Skip to content

Commit 8749f57

Browse files
jankaragregkh
authored andcommitted
ext4: don't set SB_RDONLY after filesystem errors
[ Upstream commit d3476f3 ] When the filesystem is mounted with errors=remount-ro, we were setting SB_RDONLY flag to stop all filesystem modifications. We knew this misses proper locking (sb->s_umount) and does not go through proper filesystem remount procedure but it has been the way this worked since early ext2 days and it was good enough for catastrophic situation damage mitigation. Recently, syzbot has found a way (see link) to trigger warnings in filesystem freezing because the code got confused by SB_RDONLY changing under its hands. Since these days we set EXT4_FLAGS_SHUTDOWN on the superblock which is enough to stop all filesystem modifications, modifying SB_RDONLY shouldn't be needed. So stop doing that. Link: https://lore.kernel.org/all/[email protected] Reported-by: Christian Brauner <[email protected]> Signed-off-by: Jan Kara <[email protected]> Reviewed-by: Christian Brauner <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Theodore Ts'o <[email protected]> Signed-off-by: Sasha Levin <[email protected]>
1 parent f262471 commit 8749f57

File tree

1 file changed

+5
-4
lines changed

1 file changed

+5
-4
lines changed

fs/ext4/super.c

+5-4
Original file line numberDiff line numberDiff line change
@@ -674,11 +674,12 @@ static void ext4_handle_error(struct super_block *sb, bool force_ro, int error,
674674

675675
ext4_msg(sb, KERN_CRIT, "Remounting filesystem read-only");
676676
/*
677-
* Make sure updated value of ->s_mount_flags will be visible before
678-
* ->s_flags update
677+
* EXT4_FLAGS_SHUTDOWN was set which stops all filesystem
678+
* modifications. We don't set SB_RDONLY because that requires
679+
* sb->s_umount semaphore and setting it without proper remount
680+
* procedure is confusing code such as freeze_super() leading to
681+
* deadlocks and other problems.
679682
*/
680-
smp_wmb();
681-
sb->s_flags |= SB_RDONLY;
682683
}
683684

684685
static void flush_stashed_error_work(struct work_struct *work)

0 commit comments

Comments
 (0)