diff mbox series

jffs2:fix no error report when rp_size larger than mtd_size during remounting

Message ID 20210901075210.1657-2-douzhaolei@huawei.com
State New
Delegated to: Richard Weinberger
Headers show
Series jffs2:fix no error report when rp_size larger than mtd_size during remounting | expand

Commit Message

Zhaolei Dou Sept. 1, 2021, 7:52 a.m. UTC
From: douzhaolei <douzhaolei@huawei.com>

When the value of rp_size is greater than mtd->size,
jffs2 can be remounted normally.
It can be easily reproduced with the steps listed below.
1.mount -t jffs2 -o rw,relatime  /dev/mtdblockx /mnt
2.mount -o remount -o rp_size=xxx /mnt

Signed-off-by: douzhaolei <douzhaolei@huawei.com>
---
 fs/jffs2/super.c | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)
diff mbox series

Patch

diff --git a/fs/jffs2/super.c b/fs/jffs2/super.c
index 81ca58c10b72..727693540a2d 100644
--- a/fs/jffs2/super.c
+++ b/fs/jffs2/super.c
@@ -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);
 }