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

userns: Convert jffs2 to use kuid and kgid where appropriate

- General routine uid/gid conversion work
- When storing posix acls treat ACL_USER and ACL_GROUP separately
so I can call from_kuid or from_kgid as appropriate.
- When reading posix acls treat ACL_USER and ACL_GROUP separately
so I can call make_kuid or make_kgid as appropriate.

Cc: David Woodhouse <dwmw2@infradead.org>
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>

+39 -24
+20 -6
fs/jffs2/acl.c
··· 94 94 case ACL_MASK: 95 95 case ACL_OTHER: 96 96 value += sizeof(struct jffs2_acl_entry_short); 97 - acl->a_entries[i].e_id = ACL_UNDEFINED_ID; 98 97 break; 99 98 100 99 case ACL_USER: 100 + value += sizeof(struct jffs2_acl_entry); 101 + if (value > end) 102 + goto fail; 103 + acl->a_entries[i].e_uid = 104 + make_kuid(&init_user_ns, 105 + je32_to_cpu(entry->e_id)); 106 + break; 101 107 case ACL_GROUP: 102 108 value += sizeof(struct jffs2_acl_entry); 103 109 if (value > end) 104 110 goto fail; 105 - acl->a_entries[i].e_id = je32_to_cpu(entry->e_id); 111 + acl->a_entries[i].e_gid = 112 + make_kgid(&init_user_ns, 113 + je32_to_cpu(entry->e_id)); 106 114 break; 107 115 108 116 default: ··· 139 131 header->a_version = cpu_to_je32(JFFS2_ACL_VERSION); 140 132 e = header + 1; 141 133 for (i=0; i < acl->a_count; i++) { 134 + const struct posix_acl_entry *acl_e = &acl->a_entries[i]; 142 135 entry = e; 143 - entry->e_tag = cpu_to_je16(acl->a_entries[i].e_tag); 144 - entry->e_perm = cpu_to_je16(acl->a_entries[i].e_perm); 145 - switch(acl->a_entries[i].e_tag) { 136 + entry->e_tag = cpu_to_je16(acl_e->e_tag); 137 + entry->e_perm = cpu_to_je16(acl_e->e_perm); 138 + switch(acl_e->e_tag) { 146 139 case ACL_USER: 140 + entry->e_id = cpu_to_je32( 141 + from_kuid(&init_user_ns, acl_e->e_uid)); 142 + e += sizeof(struct jffs2_acl_entry); 143 + break; 147 144 case ACL_GROUP: 148 - entry->e_id = cpu_to_je32(acl->a_entries[i].e_id); 145 + entry->e_id = cpu_to_je32( 146 + from_kgid(&init_user_ns, acl_e->e_gid)); 149 147 e += sizeof(struct jffs2_acl_entry); 150 148 break; 151 149
+4 -4
fs/jffs2/file.c
··· 175 175 ri.ino = cpu_to_je32(f->inocache->ino); 176 176 ri.version = cpu_to_je32(++f->highest_version); 177 177 ri.mode = cpu_to_jemode(inode->i_mode); 178 - ri.uid = cpu_to_je16(inode->i_uid); 179 - ri.gid = cpu_to_je16(inode->i_gid); 178 + ri.uid = cpu_to_je16(i_uid_read(inode)); 179 + ri.gid = cpu_to_je16(i_gid_read(inode)); 180 180 ri.isize = cpu_to_je32(max((uint32_t)inode->i_size, pageofs)); 181 181 ri.atime = ri.ctime = ri.mtime = cpu_to_je32(get_seconds()); 182 182 ri.offset = cpu_to_je32(inode->i_size); ··· 283 283 /* Set the fields that the generic jffs2_write_inode_range() code can't find */ 284 284 ri->ino = cpu_to_je32(inode->i_ino); 285 285 ri->mode = cpu_to_jemode(inode->i_mode); 286 - ri->uid = cpu_to_je16(inode->i_uid); 287 - ri->gid = cpu_to_je16(inode->i_gid); 286 + ri->uid = cpu_to_je16(i_uid_read(inode)); 287 + ri->gid = cpu_to_je16(i_gid_read(inode)); 288 288 ri->isize = cpu_to_je32((uint32_t)inode->i_size); 289 289 ri->atime = ri->ctime = ri->mtime = cpu_to_je32(get_seconds()); 290 290
+13 -11
fs/jffs2/fs.c
··· 99 99 ri->ino = cpu_to_je32(inode->i_ino); 100 100 ri->version = cpu_to_je32(++f->highest_version); 101 101 102 - ri->uid = cpu_to_je16((ivalid & ATTR_UID)?iattr->ia_uid:inode->i_uid); 103 - ri->gid = cpu_to_je16((ivalid & ATTR_GID)?iattr->ia_gid:inode->i_gid); 102 + ri->uid = cpu_to_je16((ivalid & ATTR_UID)? 103 + from_kuid(&init_user_ns, iattr->ia_uid):i_uid_read(inode)); 104 + ri->gid = cpu_to_je16((ivalid & ATTR_GID)? 105 + from_kgid(&init_user_ns, iattr->ia_gid):i_gid_read(inode)); 104 106 105 107 if (ivalid & ATTR_MODE) 106 108 ri->mode = cpu_to_jemode(iattr->ia_mode); ··· 149 147 inode->i_ctime = ITIME(je32_to_cpu(ri->ctime)); 150 148 inode->i_mtime = ITIME(je32_to_cpu(ri->mtime)); 151 149 inode->i_mode = jemode_to_cpu(ri->mode); 152 - inode->i_uid = je16_to_cpu(ri->uid); 153 - inode->i_gid = je16_to_cpu(ri->gid); 150 + i_uid_write(inode, je16_to_cpu(ri->uid)); 151 + i_gid_write(inode, je16_to_cpu(ri->gid)); 154 152 155 153 156 154 old_metadata = f->metadata; ··· 278 276 return ERR_PTR(ret); 279 277 } 280 278 inode->i_mode = jemode_to_cpu(latest_node.mode); 281 - inode->i_uid = je16_to_cpu(latest_node.uid); 282 - inode->i_gid = je16_to_cpu(latest_node.gid); 279 + i_uid_write(inode, je16_to_cpu(latest_node.uid)); 280 + i_gid_write(inode, je16_to_cpu(latest_node.gid)); 283 281 inode->i_size = je32_to_cpu(latest_node.isize); 284 282 inode->i_atime = ITIME(je32_to_cpu(latest_node.atime)); 285 283 inode->i_mtime = ITIME(je32_to_cpu(latest_node.mtime)); ··· 442 440 443 441 memset(ri, 0, sizeof(*ri)); 444 442 /* Set OS-specific defaults for new inodes */ 445 - ri->uid = cpu_to_je16(current_fsuid()); 443 + ri->uid = cpu_to_je16(from_kuid(&init_user_ns, current_fsuid())); 446 444 447 445 if (dir_i->i_mode & S_ISGID) { 448 - ri->gid = cpu_to_je16(dir_i->i_gid); 446 + ri->gid = cpu_to_je16(i_gid_read(dir_i)); 449 447 if (S_ISDIR(mode)) 450 448 mode |= S_ISGID; 451 449 } else { 452 - ri->gid = cpu_to_je16(current_fsgid()); 450 + ri->gid = cpu_to_je16(from_kgid(&init_user_ns, current_fsgid())); 453 451 } 454 452 455 453 /* POSIX ACLs have to be processed now, at least partly. ··· 469 467 set_nlink(inode, 1); 470 468 inode->i_ino = je32_to_cpu(ri->ino); 471 469 inode->i_mode = jemode_to_cpu(ri->mode); 472 - inode->i_gid = je16_to_cpu(ri->gid); 473 - inode->i_uid = je16_to_cpu(ri->uid); 470 + i_gid_write(inode, je16_to_cpu(ri->gid)); 471 + i_uid_write(inode, je16_to_cpu(ri->uid)); 474 472 inode->i_atime = inode->i_ctime = inode->i_mtime = CURRENT_TIME_SEC; 475 473 ri->atime = ri->mtime = ri->ctime = cpu_to_je32(I_SEC(inode->i_mtime)); 476 474
+2 -2
fs/jffs2/os-linux.h
··· 27 27 28 28 #define JFFS2_F_I_SIZE(f) (OFNI_EDONI_2SFFJ(f)->i_size) 29 29 #define JFFS2_F_I_MODE(f) (OFNI_EDONI_2SFFJ(f)->i_mode) 30 - #define JFFS2_F_I_UID(f) (OFNI_EDONI_2SFFJ(f)->i_uid) 31 - #define JFFS2_F_I_GID(f) (OFNI_EDONI_2SFFJ(f)->i_gid) 30 + #define JFFS2_F_I_UID(f) (i_uid_read(OFNI_EDONI_2SFFJ(f))) 31 + #define JFFS2_F_I_GID(f) (i_gid_read(OFNI_EDONI_2SFFJ(f))) 32 32 #define JFFS2_F_I_RDEV(f) (OFNI_EDONI_2SFFJ(f)->i_rdev) 33 33 34 34 #define ITIME(sec) ((struct timespec){sec, 0})
-1
init/Kconfig
··· 935 935 depends on CODA_FS = n 936 936 depends on FUSE_FS = n 937 937 depends on GFS2_FS = n 938 - depends on JFFS2_FS = n 939 938 depends on JFS_FS = n 940 939 depends on NCP_FS = n 941 940 depends on NFSD = n