Skip to content

Commit a04aff2

Browse files
brauneridryomov
authored andcommitted
ceph: allow idmapped setattr inode op
Enable __ceph_setattr() to handle idmapped mounts. This is just a matter of passing down the mount's idmapping. [ aleksandr.mikhalitsyn: adapted to b27c82e ("attr: port attribute changes to new types") ] Signed-off-by: Christian Brauner <brauner@kernel.org> Signed-off-by: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@canonical.com> Reviewed-by: Xiubo Li <xiubli@redhat.com> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
1 parent 79c66a0 commit a04aff2

1 file changed

Lines changed: 12 additions & 8 deletions

File tree

fs/ceph/inode.c

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2544,33 +2544,37 @@ int __ceph_setattr(struct mnt_idmap *idmap, struct inode *inode,
25442544
#endif /* CONFIG_FS_ENCRYPTION */
25452545

25462546
if (ia_valid & ATTR_UID) {
2547+
kuid_t fsuid = from_vfsuid(idmap, i_user_ns(inode), attr->ia_vfsuid);
2548+
25472549
doutc(cl, "%p %llx.%llx uid %d -> %d\n", inode,
25482550
ceph_vinop(inode),
25492551
from_kuid(&init_user_ns, inode->i_uid),
25502552
from_kuid(&init_user_ns, attr->ia_uid));
25512553
if (issued & CEPH_CAP_AUTH_EXCL) {
2552-
inode->i_uid = attr->ia_uid;
2554+
inode->i_uid = fsuid;
25532555
dirtied |= CEPH_CAP_AUTH_EXCL;
25542556
} else if ((issued & CEPH_CAP_AUTH_SHARED) == 0 ||
2555-
!uid_eq(attr->ia_uid, inode->i_uid)) {
2557+
!uid_eq(fsuid, inode->i_uid)) {
25562558
req->r_args.setattr.uid = cpu_to_le32(
2557-
from_kuid(&init_user_ns, attr->ia_uid));
2559+
from_kuid(&init_user_ns, fsuid));
25582560
mask |= CEPH_SETATTR_UID;
25592561
release |= CEPH_CAP_AUTH_SHARED;
25602562
}
25612563
}
25622564
if (ia_valid & ATTR_GID) {
2565+
kgid_t fsgid = from_vfsgid(idmap, i_user_ns(inode), attr->ia_vfsgid);
2566+
25632567
doutc(cl, "%p %llx.%llx gid %d -> %d\n", inode,
25642568
ceph_vinop(inode),
25652569
from_kgid(&init_user_ns, inode->i_gid),
25662570
from_kgid(&init_user_ns, attr->ia_gid));
25672571
if (issued & CEPH_CAP_AUTH_EXCL) {
2568-
inode->i_gid = attr->ia_gid;
2572+
inode->i_gid = fsgid;
25692573
dirtied |= CEPH_CAP_AUTH_EXCL;
25702574
} else if ((issued & CEPH_CAP_AUTH_SHARED) == 0 ||
2571-
!gid_eq(attr->ia_gid, inode->i_gid)) {
2575+
!gid_eq(fsgid, inode->i_gid)) {
25722576
req->r_args.setattr.gid = cpu_to_le32(
2573-
from_kgid(&init_user_ns, attr->ia_gid));
2577+
from_kgid(&init_user_ns, fsgid));
25742578
mask |= CEPH_SETATTR_GID;
25752579
release |= CEPH_CAP_AUTH_SHARED;
25762580
}
@@ -2799,7 +2803,7 @@ int ceph_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
27992803
if (err)
28002804
return err;
28012805

2802-
err = setattr_prepare(&nop_mnt_idmap, dentry, attr);
2806+
err = setattr_prepare(idmap, dentry, attr);
28032807
if (err != 0)
28042808
return err;
28052809

@@ -2814,7 +2818,7 @@ int ceph_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
28142818
err = __ceph_setattr(idmap, inode, attr, NULL);
28152819

28162820
if (err >= 0 && (attr->ia_valid & ATTR_MODE))
2817-
err = posix_acl_chmod(&nop_mnt_idmap, dentry, attr->ia_mode);
2821+
err = posix_acl_chmod(idmap, dentry, attr->ia_mode);
28182822

28192823
return err;
28202824
}

0 commit comments

Comments
 (0)