ANDROID: sdcardfs: Add option to not link obb
authorDaniel Rosenberg <drosen@google.com>
Thu, 25 Oct 2018 23:25:15 +0000 (16:25 -0700)
committerDanny Wood <danwood76@gmail.com>
Fri, 8 Nov 2019 12:04:20 +0000 (12:04 +0000)
Add mount option unshared_obb to not link the obb
folders of multiple users together.

Bug: 27915347
Test: mount with option. Check if altering one obb
      alters the other
Signed-off-by: Daniel Rosenberg <drosen@google.com>
Change-Id: I3956e06bd0a222b0bbb2768c9a8a8372ada85e1e
Signed-off-by: Paul Keith <javelinanddart@gmail.com>
fs/sdcardfs/derived_perm.c
fs/sdcardfs/main.c
fs/sdcardfs/sdcardfs.h

index 02e2ad40a7dcf77a1227a6e2bae2478045dc41ad..bd7149d4ce654ceeb2383b059d73f5132a65f85b 100644 (file)
@@ -353,7 +353,8 @@ int need_graft_path(struct dentry *dentry)
        struct sdcardfs_sb_info *sbi = SDCARDFS_SB(dentry->d_sb);
        struct qstr obb = QSTR_LITERAL("obb");
 
-       if (parent_info->data->perm == PERM_ANDROID &&
+       if (!sbi->options.unshared_obb &&
+                       parent_info->data->perm == PERM_ANDROID &&
                        qstr_case_eq(&dentry->d_name, &obb)) {
 
                /* /Android/obb is the base obbpath of DERIVED_UNIFIED */
index 474f12041211788a80bb47d66a2895a8a9c6e124..16d3426805aa9d8c69d6419b55fd446add21f869 100644 (file)
@@ -35,6 +35,7 @@ enum {
        Opt_gid_derivation,
        Opt_default_normal,
        Opt_nocache,
+       Opt_unshared_obb,
        Opt_err,
 };
 
@@ -48,6 +49,7 @@ static const match_table_t sdcardfs_tokens = {
        {Opt_multiuser, "multiuser"},
        {Opt_gid_derivation, "derive_gid"},
        {Opt_default_normal, "default_normal"},
+       {Opt_unshared_obb, "unshared_obb"},
        {Opt_reserved_mb, "reserved_mb=%u"},
        {Opt_nocache, "nocache"},
        {Opt_err, NULL}
@@ -134,6 +136,9 @@ static int parse_options(struct super_block *sb, char *options, int silent,
                case Opt_nocache:
                        opts->nocache = true;
                        break;
+               case Opt_unshared_obb:
+                       opts->unshared_obb = true;
+                       break;
                /* unknown option */
                default:
                        if (!silent)
@@ -187,13 +192,16 @@ int parse_options_remount(struct super_block *sb, char *options, int silent,
                                return 0;
                        vfsopts->mask = option;
                        break;
+               case Opt_unshared_obb:
                case Opt_default_normal:
                case Opt_multiuser:
                case Opt_userid:
                case Opt_fsuid:
                case Opt_fsgid:
                case Opt_reserved_mb:
-                       pr_warn("Option \"%s\" can't be changed during remount\n", p);
+               case Opt_gid_derivation:
+                       if (!silent)
+                               pr_warn("Option \"%s\" can't be changed during remount\n", p);
                        break;
                /* unknown option */
                default:
index b05cc248f2f2924b0e729bb3187836dfbe3b14e9..ea566e1c84d5872704425b974af17a00e29de868 100644 (file)
@@ -196,6 +196,7 @@ struct sdcardfs_mount_options {
        bool multiuser;
        bool gid_derivation;
        bool default_normal;
+       bool unshared_obb;
        unsigned int reserved_mb;
        bool nocache;
 };