Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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 b27c82e12965 ("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>

authored by

Christian Brauner and committed by
Ilya Dryomov
a04aff25 79c66a0c

+12 -8
+12 -8
fs/ceph/inode.c
··· 2544 2544 #endif /* CONFIG_FS_ENCRYPTION */ 2545 2545 2546 2546 if (ia_valid & ATTR_UID) { 2547 + kuid_t fsuid = from_vfsuid(idmap, i_user_ns(inode), attr->ia_vfsuid); 2548 + 2547 2549 doutc(cl, "%p %llx.%llx uid %d -> %d\n", inode, 2548 2550 ceph_vinop(inode), 2549 2551 from_kuid(&init_user_ns, inode->i_uid), 2550 2552 from_kuid(&init_user_ns, attr->ia_uid)); 2551 2553 if (issued & CEPH_CAP_AUTH_EXCL) { 2552 - inode->i_uid = attr->ia_uid; 2554 + inode->i_uid = fsuid; 2553 2555 dirtied |= CEPH_CAP_AUTH_EXCL; 2554 2556 } else if ((issued & CEPH_CAP_AUTH_SHARED) == 0 || 2555 - !uid_eq(attr->ia_uid, inode->i_uid)) { 2557 + !uid_eq(fsuid, inode->i_uid)) { 2556 2558 req->r_args.setattr.uid = cpu_to_le32( 2557 - from_kuid(&init_user_ns, attr->ia_uid)); 2559 + from_kuid(&init_user_ns, fsuid)); 2558 2560 mask |= CEPH_SETATTR_UID; 2559 2561 release |= CEPH_CAP_AUTH_SHARED; 2560 2562 } 2561 2563 } 2562 2564 if (ia_valid & ATTR_GID) { 2565 + kgid_t fsgid = from_vfsgid(idmap, i_user_ns(inode), attr->ia_vfsgid); 2566 + 2563 2567 doutc(cl, "%p %llx.%llx gid %d -> %d\n", inode, 2564 2568 ceph_vinop(inode), 2565 2569 from_kgid(&init_user_ns, inode->i_gid), 2566 2570 from_kgid(&init_user_ns, attr->ia_gid)); 2567 2571 if (issued & CEPH_CAP_AUTH_EXCL) { 2568 - inode->i_gid = attr->ia_gid; 2572 + inode->i_gid = fsgid; 2569 2573 dirtied |= CEPH_CAP_AUTH_EXCL; 2570 2574 } else if ((issued & CEPH_CAP_AUTH_SHARED) == 0 || 2571 - !gid_eq(attr->ia_gid, inode->i_gid)) { 2575 + !gid_eq(fsgid, inode->i_gid)) { 2572 2576 req->r_args.setattr.gid = cpu_to_le32( 2573 - from_kgid(&init_user_ns, attr->ia_gid)); 2577 + from_kgid(&init_user_ns, fsgid)); 2574 2578 mask |= CEPH_SETATTR_GID; 2575 2579 release |= CEPH_CAP_AUTH_SHARED; 2576 2580 } ··· 2803 2799 if (err) 2804 2800 return err; 2805 2801 2806 - err = setattr_prepare(&nop_mnt_idmap, dentry, attr); 2802 + err = setattr_prepare(idmap, dentry, attr); 2807 2803 if (err != 0) 2808 2804 return err; 2809 2805 ··· 2818 2814 err = __ceph_setattr(idmap, inode, attr, NULL); 2819 2815 2820 2816 if (err >= 0 && (attr->ia_valid & ATTR_MODE)) 2821 - err = posix_acl_chmod(&nop_mnt_idmap, dentry, attr->ia_mode); 2817 + err = posix_acl_chmod(idmap, dentry, attr->ia_mode); 2822 2818 2823 2819 return err; 2824 2820 }