OSDN Git Service

userns: Convert tmpfs to use kuid and kgid where appropriate
authorEric W. Biederman <ebiederm@xmission.com>
Wed, 8 Feb 2012 00:46:12 +0000 (16:46 -0800)
committerEric W. Biederman <ebiederm@xmission.com>
Tue, 15 May 2012 21:59:29 +0000 (14:59 -0700)
Acked-by: Serge Hallyn <serge.hallyn@canonical.com>
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
include/linux/shmem_fs.h
init/Kconfig
mm/shmem.c

index 79ab255..bef2cf0 100644 (file)
@@ -28,8 +28,8 @@ struct shmem_sb_info {
        unsigned long max_inodes;   /* How many inodes are allowed */
        unsigned long free_inodes;  /* How many are left for allocation */
        spinlock_t stat_lock;       /* Serialize shmem_sb_info changes */
-       uid_t uid;                  /* Mount uid for root directory */
-       gid_t gid;                  /* Mount gid for root directory */
+       kuid_t uid;                 /* Mount uid for root directory */
+       kgid_t gid;                 /* Mount gid for root directory */
        umode_t mode;               /* Mount mode for root directory */
        struct mempolicy *mpol;     /* default memory policy for mappings */
 };
index 908e61c..7a5ccb2 100644 (file)
@@ -953,7 +953,6 @@ config UIDGID_CONVERTED
        depends on REISERFS_FS = n
        depends on SQUASHFS = n
        depends on SYSV_FS = n
-       depends on TMPFS = n
        depends on UBIFS_FS = n
        depends on UDF_FS = n
        depends on UFS_FS = n
index f99ff3e..d7b433a 100644 (file)
@@ -2075,6 +2075,8 @@ static int shmem_parse_options(char *options, struct shmem_sb_info *sbinfo,
                               bool remount)
 {
        char *this_char, *value, *rest;
+       uid_t uid;
+       gid_t gid;
 
        while (options != NULL) {
                this_char = options;
@@ -2134,15 +2136,21 @@ static int shmem_parse_options(char *options, struct shmem_sb_info *sbinfo,
                } else if (!strcmp(this_char,"uid")) {
                        if (remount)
                                continue;
-                       sbinfo->uid = simple_strtoul(value, &rest, 0);
+                       uid = simple_strtoul(value, &rest, 0);
                        if (*rest)
                                goto bad_val;
+                       sbinfo->uid = make_kuid(current_user_ns(), uid);
+                       if (!uid_valid(sbinfo->uid))
+                               goto bad_val;
                } else if (!strcmp(this_char,"gid")) {
                        if (remount)
                                continue;
-                       sbinfo->gid = simple_strtoul(value, &rest, 0);
+                       gid = simple_strtoul(value, &rest, 0);
                        if (*rest)
                                goto bad_val;
+                       sbinfo->gid = make_kgid(current_user_ns(), gid);
+                       if (!gid_valid(sbinfo->gid))
+                               goto bad_val;
                } else if (!strcmp(this_char,"mpol")) {
                        if (mpol_parse_str(value, &sbinfo->mpol, 1))
                                goto bad_val;
@@ -2210,10 +2218,12 @@ static int shmem_show_options(struct seq_file *seq, struct dentry *root)
                seq_printf(seq, ",nr_inodes=%lu", sbinfo->max_inodes);
        if (sbinfo->mode != (S_IRWXUGO | S_ISVTX))
                seq_printf(seq, ",mode=%03ho", sbinfo->mode);
-       if (sbinfo->uid != 0)
-               seq_printf(seq, ",uid=%u", sbinfo->uid);
-       if (sbinfo->gid != 0)
-               seq_printf(seq, ",gid=%u", sbinfo->gid);
+       if (!uid_eq(sbinfo->uid, GLOBAL_ROOT_UID))
+               seq_printf(seq, ",uid=%u",
+                               from_kuid_munged(&init_user_ns, sbinfo->uid));
+       if (!gid_eq(sbinfo->gid, GLOBAL_ROOT_GID))
+               seq_printf(seq, ",gid=%u",
+                               from_kgid_munged(&init_user_ns, sbinfo->gid));
        shmem_show_mpol(seq, sbinfo->mpol);
        return 0;
 }