diff options
author | Ralph Boehme <slow@samba.org> | 2024-11-25 16:19:56 +0100 |
---|---|---|
committer | Steve French <stfrench@microsoft.com> | 2024-12-04 17:39:51 -0600 |
commit | 8cb0bc5436351de8a11eef13b7367d64cc0d6c68 (patch) | |
tree | 43f3d9858f0d34512b2029fda0db37fafdf0d440 /fs | |
parent | 6a832bc8bbb22350f7ffe6ecb2d36f261bb96023 (diff) |
fs/smb/client: cifs_prime_dcache() for SMB3 POSIX reparse points
Spares an extra revalidation request
Cc: stable@vger.kernel.org
Acked-by: Paulo Alcantara (Red Hat) <pc@manguebit.com>
Signed-off-by: Ralph Boehme <slow@samba.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/smb/client/readdir.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/fs/smb/client/readdir.c b/fs/smb/client/readdir.c index f878bcdbd319..b906bf78af1e 100644 --- a/fs/smb/client/readdir.c +++ b/fs/smb/client/readdir.c @@ -71,6 +71,8 @@ cifs_prime_dcache(struct dentry *parent, struct qstr *name, struct inode *inode; struct super_block *sb = parent->d_sb; struct cifs_sb_info *cifs_sb = CIFS_SB(sb); + bool posix = cifs_sb_master_tcon(cifs_sb)->posix_extensions; + bool reparse_need_reval = false; DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); int rc; @@ -85,7 +87,21 @@ cifs_prime_dcache(struct dentry *parent, struct qstr *name, * this spares us an invalidation. */ retry: - if ((fattr->cf_cifsattrs & ATTR_REPARSE) || + if (posix) { + switch (fattr->cf_mode & S_IFMT) { + case S_IFLNK: + case S_IFBLK: + case S_IFCHR: + reparse_need_reval = true; + break; + default: + break; + } + } else if (fattr->cf_cifsattrs & ATTR_REPARSE) { + reparse_need_reval = true; + } + + if (reparse_need_reval || (fattr->cf_flags & CIFS_FATTR_NEED_REVAL)) return; |