summaryrefslogtreecommitdiff
path: root/fs/smb/client/inode.c
diff options
context:
space:
mode:
authorEnzo Matsumiya <ematsumiya@suse.de>2025-09-12 13:31:45 -0300
committerEnzo Matsumiya <ematsumiya@suse.de>2025-09-12 17:27:38 -0300
commitd19ccabc31636d5893ec175c96ed87f8ecdd8d5e (patch)
tree5e3b00996c491421a91c734840bc2fe5b72c6ce6 /fs/smb/client/inode.c
parent48e413d9e73badac50d6cc0fe2b10808c9d56f3a (diff)
downloadlinux-cfid-fixes-2025-09-12.tar.gz
linux-cfid-fixes-2025-09-12.tar.bz2
linux-cfid-fixes-2025-09-12.zip
smb: client: fix dentry revalidation of cached rootcfid-fixes-2025-09-12
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>
Diffstat (limited to 'fs/smb/client/inode.c')
-rw-r--r--fs/smb/client/inode.c23
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);
+ }
}
/*