Merge tag 'for-5.11/dm-fix' of git://git.kernel.org/pub/scm/linux/kernel/git/device...
[linux-2.6-microblaze.git] / fs / jffs2 / super.c
index 0e6406c..81ca58c 100644 (file)
@@ -88,7 +88,7 @@ static int jffs2_show_options(struct seq_file *s, struct dentry *root)
 
        if (opts->override_compr)
                seq_printf(s, ",compr=%s", jffs2_compr_name(opts->compr));
-       if (opts->rp_size)
+       if (opts->set_rp_size)
                seq_printf(s, ",rp_size=%u", opts->rp_size / 1024);
 
        return 0;
@@ -167,27 +167,21 @@ enum {
        Opt_rp_size,
 };
 
-static const struct fs_parameter_spec jffs2_param_specs[] = {
-       fsparam_enum    ("compr",       Opt_override_compr),
-       fsparam_u32     ("rp_size",     Opt_rp_size),
-       {}
-};
-
-static const struct fs_parameter_enum jffs2_param_enums[] = {
-       { Opt_override_compr,   "none", JFFS2_COMPR_MODE_NONE },
+static const struct constant_table jffs2_param_compr[] = {
+       {"none",        JFFS2_COMPR_MODE_NONE },
 #ifdef CONFIG_JFFS2_LZO
-       { Opt_override_compr,   "lzo",  JFFS2_COMPR_MODE_FORCELZO },
+       {"lzo",         JFFS2_COMPR_MODE_FORCELZO },
 #endif
 #ifdef CONFIG_JFFS2_ZLIB
-       { Opt_override_compr,   "zlib", JFFS2_COMPR_MODE_FORCEZLIB },
+       {"zlib",        JFFS2_COMPR_MODE_FORCEZLIB },
 #endif
        {}
 };
 
-const struct fs_parameter_description jffs2_fs_parameters = {
-       .name           = "jffs2",
-       .specs          = jffs2_param_specs,
-       .enums          = jffs2_param_enums,
+static const struct fs_parameter_spec jffs2_fs_parameters[] = {
+       fsparam_enum    ("compr",       Opt_override_compr, jffs2_param_compr),
+       fsparam_u32     ("rp_size",     Opt_rp_size),
+       {}
 };
 
 static int jffs2_parse_param(struct fs_context *fc, struct fs_parameter *param)
@@ -196,7 +190,7 @@ static int jffs2_parse_param(struct fs_context *fc, struct fs_parameter *param)
        struct jffs2_sb_info *c = fc->s_fs_info;
        int opt;
 
-       opt = fs_parse(fc, &jffs2_fs_parameters, param, &result);
+       opt = fs_parse(fc, jffs2_fs_parameters, param, &result);
        if (opt < 0)
                return opt;
 
@@ -208,11 +202,8 @@ static int jffs2_parse_param(struct fs_context *fc, struct fs_parameter *param)
        case Opt_rp_size:
                if (result.uint_32 > UINT_MAX / 1024)
                        return invalf(fc, "jffs2: rp_size unrepresentable");
-               opt = result.uint_32 * 1024;
-               if (opt > c->mtd->size)
-                       return invalf(fc, "jffs2: Too large reserve pool specified, max is %llu KB",
-                                     c->mtd->size / 1024);
-               c->mount_opts.rp_size = opt;
+               c->mount_opts.rp_size = result.uint_32 * 1024;
+               c->mount_opts.set_rp_size = true;
                break;
        default:
                return -EINVAL;
@@ -221,11 +212,30 @@ static int jffs2_parse_param(struct fs_context *fc, struct fs_parameter *param)
        return 0;
 }
 
+static inline void jffs2_update_mount_opts(struct fs_context *fc)
+{
+       struct jffs2_sb_info *new_c = fc->s_fs_info;
+       struct jffs2_sb_info *c = JFFS2_SB_INFO(fc->root->d_sb);
+
+       mutex_lock(&c->alloc_sem);
+       if (new_c->mount_opts.override_compr) {
+               c->mount_opts.override_compr = new_c->mount_opts.override_compr;
+               c->mount_opts.compr = new_c->mount_opts.compr;
+       }
+       if (new_c->mount_opts.set_rp_size) {
+               c->mount_opts.set_rp_size = new_c->mount_opts.set_rp_size;
+               c->mount_opts.rp_size = new_c->mount_opts.rp_size;
+       }
+       mutex_unlock(&c->alloc_sem);
+}
+
 static int jffs2_reconfigure(struct fs_context *fc)
 {
        struct super_block *sb = fc->root->d_sb;
 
        sync_filesystem(sb);
+       jffs2_update_mount_opts(fc);
+
        return jffs2_do_remount_fs(sb, fc);
 }
 
@@ -255,6 +265,10 @@ static int jffs2_fill_super(struct super_block *sb, struct fs_context *fc)
        c->mtd = sb->s_mtd;
        c->os_priv = sb;
 
+       if (c->mount_opts.rp_size > c->mtd->size)
+               return invalf(fc, "jffs2: Too large reserve pool specified, max is %llu KB",
+                             c->mtd->size / 1024);
+
        /* Initialize JFFS2 superblock locks, the further initialization will
         * be done later */
        mutex_init(&c->alloc_sem);
@@ -339,7 +353,7 @@ static struct file_system_type jffs2_fs_type = {
        .owner =        THIS_MODULE,
        .name =         "jffs2",
        .init_fs_context = jffs2_init_fs_context,
-       .parameters =   &jffs2_fs_parameters,
+       .parameters =   jffs2_fs_parameters,
        .kill_sb =      jffs2_kill_sb,
 };
 MODULE_ALIAS_FS("jffs2");