]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
exfat: fix remount failure in different process environments
authorYuezhang Mo <Yuezhang.Mo@sony.com>
Fri, 28 Nov 2025 09:51:10 +0000 (17:51 +0800)
committerNamjae Jeon <linkinjeon@kernel.org>
Wed, 3 Dec 2025 01:00:17 +0000 (10:00 +0900)
The kernel test robot reported that the exFAT remount operation
failed. The reason for the failure was that the process's umask
is different between mount and remount, causing fs_fmask and
fs_dmask are changed.

Potentially, both gid and uid may also be changed. Therefore, when
initializing fs_context for remount, inherit these mount options
from the options used during mount.

Reported-by: kernel test robot <oliver.sang@intel.com>
Closes: https://lore.kernel.org/oe-lkp/202511251637.81670f5c-lkp@intel.com
Signed-off-by: Yuezhang Mo <Yuezhang.Mo@sony.com>
Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
fs/exfat/super.c

index bc03f47374d47c264ab1bfdfa470fff8c7e82a36..10e872a996638a480a910ab70f4ef4b4f689b2ea 100644 (file)
@@ -824,10 +824,21 @@ static int exfat_init_fs_context(struct fs_context *fc)
        ratelimit_state_init(&sbi->ratelimit, DEFAULT_RATELIMIT_INTERVAL,
                        DEFAULT_RATELIMIT_BURST);
 
-       sbi->options.fs_uid = current_uid();
-       sbi->options.fs_gid = current_gid();
-       sbi->options.fs_fmask = current->fs->umask;
-       sbi->options.fs_dmask = current->fs->umask;
+       if (fc->purpose == FS_CONTEXT_FOR_RECONFIGURE && fc->root) {
+               struct super_block *sb = fc->root->d_sb;
+               struct exfat_mount_options *cur_opts = &EXFAT_SB(sb)->options;
+
+               sbi->options.fs_uid = cur_opts->fs_uid;
+               sbi->options.fs_gid = cur_opts->fs_gid;
+               sbi->options.fs_fmask = cur_opts->fs_fmask;
+               sbi->options.fs_dmask = cur_opts->fs_dmask;
+       } else {
+               sbi->options.fs_uid = current_uid();
+               sbi->options.fs_gid = current_gid();
+               sbi->options.fs_fmask = current->fs->umask;
+               sbi->options.fs_dmask = current->fs->umask;
+       }
+
        sbi->options.allow_utime = -1;
        sbi->options.errors = EXFAT_ERRORS_RO;
        exfat_set_iocharset(&sbi->options, exfat_default_iocharset);