]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
cifs: add new field to track the last access time of cfid
authorShyam Prasad N <sprasad@microsoft.com>
Fri, 25 Jul 2025 03:23:53 +0000 (22:23 -0500)
committerSteve French <stfrench@microsoft.com>
Sun, 27 Jul 2025 21:59:59 +0000 (16:59 -0500)
The handlecache code today tracks the time at which dir lease was
acquired and the laundromat thread uses that to check for old
entries to cleanup.

However, if a directory is actively accessed, it should not
be chosen to expire first.

This change adds a new last_access_time field to cfid and
uses that to decide expiry of the cfid.

Signed-off-by: Shyam Prasad N <sprasad@microsoft.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/client/cached_dir.c
fs/smb/client/cached_dir.h

index 116470b1dfea90364dbf77bc39ff30edfe3df5e2..b69daeb1301b3c801c7c122d138f622882da40a1 100644 (file)
@@ -195,6 +195,7 @@ replay_again:
         * from @cfids->entries.  Caller will put last reference if the latter.
         */
        if (cfid->has_lease && cfid->time) {
+               cfid->last_access_time = jiffies;
                spin_unlock(&cfids->cfid_list_lock);
                *ret_cfid = cfid;
                kfree(utf16_path);
@@ -363,6 +364,7 @@ replay_again:
                cfid->file_all_info_is_valid = true;
 
        cfid->time = jiffies;
+       cfid->last_access_time = jiffies;
        spin_unlock(&cfids->cfid_list_lock);
        /* At this point the directory handle is fully cached */
        rc = 0;
@@ -730,8 +732,8 @@ static void cfids_laundromat_worker(struct work_struct *work)
 
        spin_lock(&cfids->cfid_list_lock);
        list_for_each_entry_safe(cfid, q, &cfids->entries, entry) {
-               if (cfid->time &&
-                   time_after(jiffies, cfid->time + HZ * dir_cache_timeout)) {
+               if (cfid->last_access_time &&
+                   time_after(jiffies, cfid->last_access_time + HZ * dir_cache_timeout)) {
                        cfid->on_list = false;
                        list_move(&cfid->entry, &entry);
                        cfids->num_entries--;
index 070b0962de9856581cb0190b4350a5323939804f..2c262881b7b1d84c5d68324fc3e928abda03ea9b 100644 (file)
@@ -39,6 +39,7 @@ struct cached_fid {
        bool on_list:1;
        bool file_all_info_is_valid:1;
        unsigned long time; /* jiffies of when lease was taken */
+       unsigned long last_access_time; /* jiffies of when last accessed */
        struct kref refcount;
        struct cifs_fid fid;
        spinlock_t fid_lock;