From 3d16aab78c393e648eab240923cc6e65ac854f6d Mon Sep 17 00:00:00 2001 From: Trond Myklebust Date: Sun, 30 Sep 2007 18:01:13 -0400 Subject: [PATCH] --- yaml --- r: 69257 b: refs/heads/master c: 57fa76f2da05d0fee597b26bbc1f05242252beab h: refs/heads/master i: 69255: a93bc6179702d7bfec9b06d80f4f81204a4a190b v: v3 --- [refs] | 2 +- trunk/fs/nfs/dir.c | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 84bcdaa895d2..482ef95eef79 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 47aabaa7e45385fee4a535a6f6e523ff944e1684 +refs/heads/master: 57fa76f2da05d0fee597b26bbc1f05242252beab diff --git a/trunk/fs/nfs/dir.c b/trunk/fs/nfs/dir.c index 6518b098e625..9f8ec3c3e6a7 100644 --- a/trunk/fs/nfs/dir.c +++ b/trunk/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; }