Skip to content

Commit 5a6f52d

Browse files
committed
acl: conver higher-level helpers to rely on mnt_idmap
Convert an initial portion to rely on struct mnt_idmap by converting the high level xattr helpers. Reviewed-by: Seth Forshee (DigitalOcean) <[email protected]> Signed-off-by: Christian Brauner (Microsoft) <[email protected]>
1 parent 256c8ae commit 5a6f52d

File tree

4 files changed

+38
-37
lines changed

4 files changed

+38
-37
lines changed

fs/internal.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -227,28 +227,28 @@ struct xattr_ctx {
227227
};
228228

229229

230-
ssize_t do_getxattr(struct user_namespace *mnt_userns,
230+
ssize_t do_getxattr(struct mnt_idmap *idmap,
231231
struct dentry *d,
232232
struct xattr_ctx *ctx);
233233

234234
int setxattr_copy(const char __user *name, struct xattr_ctx *ctx);
235-
int do_setxattr(struct user_namespace *mnt_userns, struct dentry *dentry,
235+
int do_setxattr(struct mnt_idmap *idmap, struct dentry *dentry,
236236
struct xattr_ctx *ctx);
237237
int may_write_xattr(struct user_namespace *mnt_userns, struct inode *inode);
238238

239239
#ifdef CONFIG_FS_POSIX_ACL
240-
int do_set_acl(struct user_namespace *mnt_userns, struct dentry *dentry,
240+
int do_set_acl(struct mnt_idmap *idmap, struct dentry *dentry,
241241
const char *acl_name, const void *kvalue, size_t size);
242-
ssize_t do_get_acl(struct user_namespace *mnt_userns, struct dentry *dentry,
242+
ssize_t do_get_acl(struct mnt_idmap *idmap, struct dentry *dentry,
243243
const char *acl_name, void *kvalue, size_t size);
244244
#else
245-
static inline int do_set_acl(struct user_namespace *mnt_userns,
245+
static inline int do_set_acl(struct mnt_idmap *idmap,
246246
struct dentry *dentry, const char *acl_name,
247247
const void *kvalue, size_t size)
248248
{
249249
return -EOPNOTSUPP;
250250
}
251-
static inline ssize_t do_get_acl(struct user_namespace *mnt_userns,
251+
static inline ssize_t do_get_acl(struct mnt_idmap *idmap,
252252
struct dentry *dentry, const char *acl_name,
253253
void *kvalue, size_t size)
254254
{

fs/posix_acl.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -871,7 +871,7 @@ EXPORT_SYMBOL (posix_acl_to_xattr);
871871

872872
/**
873873
* vfs_posix_acl_to_xattr - convert from kernel to userspace representation
874-
* @mnt_userns: user namespace of the mount
874+
* @idmap: idmap of the mount
875875
* @inode: inode the posix acls are set on
876876
* @acl: the posix acls as represented by the vfs
877877
* @buffer: the buffer into which to convert @acl
@@ -884,7 +884,7 @@ EXPORT_SYMBOL (posix_acl_to_xattr);
884884
* Return: On success, the size of the stored uapi posix acls, on error a
885885
* negative errno.
886886
*/
887-
static ssize_t vfs_posix_acl_to_xattr(struct user_namespace *mnt_userns,
887+
static ssize_t vfs_posix_acl_to_xattr(struct mnt_idmap *idmap,
888888
struct inode *inode,
889889
const struct posix_acl *acl, void *buffer,
890890
size_t size)
@@ -893,6 +893,7 @@ static ssize_t vfs_posix_acl_to_xattr(struct user_namespace *mnt_userns,
893893
struct posix_acl_xattr_header *ext_acl = buffer;
894894
struct posix_acl_xattr_entry *ext_entry;
895895
struct user_namespace *fs_userns, *caller_userns;
896+
struct user_namespace *mnt_userns;
896897
ssize_t real_size, n;
897898
vfsuid_t vfsuid;
898899
vfsgid_t vfsgid;
@@ -908,6 +909,7 @@ static ssize_t vfs_posix_acl_to_xattr(struct user_namespace *mnt_userns,
908909

909910
fs_userns = i_user_ns(inode);
910911
caller_userns = current_user_ns();
912+
mnt_userns = mnt_idmap_owner(idmap);
911913
for (n=0; n < acl->a_count; n++, ext_entry++) {
912914
const struct posix_acl_entry *acl_e = &acl->a_entries[n];
913915
ext_entry->e_tag = cpu_to_le16(acl_e->e_tag);
@@ -1227,7 +1229,7 @@ int vfs_remove_acl(struct user_namespace *mnt_userns, struct dentry *dentry,
12271229
}
12281230
EXPORT_SYMBOL_GPL(vfs_remove_acl);
12291231

1230-
int do_set_acl(struct user_namespace *mnt_userns, struct dentry *dentry,
1232+
int do_set_acl(struct mnt_idmap *idmap, struct dentry *dentry,
12311233
const char *acl_name, const void *kvalue, size_t size)
12321234
{
12331235
int error;
@@ -1243,22 +1245,22 @@ int do_set_acl(struct user_namespace *mnt_userns, struct dentry *dentry,
12431245
return PTR_ERR(acl);
12441246
}
12451247

1246-
error = vfs_set_acl(mnt_userns, dentry, acl_name, acl);
1248+
error = vfs_set_acl(mnt_idmap_owner(idmap), dentry, acl_name, acl);
12471249
posix_acl_release(acl);
12481250
return error;
12491251
}
12501252

1251-
ssize_t do_get_acl(struct user_namespace *mnt_userns, struct dentry *dentry,
1253+
ssize_t do_get_acl(struct mnt_idmap *idmap, struct dentry *dentry,
12521254
const char *acl_name, void *kvalue, size_t size)
12531255
{
12541256
ssize_t error;
12551257
struct posix_acl *acl;
12561258

1257-
acl = vfs_get_acl(mnt_userns, dentry, acl_name);
1259+
acl = vfs_get_acl(mnt_idmap_owner(idmap), dentry, acl_name);
12581260
if (IS_ERR(acl))
12591261
return PTR_ERR(acl);
12601262

1261-
error = vfs_posix_acl_to_xattr(mnt_userns, d_inode(dentry),
1263+
error = vfs_posix_acl_to_xattr(idmap, d_inode(dentry),
12621264
acl, kvalue, size);
12631265
posix_acl_release(acl);
12641266
return error;

fs/xattr.c

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -597,19 +597,19 @@ int setxattr_copy(const char __user *name, struct xattr_ctx *ctx)
597597
return error;
598598
}
599599

600-
int do_setxattr(struct user_namespace *mnt_userns, struct dentry *dentry,
600+
int do_setxattr(struct mnt_idmap *idmap, struct dentry *dentry,
601601
struct xattr_ctx *ctx)
602602
{
603603
if (is_posix_acl_xattr(ctx->kname->name))
604-
return do_set_acl(mnt_userns, dentry, ctx->kname->name,
604+
return do_set_acl(idmap, dentry, ctx->kname->name,
605605
ctx->kvalue, ctx->size);
606606

607-
return vfs_setxattr(mnt_userns, dentry, ctx->kname->name,
607+
return vfs_setxattr(mnt_idmap_owner(idmap), dentry, ctx->kname->name,
608608
ctx->kvalue, ctx->size, ctx->flags);
609609
}
610610

611611
static long
612-
setxattr(struct user_namespace *mnt_userns, struct dentry *d,
612+
setxattr(struct mnt_idmap *idmap, struct dentry *d,
613613
const char __user *name, const void __user *value, size_t size,
614614
int flags)
615615
{
@@ -627,7 +627,7 @@ setxattr(struct user_namespace *mnt_userns, struct dentry *d,
627627
if (error)
628628
return error;
629629

630-
error = do_setxattr(mnt_userns, d, &ctx);
630+
error = do_setxattr(idmap, d, &ctx);
631631

632632
kvfree(ctx.kvalue);
633633
return error;
@@ -646,7 +646,7 @@ static int path_setxattr(const char __user *pathname,
646646
return error;
647647
error = mnt_want_write(path.mnt);
648648
if (!error) {
649-
error = setxattr(mnt_user_ns(path.mnt), path.dentry, name,
649+
error = setxattr(mnt_idmap(path.mnt), path.dentry, name,
650650
value, size, flags);
651651
mnt_drop_write(path.mnt);
652652
}
@@ -683,7 +683,7 @@ SYSCALL_DEFINE5(fsetxattr, int, fd, const char __user *, name,
683683
audit_file(f.file);
684684
error = mnt_want_write_file(f.file);
685685
if (!error) {
686-
error = setxattr(file_mnt_user_ns(f.file),
686+
error = setxattr(file_mnt_idmap(f.file),
687687
f.file->f_path.dentry, name,
688688
value, size, flags);
689689
mnt_drop_write_file(f.file);
@@ -696,7 +696,7 @@ SYSCALL_DEFINE5(fsetxattr, int, fd, const char __user *, name,
696696
* Extended attribute GET operations
697697
*/
698698
ssize_t
699-
do_getxattr(struct user_namespace *mnt_userns, struct dentry *d,
699+
do_getxattr(struct mnt_idmap *idmap, struct dentry *d,
700700
struct xattr_ctx *ctx)
701701
{
702702
ssize_t error;
@@ -711,9 +711,10 @@ do_getxattr(struct user_namespace *mnt_userns, struct dentry *d,
711711
}
712712

713713
if (is_posix_acl_xattr(ctx->kname->name))
714-
error = do_get_acl(mnt_userns, d, kname, ctx->kvalue, ctx->size);
714+
error = do_get_acl(idmap, d, kname, ctx->kvalue, ctx->size);
715715
else
716-
error = vfs_getxattr(mnt_userns, d, kname, ctx->kvalue, ctx->size);
716+
error = vfs_getxattr(mnt_idmap_owner(idmap), d, kname,
717+
ctx->kvalue, ctx->size);
717718
if (error > 0) {
718719
if (ctx->size && copy_to_user(ctx->value, ctx->kvalue, error))
719720
error = -EFAULT;
@@ -727,7 +728,7 @@ do_getxattr(struct user_namespace *mnt_userns, struct dentry *d,
727728
}
728729

729730
static ssize_t
730-
getxattr(struct user_namespace *mnt_userns, struct dentry *d,
731+
getxattr(struct mnt_idmap *idmap, struct dentry *d,
731732
const char __user *name, void __user *value, size_t size)
732733
{
733734
ssize_t error;
@@ -746,7 +747,7 @@ getxattr(struct user_namespace *mnt_userns, struct dentry *d,
746747
if (error < 0)
747748
return error;
748749

749-
error = do_getxattr(mnt_userns, d, &ctx);
750+
error = do_getxattr(idmap, d, &ctx);
750751

751752
kvfree(ctx.kvalue);
752753
return error;
@@ -762,7 +763,7 @@ static ssize_t path_getxattr(const char __user *pathname,
762763
error = user_path_at(AT_FDCWD, pathname, lookup_flags, &path);
763764
if (error)
764765
return error;
765-
error = getxattr(mnt_user_ns(path.mnt), path.dentry, name, value, size);
766+
error = getxattr(mnt_idmap(path.mnt), path.dentry, name, value, size);
766767
path_put(&path);
767768
if (retry_estale(error, lookup_flags)) {
768769
lookup_flags |= LOOKUP_REVAL;
@@ -792,7 +793,7 @@ SYSCALL_DEFINE4(fgetxattr, int, fd, const char __user *, name,
792793
if (!f.file)
793794
return error;
794795
audit_file(f.file);
795-
error = getxattr(file_mnt_user_ns(f.file), f.file->f_path.dentry,
796+
error = getxattr(file_mnt_idmap(f.file), f.file->f_path.dentry,
796797
name, value, size);
797798
fdput(f);
798799
return error;
@@ -877,7 +878,7 @@ SYSCALL_DEFINE3(flistxattr, int, fd, char __user *, list, size_t, size)
877878
* Extended attribute REMOVE operations
878879
*/
879880
static long
880-
removexattr(struct user_namespace *mnt_userns, struct dentry *d,
881+
removexattr(struct mnt_idmap *idmap, struct dentry *d,
881882
const char __user *name)
882883
{
883884
int error;
@@ -890,9 +891,9 @@ removexattr(struct user_namespace *mnt_userns, struct dentry *d,
890891
return error;
891892

892893
if (is_posix_acl_xattr(kname))
893-
return vfs_remove_acl(mnt_userns, d, kname);
894+
return vfs_remove_acl(mnt_idmap_owner(idmap), d, kname);
894895

895-
return vfs_removexattr(mnt_userns, d, kname);
896+
return vfs_removexattr(mnt_idmap_owner(idmap), d, kname);
896897
}
897898

898899
static int path_removexattr(const char __user *pathname,
@@ -906,7 +907,7 @@ static int path_removexattr(const char __user *pathname,
906907
return error;
907908
error = mnt_want_write(path.mnt);
908909
if (!error) {
909-
error = removexattr(mnt_user_ns(path.mnt), path.dentry, name);
910+
error = removexattr(mnt_idmap(path.mnt), path.dentry, name);
910911
mnt_drop_write(path.mnt);
911912
}
912913
path_put(&path);
@@ -939,7 +940,7 @@ SYSCALL_DEFINE2(fremovexattr, int, fd, const char __user *, name)
939940
audit_file(f.file);
940941
error = mnt_want_write_file(f.file);
941942
if (!error) {
942-
error = removexattr(file_mnt_user_ns(f.file),
943+
error = removexattr(file_mnt_idmap(f.file),
943944
f.file->f_path.dentry, name);
944945
mnt_drop_write_file(f.file);
945946
}

io_uring/xattr.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ int io_fgetxattr(struct io_kiocb *req, unsigned int issue_flags)
112112
if (issue_flags & IO_URING_F_NONBLOCK)
113113
return -EAGAIN;
114114

115-
ret = do_getxattr(mnt_user_ns(req->file->f_path.mnt),
115+
ret = do_getxattr(mnt_idmap(req->file->f_path.mnt),
116116
req->file->f_path.dentry,
117117
&ix->ctx);
118118

@@ -133,9 +133,7 @@ int io_getxattr(struct io_kiocb *req, unsigned int issue_flags)
133133
retry:
134134
ret = filename_lookup(AT_FDCWD, ix->filename, lookup_flags, &path, NULL);
135135
if (!ret) {
136-
ret = do_getxattr(mnt_user_ns(path.mnt),
137-
path.dentry,
138-
&ix->ctx);
136+
ret = do_getxattr(mnt_idmap(path.mnt), path.dentry, &ix->ctx);
139137

140138
path_put(&path);
141139
if (retry_estale(ret, lookup_flags)) {
@@ -213,7 +211,7 @@ static int __io_setxattr(struct io_kiocb *req, unsigned int issue_flags,
213211

214212
ret = mnt_want_write(path->mnt);
215213
if (!ret) {
216-
ret = do_setxattr(mnt_user_ns(path->mnt), path->dentry, &ix->ctx);
214+
ret = do_setxattr(mnt_idmap(path->mnt), path->dentry, &ix->ctx);
217215
mnt_drop_write(path->mnt);
218216
}
219217

0 commit comments

Comments
 (0)