]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
jffs2: Fix ignoring mounting options problem during remounting
authorlizhe <lizhe67@huawei.com>
Wed, 14 Oct 2020 06:54:42 +0000 (14:54 +0800)
committerPaolo Pisati <paolo.pisati@canonical.com>
Mon, 4 Jan 2021 15:47:58 +0000 (16:47 +0100)
BugLink: https://bugs.launchpad.net/bugs/1910111
commit 08cd274f9b8283a1da93e2ccab216a336da83525 upstream.

The jffs2 mount options will be ignored when remounting jffs2.
It can be easily reproduced with the steps listed below.
1. mount -t jffs2 -o compr=none /dev/mtdblockx /mnt
2. mount -o remount compr=zlib /mnt

Since ec10a24f10c8, the option parsing happens before fill_super and
then pass fc, which contains the options parsing results, to function
jffs2_reconfigure during remounting. But function jffs2_reconfigure do
not update c->mount_opts.

This patch add a function jffs2_update_mount_opts to fix this problem.

By the way, I notice that tmpfs use the same way to update remounting
options. If it is necessary to unify them?

Cc: <stable@vger.kernel.org>
Fixes: ec10a24f10c8 ("vfs: Convert jffs2 to use the new mount API")
Signed-off-by: lizhe <lizhe67@huawei.com>
Signed-off-by: Richard Weinberger <richard@nod.at>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Paolo Pisati <paolo.pisati@canonical.com>
fs/jffs2/super.c

index 05d7878dfad1547e3ab6f5413704dd6536011842..4fd297bdf0f3ff9bdf7c6dd03bab23eb426f5fac 100644 (file)
@@ -215,11 +215,28 @@ 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.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);
 }