diff options
Diffstat (limited to 'fs/smb')
-rw-r--r-- | fs/smb/client/inode.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/fs/smb/client/inode.c b/fs/smb/client/inode.c index 35c5557d5ea1..053cdcbc87ff 100644 --- a/fs/smb/client/inode.c +++ b/fs/smb/client/inode.c @@ -2694,10 +2694,25 @@ cifs_dentry_needs_reval(struct dentry *dentry) if (!lookupCacheEnabled) return true; - cfid = find_cached_dir(tcon->cfids, dentry->d_parent, CFID_LOOKUP_DENTRY); - if (cfid) { - close_cached_dir(cfid); - return false; + if (dentry != dentry->d_parent) { + cfid = find_cached_dir(tcon->cfids, dentry->d_parent, CFID_LOOKUP_DENTRY); + if (cfid) { + /* + * We hold a lease for the cached parent. + * So as long as this inode is within cache dir lifetime, we don't need to + * revalidate it. + */ + if (time_before(cifs_i->time, cfid->time - dir_cache_timeout * HZ)) { + close_cached_dir(cfid); + return true; + } + + /* + * From cached dir perspective, we're done -- attr caching (ac*max) may + * have different requirements, so let the checks go through. + */ + close_cached_dir(cfid); + } } /* |