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

userns: Convert hpfs to use kuid and kgid where appropriate

Cc: Mikulas Patocka <mikulas@artax.karlin.mff.cuni.cz>
Acked-by: Serge Hallyn <serge.hallyn@canonical.com>
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>

+28 -22
+2 -2
fs/hpfs/hpfs_fn.h
··· 63 63 unsigned sb_dmap; /* sector number of dnode bit map */ 64 64 unsigned sb_n_free; /* free blocks for statfs, or -1 */ 65 65 unsigned sb_n_free_dnodes; /* free dnodes for statfs, or -1 */ 66 - uid_t sb_uid; /* uid from mount options */ 67 - gid_t sb_gid; /* gid from mount options */ 66 + kuid_t sb_uid; /* uid from mount options */ 67 + kgid_t sb_gid; /* gid from mount options */ 68 68 umode_t sb_mode; /* mode from mount options */ 69 69 unsigned sb_eas : 2; /* eas: 0-ignore, 1-ro, 2-rw */ 70 70 unsigned sb_err : 2; /* on errs: 0-cont, 1-ro, 2-panic */
+11 -8
fs/hpfs/inode.c
··· 7 7 */ 8 8 9 9 #include <linux/slab.h> 10 + #include <linux/user_namespace.h> 10 11 #include "hpfs_fn.h" 11 12 12 13 void hpfs_init_inode(struct inode *i) ··· 61 60 if (hpfs_sb(i->i_sb)->sb_eas) { 62 61 if ((ea = hpfs_get_ea(i->i_sb, fnode, "UID", &ea_size))) { 63 62 if (ea_size == 2) { 64 - i->i_uid = le16_to_cpu(*(__le16*)ea); 63 + i_uid_write(i, le16_to_cpu(*(__le16*)ea)); 65 64 hpfs_inode->i_ea_uid = 1; 66 65 } 67 66 kfree(ea); 68 67 } 69 68 if ((ea = hpfs_get_ea(i->i_sb, fnode, "GID", &ea_size))) { 70 69 if (ea_size == 2) { 71 - i->i_gid = le16_to_cpu(*(__le16*)ea); 70 + i_gid_write(i, le16_to_cpu(*(__le16*)ea)); 72 71 hpfs_inode->i_ea_gid = 1; 73 72 } 74 73 kfree(ea); ··· 150 149 hpfs_error(i->i_sb, "fnode %08x has some unknown HPFS386 stuctures", i->i_ino); 151 150 } else*/ if (hpfs_sb(i->i_sb)->sb_eas >= 2) { 152 151 __le32 ea; 153 - if ((i->i_uid != hpfs_sb(i->i_sb)->sb_uid) || hpfs_inode->i_ea_uid) { 154 - ea = cpu_to_le32(i->i_uid); 152 + if (!uid_eq(i->i_uid, hpfs_sb(i->i_sb)->sb_uid) || hpfs_inode->i_ea_uid) { 153 + ea = cpu_to_le32(i_uid_read(i)); 155 154 hpfs_set_ea(i, fnode, "UID", (char*)&ea, 2); 156 155 hpfs_inode->i_ea_uid = 1; 157 156 } 158 - if ((i->i_gid != hpfs_sb(i->i_sb)->sb_gid) || hpfs_inode->i_ea_gid) { 159 - ea = cpu_to_le32(i->i_gid); 157 + if (!gid_eq(i->i_gid, hpfs_sb(i->i_sb)->sb_gid) || hpfs_inode->i_ea_gid) { 158 + ea = cpu_to_le32(i_gid_read(i)); 160 159 hpfs_set_ea(i, fnode, "GID", (char *)&ea, 2); 161 160 hpfs_inode->i_ea_gid = 1; 162 161 } ··· 262 261 hpfs_lock(inode->i_sb); 263 262 if (inode->i_ino == hpfs_sb(inode->i_sb)->sb_root) 264 263 goto out_unlock; 265 - if ((attr->ia_valid & ATTR_UID) && attr->ia_uid >= 0x10000) 264 + if ((attr->ia_valid & ATTR_UID) && 265 + from_kuid(&init_user_ns, attr->ia_uid) >= 0x10000) 266 266 goto out_unlock; 267 - if ((attr->ia_valid & ATTR_GID) && attr->ia_gid >= 0x10000) 267 + if ((attr->ia_valid & ATTR_GID) && 268 + from_kgid(&init_user_ns, attr->ia_gid) >= 0x10000) 268 269 goto out_unlock; 269 270 if ((attr->ia_valid & ATTR_SIZE) && attr->ia_size > inode->i_size) 270 271 goto out_unlock;
+4 -4
fs/hpfs/namei.c
··· 91 91 inc_nlink(dir); 92 92 insert_inode_hash(result); 93 93 94 - if (result->i_uid != current_fsuid() || 95 - result->i_gid != current_fsgid() || 94 + if (!uid_eq(result->i_uid, current_fsuid()) || 95 + !gid_eq(result->i_gid, current_fsgid()) || 96 96 result->i_mode != (mode | S_IFDIR)) { 97 97 result->i_uid = current_fsuid(); 98 98 result->i_gid = current_fsgid(); ··· 179 179 180 180 insert_inode_hash(result); 181 181 182 - if (result->i_uid != current_fsuid() || 183 - result->i_gid != current_fsgid() || 182 + if (!uid_eq(result->i_uid, current_fsuid()) || 183 + !gid_eq(result->i_gid, current_fsgid()) || 184 184 result->i_mode != (mode | S_IFREG)) { 185 185 result->i_uid = current_fsuid(); 186 186 result->i_gid = current_fsgid();
+11 -7
fs/hpfs/super.c
··· 251 251 {Opt_err, NULL}, 252 252 }; 253 253 254 - static int parse_opts(char *opts, uid_t *uid, gid_t *gid, umode_t *umask, 254 + static int parse_opts(char *opts, kuid_t *uid, kgid_t *gid, umode_t *umask, 255 255 int *lowercase, int *eas, int *chk, int *errs, 256 256 int *chkdsk, int *timeshift) 257 257 { ··· 276 276 case Opt_uid: 277 277 if (match_int(args, &option)) 278 278 return 0; 279 - *uid = option; 279 + *uid = make_kuid(current_user_ns(), option); 280 + if (!uid_valid(*uid)) 281 + return 0; 280 282 break; 281 283 case Opt_gid: 282 284 if (match_int(args, &option)) 283 285 return 0; 284 - *gid = option; 286 + *gid = make_kgid(current_user_ns(), option); 287 + if (!gid_valid(*gid)) 288 + return 0; 285 289 break; 286 290 case Opt_umask: 287 291 if (match_octal(args, &option)) ··· 382 378 383 379 static int hpfs_remount_fs(struct super_block *s, int *flags, char *data) 384 380 { 385 - uid_t uid; 386 - gid_t gid; 381 + kuid_t uid; 382 + kgid_t gid; 387 383 umode_t umask; 388 384 int lowercase, eas, chk, errs, chkdsk, timeshift; 389 385 int o; ··· 459 455 struct hpfs_sb_info *sbi; 460 456 struct inode *root; 461 457 462 - uid_t uid; 463 - gid_t gid; 458 + kuid_t uid; 459 + kgid_t gid; 464 460 umode_t umask; 465 461 int lowercase, eas, chk, errs, chkdsk, timeshift; 466 462
-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 HPFS_FS = n 939 938 depends on JFFS2_FS = n 940 939 depends on JFS_FS = n 941 940 depends on NCP_FS = n