diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2007-10-01 02:01:13 +0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2007-10-10 01:19:00 +0400 |
commit | 57fa76f2da05d0fee597b26bbc1f05242252beab (patch) | |
tree | c3ee6a3b75315b10bf2d1c9396d7e07c1b8f4830 /fs/nfs | |
parent | 47aabaa7e45385fee4a535a6f6e523ff944e1684 (diff) | |
download | linux-57fa76f2da05d0fee597b26bbc1f05242252beab.tar.xz |
NFS: Don't use readdirplus data if the page cache is invalid
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs')
-rw-r--r-- | fs/nfs/dir.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index 6518b098e625..9f8ec3c3e6a7 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c @@ -1110,6 +1110,7 @@ static struct dentry *nfs_readdir_lookup(nfs_readdir_descriptor_t *desc) .len = entry->len, }; struct inode *inode; + unsigned long verf = nfs_save_change_attribute(dir); switch (name.len) { case 2: @@ -1120,6 +1121,14 @@ static struct dentry *nfs_readdir_lookup(nfs_readdir_descriptor_t *desc) if (name.name[0] == '.') return dget(parent); } + + spin_lock(&dir->i_lock); + if (NFS_I(dir)->cache_validity & NFS_INO_INVALID_DATA) { + spin_unlock(&dir->i_lock); + return NULL; + } + spin_unlock(&dir->i_lock); + name.hash = full_name_hash(name.name, name.len); dentry = d_lookup(parent, &name); if (dentry != NULL) { @@ -1161,7 +1170,7 @@ static struct dentry *nfs_readdir_lookup(nfs_readdir_descriptor_t *desc) } out_renew: - nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); + nfs_set_verifier(dentry, verf); return dentry; } |