ANDROID: sdcardfs: Add default_normal option
authorDaniel Rosenberg <drosen@google.com>
Tue, 2 Jan 2018 22:44:49 +0000 (14:44 -0800)
committerDaniel Rosenberg <drosen@google.com>
Thu, 4 Jan 2018 00:03:46 +0000 (16:03 -0800)
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 0a2b5167e9a2e5562b7af6e3642140c20816609b..3d1023a7ff7c2d7bf737bc30c9f0fdea92bc1bd6 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 88b92b2f18721890c0dcb62da6263d66c1255d3d..f5054a2650f140cad91aa45fd8f4796ade8911e8 100644 (file)
@@ -226,6 +226,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,
@@ -417,7 +418,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 b89947d878e33d50645502b60d27b9d9968d81fb..a28b40f5adc833544cefbfcd81b26094080ed10f 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);