mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
exfat: clear the volume dirty flag only when remounting read-only
exfat_reconfigure() does not hold s_lock while calling sync_filesystem(). Therefore, the filesystem can become dirty again between the sync and clearing the volume dirty flag, leaving a dirty filesystem with a clean volume flag. Holding s_lock across sync_filesystem() is not an option because it can lead to a deadlock: writeback takes s_lock in exfat_write_inode(). Instead, clear the volume dirty flag only when remounting the filesystem read-only, where no writer can modify the filesystem after the sync. For a normal read-only remount, reconfigure_super() calls sb_prepare_remount_readonly() before ->reconfigure(), which returns -EBUSY if any writer is still active. Afterwards sb_start_ro_state_change() sets sb->s_readonly_remount, so mnt_get_write_access() fails with -EROFS and no new writer can start until the reconfiguration finishes. Therefore no writer can race with the sync and the clearing. Forced remounts are different: with SB_FORCE, reconfigure_super() skips sb_prepare_remount_readonly(), so the writers active at that moment are not blocked and can still dirty the filesystem after the sync. Do not clear the volume dirty flag in this case. Signed-off-by: Chi Zhiling <chizhiling@kylinos.cn> Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
This commit is contained in:
parent
61011fb95c
commit
7d390ca06f
|
|
@ -775,9 +775,13 @@ static int exfat_reconfigure(struct fs_context *fc)
|
|||
fc->sb_flags |= SB_NODIRATIME;
|
||||
|
||||
sync_filesystem(sb);
|
||||
mutex_lock(&sbi->s_lock);
|
||||
exfat_clear_volume_dirty(sb);
|
||||
mutex_unlock(&sbi->s_lock);
|
||||
|
||||
if ((fc->sb_flags & (SB_FORCE | SB_RDONLY)) == SB_RDONLY &&
|
||||
!sb_rdonly(sb)) {
|
||||
mutex_lock(&sbi->s_lock);
|
||||
exfat_clear_volume_dirty(sb);
|
||||
mutex_unlock(&sbi->s_lock);
|
||||
}
|
||||
|
||||
if (new_opts->allow_utime == (unsigned short)-1)
|
||||
new_opts->allow_utime = ~new_opts->fs_dmask & 0022;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user