commit: 0f66b5984df2fe1617c05900a39a7ef493ca9de9
From: Peng Tao <[email protected]>
Date: Sat, 16 Oct 2010 22:07:46 -0700
Subject: [PATCH] NFS41: do not update isize if inode needs layoutcommit

nfs_update_inode will update isize if there is no queued pages. For pNFS,
layoutcommit is supposed to change file size on server, the same effect as 
queued
pages. nfs_update_inode may be called when dirty pages are written back 
(nfsi->npages==0)
but layoutcommit is not sent, and it will change client file size according to 
server
file size. Then client ends up losing what it just writes back in pNFS path.
So we should skip updating client file size if file needs layoutcommit.

Signed-off-by: Peng Tao <[email protected]>
Cc: [email protected]   [2.6.39]
Signed-off-by: Trond Myklebust <[email protected]>
---
 fs/nfs/inode.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
index 144f2a3..3f1eb81 100644
--- a/fs/nfs/inode.c
+++ b/fs/nfs/inode.c
@@ -1294,7 +1294,8 @@ static int nfs_update_inode(struct inode *inode, struct 
nfs_fattr *fattr)
                if (new_isize != cur_isize) {
                        /* Do we perhaps have any outstanding writes, or has
                         * the file grown beyond our last write? */
-                       if (nfsi->npages == 0 || new_isize > cur_isize) {
+                       if ((nfsi->npages == 0 && 
!test_bit(NFS_INO_LAYOUTCOMMIT, &nfsi->flags)) ||
+                            new_isize > cur_isize) {
                                i_size_write(inode, new_isize);
                                invalid |= 
NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA;
                        }

_______________________________________________
stable mailing list
[email protected]
http://linux.kernel.org/mailman/listinfo/stable

Reply via email to