ANDROID: sdcardfs: Add default_normal option
authorDaniel Rosenberg <drosen@google.com>
Tue, 2 Jan 2018 22:44:49 +0000 (14:44 -0800)
committerStricted <info@stricted.net>
Thu, 11 Oct 2018 16:03:45 +0000 (18:03 +0200)
The default_normal option causes mounts with the gid set to
AID_SDCARD_RW to have user specific gids, as in the normal case.

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

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

index 909193e1687bdfe314ddd8b1ea2a85263de628f2..98f8b6b14b5143ff8bd9551da3ea8fc0b17455eb 100644 (file)
@@ -33,6 +33,7 @@ enum {
        Opt_userid,
        Opt_reserved_mb,
        Opt_gid_derivation,
+       Opt_default_normal,
        Opt_err,
 };
 
@@ -45,6 +46,7 @@ static const match_table_t sdcardfs_tokens = {
        {Opt_userid, "userid=%d"},
        {Opt_multiuser, "multiuser"},
        {Opt_gid_derivation, "derive_gid"},
+       {Opt_default_normal, "default_normal"},
        {Opt_reserved_mb, "reserved_mb=%u"},
        {Opt_err, NULL}
 };
@@ -68,6 +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;
 
        *debug = 0;
 
@@ -122,6 +125,8 @@ static int parse_options(struct super_block *sb, char *options, int silent,
                case Opt_gid_derivation:
                        opts->gid_derivation = true;
                        break;
+               case Opt_default_normal:
+                       vfsopts->default_normal = true;
                /* unknown option */
                default:
                        if (!silent)
@@ -175,6 +180,7 @@ int parse_options_remount(struct super_block *sb, char *options, int silent,
                                return 0;
                        vfsopts->mask = option;
                        break;
+               case Opt_default_normal:
                case Opt_multiuser:
                case Opt_userid:
                case Opt_fsuid:
index f3c283759cb3077048f1469aded1d56b2fae974a..891f690a5953978b163e5c13bf08d0191f3d2b45 100644 (file)
@@ -225,6 +225,7 @@ struct sdcardfs_mount_options {
 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,
@@ -416,7 +417,7 @@ static inline int get_gid(struct vfsmount *mnt,
 {
        struct sdcardfs_vfsmount_options *opts = mnt->data;
 
-       if (opts->gid == AID_SDCARD_RW)
+       if (opts->gid == AID_SDCARD_RW && !opts->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
index fa9aa52e6e06d8ef9b4a9041abd9cb0d88b4b8f0..3ac05869be2815ccca9b9209e3b0b6f4907eb3dd 100644 (file)
@@ -304,6 +304,8 @@ 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)
+               seq_puts(m, ",default_normal");
        if (opts->reserved_mb != 0)
                seq_printf(m, ",reserved=%uMB", opts->reserved_mb);