|
@@ -1115,11 +1115,13 @@ static int nfs_lookup_revalidate(struct dentry *dentry, unsigned int flags)
|
|
/* Force a full look up iff the parent directory has changed */
|
|
/* Force a full look up iff the parent directory has changed */
|
|
if (!nfs_is_exclusive_create(dir, flags) &&
|
|
if (!nfs_is_exclusive_create(dir, flags) &&
|
|
nfs_check_verifier(dir, dentry, flags & LOOKUP_RCU)) {
|
|
nfs_check_verifier(dir, dentry, flags & LOOKUP_RCU)) {
|
|
-
|
|
|
|
- if (nfs_lookup_verify_inode(inode, flags)) {
|
|
|
|
|
|
+ error = nfs_lookup_verify_inode(inode, flags);
|
|
|
|
+ if (error) {
|
|
if (flags & LOOKUP_RCU)
|
|
if (flags & LOOKUP_RCU)
|
|
return -ECHILD;
|
|
return -ECHILD;
|
|
- goto out_zap_parent;
|
|
|
|
|
|
+ if (error == -ESTALE)
|
|
|
|
+ goto out_zap_parent;
|
|
|
|
+ goto out_error;
|
|
}
|
|
}
|
|
nfs_advise_use_readdirplus(dir);
|
|
nfs_advise_use_readdirplus(dir);
|
|
goto out_valid;
|
|
goto out_valid;
|
|
@@ -1144,8 +1146,10 @@ static int nfs_lookup_revalidate(struct dentry *dentry, unsigned int flags)
|
|
trace_nfs_lookup_revalidate_enter(dir, dentry, flags);
|
|
trace_nfs_lookup_revalidate_enter(dir, dentry, flags);
|
|
error = NFS_PROTO(dir)->lookup(dir, &dentry->d_name, fhandle, fattr, label);
|
|
error = NFS_PROTO(dir)->lookup(dir, &dentry->d_name, fhandle, fattr, label);
|
|
trace_nfs_lookup_revalidate_exit(dir, dentry, flags, error);
|
|
trace_nfs_lookup_revalidate_exit(dir, dentry, flags, error);
|
|
- if (error)
|
|
|
|
|
|
+ if (error == -ESTALE || error == -ENOENT)
|
|
goto out_bad;
|
|
goto out_bad;
|
|
|
|
+ if (error)
|
|
|
|
+ goto out_error;
|
|
if (nfs_compare_fh(NFS_FH(inode), fhandle))
|
|
if (nfs_compare_fh(NFS_FH(inode), fhandle))
|
|
goto out_bad;
|
|
goto out_bad;
|
|
if ((error = nfs_refresh_inode(inode, fattr)) != 0)
|
|
if ((error = nfs_refresh_inode(inode, fattr)) != 0)
|