ANDROID: sdcardfs: Move default_normal to superblock
authorDaniel Rosenberg <drosen@google.com>
Fri, 19 Jan 2018 00:17:16 +0000 (16:17 -0800)
committerStricted <info@stricted.net>
Thu, 11 Oct 2018 16:03:46 +0000 (18:03 +0200)
Moving default_normal from mount info to superblock info
as it doesn't need to change between mount points.

Signed-off-by: Daniel Rosenberg <drosen@google.com>
Bug: 72158116
Change-Id: I16c6a0577c601b4f7566269f7e189fcf697afd4e

fs/sdcardfs/inode.c
fs/sdcardfs/main.c
fs/sdcardfs/sdcardfs.h
fs/sdcardfs/super.c

index c7fe86f89caf2893b30d85bcffe71cde8642ae8b..e799bb0825f4eb233bb8e04698f826bc1bcd1dbf 100644 (file)
@@ -653,7 +653,7 @@ static int sdcardfs_permission(struct vfsmount *mnt, struct inode *inode, int ma
         */
        copy_attrs(&tmp, inode);
        tmp.i_uid = make_kuid(&init_user_ns, top->d_uid);
-       tmp.i_gid = make_kgid(&init_user_ns, get_gid(mnt, top));
+       tmp.i_gid = make_kgid(&init_user_ns, get_gid(mnt, inode->i_sb, top));
        tmp.i_mode = (inode->i_mode & S_IFMT)
                        | get_mode(mnt, SDCARDFS_I(inode), top);
        data_put(top);
@@ -730,7 +730,7 @@ static int sdcardfs_setattr(struct vfsmount *mnt, struct dentry *dentry, struct
         */
        copy_attrs(&tmp, inode);
        tmp.i_uid = make_kuid(&init_user_ns, top->d_uid);
-       tmp.i_gid = make_kgid(&init_user_ns, get_gid(mnt, top));
+       tmp.i_gid = make_kgid(&init_user_ns, get_gid(mnt, dentry->d_sb, top));
        tmp.i_mode = (inode->i_mode & S_IFMT)
                        | get_mode(mnt, SDCARDFS_I(inode), top);
        tmp.i_size = i_size_read(inode);
@@ -831,6 +831,7 @@ static int sdcardfs_fillattr(struct vfsmount *mnt,
 {
        struct sdcardfs_inode_info *info = SDCARDFS_I(inode);
        struct sdcardfs_inode_data *top = top_data_get(info);
+       struct super_block *sb = inode->i_sb;
 
        if (!top)
                return -EINVAL;
@@ -840,7 +841,7 @@ static int sdcardfs_fillattr(struct vfsmount *mnt,
        stat->mode = (inode->i_mode  & S_IFMT) | get_mode(mnt, info, top);
        stat->nlink = inode->i_nlink;
        stat->uid = make_kuid(&init_user_ns, top->d_uid);
-       stat->gid = make_kgid(&init_user_ns, get_gid(mnt, top));
+       stat->gid = make_kgid(&init_user_ns, get_gid(mnt, sb, top));
        stat->rdev = inode->i_rdev;
        stat->size = i_size_read(inode);
        stat->atime = inode->i_atime;
index 9ec3979ecb2876df44ee797790293d9179e900f7..f949fcd0ce928aad6fed1476df89b6faef492f01 100644 (file)
@@ -70,7 +70,7 @@ static int parse_options(struct super_block *sb, char *options, int silent,
        opts->reserved_mb = 0;
        /* by default, gid derivation is off */
        opts->gid_derivation = false;
-       vfsopts->default_normal = false;
+       opts->default_normal = false;
 
        *debug = 0;
 
@@ -126,7 +126,7 @@ static int parse_options(struct super_block *sb, char *options, int silent,
                        opts->gid_derivation = true;
                        break;
                case Opt_default_normal:
-                       vfsopts->default_normal = true;
+                       opts->default_normal = true;
                        break;
                /* unknown option */
                default:
index 891f690a5953978b163e5c13bf08d0191f3d2b45..31c013d28cc4520f526e878a119026e0d5044f30 100644 (file)
@@ -219,13 +219,13 @@ struct sdcardfs_mount_options {
        userid_t fs_user_id;
        bool multiuser;
        bool gid_derivation;
+       bool default_normal;
        unsigned int reserved_mb;
 };
 
 struct sdcardfs_vfsmount_options {
        gid_t gid;
        mode_t mask;
-       bool default_normal;
 };
 
 extern int parse_options_remount(struct super_block *sb, char *options, int silent,
@@ -413,11 +413,13 @@ static inline void set_top(struct sdcardfs_inode_info *info,
 }
 
 static inline int get_gid(struct vfsmount *mnt,
+               struct super_block *sb,
                struct sdcardfs_inode_data *data)
 {
-       struct sdcardfs_vfsmount_options *opts = mnt->data;
+       struct sdcardfs_vfsmount_options *vfsopts = mnt->data;
+       struct sdcardfs_sb_info *sbi = SDCARDFS_SB(sb);
 
-       if (opts->gid == AID_SDCARD_RW && !opts->default_normal)
+       if (vfsopts->gid == AID_SDCARD_RW && !sbi->options.default_normal)
                /* As an optimization, certain trusted system components only run
                 * as owner but operate across all users. Since we're now handing
                 * out the sdcard_rw GID only to trusted apps, we're okay relaxing
@@ -426,7 +428,7 @@ static inline int get_gid(struct vfsmount *mnt,
                 */
                return AID_SDCARD_RW;
        else
-               return multiuser_get_uid(data->userid, opts->gid);
+               return multiuser_get_uid(data->userid, vfsopts->gid);
 }
 
 static inline int get_mode(struct vfsmount *mnt,
index 3ac05869be2815ccca9b9209e3b0b6f4907eb3dd..6885c3e8972eba96d8b9ebd3afef825d3f2cfe30 100644 (file)
@@ -304,7 +304,7 @@ static int sdcardfs_show_options(struct vfsmount *mnt, struct seq_file *m,
                seq_printf(m, ",userid=%u", opts->fs_user_id);
        if (opts->gid_derivation)
                seq_puts(m, ",derive_gid");
-       if (vfsopts->default_normal)
+       if (opts->default_normal)
                seq_puts(m, ",default_normal");
        if (opts->reserved_mb != 0)
                seq_printf(m, ",reserved=%uMB", opts->reserved_mb);