aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTrond Myklebust <Trond.Myklebust@netapp.com>2008-09-23 17:28:42 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2008-10-07 17:41:17 -0400
commit4dc05efb86239321d43a9d74fd2ecd5c21bfc2ad (patch)
tree3075ff7f73fd2cd85d2fcf055ec201e9ffac1cff
parentd65f557f39448c2d9e58cd564037b81e646aed2c (diff)
NFS: Convert __nfs_revalidate_inode() to use nfs_refresh_inode()
In the case where there are parallel RPC calls to the same inode, we may receive stale metadata due to the lack of ordering, hence the sanity checking of metadata in nfs_refresh_inode(). Currently, __nfs_revalidate_inode() is calling nfs_update_inode() directly, without any further sanity checks, and hence may end up setting the inode up with stale metadata. Fix is to use nfs_refresh_inode() instead of nfs_update_inode(). Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
-rw-r--r--fs/nfs/inode.c5
1 files changed, 1 insertions, 4 deletions
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
index 610d022fc7a5..697157c1fdd1 100644
--- a/fs/nfs/inode.c
+++ b/fs/nfs/inode.c
@@ -724,16 +724,13 @@ __nfs_revalidate_inode(struct nfs_server *server, struct inode *inode)
724 goto out; 724 goto out;
725 } 725 }
726 726
727 spin_lock(&inode->i_lock); 727 status = nfs_refresh_inode(inode, &fattr);
728 status = nfs_update_inode(inode, &fattr);
729 if (status) { 728 if (status) {
730 spin_unlock(&inode->i_lock);
731 dfprintk(PAGECACHE, "nfs_revalidate_inode: (%s/%Ld) refresh failed, error=%d\n", 729 dfprintk(PAGECACHE, "nfs_revalidate_inode: (%s/%Ld) refresh failed, error=%d\n",
732 inode->i_sb->s_id, 730 inode->i_sb->s_id,
733 (long long)NFS_FILEID(inode), status); 731 (long long)NFS_FILEID(inode), status);
734 goto out; 732 goto out;
735 } 733 }
736 spin_unlock(&inode->i_lock);
737 734
738 if (nfsi->cache_validity & NFS_INO_INVALID_ACL) 735 if (nfsi->cache_validity & NFS_INO_INVALID_ACL)
739 nfs_zap_acl_cache(inode); 736 nfs_zap_acl_cache(inode);