ANDROID: sdcardfs: Add option to drop unused dentries
authorDaniel Rosenberg <drosen@google.com>
Fri, 6 Jul 2018 23:24:27 +0000 (16:24 -0700)
committerKim Gunho <gunho.kim@samsung.com>
Fri, 28 Jun 2019 14:46:30 +0000 (23:46 +0900)
This adds the nocache mount option, which will cause sdcardfs to always
drop dentries that are not in use, preventing cached entries from
holding on to lower dentries, which could  cause strange behavior when
bypassing the sdcardfs layer and directly changing the lower fs.

Change-Id: I70268584a20b989ae8cfdd278a2e4fa1605217fb
Signed-off-by: Daniel Rosenberg <drosen@google.com>
fs/sdcardfs/dentry.c
fs/sdcardfs/main.c
fs/sdcardfs/sdcardfs.h
fs/sdcardfs/super.c

index 776d549b397b3a3a5d838ea5e3d246119cdd0189..cb573f1efbfc41e28c73d272fd32b277de2ce882 100644 (file)
@@ -123,6 +123,12 @@ out:
        return err;
 }
 
+/* 1 = delete, 0 = cache */
+static int sdcardfs_d_delete(const struct dentry *d)
+{
+       return SDCARDFS_SB(d->d_sb)->options.nocache ? 1 : 0;
+}
+
 static void sdcardfs_d_release(struct dentry *dentry)
 {
        if (!dentry || !dentry->d_fsdata)
@@ -181,6 +187,7 @@ static void sdcardfs_canonical_path(const struct path *path,
 
 const struct dentry_operations sdcardfs_ci_dops = {
        .d_revalidate   = sdcardfs_d_revalidate,
+       .d_delete       = sdcardfs_d_delete,
        .d_release      = sdcardfs_d_release,
        .d_hash = sdcardfs_hash_ci,
        .d_compare      = sdcardfs_cmp_ci,
index 27ec726e7a464046e865a9c4f35afa5a727dffbb..ba52af8644cc89b73c1149502f646f5ce15741d5 100644 (file)
@@ -34,6 +34,7 @@ enum {
        Opt_reserved_mb,
        Opt_gid_derivation,
        Opt_default_normal,
+       Opt_nocache,
        Opt_err,
 };
 
@@ -48,6 +49,7 @@ static const match_table_t sdcardfs_tokens = {
        {Opt_gid_derivation, "derive_gid"},
        {Opt_default_normal, "default_normal"},
        {Opt_reserved_mb, "reserved_mb=%u"},
+       {Opt_nocache, "nocache"},
        {Opt_err, NULL}
 };
 
@@ -71,6 +73,7 @@ static int parse_options(struct super_block *sb, char *options, int silent,
        /* by default, gid derivation is off */
        opts->gid_derivation = false;
        opts->default_normal = false;
+       opts->nocache = false;
 
        *debug = 0;
 
@@ -128,6 +131,9 @@ static int parse_options(struct super_block *sb, char *options, int silent,
                case Opt_default_normal:
                        opts->default_normal = true;
                        break;
+               case Opt_nocache:
+                       opts->nocache = true;
+                       break;
                /* unknown option */
                default:
                        if (!silent)
index ec2290a16d3cbf0e5989c4cf9f48f32a992ffb48..c2a16a023f2cf0b2990a8d4af44360588cc3fee5 100644 (file)
@@ -198,6 +198,7 @@ struct sdcardfs_mount_options {
        bool gid_derivation;
        bool default_normal;
        unsigned int reserved_mb;
+       bool nocache;
 };
 
 struct sdcardfs_vfsmount_options {
index cffcdb11cb8ac8516e246524216f634bffe1e903..140696ed3ed3b68ac8b9ac709c25704210a52f0e 100644 (file)
@@ -311,6 +311,8 @@ static int sdcardfs_show_options(struct vfsmount *mnt, struct seq_file *m,
                seq_puts(m, ",default_normal");
        if (opts->reserved_mb != 0)
                seq_printf(m, ",reserved=%uMB", opts->reserved_mb);
+       if (opts->nocache)
+               seq_printf(m, ",nocache");
 
        return 0;
 };