userns: Convert affs to use kuid/kgid wherwe appropriate
authorEric W. Biederman <ebiederm@xmission.com>
Wed, 8 Feb 2012 00:20:16 +0000 (16:20 -0800)
committerEric W. Biederman <ebiederm@xmission.com>
Fri, 21 Sep 2012 10:13:30 +0000 (03:13 -0700)
Acked-by: Serge Hallyn <serge.hallyn@canonical.com>
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
fs/affs/affs.h
fs/affs/inode.c
fs/affs/super.c
init/Kconfig

index 6e216419f340de5219a684db6a70f99643784ac5..3952121f2f28beee731618ae915a433f16e16fa0 100644 (file)
@@ -88,8 +88,8 @@ struct affs_sb_info {
        u32 s_root_block;               /* FFS root block number. */
        int s_hashsize;                 /* Size of hash table. */
        unsigned long s_flags;          /* See below. */
-       uid_t s_uid;                    /* uid to override */
-       gid_t s_gid;                    /* gid to override */
+       kuid_t s_uid;                   /* uid to override */
+       kgid_t s_gid;                   /* gid to override */
        umode_t s_mode;                 /* mode to override */
        struct buffer_head *s_root_bh;  /* Cached root block. */
        struct mutex s_bmlock;          /* Protects bitmap access. */
index 8bc4a59f4e7ec896b6dfb29f4b252efbbc0ee933..15c4842682292784ce095d85fb01a52615f7326a 100644 (file)
@@ -80,17 +80,17 @@ struct inode *affs_iget(struct super_block *sb, unsigned long ino)
        if (id == 0 || sbi->s_flags & SF_SETUID)
                inode->i_uid = sbi->s_uid;
        else if (id == 0xFFFF && sbi->s_flags & SF_MUFS)
-               inode->i_uid = 0;
+               i_uid_write(inode, 0);
        else
-               inode->i_uid = id;
+               i_uid_write(inode, id);
 
        id = be16_to_cpu(tail->gid);
        if (id == 0 || sbi->s_flags & SF_SETGID)
                inode->i_gid = sbi->s_gid;
        else if (id == 0xFFFF && sbi->s_flags & SF_MUFS)
-               inode->i_gid = 0;
+               i_gid_write(inode, 0);
        else
-               inode->i_gid = id;
+               i_gid_write(inode, id);
 
        switch (be32_to_cpu(tail->stype)) {
        case ST_ROOT:
@@ -193,13 +193,13 @@ affs_write_inode(struct inode *inode, struct writeback_control *wbc)
                tail->size = cpu_to_be32(inode->i_size);
                secs_to_datestamp(inode->i_mtime.tv_sec,&tail->change);
                if (!(inode->i_ino == AFFS_SB(sb)->s_root_block)) {
-                       uid = inode->i_uid;
-                       gid = inode->i_gid;
+                       uid = i_uid_read(inode);
+                       gid = i_gid_read(inode);
                        if (AFFS_SB(sb)->s_flags & SF_MUFS) {
-                               if (inode->i_uid == 0 || inode->i_uid == 0xFFFF)
-                                       uid = inode->i_uid ^ ~0;
-                               if (inode->i_gid == 0 || inode->i_gid == 0xFFFF)
-                                       gid = inode->i_gid ^ ~0;
+                               if (uid == 0 || uid == 0xFFFF)
+                                       uid = uid ^ ~0;
+                               if (gid == 0 || gid == 0xFFFF)
+                                       gid = gid ^ ~0;
                        }
                        if (!(AFFS_SB(sb)->s_flags & SF_SETUID))
                                tail->uid = cpu_to_be16(uid);
index c70f1e5fc0247a616d44e60c2681bbf8fc14c747..966c8c06b9b3a2653c7b7130607614a236ed457d 100644 (file)
@@ -188,7 +188,7 @@ static const match_table_t tokens = {
 };
 
 static int
-parse_options(char *options, uid_t *uid, gid_t *gid, int *mode, int *reserved, s32 *root,
+parse_options(char *options, kuid_t *uid, kgid_t *gid, int *mode, int *reserved, s32 *root,
                int *blocksize, char **prefix, char *volume, unsigned long *mount_opts)
 {
        char *p;
@@ -253,13 +253,17 @@ parse_options(char *options, uid_t *uid, gid_t *gid, int *mode, int *reserved, s
                case Opt_setgid:
                        if (match_int(&args[0], &option))
                                return 0;
-                       *gid = option;
+                       *gid = make_kgid(current_user_ns(), option);
+                       if (!gid_valid(*gid))
+                               return 0;
                        *mount_opts |= SF_SETGID;
                        break;
                case Opt_setuid:
                        if (match_int(&args[0], &option))
                                return 0;
-                       *uid = option;
+                       *uid = make_kuid(current_user_ns(), option);
+                       if (!uid_valid(*uid))
+                               return 0;
                        *mount_opts |= SF_SETUID;
                        break;
                case Opt_verbose:
@@ -301,8 +305,8 @@ static int affs_fill_super(struct super_block *sb, void *data, int silent)
        int                      num_bm;
        int                      i, j;
        s32                      key;
-       uid_t                    uid;
-       gid_t                    gid;
+       kuid_t                   uid;
+       kgid_t                   gid;
        int                      reserved;
        unsigned long            mount_flags;
        int                      tmp_flags;     /* fix remount prototype... */
@@ -527,8 +531,8 @@ affs_remount(struct super_block *sb, int *flags, char *data)
 {
        struct affs_sb_info     *sbi = AFFS_SB(sb);
        int                      blocksize;
-       uid_t                    uid;
-       gid_t                    gid;
+       kuid_t                   uid;
+       kgid_t                   gid;
        int                      mode;
        int                      reserved;
        int                      root_block;
index 86910982b94aed11b29c70b2941450330ef203b0..a358f4acdc4292753ee1137ce7ade59414720382 100644 (file)
@@ -928,7 +928,6 @@ config UIDGID_CONVERTED
 
        # Filesystems
        depends on 9P_FS = n
-       depends on AFFS_FS = n
        depends on AFS_FS = n
        depends on AUTOFS4_FS = n
        depends on BFS_FS = n