summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEnzo Matsumiya <ematsumiya@suse.de>2025-09-12 13:31:45 -0300
committerEnzo Matsumiya <ematsumiya@suse.de>2025-10-03 15:13:02 -0300
commitaed215cdf8646ead07b6dc6e44cfbdd5ba412bb3 (patch)
treeb41ea44501e9e482860c5be3d1d0fd1fb7bd601a
parentf95110b86cf27db7cd9d9f1fe6e0b3ea817259b0 (diff)
downloadlinux-aed215cdf8646ead07b6dc6e44cfbdd5ba412bb3.tar.gz
linux-aed215cdf8646ead07b6dc6e44cfbdd5ba412bb3.tar.bz2
linux-aed215cdf8646ead07b6dc6e44cfbdd5ba412bb3.zip
smb: client: skip dentry revalidation of cached root
Don't check root dir dentry in cifs_dentry_needs_reval() as its inode was created before the cfid, so the time check will fail and trigger an unnecessary revalidation. Also account for dir_cache_timeout in time comparison, because if we have a cached dir, we have a lease for it, and, thus, may assume its children are (still) valid. To confirm that, let the ac*max checks go through for granular results. Signed-off-by: Enzo Matsumiya <ematsumiya@suse.de>
-rw-r--r--fs/smb/client/inode.c26
1 files changed, 22 insertions, 4 deletions
diff --git a/fs/smb/client/inode.c b/fs/smb/client/inode.c
index 31d138ad11bc..f16070888c06 100644
--- a/fs/smb/client/inode.c
+++ b/fs/smb/client/inode.c
@@ -2689,10 +2689,28 @@ 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 (!IS_ROOT(dentry)) {
+ 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 child is within cached dir lifetime, we don't need to
+ * revalidate it.
+ *
+ * Since cfid expiration is based on access time, use it for comparison
+ * instead of creation time.
+ */
+ if (time_after(cifs_i->time, cfid->atime - 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);
+ }
}
/*