UPSTREAM: PM / devfreq: rk3399_dmc: Remove explictly regulator_put call in .remove
[firefly-linux-kernel-4.4.55.git] / fs / sdcardfs / super.c
index 1d6490128c9905f36eba30e0e896a4634ee5dc32..edda32b68dc08d5f48213f0c20d75aac4b3fd07b 100644 (file)
@@ -108,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
@@ -126,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);
 }
 
@@ -190,19 +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);
-
+               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);
 
@@ -213,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,