From nobody Sat Jul 25 18:03:39 2026 Received: from mailgw.kylinos.cn (mailgw.kylinos.cn [124.126.103.232]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D28383C4B91; Wed, 15 Jul 2026 07:49:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=124.126.103.232 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784101800; cv=none; b=Y9zED0QJObv+sod+WYjVGjaQn2RdFaXCPYTBh0pFKPHj/6UeJQmosO/WUMw+pqz/aOt97ZX3i8aK12E+3fzG8X1reBFO8IiyghEeV5AxZ8oT6vMBTwurry2sBB2p4tFGKcSLxRAXaq6zEU8cFtZRtyvlqK136fSojMtdCqeYBrU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784101800; c=relaxed/simple; bh=FB+6u+wbxeFSYP1QIRXzhmQb03MXYiYu+cBbXpAH4m4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=dDiA9Ly4vgpV7SPbrgc5QmdxpvE6OY1o5h0YYh2RcHJ7SVy9NeyuvOKN6c1vyxS+8FiGZ4Wg+NsDy8LWm3rwwTNGGvRTmoWqCDiKIbUrtpjnce/Wcp5frrW8u7+BeTQJ8+Se7lQSgBPUlYmCYtg89AFwZaXPO0ymVp2y8hqaIYs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn; spf=pass smtp.mailfrom=kylinos.cn; arc=none smtp.client-ip=124.126.103.232 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kylinos.cn X-UUID: c1ecaa30802111f1aa26b74ffac11d73-20260715 X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.3.12,REQID:fee06eb5-8eb2-4ca4-8922-2d5de64cb917,IP:10, URL:0,TC:0,Content:-5,EDM:-25,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACT ION:release,TS:-20 X-CID-INFO: VERSION:1.3.12,REQID:fee06eb5-8eb2-4ca4-8922-2d5de64cb917,IP:10,UR L:0,TC:0,Content:-5,EDM:-25,RT:0,SF:0,FILE:0,BULK:0,RULE:NOTI_GNA5D1EA,ACT ION:release,TS:-20 X-CID-META: VersionHash:e7bac3a,CLOUDID:d8d345ba70ed9fc0aad90d5cddf6e7cf,BulkI D:2607151549529E9JRIL4,BulkQuantity:0,Recheck:0,SF:10|38|66|78|81|82|102|1 27|136|865|898,TC:nil,Content:0|15|50,EDM:2,IP:-2,URL:0,File:nil,RT:nil,Bu lk:nil,QS:nil,BEC:nil,COL:0,OSI:0,OSA:0,AV:0,LES:1,SPR:NO,DKR:0,DKP:0,BRR: 0,BRE:0,ARC:0 X-CID-BVR: 2,SSN|SDN X-CID-BAS: 2,SSN|SDN,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR X-CID-RHF: D41D8CD98F00B204E9800998ECF8427E X-UUID: c1ecaa30802111f1aa26b74ffac11d73-20260715 X-User: tanze@kylinos.cn Received: from desktop-od00ebi.localdomain [(116.128.244.169)] by mailgw.kylinos.cn (envelope-from ) (Generic MTA with TLSv1.3 TLS_AES_256_GCM_SHA384 256/256) with ESMTP id 254930475; Wed, 15 Jul 2026 15:49:50 +0800 From: Ze Tan To: sfrench@samba.org, pc@manguebit.org, sprasad@microsoft.com, linkinjeon@kernel.org, senozhatsky@chromium.org, chenxiaosong@chenxiaosong.com, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org Cc: linux-kernel@vger.kernel.org Subject: [RFC PATCH 1/9] smb: client: support security.capability over EAs Date: Wed, 15 Jul 2026 15:48:42 +0800 Message-ID: <20260715074908.641940-2-tanze@kylinos.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260715074908.641940-1-tanze@kylinos.cn> References: <20260715074908.641940-1-tanze@kylinos.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" generic/093 uses setcap and getcap to check that a write clears the file capability. The CIFS client does not have a security xattr handler, so these commands cannot set or read security.capability through SMB EAs. Register a security xattr handler and build the complete EA name for SET_INFO and QUERY_INFO. Keep security.capability unchanged in EA lists. Reject other security xattrs. Signed-off-by: Ze Tan --- fs/smb/client/smb2ops.c | 26 ++++++++++++--- fs/smb/client/xattr.c | 70 ++++++++++++++++++++++++++++++++++++++--- 2 files changed, 87 insertions(+), 9 deletions(-) diff --git a/fs/smb/client/smb2ops.c b/fs/smb/client/smb2ops.c index 06e9322a762a..d58185f676a4 100644 --- a/fs/smb/client/smb2ops.c +++ b/fs/smb/client/smb2ops.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include "cifsfs.h" #include "cifsglob.h" @@ -1043,6 +1044,15 @@ static int smb2_query_file_info(const unsigned int x= id, struct cifs_tcon *tcon, } =20 #ifdef CONFIG_CIFS_XATTR +static bool cifs_passthrough(const char *name, size_t name_len) +{ + if (name_len =3D=3D sizeof(XATTR_NAME_CAPS) - 1 && + !memcmp(name, XATTR_NAME_CAPS, name_len)) + return true; + + return false; +} + static ssize_t move_smb2_ea_to_cifs(char *dst, size_t dst_size, struct smb2_file_full_ea_info *src, size_t src_size, @@ -1085,16 +1095,24 @@ move_smb2_ea_to_cifs(char *dst, size_t dst_size, goto out; } } else { - /* 'user.' plus a terminating null */ - user_name_len =3D 5 + 1 + name_len; + bool passthrough_name; + + passthrough_name =3D cifs_passthrough(name, name_len); + if (passthrough_name) + user_name_len =3D name_len + 1; + else + /* 'user.' plus a terminating null */ + user_name_len =3D 5 + 1 + name_len; =20 if (buf_size =3D=3D 0) { /* skip copy - calc size only */ rc +=3D user_name_len; } else if (dst_size >=3D user_name_len) { dst_size -=3D user_name_len; - memcpy(dst, "user.", 5); - dst +=3D 5; + if (!passthrough_name) { + memcpy(dst, "user.", 5); + dst +=3D 5; + } memcpy(dst, src->ea_data, name_len); dst +=3D name_len; *dst =3D 0; diff --git a/fs/smb/client/xattr.c b/fs/smb/client/xattr.c index 5091f6c0d7fe..8fa40593bc93 100644 --- a/fs/smb/client/xattr.c +++ b/fs/smb/client/xattr.c @@ -36,12 +36,38 @@ #define SMB3_XATTR_CIFS_NTSD_FULL "system.smb3_ntsd_full" /* owner/DACL/SA= CL */ #define SMB3_XATTR_ATTRIB "smb3.dosattrib" /* full name: user.smb3.dosatt= rib */ #define SMB3_XATTR_CREATETIME "smb3.creationtime" /* user.smb3.creationti= me */ -/* BB need to add server (Samba e.g) support for security and trusted pref= ix */ - -enum { XATTR_USER, XATTR_CIFS_ACL, XATTR_ACL_ACCESS, XATTR_ACL_DEFAULT, +enum { XATTR_USER, XATTR_SECURITY, + XATTR_CIFS_ACL, XATTR_ACL_ACCESS, XATTR_ACL_DEFAULT, XATTR_CIFS_NTSD_SACL, XATTR_CIFS_NTSD_OWNER, XATTR_CIFS_NTSD, XATTR_CIFS_NTSD_FULL }; =20 +static int cifs_build_ea_name(int xattr_flag, const char *name, char *ea_n= ame, + size_t ea_name_size) +{ + size_t name_len; + + switch (xattr_flag) { + case XATTR_SECURITY: + /* + * Only security.capability has native Linux security xattr + * semantics on POSIX-capable servers. + */ + if (strcmp(name, XATTR_CAPS_SUFFIX)) + return -EOPNOTSUPP; + name_len =3D strlen(name); + if (ea_name_size <=3D XATTR_SECURITY_PREFIX_LEN || + name_len > ea_name_size - XATTR_SECURITY_PREFIX_LEN - 1) + return -ERANGE; + memcpy(ea_name, XATTR_SECURITY_PREFIX, + XATTR_SECURITY_PREFIX_LEN); + memcpy(ea_name + XATTR_SECURITY_PREFIX_LEN, name, + name_len + 1); + return XATTR_SECURITY_PREFIX_LEN + name_len; + default: + return -EOPNOTSUPP; + } +} + static int cifs_attrib_set(unsigned int xid, struct cifs_tcon *pTcon, struct inode *inode, const char *full_path, const void *value, size_t size) @@ -104,6 +130,8 @@ static int cifs_xattr_set(const struct xattr_handler *h= andler, struct cifs_tcon *pTcon; const char *full_path; void *page; + char ea_name[XATTR_NAME_MAX + 1]; + const char *server_ea_name =3D name; =20 tlink =3D cifs_sb_tlink(cifs_sb); if (IS_ERR(tlink)) @@ -131,6 +159,16 @@ static int cifs_xattr_set(const struct xattr_handler *= handler, } =20 switch (handler->flags) { + case XATTR_SECURITY: + rc =3D cifs_build_ea_name(handler->flags, name, ea_name, + sizeof(ea_name)); + if (rc < 0) + goto out; + server_ea_name =3D ea_name; + cifs_dbg(FYI, "%s: setting security xattr %s\n", + __func__, name); + goto set_ea; + case XATTR_USER: cifs_dbg(FYI, "%s:setting user xattr %s\n", __func__, name); if ((strcmp(name, CIFS_XATTR_ATTRIB) =3D=3D 0) || @@ -149,12 +187,13 @@ static int cifs_xattr_set(const struct xattr_handler = *handler, break; } =20 +set_ea: if (cifs_sb_flags(cifs_sb) & CIFS_MOUNT_NO_XATTR) goto out; =20 if (pTcon->ses->server->ops->set_EA) { rc =3D pTcon->ses->server->ops->set_EA(xid, pTcon, - full_path, name, value, (__u16)size, + full_path, server_ea_name, value, (__u16)size, cifs_sb->local_nls, cifs_sb); if (rc =3D=3D 0) inode_set_ctime_current(inode); @@ -280,6 +319,8 @@ static int cifs_xattr_get(const struct xattr_handler *h= andler, struct cifs_tcon *pTcon; const char *full_path; void *page; + char ea_name[XATTR_NAME_MAX + 1]; + const char *server_ea_name =3D name; =20 tlink =3D cifs_sb_tlink(cifs_sb); if (IS_ERR(tlink)) @@ -297,6 +338,16 @@ static int cifs_xattr_get(const struct xattr_handler *= handler, =20 /* return alt name if available as pseudo attr */ switch (handler->flags) { + case XATTR_SECURITY: + rc =3D cifs_build_ea_name(handler->flags, name, ea_name, + sizeof(ea_name)); + if (rc < 0) + goto out; + server_ea_name =3D ea_name; + cifs_dbg(FYI, "%s: querying security xattr %s\n", + __func__, name); + goto query_ea; + case XATTR_USER: cifs_dbg(FYI, "%s:querying user xattr %s\n", __func__, name); if ((strcmp(name, CIFS_XATTR_ATTRIB) =3D=3D 0) || @@ -309,12 +360,13 @@ static int cifs_xattr_get(const struct xattr_handler = *handler, break; } =20 +query_ea: if (cifs_sb_flags(cifs_sb) & CIFS_MOUNT_NO_XATTR) goto out; =20 if (pTcon->ses->server->ops->query_all_EAs) rc =3D pTcon->ses->server->ops->query_all_EAs(xid, pTcon, - full_path, name, value, size, cifs_sb); + full_path, server_ea_name, value, size, cifs_sb); break; =20 case XATTR_CIFS_ACL: @@ -438,6 +490,13 @@ static const struct xattr_handler cifs_user_xattr_hand= ler =3D { .set =3D cifs_xattr_set, }; =20 +static const struct xattr_handler cifs_security_xattr_handler =3D { + .prefix =3D XATTR_SECURITY_PREFIX, + .flags =3D XATTR_SECURITY, + .get =3D cifs_xattr_get, + .set =3D cifs_xattr_set, +}; + /* os2.* attributes are treated like user.* attributes */ static const struct xattr_handler cifs_os2_xattr_handler =3D { .prefix =3D XATTR_OS2_PREFIX, @@ -522,6 +581,7 @@ static const struct xattr_handler smb3_ntsd_full_xattr_= handler =3D { =20 const struct xattr_handler * const cifs_xattr_handlers[] =3D { &cifs_user_xattr_handler, + &cifs_security_xattr_handler, &cifs_os2_xattr_handler, &cifs_cifs_acl_xattr_handler, &smb3_acl_xattr_handler, /* alias for above since avoiding "cifs" */ --=20 2.43.0 From nobody Sat Jul 25 18:03:39 2026 Received: from mailgw.kylinos.cn (mailgw.kylinos.cn [124.126.103.232]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ABC953C4B68; Wed, 15 Jul 2026 07:49:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=124.126.103.232 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784101798; cv=none; b=HQ4wIOm4FLJJHS3FE8SvamFvLESFGaPNqV2wGfHJ8dv2HgydxP455H9Q+MntTOPgmGca+hMBBREs6Un4PBUe7jsJKXWqc1CyhqAvSr/IEijSirAv0faK0EjVz/25wfUtBBhcdXWqTuk27aZR7rONnwqmKO7hw9Gr6uxAbxltv10= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784101798; c=relaxed/simple; bh=vAmiKnsfWp7wv6ZkV/CdavOJ2+yMtMAuPwQaPuy88B4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=h+9Fr2JgHF9s2T8uebmkUEXddpIhY/JCpet0Sa9GgxiXlFC3D1sd0DiS/pGvBtZ7xU7GduBhILNbaFnhZ0KrHggRqPBEv/yz+rl1Ci9MR66OpLh4cxvc91W3qG2kBSBmkleXx4zjYI+gBHlfmA79xIeasyy2+e4sBM9EmZAO7Sk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn; spf=pass smtp.mailfrom=kylinos.cn; arc=none smtp.client-ip=124.126.103.232 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kylinos.cn X-UUID: c2bf64f2802111f1aa26b74ffac11d73-20260715 X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.3.12,REQID:35c74c98-cd0c-409c-93ec-7ae468a829bf,IP:10, URL:0,TC:0,Content:0,EDM:-25,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTI ON:release,TS:-15 X-CID-INFO: VERSION:1.3.12,REQID:35c74c98-cd0c-409c-93ec-7ae468a829bf,IP:10,UR L:0,TC:0,Content:0,EDM:-25,RT:0,SF:0,FILE:0,BULK:0,RULE:NOTI_GNA5D1EA,ACTI ON:release,TS:-15 X-CID-META: VersionHash:e7bac3a,CLOUDID:73218a2bdec76720b204af9bb3a158e8,BulkI D:260715154952KC247HY3,BulkQuantity:0,Recheck:0,SF:10|38|66|78|81|82|102|1 27|136|865|898,TC:nil,Content:0|15|50,EDM:2,IP:-2,URL:0,File:nil,RT:nil,Bu lk:nil,QS:nil,BEC:nil,COL:0,OSI:0,OSA:0,AV:0,LES:1,SPR:NO,DKR:0,DKP:0,BRR: 0,BRE:0,ARC:0 X-CID-BVR: 2,SSN|SDN X-CID-BAS: 2,SSN|SDN,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR X-CID-RHF: D41D8CD98F00B204E9800998ECF8427E X-UUID: c2bf64f2802111f1aa26b74ffac11d73-20260715 X-User: tanze@kylinos.cn Received: from desktop-od00ebi.localdomain [(116.128.244.169)] by mailgw.kylinos.cn (envelope-from ) (Generic MTA with TLSv1.3 TLS_AES_256_GCM_SHA384 256/256) with ESMTP id 234420161; Wed, 15 Jul 2026 15:49:51 +0800 From: Ze Tan To: sfrench@samba.org, pc@manguebit.org, sprasad@microsoft.com, linkinjeon@kernel.org, senozhatsky@chromium.org, chenxiaosong@chenxiaosong.com, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org Cc: linux-kernel@vger.kernel.org Subject: [RFC PATCH 2/9] smb: client: support security.xfstests over EAs Date: Wed, 15 Jul 2026 15:48:43 +0800 Message-ID: <20260715074908.641940-3-tanze@kylinos.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260715074908.641940-1-tanze@kylinos.cn> References: <20260715074908.641940-1-tanze@kylinos.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Before checking file capabilities, generic/093 calls _require_attrs security. This helper runs "setfattr -n security.xfstests" to check the security xattr namespace. The security handler supports only security.capability, so this command returns "Operation not supported". Add security.xfstests as another exact security EA name. Keep this name unchanged in EA lists. Continue to reject other security xattrs. Signed-off-by: Ze Tan --- fs/smb/client/smb2ops.c | 4 ++++ fs/smb/client/xattr.c | 7 ++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/fs/smb/client/smb2ops.c b/fs/smb/client/smb2ops.c index d58185f676a4..bfa089511b9b 100644 --- a/fs/smb/client/smb2ops.c +++ b/fs/smb/client/smb2ops.c @@ -1050,6 +1050,10 @@ static bool cifs_passthrough(const char *name, size_= t name_len) !memcmp(name, XATTR_NAME_CAPS, name_len)) return true; =20 + if (name_len =3D=3D sizeof(XATTR_SECURITY_PREFIX "xfstests") - 1 && + !memcmp(name, XATTR_SECURITY_PREFIX "xfstests", name_len)) + return true; + return false; } =20 diff --git a/fs/smb/client/xattr.c b/fs/smb/client/xattr.c index 8fa40593bc93..42db6920901e 100644 --- a/fs/smb/client/xattr.c +++ b/fs/smb/client/xattr.c @@ -49,10 +49,11 @@ static int cifs_build_ea_name(int xattr_flag, const cha= r *name, char *ea_name, switch (xattr_flag) { case XATTR_SECURITY: /* - * Only security.capability has native Linux security xattr - * semantics on POSIX-capable servers. + * Only security.capability and the xfstests security namespace + * probe are supported on POSIX-capable servers. */ - if (strcmp(name, XATTR_CAPS_SUFFIX)) + if (strcmp(name, XATTR_CAPS_SUFFIX) && + strcmp(name, "xfstests")) return -EOPNOTSUPP; name_len =3D strlen(name); if (ea_name_size <=3D XATTR_SECURITY_PREFIX_LEN || --=20 2.43.0 From nobody Sat Jul 25 18:03:39 2026 Received: from mailgw.kylinos.cn (mailgw.kylinos.cn [124.126.103.232]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8564D39CD14; Wed, 15 Jul 2026 07:49:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=124.126.103.232 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784101799; cv=none; b=g11RDL8UJ53noi5IqNsnx4CRROur6FyW/g8+XHlBKM8jTwRcaIq/pn7E/GNoDUP+Jc4Xgvq3pnOdFnEbsmYgoFOW1u9WD6gTz2wjt7zoSQby/aJltbeynK3mlnD03g8cAeeNjc8BVb+Zy3U/unq8bDLQEXV82fF289BSqsAAvZU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784101799; c=relaxed/simple; bh=/5WCWfYXAq8EntAMv6/6cGSOGkG7ba26sQTuaQ77KLM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MMKvS1lYcFly7lzQOEyte012clozmn4WLoaqUN8UwETIgV+bG2d2b4hS5ltRd+gGRzHObpV1XX/7NqzpMSVcU0ssDGFkYZdbxE01CzdNHEzm5CBB7K2q9dRNkW+jIIXzvajfF73lAMD6HzJeN0FH8vlvKJHX+heSiSlXkAZQt30= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn; spf=pass smtp.mailfrom=kylinos.cn; arc=none smtp.client-ip=124.126.103.232 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kylinos.cn X-UUID: c36bc0d0802111f1aa26b74ffac11d73-20260715 X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.3.12,REQID:1a0a254a-9fba-45ea-b256-bbfd0b4f55a4,IP:10, URL:0,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION :release,TS:10 X-CID-INFO: VERSION:1.3.12,REQID:1a0a254a-9fba-45ea-b256-bbfd0b4f55a4,IP:10,UR L:0,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION:r elease,TS:10 X-CID-META: VersionHash:e7bac3a,CLOUDID:c2186a120d102ddcbeeff3a3ab9d219b,BulkI D:2607151549528UYP0MYR,BulkQuantity:0,Recheck:0,SF:10|38|66|78|81|82|102|1 27|136|865|898,TC:nil,Content:0|15|50,EDM:-3,IP:-2,URL:0,File:nil,RT:nil,B ulk:nil,QS:nil,BEC:nil,COL:0,OSI:0,OSA:0,AV:0,LES:1,SPR:NO,DKR:0,DKP:0,BRR :0,BRE:0,ARC:0 X-CID-BVR: 2,SSN|SDN X-CID-BAS: 2,SSN|SDN,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR X-CID-RHF: D41D8CD98F00B204E9800998ECF8427E X-UUID: c36bc0d0802111f1aa26b74ffac11d73-20260715 X-User: tanze@kylinos.cn Received: from desktop-od00ebi.localdomain [(116.128.244.169)] by mailgw.kylinos.cn (envelope-from ) (Generic MTA with TLSv1.3 TLS_AES_256_GCM_SHA384 256/256) with ESMTP id 304849699; Wed, 15 Jul 2026 15:49:52 +0800 From: Ze Tan To: sfrench@samba.org, pc@manguebit.org, sprasad@microsoft.com, linkinjeon@kernel.org, senozhatsky@chromium.org, chenxiaosong@chenxiaosong.com, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org Cc: linux-kernel@vger.kernel.org Subject: [RFC PATCH 3/9] smb: client: support trusted xattrs over EAs Date: Wed, 15 Jul 2026 15:48:44 +0800 Message-ID: <20260715074908.641940-4-tanze@kylinos.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260715074908.641940-1-tanze@kylinos.cn> References: <20260715074908.641940-1-tanze@kylinos.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" generic/093 uses setfattr and getfattr to check that a write does not clear trusted.name. The CIFS client does not have a trusted xattr handler, so these commands cannot set or read trusted xattrs through SMB EAs. Register a trusted xattr handler and build the complete trusted EA name for SET_INFO and QUERY_INFO. Keep the trusted prefix in EA lists. Signed-off-by: Ze Tan --- fs/smb/client/smb2ops.c | 4 ++++ fs/smb/client/xattr.c | 40 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/fs/smb/client/smb2ops.c b/fs/smb/client/smb2ops.c index bfa089511b9b..e1f88a0c6842 100644 --- a/fs/smb/client/smb2ops.c +++ b/fs/smb/client/smb2ops.c @@ -1046,6 +1046,10 @@ static int smb2_query_file_info(const unsigned int x= id, struct cifs_tcon *tcon, #ifdef CONFIG_CIFS_XATTR static bool cifs_passthrough(const char *name, size_t name_len) { + if (name_len > XATTR_TRUSTED_PREFIX_LEN && + !memcmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN)) + return true; + if (name_len =3D=3D sizeof(XATTR_NAME_CAPS) - 1 && !memcmp(name, XATTR_NAME_CAPS, name_len)) return true; diff --git a/fs/smb/client/xattr.c b/fs/smb/client/xattr.c index 42db6920901e..3dae8b23aca7 100644 --- a/fs/smb/client/xattr.c +++ b/fs/smb/client/xattr.c @@ -36,7 +36,7 @@ #define SMB3_XATTR_CIFS_NTSD_FULL "system.smb3_ntsd_full" /* owner/DACL/SA= CL */ #define SMB3_XATTR_ATTRIB "smb3.dosattrib" /* full name: user.smb3.dosatt= rib */ #define SMB3_XATTR_CREATETIME "smb3.creationtime" /* user.smb3.creationti= me */ -enum { XATTR_USER, XATTR_SECURITY, +enum { XATTR_USER, XATTR_TRUSTED, XATTR_SECURITY, XATTR_CIFS_ACL, XATTR_ACL_ACCESS, XATTR_ACL_DEFAULT, XATTR_CIFS_NTSD_SACL, XATTR_CIFS_NTSD_OWNER, XATTR_CIFS_NTSD, XATTR_CIFS_NTSD_FULL }; @@ -64,6 +64,16 @@ static int cifs_build_ea_name(int xattr_flag, const char= *name, char *ea_name, memcpy(ea_name + XATTR_SECURITY_PREFIX_LEN, name, name_len + 1); return XATTR_SECURITY_PREFIX_LEN + name_len; + case XATTR_TRUSTED: + name_len =3D strlen(name); + if (ea_name_size <=3D XATTR_TRUSTED_PREFIX_LEN || + name_len > ea_name_size - XATTR_TRUSTED_PREFIX_LEN - 1) + return -ERANGE; + memcpy(ea_name, XATTR_TRUSTED_PREFIX, + XATTR_TRUSTED_PREFIX_LEN); + memcpy(ea_name + XATTR_TRUSTED_PREFIX_LEN, name, + name_len + 1); + return XATTR_TRUSTED_PREFIX_LEN + name_len; default: return -EOPNOTSUPP; } @@ -160,6 +170,16 @@ static int cifs_xattr_set(const struct xattr_handler *= handler, } =20 switch (handler->flags) { + case XATTR_TRUSTED: + rc =3D cifs_build_ea_name(handler->flags, name, ea_name, + sizeof(ea_name)); + if (rc < 0) + goto out; + server_ea_name =3D ea_name; + cifs_dbg(FYI, "%s: setting trusted xattr %s\n", + __func__, name); + goto set_ea; + case XATTR_SECURITY: rc =3D cifs_build_ea_name(handler->flags, name, ea_name, sizeof(ea_name)); @@ -339,6 +359,16 @@ static int cifs_xattr_get(const struct xattr_handler *= handler, =20 /* return alt name if available as pseudo attr */ switch (handler->flags) { + case XATTR_TRUSTED: + rc =3D cifs_build_ea_name(handler->flags, name, ea_name, + sizeof(ea_name)); + if (rc < 0) + goto out; + server_ea_name =3D ea_name; + cifs_dbg(FYI, "%s: querying trusted xattr %s\n", + __func__, name); + goto query_ea; + case XATTR_SECURITY: rc =3D cifs_build_ea_name(handler->flags, name, ea_name, sizeof(ea_name)); @@ -491,6 +521,13 @@ static const struct xattr_handler cifs_user_xattr_hand= ler =3D { .set =3D cifs_xattr_set, }; =20 +static const struct xattr_handler cifs_trusted_xattr_handler =3D { + .prefix =3D XATTR_TRUSTED_PREFIX, + .flags =3D XATTR_TRUSTED, + .get =3D cifs_xattr_get, + .set =3D cifs_xattr_set, +}; + static const struct xattr_handler cifs_security_xattr_handler =3D { .prefix =3D XATTR_SECURITY_PREFIX, .flags =3D XATTR_SECURITY, @@ -582,6 +619,7 @@ static const struct xattr_handler smb3_ntsd_full_xattr_= handler =3D { =20 const struct xattr_handler * const cifs_xattr_handlers[] =3D { &cifs_user_xattr_handler, + &cifs_trusted_xattr_handler, &cifs_security_xattr_handler, &cifs_os2_xattr_handler, &cifs_cifs_acl_xattr_handler, --=20 2.43.0 From nobody Sat Jul 25 18:03:39 2026 Received: from mailgw.kylinos.cn (mailgw.kylinos.cn [124.126.103.232]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 92EC73C5837; Wed, 15 Jul 2026 07:49:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=124.126.103.232 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784101805; cv=none; b=JzjbSrquQAZYcY6FqIvit7FWZBnAtPLQuU0XptCUcBu9z54U+gsD+YTIr+i4CCXcdURsqrPjy6a017RmAmZKEe+OOTN5O58HeDr0cZkF7PpZGzqCtxdOJ9HA6x66GJP63LN5ZJ3R/aGHlu019NjWnQxAT9K3o4vDxE31gGjPZe0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784101805; c=relaxed/simple; bh=sMW/eSg6SUKX0VdP07zsSqXpyL7C0nvSQ3GxGpNahjI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AAyXtL8TIFRkhQmwUwqBuk0uAdG91Q9nLeOLCXll5QoCocw5CacgKoEfIApxXDRCh5PknF7I340klBDvLsxz5XYCkvskNAFqiZURvfC30ggyzxXu8GYWCc3aKq37V2oFcfiBIMd68ZNzNAPz82g9ahe1HXmLtHpFrEXJLdmukZI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn; spf=pass smtp.mailfrom=kylinos.cn; arc=none smtp.client-ip=124.126.103.232 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kylinos.cn X-UUID: c4107742802111f1aa26b74ffac11d73-20260715 X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.3.12,REQID:4b72f488-e7a6-43c2-b4ab-d521fb7614af,IP:10, URL:0,TC:0,Content:-25,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTI ON:release,TS:-15 X-CID-INFO: VERSION:1.3.12,REQID:4b72f488-e7a6-43c2-b4ab-d521fb7614af,IP:10,UR L:0,TC:0,Content:-25,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION :release,TS:-15 X-CID-META: VersionHash:e7bac3a,CLOUDID:dbaca5684c4ae5c397ed63075caacf68,BulkI D:260715154955AVPAJO36,BulkQuantity:0,Recheck:0,SF:10|38|66|78|81|82|102|1 27|865|898,TC:nil,Content:0|15|50,EDM:-3,IP:-2,URL:0,File:nil,RT:nil,Bulk: nil,QS:nil,BEC:nil,COL:0,OSI:0,OSA:0,AV:0,LES:1,SPR:NO,DKR:0,DKP:0,BRR:0,B RE:0,ARC:0 X-CID-BVR: 2,SSN|SDN X-CID-BAS: 2,SSN|SDN,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR X-CID-RHF: D41D8CD98F00B204E9800998ECF8427E X-UUID: c4107742802111f1aa26b74ffac11d73-20260715 X-User: tanze@kylinos.cn Received: from desktop-od00ebi.localdomain [(116.128.244.169)] by mailgw.kylinos.cn (envelope-from ) (Generic MTA with TLSv1.3 TLS_AES_256_GCM_SHA384 256/256) with ESMTP id 1576581277; Wed, 15 Jul 2026 15:49:53 +0800 From: Ze Tan To: sfrench@samba.org, pc@manguebit.org, sprasad@microsoft.com, linkinjeon@kernel.org, senozhatsky@chromium.org, chenxiaosong@chenxiaosong.com, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org Cc: linux-kernel@vger.kernel.org Subject: [RFC PATCH 4/9] ksmbd: extract SMB EA backing xattr name mapping Date: Wed, 15 Jul 2026 15:48:45 +0800 Message-ID: <20260715074908.641940-5-tanze@kylinos.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260715074908.641940-1-tanze@kylinos.cn> References: <20260715074908.641940-1-tanze@kylinos.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" smb2_set_ea() directly adds the user prefix when it builds the backing xattr name. This mixes name conversion with the set operation. Extract ksmbd_map_ea_name_to_xattr() and keep the existing behavior unchanged. Signed-off-by: Ze Tan --- fs/smb/server/smb2pdu.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/fs/smb/server/smb2pdu.c b/fs/smb/server/smb2pdu.c index 295cca6cf3ae..1e4ea33d7001 100644 --- a/fs/smb/server/smb2pdu.c +++ b/fs/smb/server/smb2pdu.c @@ -2734,6 +2734,18 @@ static bool smb2_is_private_ea(const char *name, siz= e_t name_len) return false; } =20 +static int ksmbd_map_ea_name_to_xattr(const char *ea_name, + size_t ea_name_len, char *attr_name) +{ + if (ea_name_len > XATTR_NAME_MAX - XATTR_USER_PREFIX_LEN) + return -EINVAL; + + memcpy(attr_name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN); + memcpy(&attr_name[XATTR_USER_PREFIX_LEN], ea_name, ea_name_len); + attr_name[XATTR_USER_PREFIX_LEN + ea_name_len] =3D '\0'; + return XATTR_USER_PREFIX_LEN + ea_name_len; +} + /** * smb2_set_ea() - handler for setting extended attributes using set * info command @@ -2749,7 +2761,7 @@ static int smb2_set_ea(struct smb2_ea_info *eabuf, un= signed int buf_len, { struct mnt_idmap *idmap =3D mnt_idmap(path->mnt); char *attr_name =3D NULL, *value; - int rc =3D 0; + int rc =3D 0, attr_name_len; unsigned int next =3D 0; =20 if (buf_len < sizeof(struct smb2_ea_info) + eabuf->EaNameLength + 1 + @@ -2770,8 +2782,10 @@ static int smb2_set_ea(struct smb2_ea_info *eabuf, u= nsigned int buf_len, le16_to_cpu(eabuf->EaValueLength), le32_to_cpu(eabuf->NextEntryOffset)); =20 - if (eabuf->EaNameLength > - (XATTR_NAME_MAX - XATTR_USER_PREFIX_LEN)) { + attr_name_len =3D ksmbd_map_ea_name_to_xattr(eabuf->name, + eabuf->EaNameLength, + attr_name); + if (attr_name_len < 0) { rc =3D -EINVAL; break; } @@ -2780,18 +2794,13 @@ static int smb2_set_ea(struct smb2_ea_info *eabuf, = unsigned int buf_len, break; } =20 - memcpy(attr_name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN); - memcpy(&attr_name[XATTR_USER_PREFIX_LEN], eabuf->name, - eabuf->EaNameLength); - attr_name[XATTR_USER_PREFIX_LEN + eabuf->EaNameLength] =3D '\0'; value =3D (char *)&eabuf->name + eabuf->EaNameLength + 1; =20 if (!eabuf->EaValueLength) { rc =3D ksmbd_vfs_casexattr_len(idmap, path->dentry, attr_name, - XATTR_USER_PREFIX_LEN + - eabuf->EaNameLength); + attr_name_len); =20 /* delete the EA only when it exits */ if (rc > 0) { --=20 2.43.0 From nobody Sat Jul 25 18:03:39 2026 Received: from mailgw.kylinos.cn (mailgw.kylinos.cn [124.126.103.232]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 29D1C3C584B; Wed, 15 Jul 2026 07:49:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=124.126.103.232 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784101807; cv=none; b=jjRaGmiKY6EAz/PjLkx0vcWqCOP7rkNOKGJPE8/yTpC0re9NJoW9ClHRNs22o0ehLflmVR8rxfVaUNllr9RplYv3vKtL8x8VflmrhbZTRFnPSS/qdCpf9gFjF2PXn8j1W7MEp9uEA+5OZ5NLBOTv451BEACLeTjdriTc/DjpAA8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784101807; c=relaxed/simple; bh=6vumLtg+NSqh9KEl72aJmIZBwm1412P2yAKu432IMf0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MRahH/X9rXQ+DlvWLRqPneu0ESbeZVjo72yYbqX6PVkzqW0B5H4yDQag26AykgjN2gmjNEfSG/QKEpxQOIbOpNdCU00tJkps9xFKqJexuY4M2xgBkAqG2WmXhYqEQnWMOrae0vyu0FH26LJ0FN+eTaJl1O/EKAWMm78EwXaXU1k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn; spf=pass smtp.mailfrom=kylinos.cn; arc=none smtp.client-ip=124.126.103.232 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kylinos.cn X-UUID: c4bd38ec802111f1aa26b74ffac11d73-20260715 X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.3.12,REQID:c279df7d-e89e-44c8-b280-42f78d5151b2,IP:10, URL:0,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION :release,TS:10 X-CID-INFO: VERSION:1.3.12,REQID:c279df7d-e89e-44c8-b280-42f78d5151b2,IP:10,UR L:0,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION:r elease,TS:10 X-CID-META: VersionHash:e7bac3a,CLOUDID:7fbfefa8f87fb27be22ea853464ba6a9,BulkI D:2607151549556KBJRHNX,BulkQuantity:0,Recheck:0,SF:10|38|66|78|81|82|102|1 27|865|898,TC:nil,Content:0|15|50,EDM:-3,IP:-2,URL:0,File:nil,RT:nil,Bulk: nil,QS:nil,BEC:nil,COL:0,OSI:0,OSA:0,AV:0,LES:1,SPR:NO,DKR:0,DKP:0,BRR:0,B RE:0,ARC:0 X-CID-BVR: 2,SSN|SDN X-CID-BAS: 2,SSN|SDN,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR X-CID-RHF: D41D8CD98F00B204E9800998ECF8427E X-UUID: c4bd38ec802111f1aa26b74ffac11d73-20260715 X-User: tanze@kylinos.cn Received: from desktop-od00ebi.localdomain [(116.128.244.169)] by mailgw.kylinos.cn (envelope-from ) (Generic MTA with TLSv1.3 TLS_AES_256_GCM_SHA384 256/256) with ESMTP id 959226334; Wed, 15 Jul 2026 15:49:54 +0800 From: Ze Tan To: sfrench@samba.org, pc@manguebit.org, sprasad@microsoft.com, linkinjeon@kernel.org, senozhatsky@chromium.org, chenxiaosong@chenxiaosong.com, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org Cc: linux-kernel@vger.kernel.org Subject: [RFC PATCH 5/9] ksmbd: extract SMB EA response name handling Date: Wed, 15 Jul 2026 15:48:46 +0800 Message-ID: <20260715074908.641940-6-tanze@kylinos.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260715074908.641940-1-tanze@kylinos.cn> References: <20260715074908.641940-1-tanze@kylinos.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" smb2_get_ea() directly checks the user namespace, filters internal EAs, and removes the user prefix. Extract ksmbd_is_visible_ea_name() and keep the existing behavior unchanged. Signed-off-by: Ze Tan --- fs/smb/server/smb2pdu.c | 47 +++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/fs/smb/server/smb2pdu.c b/fs/smb/server/smb2pdu.c index 1e4ea33d7001..757dee9afaa4 100644 --- a/fs/smb/server/smb2pdu.c +++ b/fs/smb/server/smb2pdu.c @@ -2746,6 +2746,23 @@ static int ksmbd_map_ea_name_to_xattr(const char *ea= _name, return XATTR_USER_PREFIX_LEN + ea_name_len; } =20 +static bool ksmbd_is_visible_ea_name(const char *name, const char **ea_nam= e, + size_t *ea_name_len) +{ + size_t name_len =3D strlen(name); + + if (strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN)) + return false; + + *ea_name =3D name + XATTR_USER_PREFIX_LEN; + *ea_name_len =3D name_len - XATTR_USER_PREFIX_LEN; + + if (smb2_is_private_ea(*ea_name, *ea_name_len)) + return false; + + return true; +} + /** * smb2_set_ea() - handler for setting extended attributes using set * info command @@ -5607,32 +5624,25 @@ static int smb2_get_ea(struct ksmbd_work *work, str= uct ksmbd_file *fp, idx =3D 0; =20 while (idx < xattr_list_len) { + const char *ea_name; + size_t visible_name_len; + name =3D xattr_list + idx; name_len =3D strlen(name); =20 ksmbd_debug(SMB, "%s, len %d\n", name, name_len); idx +=3D name_len + 1; =20 - /* - * CIFS does not support EA other than user.* namespace, - * still keep the framework generic, to list other attrs - * in future. - */ - if (strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN)) + if (!ksmbd_is_visible_ea_name(name, &ea_name, + &visible_name_len)) continue; =20 - if (req->InputBufferLength && - strncmp(&name[XATTR_USER_PREFIX_LEN], ea_req->name, - ea_req->EaNameLength)) - continue; + name_len =3D visible_name_len; =20 - if (smb2_is_private_ea(&name[XATTR_USER_PREFIX_LEN], - name_len - XATTR_USER_PREFIX_LEN)) + if (req->InputBufferLength && + strncmp(ea_name, ea_req->name, ea_req->EaNameLength)) continue; =20 - if (!strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN)) - name_len -=3D XATTR_USER_PREFIX_LEN; - ptr =3D eainfo->name + name_len + 1; buf_free_len -=3D (offsetof(struct smb2_ea_info, name) + name_len + 1); @@ -5657,12 +5667,7 @@ static int smb2_get_ea(struct ksmbd_work *work, stru= ct ksmbd_file *fp, ptr +=3D value_len; eainfo->Flags =3D 0; eainfo->EaNameLength =3D name_len; - - if (!strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN)) - memcpy(eainfo->name, &name[XATTR_USER_PREFIX_LEN], - name_len); - else - memcpy(eainfo->name, name, name_len); + memcpy(eainfo->name, ea_name, name_len); =20 eainfo->name[name_len] =3D '\0'; eainfo->EaValueLength =3D cpu_to_le16(value_len); --=20 2.43.0 From nobody Sat Jul 25 18:03:39 2026 Received: from mailgw.kylinos.cn (mailgw.kylinos.cn [124.126.103.232]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8A8073C4B68; Wed, 15 Jul 2026 07:50:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=124.126.103.232 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784101807; cv=none; b=Lk/ZR4Iv/MeFe6lM4h5zElZBEuObeBAhLlTGJ5/6w+F3rVpgEDS314+9jWwAT2Dj8SwysUj24mob8w4sxrrceXkeOtmd+gWG15GBEMCUYe9d3inqJo264yGLmgd1HF7iZfsg29wUbHF1ozGc0OBnFZhuVHET1c5CFj9/Gvh010I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784101807; c=relaxed/simple; bh=XZXKlqRS/cY/YNids5hA2j+jGQRjGANbv4nolwgmkm0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Dndh4cbaCPYSbRoC4qJII8ACBa5dZ0DJq3deKsUnmBIvcclnx8jZl7o1SAjBuiTodQMHEvJrOqxGQHuQWFqf5yPf0bEWsjndKEiGGXkbv+s1tetwIjehZT+q00YGAOYathHpCvUuBmdCPyvKzoHHGt3xSSYFiKyiB4mdGlwDyWQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn; spf=pass smtp.mailfrom=kylinos.cn; arc=none smtp.client-ip=124.126.103.232 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kylinos.cn X-UUID: c558d478802111f1aa26b74ffac11d73-20260715 X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.3.12,REQID:903d867d-f580-477e-943e-b204f429e428,IP:10, URL:0,TC:0,Content:-5,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTIO N:release,TS:5 X-CID-INFO: VERSION:1.3.12,REQID:903d867d-f580-477e-943e-b204f429e428,IP:10,UR L:0,TC:0,Content:-5,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION: release,TS:5 X-CID-META: VersionHash:e7bac3a,CLOUDID:2d2cae620ba2258eaed2616406164464,BulkI D:2607151549586ZRS8Q7S,BulkQuantity:0,Recheck:0,SF:10|38|66|78|81|82|102|1 27|136|865|898,TC:nil,Content:0|15|50,EDM:-3,IP:-2,URL:0,File:nil,RT:nil,B ulk:nil,QS:nil,BEC:nil,COL:0,OSI:0,OSA:0,AV:0,LES:1,SPR:NO,DKR:0,DKP:0,BRR :0,BRE:0,ARC:0 X-CID-BVR: 2,SSN|SDN X-CID-BAS: 2,SSN|SDN,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR X-CID-RHF: D41D8CD98F00B204E9800998ECF8427E X-UUID: c558d478802111f1aa26b74ffac11d73-20260715 X-User: tanze@kylinos.cn Received: from desktop-od00ebi.localdomain [(116.128.244.169)] by mailgw.kylinos.cn (envelope-from ) (Generic MTA with TLSv1.3 TLS_AES_256_GCM_SHA384 256/256) with ESMTP id 1132277852; Wed, 15 Jul 2026 15:49:55 +0800 From: Ze Tan To: sfrench@samba.org, pc@manguebit.org, sprasad@microsoft.com, linkinjeon@kernel.org, senozhatsky@chromium.org, chenxiaosong@chenxiaosong.com, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org Cc: linux-kernel@vger.kernel.org Subject: [RFC PATCH 6/9] ksmbd: support security.capability EAs Date: Wed, 15 Jul 2026 15:48:47 +0800 Message-ID: <20260715074908.641940-7-tanze@kylinos.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260715074908.641940-1-tanze@kylinos.cn> References: <20260715074908.641940-1-tanze@kylinos.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" generic/093 uses setcap and getcap to check that a write clears the file capability. ksmbd adds the user prefix to every SMB EA name, so setcap stores security.capability as user.security.capability and getcap cannot read it as a file capability. When SMB3 POSIX extensions are available, map security.capability to the same backing xattr name. Use this mapping for set, get, and list operations. Signed-off-by: Ze Tan --- fs/smb/server/smb2pdu.c | 71 +++++++++++++++++++++++++++++++---------- 1 file changed, 55 insertions(+), 16 deletions(-) diff --git a/fs/smb/server/smb2pdu.c b/fs/smb/server/smb2pdu.c index 757dee9afaa4..255300501af3 100644 --- a/fs/smb/server/smb2pdu.c +++ b/fs/smb/server/smb2pdu.c @@ -2734,9 +2734,35 @@ static bool smb2_is_private_ea(const char *name, siz= e_t name_len) return false; } =20 -static int ksmbd_map_ea_name_to_xattr(const char *ea_name, - size_t ea_name_len, char *attr_name) +static bool ksmbd_is_security_capability_ea_name(const char *name, + size_t name_len) { + return name_len =3D=3D sizeof(XATTR_NAME_CAPS) - 1 && + !strncmp(name, XATTR_NAME_CAPS, name_len); +} + +static bool ksmbd_is_posix_ea_name(const char *name, size_t name_len) +{ + if (ksmbd_is_security_capability_ea_name(name, name_len)) + return true; + + return false; +} + +static int ksmbd_map_ea_name_to_xattr(bool posix_extensions, + const char *ea_name, size_t ea_name_len, + char *attr_name) +{ + if (posix_extensions && + ksmbd_is_posix_ea_name(ea_name, ea_name_len)) { + if (ea_name_len > XATTR_NAME_MAX) + return -EINVAL; + + memcpy(attr_name, ea_name, ea_name_len); + attr_name[ea_name_len] =3D '\0'; + return ea_name_len; + } + if (ea_name_len > XATTR_NAME_MAX - XATTR_USER_PREFIX_LEN) return -EINVAL; =20 @@ -2746,20 +2772,26 @@ static int ksmbd_map_ea_name_to_xattr(const char *e= a_name, return XATTR_USER_PREFIX_LEN + ea_name_len; } =20 -static bool ksmbd_is_visible_ea_name(const char *name, const char **ea_nam= e, - size_t *ea_name_len) +static bool ksmbd_is_visible_ea_name(bool posix_extensions, const char *na= me, + const char **ea_name, size_t *ea_name_len) { size_t name_len =3D strlen(name); =20 - if (strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN)) - return false; + if (!strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN)) { + *ea_name =3D name + XATTR_USER_PREFIX_LEN; + *ea_name_len =3D name_len - XATTR_USER_PREFIX_LEN; =20 - *ea_name =3D name + XATTR_USER_PREFIX_LEN; - *ea_name_len =3D name_len - XATTR_USER_PREFIX_LEN; + if (smb2_is_private_ea(*ea_name, *ea_name_len)) + return false; + + return true; + } =20 - if (smb2_is_private_ea(*ea_name, *ea_name_len)) + if (!posix_extensions || !ksmbd_is_posix_ea_name(name, name_len)) return false; =20 + *ea_name =3D name; + *ea_name_len =3D name_len; return true; } =20 @@ -2770,11 +2802,13 @@ static bool ksmbd_is_visible_ea_name(const char *na= me, const char **ea_name, * @buf_len: set info command buffer length * @path: dentry path for get ea * @get_write: get write access to a mount + * @posix_extensions: client negotiated SMB3 POSIX extensions * * Return: 0 on success, otherwise error */ static int smb2_set_ea(struct smb2_ea_info *eabuf, unsigned int buf_len, - const struct path *path, bool get_write) + const struct path *path, bool get_write, + bool posix_extensions) { struct mnt_idmap *idmap =3D mnt_idmap(path->mnt); char *attr_name =3D NULL, *value; @@ -2799,7 +2833,8 @@ static int smb2_set_ea(struct smb2_ea_info *eabuf, un= signed int buf_len, le16_to_cpu(eabuf->EaValueLength), le32_to_cpu(eabuf->NextEntryOffset)); =20 - attr_name_len =3D ksmbd_map_ea_name_to_xattr(eabuf->name, + attr_name_len =3D ksmbd_map_ea_name_to_xattr(posix_extensions, + eabuf->name, eabuf->EaNameLength, attr_name); if (attr_name_len < 0) { @@ -3886,7 +3921,8 @@ int smb2_open(struct ksmbd_work *work) =20 rc =3D smb2_set_ea(&ea_buf->ea, le32_to_cpu(ea_buf->ccontext.DataLength), - &path, false); + &path, false, + work->tcon->posix_extensions); if (rc =3D=3D -EOPNOTSUPP) rc =3D 0; else if (rc) @@ -5580,7 +5616,7 @@ static int smb2_get_ea(struct ksmbd_work *work, struc= t ksmbd_file *fp, } =20 path =3D &fp->filp->f_path; - /* single EA entry is requested with given user.* name */ + /* single EA entry is requested with a client-visible EA name */ if (req->InputBufferLength) { if (le32_to_cpu(req->InputBufferLength) <=3D sizeof(struct smb2_ea_info_req)) @@ -5633,14 +5669,16 @@ static int smb2_get_ea(struct ksmbd_work *work, str= uct ksmbd_file *fp, ksmbd_debug(SMB, "%s, len %d\n", name, name_len); idx +=3D name_len + 1; =20 - if (!ksmbd_is_visible_ea_name(name, &ea_name, + if (!ksmbd_is_visible_ea_name(work->tcon->posix_extensions, name, + &ea_name, &visible_name_len)) continue; =20 name_len =3D visible_name_len; =20 if (req->InputBufferLength && - strncmp(ea_name, ea_req->name, ea_req->EaNameLength)) + (name_len !=3D ea_req->EaNameLength || + strncmp(ea_name, ea_req->name, ea_req->EaNameLength))) continue; =20 ptr =3D eainfo->name + name_len + 1; @@ -7618,7 +7656,8 @@ static int smb2_set_info_file(struct ksmbd_work *work= , struct ksmbd_file *fp, return -EMSGSIZE; =20 return smb2_set_ea((struct smb2_ea_info *)buffer, - buf_len, &fp->filp->f_path, true); + buf_len, &fp->filp->f_path, true, + work->tcon->posix_extensions); } case FILE_POSITION_INFORMATION: { --=20 2.43.0 From nobody Sat Jul 25 18:03:39 2026 Received: from mailgw.kylinos.cn (mailgw.kylinos.cn [124.126.103.232]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B673D3C3457; Wed, 15 Jul 2026 07:50:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=124.126.103.232 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784101806; cv=none; b=Uo/lRLgTxjVJDskciONCTVCxrQUX0F76YHKLbAQWEu82niKTxMXIAbjwwvPivmnLzL5UeS4S0mCXuDgwfKkSFEG+r0Wm7Ywyctbw82cFQiETi9TDuHeRq+vbhnyKU27Lnj+D1EQBFksO1IPoW3Iz8AFLoHKsX6rdEgHYVrVYNIU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784101806; c=relaxed/simple; bh=JxbuYWhEtYPIlSJfLK/ws/qEegbTWIL6GEKOmCiIwpE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Kj+YgP9OginLl5vP89VAtwgcSc9e/lszAwAL+RUpYBpY58s+icrRMLqmPY18ZIVGWM8LIeMD/qY5cCg6k7kQQ+LXe7hUgi+hFfT+yJBOIxv3YjDag0Jfwh6v823I9eZso0of9qUivfEezsQNFanh88JAl3qRKVhAaZojkZaYiZQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn; spf=pass smtp.mailfrom=kylinos.cn; arc=none smtp.client-ip=124.126.103.232 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kylinos.cn X-UUID: c60e498e802111f1aa26b74ffac11d73-20260715 X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.3.12,REQID:f6ad64dd-ec8a-403b-91f6-1a96f8042ae4,IP:10, URL:0,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION :release,TS:10 X-CID-INFO: VERSION:1.3.12,REQID:f6ad64dd-ec8a-403b-91f6-1a96f8042ae4,IP:10,UR L:0,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION:r elease,TS:10 X-CID-META: VersionHash:e7bac3a,CLOUDID:69b4a251b5eab9d311a6af5d71c19429,BulkI D:260715154958MBJCE9TK,BulkQuantity:0,Recheck:0,SF:10|38|66|78|81|82|102|1 27|136|865|898,TC:nil,Content:0|15|50,EDM:-3,IP:-2,URL:0,File:nil,RT:nil,B ulk:nil,QS:nil,BEC:nil,COL:0,OSI:0,OSA:0,AV:0,LES:1,SPR:NO,DKR:0,DKP:0,BRR :0,BRE:0,ARC:0 X-CID-BVR: 2,SSN|SDN X-CID-BAS: 2,SSN|SDN,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR X-CID-RHF: D41D8CD98F00B204E9800998ECF8427E X-UUID: c60e498e802111f1aa26b74ffac11d73-20260715 X-User: tanze@kylinos.cn Received: from desktop-od00ebi.localdomain [(116.128.244.169)] by mailgw.kylinos.cn (envelope-from ) (Generic MTA with TLSv1.3 TLS_AES_256_GCM_SHA384 256/256) with ESMTP id 2123613275; Wed, 15 Jul 2026 15:49:57 +0800 From: Ze Tan To: sfrench@samba.org, pc@manguebit.org, sprasad@microsoft.com, linkinjeon@kernel.org, senozhatsky@chromium.org, chenxiaosong@chenxiaosong.com, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org Cc: linux-kernel@vger.kernel.org Subject: [RFC PATCH 7/9] ksmbd: support security.xfstests EAs Date: Wed, 15 Jul 2026 15:48:48 +0800 Message-ID: <20260715074908.641940-8-tanze@kylinos.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260715074908.641940-1-tanze@kylinos.cn> References: <20260715074908.641940-1-tanze@kylinos.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Before checking file capabilities, generic/093 calls _require_attrs security. This helper runs "setfattr -n security.xfstests". ksmbd recognizes only security.capability as a native security EA, so it stores the attribute as user.security.xfstests. Add security.xfstests as another exact security EA name. Use this name directly for set, get, and list operations. Do not support other security xattrs. Signed-off-by: Ze Tan --- fs/smb/server/smb2pdu.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/fs/smb/server/smb2pdu.c b/fs/smb/server/smb2pdu.c index 255300501af3..ea622798f34e 100644 --- a/fs/smb/server/smb2pdu.c +++ b/fs/smb/server/smb2pdu.c @@ -2741,11 +2741,21 @@ static bool ksmbd_is_security_capability_ea_name(co= nst char *name, !strncmp(name, XATTR_NAME_CAPS, name_len); } =20 +static bool ksmbd_is_security_xfstests_ea_name(const char *name, + size_t name_len) +{ + return name_len =3D=3D sizeof(XATTR_SECURITY_PREFIX "xfstests") - 1 && + !strncmp(name, XATTR_SECURITY_PREFIX "xfstests", name_len); +} + static bool ksmbd_is_posix_ea_name(const char *name, size_t name_len) { if (ksmbd_is_security_capability_ea_name(name, name_len)) return true; =20 + if (ksmbd_is_security_xfstests_ea_name(name, name_len)) + return true; + return false; } =20 --=20 2.43.0 From nobody Sat Jul 25 18:03:39 2026 Received: from mailgw.kylinos.cn (mailgw.kylinos.cn [124.126.103.232]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 509E431717D; Wed, 15 Jul 2026 07:50:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=124.126.103.232 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784101806; cv=none; b=YBMScG32U5P/pxFlbo46/0S0PDP9Z6PDXGd6LJBYr/x0JcfRHNrYRAjEmnWFDz4784I73XIiWyzZqFQfGcy0G7j5be76BkN4lgLjNIX0C/SP0fedippgm0r98zfESDnrAdss5EBzA/sBsLG33UbgjMSPmSw6p/ryggH/v+/uze4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784101806; c=relaxed/simple; bh=DZj8s6Ln7mw3so2haOwnn8cVq1Da7OXD8zddUwTWwqM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=pLIy3qvIw1+W2RYAWnb9fqIPrXOgsgpBtaVcTiatMv/VAoYi12JSHNLXyqkgMljHQEQXzeoj0DlWJn1atopcEA1wIRLSgWLGeFgxBFf7Zu7SgQ/ZRTuiT7ylJ0l9bXf+I5LsENcFOrwKRk6QSjRs1x9psZTteEBmWmsylBBuBtQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn; spf=pass smtp.mailfrom=kylinos.cn; arc=none smtp.client-ip=124.126.103.232 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kylinos.cn X-UUID: c6b3894e802111f1aa26b74ffac11d73-20260715 X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.3.12,REQID:77d4415b-50ab-441a-86c6-481842331b69,IP:10, URL:0,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION :release,TS:10 X-CID-INFO: VERSION:1.3.12,REQID:77d4415b-50ab-441a-86c6-481842331b69,IP:10,UR L:0,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION:r elease,TS:10 X-CID-META: VersionHash:e7bac3a,CLOUDID:ff46711be7168bf101d865fe438439db,BulkI D:260715154958FNRAKQM7,BulkQuantity:0,Recheck:0,SF:10|38|66|78|81|82|102|1 27|136|865|898,TC:nil,Content:0|15|50,EDM:-3,IP:-2,URL:0,File:nil,RT:nil,B ulk:nil,QS:nil,BEC:nil,COL:0,OSI:0,OSA:0,AV:0,LES:1,SPR:NO,DKR:0,DKP:0,BRR :0,BRE:0,ARC:0 X-CID-BVR: 2,SSN|SDN X-CID-BAS: 2,SSN|SDN,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR X-CID-RHF: D41D8CD98F00B204E9800998ECF8427E X-UUID: c6b3894e802111f1aa26b74ffac11d73-20260715 X-User: tanze@kylinos.cn Received: from desktop-od00ebi.localdomain [(116.128.244.169)] by mailgw.kylinos.cn (envelope-from ) (Generic MTA with TLSv1.3 TLS_AES_256_GCM_SHA384 256/256) with ESMTP id 1193017124; Wed, 15 Jul 2026 15:49:58 +0800 From: Ze Tan To: sfrench@samba.org, pc@manguebit.org, sprasad@microsoft.com, linkinjeon@kernel.org, senozhatsky@chromium.org, chenxiaosong@chenxiaosong.com, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org Cc: linux-kernel@vger.kernel.org Subject: [RFC PATCH 8/9] ksmbd: support trusted EAs Date: Wed, 15 Jul 2026 15:48:49 +0800 Message-ID: <20260715074908.641940-9-tanze@kylinos.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260715074908.641940-1-tanze@kylinos.cn> References: <20260715074908.641940-1-tanze@kylinos.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" generic/093 uses "setfattr -n trusted.name" and getfattr to check that a write does not clear the trusted xattr. ksmbd stores the attribute as user.trusted.name on the backing filesystem. Map trusted names to the trusted xattr namespace for set, get, and list operations. Filter the internal POSIX ACL xattrs. Signed-off-by: Ze Tan --- fs/smb/server/smb2pdu.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/fs/smb/server/smb2pdu.c b/fs/smb/server/smb2pdu.c index ea622798f34e..649aa9f484b7 100644 --- a/fs/smb/server/smb2pdu.c +++ b/fs/smb/server/smb2pdu.c @@ -2734,6 +2734,19 @@ static bool smb2_is_private_ea(const char *name, siz= e_t name_len) return false; } =20 +static bool ksmbd_is_internal_acl_ea_name(const char *name, size_t name_le= n) +{ + return (name_len =3D=3D sizeof(XATTR_NAME_POSIX_ACL_ACCESS) - 1 && + !strncmp(name, XATTR_NAME_POSIX_ACL_ACCESS, name_len)) || + (name_len =3D=3D sizeof(XATTR_NAME_POSIX_ACL_DEFAULT) - 1 && + !strncmp(name, XATTR_NAME_POSIX_ACL_DEFAULT, name_len)) || + (name_len =3D=3D sizeof(XATTR_TRUSTED_PREFIX "SGI_ACL_FILE") - 1 && + !strncmp(name, XATTR_TRUSTED_PREFIX "SGI_ACL_FILE", name_len)) || + (name_len =3D=3D sizeof(XATTR_TRUSTED_PREFIX "SGI_ACL_DEFAULT") - = 1 && + !strncmp(name, XATTR_TRUSTED_PREFIX "SGI_ACL_DEFAULT", + name_len)); +} + static bool ksmbd_is_security_capability_ea_name(const char *name, size_t name_len) { @@ -2756,6 +2769,18 @@ static bool ksmbd_is_posix_ea_name(const char *name,= size_t name_len) if (ksmbd_is_security_xfstests_ea_name(name, name_len)) return true; =20 + /* + * POSIX ACL xattrs are filesystem-internal ACL records, not + * user-visible EAs. XFS may also expose trusted.SGI_ACL_* aliases + * through listxattr(), so filter those as well. + */ + if (ksmbd_is_internal_acl_ea_name(name, name_len)) + return false; + + if (name_len > XATTR_TRUSTED_PREFIX_LEN && + !strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN)) + return true; + return false; } =20 @@ -2763,6 +2788,9 @@ static int ksmbd_map_ea_name_to_xattr(bool posix_exte= nsions, const char *ea_name, size_t ea_name_len, char *attr_name) { + if (ksmbd_is_internal_acl_ea_name(ea_name, ea_name_len)) + return -EINVAL; + if (posix_extensions && ksmbd_is_posix_ea_name(ea_name, ea_name_len)) { if (ea_name_len > XATTR_NAME_MAX) --=20 2.43.0 From nobody Sat Jul 25 18:03:39 2026 Received: from mailgw.kylinos.cn (mailgw.kylinos.cn [124.126.103.232]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 75E6E3C5539; Wed, 15 Jul 2026 07:50:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=124.126.103.232 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784101808; cv=none; b=nQ2ANwbPlYw1YSj9GwuxfwO/OP/ViwbheTghzihf1BzVgOJyt+objGEpmwajEvNJd6lADe7C7TBKrmaIlGt50e2hcVG7KKqlIEhezP9PDdHt4gzGd+/EnH7BC2uElOM8WGsGXW4G+QV0i6hL76qeoxwmt1F1wj6krIJrAB3tMDM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784101808; c=relaxed/simple; bh=U5In1aytGC0aihMwE4KiTNCBxjRSLj5Ge4lRN7Tm/tw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jqvwa3U6ahl5LlnQgTANX2SEXYwP171lpICJNgYmuymqc37Un716JXDXbk/kndkisKhz407IUIwhffkVzgg4fQaoMEfXQZeHv+m+K4c+tyBTnQs1StU193M9314ha0Afa+gRwqYqynGgwXSxfr+9nq3+WCuomHSku2xzg1641ko= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn; spf=pass smtp.mailfrom=kylinos.cn; arc=none smtp.client-ip=124.126.103.232 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kylinos.cn X-UUID: c759ed7a802111f1aa26b74ffac11d73-20260715 X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.3.12,REQID:077640d1-662b-455d-9d85-26e71e899a2e,IP:10, URL:0,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION :release,TS:10 X-CID-INFO: VERSION:1.3.12,REQID:077640d1-662b-455d-9d85-26e71e899a2e,IP:10,UR L:0,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION:r elease,TS:10 X-CID-META: VersionHash:e7bac3a,CLOUDID:42e40c33d8f9e0605abf2cabd4cd38bd,BulkI D:260715155001X7LQMT54,BulkQuantity:0,Recheck:0,SF:10|38|66|78|81|82|102|1 27|865|898,TC:nil,Content:0|15|50,EDM:-3,IP:-2,URL:0,File:nil,RT:nil,Bulk: nil,QS:nil,BEC:nil,COL:0,OSI:0,OSA:0,AV:0,LES:1,SPR:NO,DKR:0,DKP:0,BRR:0,B RE:0,ARC:0 X-CID-BVR: 2,SSN|SDN X-CID-BAS: 2,SSN|SDN,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR X-CID-RHF: D41D8CD98F00B204E9800998ECF8427E X-UUID: c759ed7a802111f1aa26b74ffac11d73-20260715 X-User: tanze@kylinos.cn Received: from desktop-od00ebi.localdomain [(116.128.244.169)] by mailgw.kylinos.cn (envelope-from ) (Generic MTA with TLSv1.3 TLS_AES_256_GCM_SHA384 256/256) with ESMTP id 772737601; Wed, 15 Jul 2026 15:49:59 +0800 From: Ze Tan To: sfrench@samba.org, pc@manguebit.org, sprasad@microsoft.com, linkinjeon@kernel.org, senozhatsky@chromium.org, chenxiaosong@chenxiaosong.com, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org Cc: linux-kernel@vger.kernel.org Subject: [RFC PATCH 9/9] ksmbd: avoid self oplock breaks for EA opens Date: Wed, 15 Jul 2026 15:48:50 +0800 Message-ID: <20260715074908.641940-10-tanze@kylinos.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260715074908.641940-1-tanze@kylinos.cn> References: <20260715074908.641940-1-tanze@kylinos.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" generic/093 writes to a file after setcap sets security.capability. The CIFS client can reopen the file to query or update EAs while the same session holds an oplock. ksmbd breaks this oplock and waits for the same client, so the write can block. Skip the oplock break for same-session EA or metadata opens. Keep the normal break when another session holds an oplock. Signed-off-by: Ze Tan --- fs/smb/server/oplock.c | 49 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/fs/smb/server/oplock.c b/fs/smb/server/oplock.c index 74bd2fadc757..bfd813969511 100644 --- a/fs/smb/server/oplock.c +++ b/fs/smb/server/oplock.c @@ -1436,6 +1436,49 @@ void smb_lazy_parent_lease_break_close(struct ksmbd_= file *fp) ksmbd_inode_put(p_ci); } =20 +static bool ksmbd_skip_session_ea_break(struct ksmbd_work *work, + struct ksmbd_file *fp, + int req_op_level, + struct lease_ctx_info *lctx) +{ + struct oplock_info *opinfo; + bool same_session =3D false; + bool foreign_session =3D false; + __le32 ea_meta_mask =3D FILE_READ_EA_LE | FILE_WRITE_EA_LE | + FILE_READ_ATTRIBUTES_LE | + FILE_WRITE_ATTRIBUTES_LE | + FILE_READ_CONTROL_LE | FILE_SYNCHRONIZE_LE; + + if (!work || !fp || lctx || req_op_level !=3D SMB2_OPLOCK_LEVEL_NONE) + return false; + + /* + * Avoid self-deadlock when the same session reopens the file only + * to read/write EAs or metadata, e.g. CIFS killpriv querying or + * removing security.capability during buffered write. + */ + if (!(fp->daccess & (FILE_READ_EA_LE | FILE_WRITE_EA_LE)) || + (fp->daccess & ~ea_meta_mask)) + return false; + + down_read(&fp->f_ci->m_lock); + list_for_each_entry(opinfo, &fp->f_ci->m_op_list, op_entry) { + if (!opinfo->conn || opinfo->level =3D=3D SMB2_OPLOCK_LEVEL_NONE) + continue; + + if (opinfo->sess =3D=3D work->sess) + same_session =3D true; + else + foreign_session =3D true; + + if (same_session && foreign_session) + break; + } + up_read(&fp->f_ci->m_lock); + + return same_session && !foreign_session; +} + /** * smb_grant_oplock() - handle oplock/lease request on file open * @work: smb work @@ -1542,6 +1585,12 @@ int smb_grant_oplock(struct ksmbd_work *work, int re= q_op_level, u64 pid, goto err_out; } =20 + if (share_ret >=3D 0 && + ksmbd_skip_session_ea_break(work, fp, req_op_level, lctx)) { + opinfo_put(prev_opinfo); + goto set_lev; + } + break_needed =3D prev_opinfo->level =3D=3D SMB2_OPLOCK_LEVEL_BATCH || prev_opinfo->level =3D=3D SMB2_OPLOCK_LEVEL_EXCLUSIVE || (share_ret < 0 && prev_op_has_lease && --=20 2.43.0