Pārlūkot izejas kodu

NFSv4: Ensure that we set the verifier when revalidating delegated dentries

This ensures that we don't have to look up the dentry again after we return
the delegation if we know that the directory didn't change.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Trond Myklebust 16 gadi atpakaļ
vecāks
revīzija
15860ab1d7
1 mainītis faili ar 4 papildinājumiem un 2 dzēšanām
  1. 4 2
      fs/nfs/dir.c

+ 4 - 2
fs/nfs/dir.c

@@ -799,6 +799,9 @@ static int nfs_lookup_revalidate(struct dentry * dentry, struct nameidata *nd)
 		goto out_bad;
 		goto out_bad;
 	}
 	}
 
 
+	if (nfs_have_delegation(inode, FMODE_READ))
+		goto out_set_verifier;
+
 	/* 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, nd) && nfs_check_verifier(dir, dentry)) {
 	if (!nfs_is_exclusive_create(dir, nd) && nfs_check_verifier(dir, dentry)) {
 		if (nfs_lookup_verify_inode(inode, nd))
 		if (nfs_lookup_verify_inode(inode, nd))
@@ -817,6 +820,7 @@ static int nfs_lookup_revalidate(struct dentry * dentry, struct nameidata *nd)
 	if ((error = nfs_refresh_inode(inode, &fattr)) != 0)
 	if ((error = nfs_refresh_inode(inode, &fattr)) != 0)
 		goto out_bad;
 		goto out_bad;
 
 
+out_set_verifier:
 	nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
 	nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
  out_valid:
  out_valid:
 	dput(parent);
 	dput(parent);
@@ -1084,8 +1088,6 @@ out:
 no_open_dput:
 no_open_dput:
 	dput(parent);
 	dput(parent);
 no_open:
 no_open:
-	if (inode != NULL && nfs_have_delegation(inode, FMODE_READ))
-		return 1;
 	return nfs_lookup_revalidate(dentry, nd);
 	return nfs_lookup_revalidate(dentry, nd);
 }
 }
 #endif /* CONFIG_NFSV4 */
 #endif /* CONFIG_NFSV4 */