]> git.itanic.dy.fi Git - linux-stable/commitdiff
Revert "ext4: fix superblock checksum calculation race"
authorTheodore Ts'o <tytso@mit.edu>
Wed, 11 Nov 2020 19:24:18 +0000 (14:24 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Wed, 11 Nov 2020 19:24:18 +0000 (14:24 -0500)
This reverts commit acaa532687cdc3a03757defafece9c27aa667546 which can
result in a ext4_superblock_csum_set() trying to sleep while a
spinlock is being held.

For more discussion of this issue, please see:

https://lore.kernel.org/r/000000000000f50cb705b313ed70@google.com

Reported-by: syzbot+7a4ba6a239b91a126c28@syzkaller.appspotmail.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/super.c

index c3b864588a0be83a489031504267721a22a521ee..6633b20224d509bce8107834ef07d700d9244cbe 100644 (file)
@@ -289,18 +289,7 @@ void ext4_superblock_csum_set(struct super_block *sb)
        if (!ext4_has_metadata_csum(sb))
                return;
 
-       /*
-        * Locking the superblock prevents the scenario
-        * where:
-        *  1) a first thread pauses during checksum calculation.
-        *  2) a second thread updates the superblock, recalculates
-        *     the checksum, and updates s_checksum
-        *  3) the first thread resumes and finishes its checksum calculation
-        *     and updates s_checksum with a potentially stale or torn value.
-        */
-       lock_buffer(EXT4_SB(sb)->s_sbh);
        es->s_checksum = ext4_superblock_csum(sb, es);
-       unlock_buffer(EXT4_SB(sb)->s_sbh);
 }
 
 ext4_fsblk_t ext4_block_bitmap(struct super_block *sb,