UPSTREAM: PM / devfreq: rk3399_dmc: Remove explictly regulator_put call in .remove
[firefly-linux-kernel-4.4.55.git] / fs / sdcardfs / super.c
index f153ce1b8cf398de0d57f6460901cd9ade754608..edda32b68dc08d5f48213f0c20d75aac4b3fd07b 100644 (file)
@@ -46,9 +46,6 @@ static void sdcardfs_put_super(struct super_block *sb)
        sdcardfs_set_lower_super(sb, NULL);
        atomic_dec(&s->s_active);
 
-       if(spd->pkgl_id)
-               packagelist_destroy(spd->pkgl_id);
-
        kfree(spd);
        sb->s_fs_info = NULL;
 }
@@ -111,6 +108,50 @@ static int sdcardfs_remount_fs(struct super_block *sb, int *flags, char *options
        return err;
 }
 
+/*
+ * @mnt: mount point we are remounting
+ * @sb: superblock we are remounting
+ * @flags: numeric mount options
+ * @options: mount options string
+ */
+static int sdcardfs_remount_fs2(struct vfsmount *mnt, struct super_block *sb,
+                                               int *flags, char *options)
+{
+       int err = 0;
+
+       /*
+        * The VFS will take care of "ro" and "rw" flags among others.  We
+        * can safely accept a few flags (RDONLY, MANDLOCK), and honor
+        * SILENT, but anything else left over is an error.
+        */
+       if ((*flags & ~(MS_RDONLY | MS_MANDLOCK | MS_SILENT | MS_REMOUNT)) != 0) {
+               printk(KERN_ERR
+                      "sdcardfs: remount flags 0x%x unsupported\n", *flags);
+               err = -EINVAL;
+       }
+       printk(KERN_INFO "Remount options were %s for vfsmnt %p.\n", options, mnt);
+       err = parse_options_remount(sb, options, *flags & ~MS_SILENT, mnt->data);
+
+
+       return err;
+}
+
+static void* sdcardfs_clone_mnt_data(void *data) {
+       struct sdcardfs_vfsmount_options* opt = kmalloc(sizeof(struct sdcardfs_vfsmount_options), GFP_KERNEL);
+       struct sdcardfs_vfsmount_options* old = data;
+       if(!opt) return NULL;
+       opt->gid = old->gid;
+       opt->mask = old->mask;
+       return opt;
+}
+
+static void sdcardfs_copy_mnt_data(void *data, void *newdata) {
+       struct sdcardfs_vfsmount_options* old = data;
+       struct sdcardfs_vfsmount_options* new = newdata;
+       old->gid = new->gid;
+       old->mask = new->mask;
+}
+
 /*
  * Called by iput() when the inode reference count reached zero
  * and the inode is not hashed anywhere.  Used to clear anything
@@ -129,6 +170,7 @@ static void sdcardfs_evict_inode(struct inode *inode)
         */
        lower_inode = sdcardfs_lower_inode(inode);
        sdcardfs_set_lower_inode(inode, NULL);
+       set_top(SDCARDFS_I(inode), inode);
        iput(lower_inode);
 }
 
@@ -193,23 +235,24 @@ static void sdcardfs_umount_begin(struct super_block *sb)
                lower_sb->s_op->umount_begin(lower_sb);
 }
 
-static int sdcardfs_show_options(struct seq_file *m, struct dentry *root)
+static int sdcardfs_show_options(struct vfsmount *mnt, struct seq_file *m, struct dentry *root)
 {
        struct sdcardfs_sb_info *sbi = SDCARDFS_SB(root->d_sb);
        struct sdcardfs_mount_options *opts = &sbi->options;
+       struct sdcardfs_vfsmount_options *vfsopts = mnt->data;
 
        if (opts->fs_low_uid != 0)
-               seq_printf(m, ",uid=%u", opts->fs_low_uid);
+               seq_printf(m, ",fsuid=%u", opts->fs_low_uid);
        if (opts->fs_low_gid != 0)
-               seq_printf(m, ",gid=%u", opts->fs_low_gid);
-
-       if (opts->derive == DERIVE_NONE)
-               seq_printf(m, ",derive=none");
-       else if (opts->derive == DERIVE_LEGACY)
-               seq_printf(m, ",derive=legacy");
-       else if (opts->derive == DERIVE_UNIFIED)
-               seq_printf(m, ",derive=unified");
-
+               seq_printf(m, ",fsgid=%u", opts->fs_low_gid);
+       if (vfsopts->gid != 0)
+               seq_printf(m, ",gid=%u", vfsopts->gid);
+       if (opts->multiuser)
+               seq_printf(m, ",multiuser");
+       if (vfsopts->mask)
+               seq_printf(m, ",mask=%u", vfsopts->mask);
+       if (opts->fs_user_id)
+               seq_printf(m, ",userid=%u", opts->fs_user_id);
        if (opts->reserved_mb != 0)
                seq_printf(m, ",reserved=%uMB", opts->reserved_mb);
 
@@ -220,9 +263,12 @@ const struct super_operations sdcardfs_sops = {
        .put_super      = sdcardfs_put_super,
        .statfs         = sdcardfs_statfs,
        .remount_fs     = sdcardfs_remount_fs,
+       .remount_fs2    = sdcardfs_remount_fs2,
+       .clone_mnt_data = sdcardfs_clone_mnt_data,
+       .copy_mnt_data  = sdcardfs_copy_mnt_data,
        .evict_inode    = sdcardfs_evict_inode,
        .umount_begin   = sdcardfs_umount_begin,
-       .show_options   = sdcardfs_show_options,
+       .show_options2  = sdcardfs_show_options,
        .alloc_inode    = sdcardfs_alloc_inode,
        .destroy_inode  = sdcardfs_destroy_inode,
        .drop_inode     = generic_delete_inode,