cifs: check the timestamp for the cached dirent when deciding on revalidate
authorRonnie Sahlberg <lsahlber@redhat.com>
Mon, 8 Mar 2021 23:07:35 +0000 (09:07 +1000)
committerSteve French <stfrench@microsoft.com>
Sun, 25 Apr 2021 21:28:24 +0000 (16:28 -0500)
Improves directory metadata caching

Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/cifs/inode.c

index 22662ea..a0846f7 100644 (file)
@@ -2193,6 +2193,8 @@ cifs_dentry_needs_reval(struct dentry *dentry)
        struct inode *inode = d_inode(dentry);
        struct cifsInodeInfo *cifs_i = CIFS_I(inode);
        struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
+       struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
+       struct cached_fid *cfid = NULL;
 
        if (cifs_i->time == 0)
                return true;
@@ -2203,6 +2205,16 @@ cifs_dentry_needs_reval(struct dentry *dentry)
        if (!lookupCacheEnabled)
                return true;
 
+       if (!open_cached_dir_by_dentry(tcon, dentry->d_parent, &cfid)) {
+               mutex_lock(&cfid->fid_mutex);
+               if (cfid->time && cifs_i->time > cfid->time) {
+                       mutex_unlock(&cfid->fid_mutex);
+                       close_cached_dir(cfid);
+                       return false;
+               }
+               mutex_unlock(&cfid->fid_mutex);
+               close_cached_dir(cfid);
+       }
        /*
         * depending on inode type, check if attribute caching disabled for
         * files or directories