Commit 276a3f7c authored by Christian Brauner's avatar Christian Brauner Committed by Steve French
Browse files

ksmbd: port to vfs{g,u}id_t and associated helpers



A while ago we introduced a dedicated vfs{g,u}id_t type in commit
1e5267cd ("mnt_idmapping: add vfs{g,u}id_t"). We already switched
over a good part of the VFS. Ultimately we will remove all legacy
idmapped mount helpers that operate only on k{g,u}id_t in favor of the
new type safe helpers that operate on vfs{g,u}id_t.

Cc: Seth Forshee (Digital Ocean) <sforshee@kernel.org>
Cc: Steve French <sfrench@samba.org>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Namjae Jeon <linkinjeon@kernel.org>
Cc: Hyunchul Lee <hyc.lee@gmail.com>
Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
Cc: linux-cifs@vger.kernel.org
Signed-off-by: default avatarChristian Brauner (Microsoft) <brauner@kernel.org>
Acked-by: default avatarNamjae Jeon <linkinjeon@kernel.org>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent 88541cb4
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -345,6 +345,8 @@ int ndr_encode_posix_acl(struct ndr *n,
{
	unsigned int ref_id = 0x00020000;
	int ret;
	vfsuid_t vfsuid;
	vfsgid_t vfsgid;

	n->offset = 0;
	n->length = 1024;
@@ -372,10 +374,12 @@ int ndr_encode_posix_acl(struct ndr *n,
	if (ret)
		return ret;

	ret = ndr_write_int64(n, from_kuid(&init_user_ns, i_uid_into_mnt(user_ns, inode)));
	vfsuid = i_uid_into_vfsuid(user_ns, inode);
	ret = ndr_write_int64(n, from_kuid(&init_user_ns, vfsuid_into_kuid(vfsuid)));
	if (ret)
		return ret;
	ret = ndr_write_int64(n, from_kgid(&init_user_ns, i_gid_into_mnt(user_ns, inode)));
	vfsgid = i_gid_into_vfsgid(user_ns, inode);
	ret = ndr_write_int64(n, from_kgid(&init_user_ns, vfsgid_into_kgid(vfsgid)));
	if (ret)
		return ret;
	ret = ndr_write_int32(n, inode->i_mode);
+4 −4
Original line number Diff line number Diff line
@@ -1609,6 +1609,8 @@ void create_posix_rsp_buf(char *cc, struct ksmbd_file *fp)
	struct create_posix_rsp *buf;
	struct inode *inode = file_inode(fp->filp);
	struct user_namespace *user_ns = file_mnt_user_ns(fp->filp);
	vfsuid_t vfsuid = i_uid_into_vfsuid(user_ns, inode);
	vfsgid_t vfsgid = i_gid_into_vfsgid(user_ns, inode);

	buf = (struct create_posix_rsp *)cc;
	memset(buf, 0, sizeof(struct create_posix_rsp));
@@ -1639,11 +1641,9 @@ void create_posix_rsp_buf(char *cc, struct ksmbd_file *fp)
	buf->nlink = cpu_to_le32(inode->i_nlink);
	buf->reparse_tag = cpu_to_le32(fp->volatile_id);
	buf->mode = cpu_to_le32(inode->i_mode);
	id_to_sid(from_kuid_munged(&init_user_ns,
				   i_uid_into_mnt(user_ns, inode)),
	id_to_sid(from_kuid_munged(&init_user_ns, vfsuid_into_kuid(vfsuid)),
		  SIDNFS_USER, (struct smb_sid *)&buf->SidBuffer[0]);
	id_to_sid(from_kgid_munged(&init_user_ns,
				   i_gid_into_mnt(user_ns, inode)),
	id_to_sid(from_kgid_munged(&init_user_ns, vfsgid_into_kgid(vfsgid)),
		  SIDNFS_GROUP, (struct smb_sid *)&buf->SidBuffer[20]);
}

+5 −2
Original line number Diff line number Diff line
@@ -2477,8 +2477,11 @@ static void ksmbd_acls_fattr(struct smb_fattr *fattr,
			     struct user_namespace *mnt_userns,
			     struct inode *inode)
{
	fattr->cf_uid = i_uid_into_mnt(mnt_userns, inode);
	fattr->cf_gid = i_gid_into_mnt(mnt_userns, inode);
	vfsuid_t vfsuid = i_uid_into_vfsuid(mnt_userns, inode);
	vfsgid_t vfsgid = i_gid_into_vfsgid(mnt_userns, inode);

	fattr->cf_uid = vfsuid_into_kuid(vfsuid);
	fattr->cf_gid = vfsgid_into_kgid(vfsgid);
	fattr->cf_mode = inode->i_mode;
	fattr->cf_acls = NULL;
	fattr->cf_dacls = NULL;
+4 −2
Original line number Diff line number Diff line
@@ -275,7 +275,8 @@ static int sid_to_id(struct user_namespace *user_ns,
		uid_t id;

		id = le32_to_cpu(psid->sub_auth[psid->num_subauth - 1]);
		uid = mapped_kuid_user(user_ns, &init_user_ns, KUIDT_INIT(id));
		uid = KUIDT_INIT(id);
		uid = from_vfsuid(user_ns, &init_user_ns, VFSUIDT_INIT(uid));
		if (uid_valid(uid)) {
			fattr->cf_uid = uid;
			rc = 0;
@@ -285,7 +286,8 @@ static int sid_to_id(struct user_namespace *user_ns,
		gid_t id;

		id = le32_to_cpu(psid->sub_auth[psid->num_subauth - 1]);
		gid = mapped_kgid_user(user_ns, &init_user_ns, KGIDT_INIT(id));
		gid = KGIDT_INIT(id);
		gid = from_vfsgid(user_ns, &init_user_ns, VFSGIDT_INIT(gid));
		if (gid_valid(gid)) {
			fattr->cf_gid = gid;
			rc = 0;
+6 −6
Original line number Diff line number Diff line
@@ -214,25 +214,25 @@ void ksmbd_init_domain(u32 *sub_auth);
static inline uid_t posix_acl_uid_translate(struct user_namespace *mnt_userns,
					    struct posix_acl_entry *pace)
{
	kuid_t kuid;
	vfsuid_t vfsuid;

	/* If this is an idmapped mount, apply the idmapping. */
	kuid = mapped_kuid_fs(mnt_userns, &init_user_ns, pace->e_uid);
	vfsuid = make_vfsuid(mnt_userns, &init_user_ns, pace->e_uid);

	/* Translate the kuid into a userspace id ksmbd would see. */
	return from_kuid(&init_user_ns, kuid);
	return from_kuid(&init_user_ns, vfsuid_into_kuid(vfsuid));
}

static inline gid_t posix_acl_gid_translate(struct user_namespace *mnt_userns,
					    struct posix_acl_entry *pace)
{
	kgid_t kgid;
	vfsgid_t vfsgid;

	/* If this is an idmapped mount, apply the idmapping. */
	kgid = mapped_kgid_fs(mnt_userns, &init_user_ns, pace->e_gid);
	vfsgid = make_vfsgid(mnt_userns, &init_user_ns, pace->e_gid);

	/* Translate the kgid into a userspace id ksmbd would see. */
	return from_kgid(&init_user_ns, kgid);
	return from_kgid(&init_user_ns, vfsgid_into_kgid(vfsgid));
}

#endif /* _SMBACL_H */