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>
This commit is contained in:
Ralph Boehme 2024-11-25 16:19:56 +01:00 committed by Steve French
parent 6a832bc8bb
commit 8cb0bc5436

View File

@ -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;