Without this fix, the mount options cannot be modified via remount. For example, after executing the second command below, mount option 'errors' is not modified to 'remount-ro'. mount -o errors=panic /dev/sda1 /mnt mount -o remount,errors=remount-ro /mnt The reason is that a new "struct fs_context" is allocated during remount, which when initialized in exfat_init_fs_context(), allocates a new "struct exfat_sb_info". exfat_parse_param() applies the new mount options to this new "struct exfat_sb_info" instead of the one allocated during the first mount. This commit adds a remount check in exfat_init_fs_context(), so that if it is a remount, a new "struct exfat_sb_info" is not allocated, but the one from the first mount is referenced. Fixes: 719c1e182916 ("exfat: add super block operations") Signed-off-by: Yuezhang Mo <Yuezhang.Mo@xxxxxxxx> --- fs/exfat/super.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/fs/exfat/super.c b/fs/exfat/super.c index 8465033a6cf0..6a23523b1276 100644 --- a/fs/exfat/super.c +++ b/fs/exfat/super.c @@ -745,7 +745,7 @@ static void exfat_free(struct fs_context *fc) { struct exfat_sb_info *sbi = fc->s_fs_info; - if (sbi) + if (sbi && fc->purpose != FS_CONTEXT_FOR_RECONFIGURE) exfat_free_sbi(sbi); } @@ -769,6 +769,11 @@ static int exfat_init_fs_context(struct fs_context *fc) { struct exfat_sb_info *sbi; + if (fc->purpose == FS_CONTEXT_FOR_RECONFIGURE) { /* remount */ + sbi = EXFAT_SB(fc->root->d_sb); + goto out; + } + sbi = kzalloc(sizeof(struct exfat_sb_info), GFP_KERNEL); if (!sbi) return -ENOMEM; @@ -786,6 +791,7 @@ static int exfat_init_fs_context(struct fs_context *fc) sbi->options.iocharset = exfat_default_iocharset; sbi->options.errors = EXFAT_ERRORS_RO; +out: fc->s_fs_info = sbi; fc->ops = &exfat_context_ops; return 0; -- 2.43.0