diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2007-10-01 13:46:53 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2007-10-09 17:19:42 -0400 |
commit | cf8ba45e0554f1c8838fcfe43a93114f177af839 (patch) | |
tree | e8799c4eac30b4c42c2be7a02e4848aac6113f44 /fs/nfs | |
parent | f38211100d4823be530577dc3452f838861222ec (diff) |
NFS: don't cache the verifer across ->lookup() calls
If the ->lookup() call causes the directory verifier to change, then there
is still no need to use the old verifier, since our dentry has been
verified.
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs')
-rw-r--r-- | fs/nfs/dir.c | 8 |
1 files changed, 2 insertions, 6 deletions
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index d58bfb81354..7cd2697f2d3 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c | |||
@@ -735,7 +735,6 @@ static int nfs_lookup_revalidate(struct dentry * dentry, struct nameidata *nd) | |||
735 | int error; | 735 | int error; |
736 | struct nfs_fh fhandle; | 736 | struct nfs_fh fhandle; |
737 | struct nfs_fattr fattr; | 737 | struct nfs_fattr fattr; |
738 | unsigned long verifier; | ||
739 | 738 | ||
740 | parent = dget_parent(dentry); | 739 | parent = dget_parent(dentry); |
741 | lock_kernel(); | 740 | lock_kernel(); |
@@ -770,7 +769,6 @@ static int nfs_lookup_revalidate(struct dentry * dentry, struct nameidata *nd) | |||
770 | if (NFS_STALE(inode)) | 769 | if (NFS_STALE(inode)) |
771 | goto out_bad; | 770 | goto out_bad; |
772 | 771 | ||
773 | verifier = nfs_save_change_attribute(dir); | ||
774 | error = NFS_PROTO(dir)->lookup(dir, &dentry->d_name, &fhandle, &fattr); | 772 | error = NFS_PROTO(dir)->lookup(dir, &dentry->d_name, &fhandle, &fattr); |
775 | if (error) | 773 | if (error) |
776 | goto out_bad; | 774 | goto out_bad; |
@@ -779,7 +777,7 @@ static int nfs_lookup_revalidate(struct dentry * dentry, struct nameidata *nd) | |||
779 | if ((error = nfs_refresh_inode(inode, &fattr)) != 0) | 777 | if ((error = nfs_refresh_inode(inode, &fattr)) != 0) |
780 | goto out_bad; | 778 | goto out_bad; |
781 | 779 | ||
782 | nfs_set_verifier(dentry, verifier); | 780 | nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); |
783 | out_valid: | 781 | out_valid: |
784 | unlock_kernel(); | 782 | unlock_kernel(); |
785 | dput(parent); | 783 | dput(parent); |
@@ -1048,7 +1046,6 @@ static int nfs_open_revalidate(struct dentry *dentry, struct nameidata *nd) | |||
1048 | struct dentry *parent = NULL; | 1046 | struct dentry *parent = NULL; |
1049 | struct inode *inode = dentry->d_inode; | 1047 | struct inode *inode = dentry->d_inode; |
1050 | struct inode *dir; | 1048 | struct inode *dir; |
1051 | unsigned long verifier; | ||
1052 | int openflags, ret = 0; | 1049 | int openflags, ret = 0; |
1053 | 1050 | ||
1054 | parent = dget_parent(dentry); | 1051 | parent = dget_parent(dentry); |
@@ -1076,10 +1073,9 @@ static int nfs_open_revalidate(struct dentry *dentry, struct nameidata *nd) | |||
1076 | * change attribute *before* we do the RPC call. | 1073 | * change attribute *before* we do the RPC call. |
1077 | */ | 1074 | */ |
1078 | lock_kernel(); | 1075 | lock_kernel(); |
1079 | verifier = nfs_save_change_attribute(dir); | ||
1080 | ret = nfs4_open_revalidate(dir, dentry, openflags, nd); | 1076 | ret = nfs4_open_revalidate(dir, dentry, openflags, nd); |
1081 | if (ret == 1) | 1077 | if (ret == 1) |
1082 | nfs_set_verifier(dentry, verifier); | 1078 | nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); |
1083 | unlock_kernel(); | 1079 | unlock_kernel(); |
1084 | out: | 1080 | out: |
1085 | dput(parent); | 1081 | dput(parent); |