diff options
author | NeilBrown <neilb@suse.de> | 2014-07-13 21:28:20 -0400 |
---|---|---|
committer | Trond Myklebust <trond.myklebust@primarydata.com> | 2014-08-03 17:14:13 -0400 |
commit | 1fa1e38447964d6c96b027f9f999ef105d8cf8aa (patch) | |
tree | b992f859e384cddb2bfb933fd466b537e282a5a7 /fs/nfs | |
parent | 912a108da767ae75cc929d2854e698aff527ec5d (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.c | 10 |
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) | |||
1050 | out: | 1050 | out: |
1051 | return (inode->i_nlink == 0) ? -ENOENT : 0; | 1051 | return (inode->i_nlink == 0) ? -ENOENT : 0; |
1052 | out_force: | 1052 | out_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 | ||