aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2014-07-13 21:28:20 -0400
committerTrond Myklebust <trond.myklebust@primarydata.com>2014-08-03 17:14:13 -0400
commit1fa1e38447964d6c96b027f9f999ef105d8cf8aa (patch)
treeb992f859e384cddb2bfb933fd466b537e282a5a7 /fs/nfs
parent912a108da767ae75cc929d2854e698aff527ec5d (diff)
NFS: teach nfs_lookup_verify_inode to handle LOOKUP_RCU
It fails with -ECHILD rather than make an RPC call. This allows nfs_lookup_revalidate to call it in RCU-walk mode. Signed-off-by: NeilBrown <neilb@suse.de> Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Diffstat (limited to 'fs/nfs')
-rw-r--r--fs/nfs/dir.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
index dcd4fe5831d6..2bfbde0f7176 100644
--- a/fs/nfs/dir.c
+++ b/fs/nfs/dir.c
@@ -1050,6 +1050,8 @@ int nfs_lookup_verify_inode(struct inode *inode, unsigned int flags)
1050out: 1050out:
1051 return (inode->i_nlink == 0) ? -ENOENT : 0; 1051 return (inode->i_nlink == 0) ? -ENOENT : 0;
1052out_force: 1052out_force:
1053 if (flags & LOOKUP_RCU)
1054 return -ECHILD;
1053 ret = __nfs_revalidate_inode(server, inode); 1055 ret = __nfs_revalidate_inode(server, inode);
1054 if (ret != 0) 1056 if (ret != 0)
1055 return ret; 1057 return ret;
@@ -1135,11 +1137,11 @@ static int nfs_lookup_revalidate(struct dentry *dentry, unsigned int flags)
1135 if (!nfs_is_exclusive_create(dir, flags) && 1137 if (!nfs_is_exclusive_create(dir, flags) &&
1136 nfs_check_verifier(dir, dentry, flags & LOOKUP_RCU)) { 1138 nfs_check_verifier(dir, dentry, flags & LOOKUP_RCU)) {
1137 1139
1138 if (flags & LOOKUP_RCU) 1140 if (nfs_lookup_verify_inode(inode, flags)) {
1139 return -ECHILD; 1141 if (flags & LOOKUP_RCU)
1140 1142 return -ECHILD;
1141 if (nfs_lookup_verify_inode(inode, flags))
1142 goto out_zap_parent; 1143 goto out_zap_parent;
1144 }
1143 goto out_valid; 1145 goto out_valid;
1144 } 1146 }
1145 1147