FAILED: patch "[PATCH] smb: client: fix uid/gid override in getattr with posix" failed to apply to 6.12-stable tree
Subsystems (4)
[email protected]
maintainerThe patch below does not apply to the 6.12-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.12.y
git checkout FETCH_HEAD
git cherry-pick -x cf4d35896621b7298eef51b7a465e5c0cb22f670
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026091634-strongman-causation-bca7@gregkh' --subject-prefix 'PATCH 6.12.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From cf4d35896621b7298eef51b7a465e5c0cb22f670 Mon Sep 17 00:00:00 2001
From: Paulo Alcantara <[email protected]>
Date: Sun, 6 Sep 2026 14:39:44 -0300
Subject: [PATCH] smb: client: fix uid/gid override in getattr with posix
extensions
When mounting with 'multiuser,posix' options, cifs_getattr() overrides the server-provided uid/gid with the current process's fsuid/fsgid. This is because the condition only checks for unix extensions (tcon->unix_ext) but not posix extensions (tcon->posix_extensions).
With SMB3 POSIX extensions, the server provides real uid/gid values just like with unix extensions, so they should be preserved rather than replaced with the caller's credentials.
Add a tcon->posix_extensions check to the condition so that uid/gid from the server are properly reported in stat results.
fs/smb/client/inode.c +4 -4
@@ -2992,14 +2992,14 @@ int cifs_getattr(struct mnt_idmap *idmap, const struct path *path, stat->attributes |=STATX_ATTR_ENCRYPTED ;/* -* If on a multiuser mount without unix extensions or cifsacl being -* enabled, and the admin hasn't overridden them, set the ownership -* to the fsuid/fsgid of the current process. +* If on a multiuser mount without unix extensions, posix extensions +* or cifsacl being enabled, and the admin hasn't overridden them, +* set the ownership to the fsuid/fsgid of the current process. */ sbflags =cifs_sb_flags (cifs_sb);if ((sbflags &CIFS_MOUNT_MULTIUSER ) && !(sbflags &CIFS_MOUNT_CIFS_ACL ) && - !tcon->unix_ext) { + !tcon->unix_ext && !tcon->posix_extensions) {if (!(sbflags &CIFS_MOUNT_OVERR_UID )) stat->uid =current_fsuid ();if (!(sbflags &CIFS_MOUNT_OVERR_GID ))
Sasha Levin
maintainerPATCH 1/3 cifs: Scripted clean up fs/smb/client/fscache.h
From: David Howells <[email protected]>
[ Upstream commit bc3de356aae666de5d8b5131545be87cf7754431 ]
Remove externs, correct argument names and reformat declarations.
Stable-dep-of: cf4d35896621 ("smb: client: fix uid/gid override in getattr with posix extensions")
--- fs/smb/client/fscache.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
fs/smb/client/fscache.h +5 -5
@@ -38,12 +38,12 @@ struct cifs_fscache_inode_coherency_data {/* * fscache.c */ -extern int cifs_fscache_get_super_cookie (struct cifs_tcon *); -extern void cifs_fscache_release_super_cookie (struct cifs_tcon *); +int cifs_fscache_get_super_cookie (struct cifs_tcon *tcon); +void cifs_fscache_release_super_cookie (struct cifs_tcon *tcon); -extern void cifs_fscache_get_inode_cookie (struct inode *inode); -extern void cifs_fscache_release_inode_cookie (struct inode *); -extern void cifs_fscache_unuse_inode_cookie (struct inode *inode,bool update); +void cifs_fscache_get_inode_cookie (struct inode *inode); +void cifs_fscache_release_inode_cookie (struct inode *inode); +void cifs_fscache_unuse_inode_cookie (struct inode *inode,bool update); static inline void cifs_fscache_fill_coherency(struct inode *inode,
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 2/3 smb: client: use atomic_t for mnt_cifs_flags
From: Paulo Alcantara <[email protected]>
[ Upstream commit 4fc3a433c13944ee5766ec5b9bf6f1eb4d29b880 ]
Use atomic_t for cifs_sb_info::mnt_cifs_flags as it's currently accessed locklessly and may be changed concurrently in mount/remount and reconnect paths.
Adapt the atomic mount flags conversion to the existing 6.12 client. Keep CIFS_SB(), CIFS_FILE_SB(), cifs_remap() and cifs_forced_shutdown() in their existing forms and locations, and omit the upstream generic superblock accessor refactoring. Define cifs_sb_flags() as a macro so this backport introduces no functions.
Convert all existing flag readers and use atomic_or()/atomic_andnot() for the in-place flag updates. This includes the legacy Unix capability negotiation in connect.c, the existing cache macros and the older setattr and I/O paths. Keep smb3_update_mnt_flags()'s void interface and update individual flags atomically so unrelated concurrent flag changes are preserved.
Take the upstream sbflags snapshot in cifs_getattr() so the follow-up uid/gid override fix cf4d35896621 applies without modification. Drop changes for newer reparse, symlink and I/O code absent from this tree.
[ sashal: Reduced backport -- upstream 4fc3a433c1394 touches 27 file(s), this
backport carries 23. Not backported here:
fs/smb/client/cifs_unicode.h
fs/smb/client/fs_context.h
fs/smb/client/reparse.c
fs/smb/client/smb2file.c
This note is generated from the file lists only; see the resolution record for the reasoning. ]
Stable-dep-of: cf4d35896621 ("smb: client: fix uid/gid override in getattr with posix extensions")
--- fs/smb/client/cached_dir.c | 2 +- fs/smb/client/cifs_fs_sb.h | 7 ++- fs/smb/client/cifs_ioctl.h | 2 +- fs/smb/client/cifs_unicode.c | 4 +- fs/smb/client/cifsacl.c | 6 +- fs/smb/client/cifsfs.c | 66 ++++++++++----------- fs/smb/client/cifsglob.h | 10 +++- fs/smb/client/connect.c | 39 ++++++------- fs/smb/client/dfs_cache.c | 2 +- fs/smb/client/dir.c | 16 +++--- fs/smb/client/file.c | 32 +++++------ fs/smb/client/fs_context.c | 107 +++++++++++++++++------------------ fs/smb/client/inode.c | 88 ++++++++++++++-------------- fs/smb/client/ioctl.c | 2 +- fs/smb/client/link.c | 4 +- fs/smb/client/misc.c | 12 ++-- fs/smb/client/readdir.c | 16 +++--- fs/smb/client/reparse.h | 4 +- fs/smb/client/smb1ops.c | 4 +- fs/smb/client/smb2misc.c | 4 +- fs/smb/client/smb2ops.c | 4 +- fs/smb/client/smb2pdu.c | 4 +- fs/smb/client/xattr.c | 6 +- 23 files changed, 224 insertions(+), 217 deletions(-)
fs/smb/client/cached_dir.c +1 -1
@@ -118,7 +118,7 @@ static const char *path_no_prefix(struct cifs_sb_info *cifs_sb,if (!*path)return path; -if ((cifs_sb->mnt_cifs_flags &CIFS_MOUNT_USE_PREFIX_PATH ) && +if ((cifs_sb_flags (cifs_sb) &CIFS_MOUNT_USE_PREFIX_PATH ) && cifs_sb->prepath) { len =strlen (cifs_sb->prepath) +1 ;if (unlikely (len >strlen (path)))
fs/smb/client/cifs_fs_sb.h +6 -1
@@ -10,6 +10,7 @@#ifndef _CIFS_FS_SB_H#define _CIFS_FS_SB_H +#include <linux/atomic.h> #include <linux/backing-dev.h> #define CIFS_MOUNT_NO_PERM 1/* do not do client vfs_perm check */
@@ -54,7 +55,7 @@ struct cifs_sb_info {struct nls_table *local_nls;struct smb3_fs_context *ctx;atomic_t active; -unsigned int mnt_cifs_flags; +atomic_t mnt_cifs_flags;struct delayed_work prune_tlinks;struct rcu_head rcu;
@@ -71,4 +72,8 @@ struct cifs_sb_info {*/ struct dentry *root; }; + +/* Mount/remount and reconnect paths update these flags without a common lock. */ +#define cifs_sb_flags (cifs_sb) ((unsigned int)atomic_read(&(cifs_sb)->mnt_cifs_flags)) +#endif /* _CIFS_FS_SB_H */
fs/smb/client/cifs_ioctl.h +1 -1
@@ -125,7 +125,7 @@ struct smb3_notify_info {static inline bool cifs_forced_shutdown (struct cifs_sb_info *sbi) { -if (CIFS_MOUNT_SHUTDOWN & sbi->mnt_cifs_flags) +if (CIFS_MOUNT_SHUTDOWN &cifs_sb_flags (sbi))return true;else return false;
fs/smb/client/cifs_unicode.c +2 -2
@@ -16,9 +16,9 @@ int cifs_remap(struct cifs_sb_info *cifs_sb) {int map_type; -if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_MAP_SFM_CHR ) +if (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_MAP_SFM_CHR ) map_type =SFM_MAP_UNI_RSVD ; -else if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_MAP_SPECIAL_CHR ) +else if (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_MAP_SPECIAL_CHR ) map_type =SFU_MAP_UNI_RSVD ;else map_type =NO_MAP_UNI_RSVD ;
fs/smb/client/cifsacl.c +3 -3
@@ -356,7 +356,7 @@ sid_to_id(struct cifs_sb_info *cifs_sb, struct smb_sid *psid,return -EIO ; } -if ((cifs_sb->mnt_cifs_flags &CIFS_MOUNT_UID_FROM_ACL ) || +if ((cifs_sb_flags (cifs_sb) &CIFS_MOUNT_UID_FROM_ACL ) || (cifs_sb_master_tcon (cifs_sb)->posix_extensions)) {uint32_t unix_id;bool is_group;
@@ -1715,12 +1715,12 @@ id_mode_to_cifs_acl(struct inode *inode, const char *path, __u64 *pnmode,return rc; } -if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_MODE_FROM_SID ) +if (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_MODE_FROM_SID ) mode_from_sid = true;else mode_from_sid = false; -if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_UID_FROM_ACL ) +if (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_UID_FROM_ACL ) id_from_sid = true;else id_from_sid = false;
fs/smb/client/cifsfs.c +33 -33
148 lines not on this page · raw message
fs/smb/client/cifsglob.h +7 -3
@@ -1500,9 +1500,13 @@ void cifsFileInfo_put(struct cifsFileInfo *cifs_file);#define CIFS_CACHE_RW_FLG (CIFS_CACHE_READ_FLG | CIFS_CACHE_WRITE_FLG)#define CIFS_CACHE_RHW_FLG (CIFS_CACHE_RW_FLG | CIFS_CACHE_HANDLE_FLG) -#define CIFS_CACHE_READ (cinode) ((cinode->oplock & CIFS_CACHE_READ_FLG) || (CIFS_SB(cinode->netfs.inode.i_sb)->mnt_cifs_flags & CIFS_MOUNT_RO_CACHE)) +#define CIFS_CACHE_READ (cinode) \ + (((cinode)->oplock & CIFS_CACHE_READ_FLG) || \ + (cifs_sb_flags(CIFS_SB((cinode)->netfs.inode.i_sb)) & CIFS_MOUNT_RO_CACHE))#define CIFS_CACHE_HANDLE (cinode) (cinode->oplock & CIFS_CACHE_HANDLE_FLG) -#define CIFS_CACHE_WRITE (cinode) ((cinode->oplock & CIFS_CACHE_WRITE_FLG) || (CIFS_SB(cinode->netfs.inode.i_sb)->mnt_cifs_flags & CIFS_MOUNT_RW_CACHE)) +#define CIFS_CACHE_WRITE (cinode) \ + (((cinode)->oplock & CIFS_CACHE_WRITE_FLG) || \ + (cifs_sb_flags(CIFS_SB((cinode)->netfs.inode.i_sb)) & CIFS_MOUNT_RW_CACHE))/* * One of these for each file inode
@@ -1565,7 +1569,7 @@ CIFS_FILE_SB(struct file *file)static inline char CIFS_DIR_SEP (const struct cifs_sb_info *cifs_sb) { -if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_POSIX_PATHS ) +if (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_POSIX_PATHS )return '/' ;else return '\\' ;
fs/smb/client/connect.c +18 -21
@@ -2863,8 +2863,8 @@ compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data) {struct cifs_sb_info *old =CIFS_SB (sb);struct cifs_sb_info *new = mnt_data->cifs_sb; -unsigned int oldflags = old->mnt_cifs_flags &CIFS_MOUNT_MASK ; -unsigned int newflags = new->mnt_cifs_flags &CIFS_MOUNT_MASK ; +unsigned int oldflags =cifs_sb_flags (old) &CIFS_MOUNT_MASK ; +unsigned int newflags =cifs_sb_flags (new) &CIFS_MOUNT_MASK ;if ((sb->s_flags &CIFS_MS_MASK ) != (mnt_data->flags &CIFS_MS_MASK ))return 0 ;
@@ -2915,9 +2915,9 @@ static int match_prepath(struct super_block *sb,struct smb3_fs_context *ctx = mnt_data->ctx;struct cifs_sb_info *old =CIFS_SB (sb);struct cifs_sb_info *new = mnt_data->cifs_sb; -bool old_set = (old->mnt_cifs_flags &CIFS_MOUNT_USE_PREFIX_PATH ) && +bool old_set = (cifs_sb_flags (old) &CIFS_MOUNT_USE_PREFIX_PATH ) && old->prepath; -bool new_set = (new->mnt_cifs_flags &CIFS_MOUNT_USE_PREFIX_PATH ) && +bool new_set = (cifs_sb_flags (new) &CIFS_MOUNT_USE_PREFIX_PATH ) && new->prepath; if (tcon->origin_fullpath &&
@@ -2948,7 +2948,7 @@ cifs_match_super(struct super_block *sb, void *data) cifs_sb =CIFS_SB (sb);/* We do not want to use a superblock that has been shutdown */ -if (CIFS_MOUNT_SHUTDOWN & cifs_sb->mnt_cifs_flags) { +if (CIFS_MOUNT_SHUTDOWN &cifs_sb_flags (cifs_sb)) {spin_unlock (&cifs_tcp_ses_lock);return 0 ; }
@@ -3332,8 +3332,7 @@ void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {cifs_dbg (FYI ,"negotiated posix acl support\n" );if (cifs_sb) - cifs_sb->mnt_cifs_flags |= -CIFS_MOUNT_POSIXACL ; +atomic_or (CIFS_MOUNT_POSIXACL , &cifs_sb->mnt_cifs_flags); }if (ctx && ctx->posix_paths ==0 )
@@ -3341,8 +3340,7 @@ void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,else if (cap &CIFS_UNIX_POSIX_PATHNAMES_CAP ) {cifs_dbg (FYI ,"negotiate posix pathnames\n" );if (cifs_sb) - cifs_sb->mnt_cifs_flags |= -CIFS_MOUNT_POSIX_PATHS ; +atomic_or (CIFS_MOUNT_POSIX_PATHS , &cifs_sb->mnt_cifs_flags); }cifs_dbg (FYI ,"Negotiate caps 0x%x\n" , (int )cap);
@@ -3409,11 +3407,10 @@ int cifs_setup_cifs_sb(struct cifs_sb_info *cifs_sb)cifs_dbg (FYI ,"mounting share using direct i/o\n" );if (ctx->cache_ro) {cifs_dbg (VFS ,"mounting share with read only caching. Ensure that the share will not be modified while in use.\n" ); - cifs_sb->mnt_cifs_flags |=CIFS_MOUNT_RO_CACHE ; +atomic_or (CIFS_MOUNT_RO_CACHE , &cifs_sb->mnt_cifs_flags); }else if (ctx->cache_rw) {cifs_dbg (VFS ,"mounting share in single client RW caching mode. Ensure that no other systems will be accessing the share.\n" ); - cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_RO_CACHE | -CIFS_MOUNT_RW_CACHE ); +atomic_or (CIFS_MOUNT_RO_CACHE |CIFS_MOUNT_RW_CACHE , &cifs_sb->mnt_cifs_flags); }if ((ctx->cifs_acl) && (ctx->dynperm))
@@ -3423,7 +3420,7 @@ int cifs_setup_cifs_sb(struct cifs_sb_info *cifs_sb) cifs_sb->prepath =kstrdup (ctx->prepath,GFP_KERNEL );if (cifs_sb->prepath ==NULL )return -ENOMEM ; - cifs_sb->mnt_cifs_flags |=CIFS_MOUNT_USE_PREFIX_PATH ; +atomic_or (CIFS_MOUNT_USE_PREFIX_PATH , &cifs_sb->mnt_cifs_flags); }return 0 ;
@@ -3443,7 +3440,7 @@ void cifs_mount_put_conns(struct cifs_mount_ctx *mnt_ctx) mnt_ctx->ses =NULL ; mnt_ctx->tcon =NULL ; mnt_ctx->server =NULL ; - mnt_ctx->cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_POSIX_PATHS ; +atomic_andnot (CIFS_MOUNT_POSIX_PATHS , &mnt_ctx->cifs_sb->mnt_cifs_flags);free_xid (mnt_ctx->xid); }
@@ -3521,7 +3518,7 @@ int cifs_mount_get_tcon(struct cifs_mount_ctx *mnt_ctx)/* if new SMB3.11 POSIX extensions are supported do not remap / and \ */ if (tcon->posix_extensions) - cifs_sb->mnt_cifs_flags |=CIFS_MOUNT_POSIX_PATHS ; +atomic_or (CIFS_MOUNT_POSIX_PATHS , &cifs_sb->mnt_cifs_flags);#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY /* tell server which Unix caps we support */
@@ -3547,11 +3544,11 @@ int cifs_mount_get_tcon(struct cifs_mount_ctx *mnt_ctx)/* do not care if a following call succeed - informational */ if (!tcon->pipe && server->ops->qfs_tcon) { server->ops->qfs_tcon (mnt_ctx->xid, tcon, cifs_sb); -if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_RO_CACHE ) { +if (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_RO_CACHE ) {if (tcon->fsDevInfo.DeviceCharacteristics &cpu_to_le32 (FILE_READ_ONLY_DEVICE ))cifs_dbg (VFS ,"mounted to read only share\n" ); -else if ((cifs_sb->mnt_cifs_flags & +else if ((cifs_sb_flags (cifs_sb) &CIFS_MOUNT_RW_CACHE ) ==0 )cifs_dbg (VFS ,"read only mount of RW share\n" );/* no need to log a RW mount of a typical RW share */
@@ -3585,7 +3582,7 @@ int cifs_mount_get_tcon(struct cifs_mount_ctx *mnt_ctx)* Inside cifs_fscache_get_super_cookie it checks * that we do not get super cookie twice. */ -if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_FSCACHE ) +if (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_FSCACHE )cifs_fscache_get_super_cookie (tcon); out:
@@ -3704,7 +3701,7 @@ int cifs_is_path_remote(struct cifs_mount_ctx *mnt_ctx) cifs_sb, full_path, tcon->Flags & SMB_SHARE_IS_IN_DFS);if (rc !=0 ) {cifs_server_dbg (VFS ,"cannot query dirs between root and final path, enabling CIFS_MOUNT_USE_PREFIX_PATH\n" ); - cifs_sb->mnt_cifs_flags |=CIFS_MOUNT_USE_PREFIX_PATH ; +atomic_or (CIFS_MOUNT_USE_PREFIX_PATH , &cifs_sb->mnt_cifs_flags); rc =0 ; } }
@@ -3735,7 +3732,7 @@ int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)* Force the use of prefix path to support failover on DFS paths that resolve to targets * that have different prefix paths. */ - cifs_sb->mnt_cifs_flags |=CIFS_MOUNT_USE_PREFIX_PATH ; +atomic_or (CIFS_MOUNT_USE_PREFIX_PATH , &cifs_sb->mnt_cifs_flags);kfree (cifs_sb->prepath); cifs_sb->prepath = ctx->prepath; ctx->prepath =NULL ;
@@ -4316,7 +4313,7 @@ cifs_sb_tlink(struct cifs_sb_info *cifs_sb)kuid_t fsuid =current_fsuid ();int err; -if (!(cifs_sb->mnt_cifs_flags &CIFS_MOUNT_MULTIUSER )) +if (!(cifs_sb_flags (cifs_sb) &CIFS_MOUNT_MULTIUSER ))return cifs_get_tlink (cifs_sb_master_tlink (cifs_sb));spin_lock (&cifs_sb->tlink_tree_lock);
fs/smb/client/dfs_cache.c +1 -1
@@ -1340,7 +1340,7 @@ int dfs_cache_remount_fs(struct cifs_sb_info *cifs_sb)* Force the use of prefix path to support failover on DFS paths that resolve to targets * that have different prefix paths. */ - cifs_sb->mnt_cifs_flags |=CIFS_MOUNT_USE_PREFIX_PATH ; +atomic_or (CIFS_MOUNT_USE_PREFIX_PATH , &cifs_sb->mnt_cifs_flags);refresh_tcon_referral (tcon, true);return 0 ;
fs/smb/client/dir.c +8 -8
@@ -96,7 +96,7 @@ char *__build_path_from_dentry_optional_prefix(struct dentry *direntry, void *paelse dfsplen =0 ; -if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_USE_PREFIX_PATH ) +if (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_USE_PREFIX_PATH ) pplen = cifs_sb->prepath ?strlen (cifs_sb->prepath) +1 :0 ; s =dentry_path_raw (direntry, page,PATH_MAX );
@@ -123,7 +123,7 @@ char *__build_path_from_dentry_optional_prefix(struct dentry *direntry, void *paif (dfsplen) { s -= dfsplen;memcpy (s, tree, dfsplen); -if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_POSIX_PATHS ) { +if (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_POSIX_PATHS ) {int i;for (i =0 ; i < dfsplen; i++) {if (s[i] =='\\' )
@@ -160,7 +160,7 @@ check_name(struct dentry *direntry, struct cifs_tcon *tcon) le32_to_cpu(tcon->fsAttrInfo.MaxPathNameComponentLength)))return -ENAMETOOLONG ; -if (!(cifs_sb->mnt_cifs_flags &CIFS_MOUNT_POSIX_PATHS )) { +if (!(cifs_sb_flags (cifs_sb) &CIFS_MOUNT_POSIX_PATHS )) {for (i =0 ; i < direntry->d_name.len; i++) {if (direntry->d_name.name[i] =='\\' ) {cifs_dbg (FYI ,"Invalid file name\n" );
@@ -350,7 +350,7 @@ static int cifs_do_create(struct inode *inode, struct dentry *direntry, unsigned .device = 0, }; -if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_SET_UID ) { +if (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_SET_UID ) { args.uid =current_fsuid ();if (inode->i_mode &S_ISGID ) args.gid = inode->i_gid;
@@ -387,9 +387,9 @@ static int cifs_do_create(struct inode *inode, struct dentry *direntry, unsignedif (server->ops->set_lease_key) server->ops->set_lease_key (newinode, fid);if ((*oplock &CIFS_CREATE_ACTION ) &&S_ISREG (newinode->i_mode)) { -if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_DYNPERM ) +if (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_DYNPERM ) newinode->i_mode = mode; -if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_SET_UID ) { +if (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_SET_UID ) { newinode->i_uid =current_fsuid ();if (inode->i_mode &S_ISGID ) newinode->i_gid = inode->i_gid;
@@ -519,8 +519,8 @@ cifs_atomic_open(struct inode *inode, struct dentry *direntry, }if (file->f_flags &O_DIRECT && -CIFS_SB (inode->i_sb)->mnt_cifs_flags &CIFS_MOUNT_STRICT_IO ) { -if (CIFS_SB (inode->i_sb)->mnt_cifs_flags &CIFS_MOUNT_NO_BRL ) +cifs_sb_flags (CIFS_SB (inode->i_sb)) &CIFS_MOUNT_STRICT_IO ) { +if (cifs_sb_flags (CIFS_SB (inode->i_sb)) &CIFS_MOUNT_NO_BRL ) file->f_op = &cifs_file_direct_nobrl_ops;else file->f_op = &cifs_file_direct_ops;
fs/smb/client/file.c +16 -16
@@ -269,7 +269,7 @@ static int cifs_init_request(struct netfs_io_request *rreq, struct file *file) open_file = file->private_data; rreq->netfs_priv = file->private_data; req->cfile =cifsFileInfo_get (open_file); -if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_RWPIDFORWARD ) +if (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_RWPIDFORWARD ) req->pid = req->cfile->pid; }else if (rreq->origin !=NETFS_WRITEBACK ) {WARN_ON_ONCE (1 );
@@ -883,7 +883,7 @@ void _cifsFileInfo_put(struct cifsFileInfo *cifs_file,* close because it may cause a error when we open this file * again and get at least level II oplock. */ -if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_STRICT_IO ) +if (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_STRICT_IO )set_bit (CIFS_INO_INVALID_MAPPING , &cifsi->flags);cifs_set_oplock_level (cifsi,0 ); }
@@ -974,8 +974,8 @@ int cifs_open(struct inode *inode, struct file *file) inode, file->f_flags, full_path);if (file->f_flags &O_DIRECT && - cifs_sb->mnt_cifs_flags &CIFS_MOUNT_STRICT_IO ) { -if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_NO_BRL ) +cifs_sb_flags (cifs_sb) &CIFS_MOUNT_STRICT_IO ) { +if (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_NO_BRL ) file->f_op = &cifs_file_direct_nobrl_ops;else file->f_op = &cifs_file_direct_ops;
@@ -1123,7 +1123,7 @@ cifs_relock_file(struct cifsFileInfo *cfile)#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY if (cap_unix (tcon->ses) && (CIFS_UNIX_FCNTL_CAP &le64_to_cpu (tcon->fsUnixInfo.Capability)) && - ((cifs_sb->mnt_cifs_flags &CIFS_MOUNT_NOPOSIXBRL ) ==0 )) + ((cifs_sb_flags (cifs_sb) &CIFS_MOUNT_NOPOSIXBRL ) ==0 )) rc =cifs_push_posix_locks (cfile); else#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
@@ -1919,7 +1919,7 @@ cifs_push_locks(struct cifsFileInfo *cfile)#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY if (cap_unix (tcon->ses) && (CIFS_UNIX_FCNTL_CAP &le64_to_cpu (tcon->fsUnixInfo.Capability)) && - ((cifs_sb->mnt_cifs_flags &CIFS_MOUNT_NOPOSIXBRL ) ==0 )) + ((cifs_sb_flags (cifs_sb) &CIFS_MOUNT_NOPOSIXBRL ) ==0 )) rc =cifs_push_posix_locks (cfile); else#endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
@@ -2327,7 +2327,7 @@ int cifs_flock(struct file *file, int cmd, struct file_lock *fl)if (cap_unix (tcon->ses) && (CIFS_UNIX_FCNTL_CAP &le64_to_cpu (tcon->fsUnixInfo.Capability)) && - ((cifs_sb->mnt_cifs_flags &CIFS_MOUNT_NOPOSIXBRL ) ==0 )) + ((cifs_sb_flags (cifs_sb) &CIFS_MOUNT_NOPOSIXBRL ) ==0 )) posix_lck = true;if (!lock && !unlock) {
@@ -2377,7 +2377,7 @@ int cifs_lock(struct file *file, int cmd, struct file_lock *flock)if (cap_unix (tcon->ses) && (CIFS_UNIX_FCNTL_CAP &le64_to_cpu (tcon->fsUnixInfo.Capability)) && - ((cifs_sb->mnt_cifs_flags &CIFS_MOUNT_NOPOSIXBRL ) ==0 )) + ((cifs_sb_flags (cifs_sb) &CIFS_MOUNT_NOPOSIXBRL ) ==0 )) posix_lck = true;/* * BB add code here to normalize offset and length to account for
@@ -2432,7 +2432,7 @@ struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode,struct cifs_sb_info *cifs_sb =CIFS_SB (cifs_inode->netfs.inode.i_sb);/* only filter by fsuid on multiuser mounts */ -if (!(cifs_sb->mnt_cifs_flags &CIFS_MOUNT_MULTIUSER )) +if (!(cifs_sb_flags (cifs_sb) &CIFS_MOUNT_MULTIUSER )) fsuid_only = false;spin_lock (&cifs_inode->open_file_lock);
@@ -2488,7 +2488,7 @@ cifs_get_writable_file(struct cifsInodeInfo *cifs_inode, int flags, cifs_sb =CIFS_SB (cifs_inode->netfs.inode.i_sb);/* only filter by fsuid on multiuser mounts */ -if (!(cifs_sb->mnt_cifs_flags &CIFS_MOUNT_MULTIUSER )) +if (!(cifs_sb_flags (cifs_sb) &CIFS_MOUNT_MULTIUSER )) fsuid_only = false;spin_lock (&cifs_inode->open_file_lock);
@@ -2663,7 +2663,7 @@ int cifs_strict_fsync(struct file *file, loff_t start, loff_t end, } tcon =tlink_tcon (smbfile->tlink); -if (!(cifs_sb->mnt_cifs_flags &CIFS_MOUNT_NOSSYNC )) { +if (!(cifs_sb_flags (cifs_sb) &CIFS_MOUNT_NOSSYNC )) { server = tcon->ses->server;if (server->ops->flush ==NULL ) { rc = -ENOSYS ;
@@ -2711,7 +2711,7 @@ int cifs_fsync(struct file *file, loff_t start, loff_t end, int datasync) file, datasync); tcon =tlink_tcon (smbfile->tlink); -if (!(cifs_sb->mnt_cifs_flags &CIFS_MOUNT_NOSSYNC )) { +if (!(cifs_sb_flags (cifs_sb) &CIFS_MOUNT_NOSSYNC )) { server = tcon->ses->server;if (server->ops->flush ==NULL ) { rc = -ENOSYS ;
@@ -2780,7 +2780,7 @@ cifs_writev(struct kiocb *iocb, struct iov_iter *from)if (rc <=0 ) goto out; -if ((cifs_sb->mnt_cifs_flags &CIFS_MOUNT_NOPOSIXBRL ) && +if ((cifs_sb_flags (cifs_sb) &CIFS_MOUNT_NOPOSIXBRL ) && (cifs_find_lock_conflict (cfile, iocb->ki_pos,iov_iter_count (from), server->vals->exclusive_lock_type,0 ,NULL ,CIFS_WRITE_OP ))) {
@@ -2816,7 +2816,7 @@ cifs_strict_writev(struct kiocb *iocb, struct iov_iter *from)if (CIFS_CACHE_WRITE (cinode)) {if (cap_unix (tcon->ses) && (CIFS_UNIX_FCNTL_CAP &le64_to_cpu (tcon->fsUnixInfo.Capability)) && - ((cifs_sb->mnt_cifs_flags &CIFS_MOUNT_NOPOSIXBRL ) ==0 )) { + ((cifs_sb_flags (cifs_sb) &CIFS_MOUNT_NOPOSIXBRL ) ==0 )) { written =netfs_file_write_iter (iocb, from); goto out; }
@@ -2921,7 +2921,7 @@ cifs_strict_readv(struct kiocb *iocb, struct iov_iter *to)if (!CIFS_CACHE_READ (cinode))return netfs_unbuffered_read_iter (iocb, to); -if ((cifs_sb->mnt_cifs_flags &CIFS_MOUNT_NOPOSIXBRL ) ==0 ) { +if ((cifs_sb_flags (cifs_sb) &CIFS_MOUNT_NOPOSIXBRL ) ==0 ) {if (iocb->ki_flags &IOCB_DIRECT )return netfs_unbuffered_read_iter (iocb, to);return netfs_buffered_read_iter (iocb, to);
@@ -3043,7 +3043,7 @@ bool is_size_safe_to_change(struct cifsInodeInfo *cifsInode, __u64 end_of_file,struct cifs_sb_info *cifs_sb; cifs_sb =CIFS_SB (cifsInode->netfs.inode.i_sb); -if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_DIRECT_IO ) { +if (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_DIRECT_IO ) {/* since no page cache to corrupt on directio we can change size safely */ return true;
fs/smb/client/fs_context.c +53 -54
196 lines not on this page · raw message
fs/smb/client/inode.c +45 -43
295 lines not on this page · raw message
fs/smb/client/ioctl.c +1 -1
@@ -220,7 +220,7 @@ static int cifs_shutdown(struct super_block *sb, unsigned long arg)*/ case CIFS_GOING_FLAGS_LOGFLUSH :case CIFS_GOING_FLAGS_NOLOGFLUSH : - sbi->mnt_cifs_flags |=CIFS_MOUNT_SHUTDOWN ; +atomic_or (CIFS_MOUNT_SHUTDOWN , &sbi->mnt_cifs_flags); goto shutdown_good;default : rc = -EINVAL ;
fs/smb/client/link.c +2 -2
@@ -604,9 +604,9 @@ cifs_symlink(struct mnt_idmap *idmap, struct inode *inode,cifs_dbg (FYI ,"symname is %s\n" , symname);/* BB what if DFS and this volume is on different share? BB */ -if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_MF_SYMLINKS ) { +if (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_MF_SYMLINKS ) { rc =create_mf_symlink (xid, pTcon, cifs_sb, full_path, symname); - }else if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_UNX_EMUL ) { + }else if (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_UNX_EMUL ) { rc =__cifs_sfu_make_node (xid, inode, direntry, pTcon, full_path,S_IFLNK ,0 , symname);#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
fs/smb/client/misc.c +6 -6
@@ -562,13 +562,13 @@ dump_smb(void *buf, int smb_buf_length)void cifs_autodisable_serverino (struct cifs_sb_info *cifs_sb) { -if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_SERVER_INUM ) { +if (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_SERVER_INUM ) {struct cifs_tcon *tcon =NULL ;if (cifs_sb->master_tlink) tcon =cifs_sb_master_tcon (cifs_sb); - cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_SERVER_INUM ; +atomic_andnot (CIFS_MOUNT_SERVER_INUM , &cifs_sb->mnt_cifs_flags); cifs_sb->mnt_cifs_serverino_autodisabled = true;cifs_dbg (VFS ,"Autodisabling the use of server inode numbers on %s\n" , tcon ? tcon->tree_name :"new server" );
@@ -669,11 +669,11 @@ void cifs_done_oplock_break(struct cifsInodeInfo *cinode)bool backup_cred (struct cifs_sb_info *cifs_sb) { -if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_CIFS_BACKUPUID ) { +if (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_CIFS_BACKUPUID ) {if (uid_eq (cifs_sb->ctx->backupuid,current_fsuid ()))return true; } -if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_CIFS_BACKUPGID ) { +if (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_CIFS_BACKUPGID ) {if (in_group_p (cifs_sb->ctx->backupgid))return true; }
@@ -1310,7 +1310,7 @@ int cifs_update_super_prepath(struct cifs_sb_info *cifs_sb, char *prefix)convert_delimiter (cifs_sb->prepath,CIFS_DIR_SEP (cifs_sb)); } - cifs_sb->mnt_cifs_flags |=CIFS_MOUNT_USE_PREFIX_PATH ; +atomic_or (CIFS_MOUNT_USE_PREFIX_PATH , &cifs_sb->mnt_cifs_flags);return 0 ; }
@@ -1339,7 +1339,7 @@ int cifs_inval_name_dfs_link_error(const unsigned int xid,* look up or tcon is not DFS. */ if (strlen (full_path) <2 || !cifs_sb || - (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_NO_DFS ) || + (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_NO_DFS ) || !is_tcon_dfs (tcon))return 0 ;
fs/smb/client/readdir.c +8 -8
@@ -121,7 +121,7 @@ cifs_prime_dcache(struct dentry *parent, struct qstr *name,* want to clobber the existing one with the one that * the readdir code created. */ -if (!(cifs_sb->mnt_cifs_flags &CIFS_MOUNT_SERVER_INUM )) +if (!(cifs_sb_flags (cifs_sb) &CIFS_MOUNT_SERVER_INUM )) fattr->cf_uniqueid =CIFS_I (inode)->uniqueid;/*
@@ -215,11 +215,11 @@ cifs_fill_common_info(struct cifs_fattr *fattr, struct cifs_sb_info *cifs_sb)* may look wrong since the inodes may not have timed out by the time * "ls" does a stat() call on them. */ -if ((cifs_sb->mnt_cifs_flags &CIFS_MOUNT_CIFS_ACL ) || - (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_MODE_FROM_SID )) +if ((cifs_sb_flags (cifs_sb) &CIFS_MOUNT_CIFS_ACL ) || + (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_MODE_FROM_SID )) fattr->cf_flags |=CIFS_FATTR_NEED_REVAL ; -if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_UNX_EMUL && +if (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_UNX_EMUL && fattr->cf_cifsattrs &ATTR_SYSTEM ) {if (fattr->cf_eof ==0 ) { fattr->cf_mode &= ~S_IFMT ;
@@ -395,7 +395,7 @@ _initiate_cifs_search(const unsigned int xid, struct file *file,else if ((tcon->ses->capabilities & tcon->ses->server->vals->cap_nt_find) ==0 ) { cifsFile->srch_inf.info_level =SMB_FIND_FILE_INFO_STANDARD ; - }else if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_SERVER_INUM ) { + }else if (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_SERVER_INUM ) { cifsFile->srch_inf.info_level =SMB_FIND_FILE_ID_FULL_DIR_INFO ; }else /* not srvinos - BB fixme add check for backlevel? */ { cifsFile->srch_inf.info_level =SMB_FIND_FILE_FULL_DIRECTORY_INFO ;
@@ -412,7 +412,7 @@ _initiate_cifs_search(const unsigned int xid, struct file *file,if (rc ==0 ) { cifsFile->invalidHandle = false; }else if ((rc == -EOPNOTSUPP ) && - (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_SERVER_INUM )) { + (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_SERVER_INUM )) {cifs_autodisable_serverino (cifs_sb); goto ffirst_retry; }
@@ -1005,14 +1005,14 @@ static int cifs_filldir(char *find_entry, struct file *file,break ; } -if (de.ino && (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_SERVER_INUM )) { +if (de.ino && (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_SERVER_INUM )) { fattr.cf_uniqueid = de.ino; }else { fattr.cf_uniqueid =iunique (sb,ROOT_I );cifs_autodisable_serverino (cifs_sb); } -if ((cifs_sb->mnt_cifs_flags &CIFS_MOUNT_MF_SYMLINKS ) && +if ((cifs_sb_flags (cifs_sb) &CIFS_MOUNT_MF_SYMLINKS ) &&couldbe_mf_symlink (&fattr))/* * trying to get the type and mode can be slow,
fs/smb/client/reparse.h +2 -2
@@ -32,7 +32,7 @@ static inline kuid_t wsl_make_kuid(struct cifs_sb_info *cifs_sb, {u32 uid =le32_to_cpu (*(__le32 *)ptr); -if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_OVERR_UID ) +if (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_OVERR_UID )return cifs_sb->ctx->linux_uid;return make_kuid (current_user_ns (), uid); }
@@ -42,7 +42,7 @@ static inline kgid_t wsl_make_kgid(struct cifs_sb_info *cifs_sb, {u32 gid =le32_to_cpu (*(__le32 *)ptr); -if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_OVERR_GID ) +if (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_OVERR_GID )return cifs_sb->ctx->linux_gid;return make_kgid (current_user_ns (), gid); }
fs/smb/client/smb1ops.c +2 -2
@@ -1323,7 +1323,7 @@ cifs_make_node(unsigned int xid, struct inode *inode, .mtime = NO_CHANGE_64, .device = dev, }; -if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_SET_UID ) { +if (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_SET_UID ) { args.uid =current_fsuid (); args.gid =current_fsgid (); }else {
@@ -1349,7 +1349,7 @@ cifs_make_node(unsigned int xid, struct inode *inode,* supports block and char device, socket & fifo, * and was used by default in earlier versions of Windows */ -if (!(cifs_sb->mnt_cifs_flags &CIFS_MOUNT_UNX_EMUL )) +if (!(cifs_sb_flags (cifs_sb) &CIFS_MOUNT_UNX_EMUL ))return -EPERM ;return cifs_sfu_make_node (xid, inode, dentry, tcon, full_path, mode, dev);
fs/smb/client/smb2misc.c +2 -2
@@ -495,9 +495,9 @@ cifs_convert_path_to_utf16(const char *from, struct cifs_sb_info *cifs_sb)__le16 *to;int map_type; -if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_MAP_SFM_CHR ) +if (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_MAP_SFM_CHR ) map_type =SFM_MAP_UNI_RSVD ; -else if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_MAP_SPECIAL_CHR ) +else if (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_MAP_SPECIAL_CHR ) map_type =SFU_MAP_UNI_RSVD ;else map_type =NO_MAP_UNI_RSVD ;
fs/smb/client/smb2ops.c +2 -2
@@ -1011,7 +1011,7 @@ smb2_is_path_accessible(const unsigned int xid, struct cifs_tcon *tcon, rc = -EREMOTE ; }if (rc == -EREMOTE &&IS_ENABLED (CONFIG_CIFS_DFS_UPCALL ) && cifs_sb && - (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_NO_DFS )) + (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_NO_DFS )) rc = -EOPNOTSUPP ; goto out; }
@@ -5321,7 +5321,7 @@ static int smb2_make_node(unsigned int xid, struct inode *inode,* supports block and char device, socket & fifo, * and was used by default in earlier versions of Windows */ -if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_UNX_EMUL ) { +if (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_UNX_EMUL ) { rc =cifs_sfu_make_node (xid, inode, dentry, tcon, full_path, mode, dev); }else {
fs/smb/client/smb2pdu.c +2 -2
@@ -3127,7 +3127,7 @@ SMB2_open_init(struct cifs_tcon *tcon, struct TCP_Server_Info *server,bool set_mode;bool set_owner; -if ((oparms->cifs_sb->mnt_cifs_flags &CIFS_MOUNT_MODE_FROM_SID ) && +if ((cifs_sb_flags (oparms->cifs_sb) &CIFS_MOUNT_MODE_FROM_SID ) && (oparms->mode !=ACL_NO_MODE )) set_mode = true;else {
@@ -3135,7 +3135,7 @@ SMB2_open_init(struct cifs_tcon *tcon, struct TCP_Server_Info *server, oparms->mode =ACL_NO_MODE ; } -if (oparms->cifs_sb->mnt_cifs_flags &CIFS_MOUNT_UID_FROM_ACL ) +if (cifs_sb_flags (oparms->cifs_sb) &CIFS_MOUNT_UID_FROM_ACL ) set_owner = true;else set_owner = false;
fs/smb/client/xattr.c +3 -3
@@ -147,7 +147,7 @@ static int cifs_xattr_set(const struct xattr_handler *handler,break ; } -if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_NO_XATTR ) +if (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_NO_XATTR ) goto out;if (pTcon->ses->server->ops->set_EA) {
@@ -299,7 +299,7 @@ static int cifs_xattr_get(const struct xattr_handler *handler,break ; } -if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_NO_XATTR ) +if (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_NO_XATTR ) goto out;if (pTcon->ses->server->ops->query_all_EAs)
@@ -373,7 +373,7 @@ ssize_t cifs_listxattr(struct dentry *direntry, char *data, size_t buf_size)if (unlikely (cifs_forced_shutdown (cifs_sb)))return -EIO ; -if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_NO_XATTR ) +if (cifs_sb_flags (cifs_sb) &CIFS_MOUNT_NO_XATTR )return -EOPNOTSUPP ; tlink =cifs_sb_tlink (cifs_sb);
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 3/3 smb: client: fix uid/gid override in getattr with posix extensions
In reply to Sasha LevinFrom: Paulo Alcantara <[email protected]>
[ Upstream commit cf4d35896621b7298eef51b7a465e5c0cb22f670 ]
When mounting with 'multiuser,posix' options, cifs_getattr() overrides the server-provided uid/gid with the current process's fsuid/fsgid. This is because the condition only checks for unix extensions (tcon->unix_ext) but not posix extensions (tcon->posix_extensions).
With SMB3 POSIX extensions, the server provides real uid/gid values just like with unix extensions, so they should be preserved rather than replaced with the caller's credentials.
Add a tcon->posix_extensions check to the condition so that uid/gid from the server are properly reported in stat results.
--- fs/smb/client/inode.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
fs/smb/client/inode.c +4 -4
@@ -2883,14 +2883,14 @@ int cifs_getattr(struct mnt_idmap *idmap, const struct path *path, stat->attributes |=STATX_ATTR_ENCRYPTED ;/* -* If on a multiuser mount without unix extensions or cifsacl being -* enabled, and the admin hasn't overridden them, set the ownership -* to the fsuid/fsgid of the current process. +* If on a multiuser mount without unix extensions, posix extensions +* or cifsacl being enabled, and the admin hasn't overridden them, +* set the ownership to the fsuid/fsgid of the current process. */ sbflags =cifs_sb_flags (cifs_sb);if ((sbflags &CIFS_MOUNT_MULTIUSER ) && !(sbflags &CIFS_MOUNT_CIFS_ACL ) && - !tcon->unix_ext) { + !tcon->unix_ext && !tcon->posix_extensions) {if (!(sbflags &CIFS_MOUNT_OVERR_UID )) stat->uid =current_fsuid ();if (!(sbflags &CIFS_MOUNT_OVERR_GID ))
Signature · 1 line
2.53.0