@@ -212,7 +212,7 @@ 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)
+static int 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);
@@ -223,18 +223,29 @@ static inline void jffs2_update_mount_opts(struct fs_context *fc)
c->mount_opts.compr = new_c->mount_opts.compr;
}
if (new_c->mount_opts.set_rp_size) {
+ /* During remounting, compare the values of rp_szie and mtd->size. */
+ if (new_c->mount_opts.rp_size > c->mtd->size) {
+ mutex_unlock(&c->alloc_sem);
+ return invalf(fc, "jffs2: Too large reserve pool specified, max is %llu KB",
+ c->mtd->size / 1024);
+ }
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);
+
+ return 0;
}
static int jffs2_reconfigure(struct fs_context *fc)
{
struct super_block *sb = fc->root->d_sb;
+ int ret;
sync_filesystem(sb);
- jffs2_update_mount_opts(fc);
+ ret = jffs2_update_mount_opts(fc);
+ if (ret)
+ return -EINVAL;
return jffs2_do_remount_fs(sb, fc);
}