mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
Revert "ext4: fix superblock checksum calculation race"
This reverts commit acaa532687
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>
This commit is contained in:
parent
a72b38eebe
commit
d196e229a8
@ -289,18 +289,7 @@ void ext4_superblock_csum_set(struct super_block *sb)
|
|||||||
if (!ext4_has_metadata_csum(sb))
|
if (!ext4_has_metadata_csum(sb))
|
||||||
return;
|
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);
|
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,
|
ext4_fsblk_t ext4_block_bitmap(struct super_block *sb,
|
||||||
|
Loading…
Reference in New Issue
Block a user