mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 02:21:52 +09:00
ext4: check for allocation block validity with block group locked
commit8d5a803c6aupstream. With commit044e6e3d74: "ext4: don't update checksum of new initialized bitmaps" the buffer valid bit will get set without actually setting up the checksum for the allocation bitmap, since the checksum will get calculated once we actually allocate an inode or block. If we are doing this, then we need to (re-)check the verified bit after we take the block group lock. Otherwise, we could race with another process reading and verifying the bitmap, which would then complain about the checksum being invalid. https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1780137 Signed-off-by: Theodore Ts'o <tytso@mit.edu> Cc: stable@kernel.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
cdcbe750ac
commit
dc1b4b710f
@@ -379,6 +379,8 @@ static int ext4_validate_block_bitmap(struct super_block *sb,
|
||||
return -EFSCORRUPTED;
|
||||
|
||||
ext4_lock_group(sb, block_group);
|
||||
if (buffer_verified(bh))
|
||||
goto verified;
|
||||
if (unlikely(!ext4_block_bitmap_csum_verify(sb, block_group,
|
||||
desc, bh))) {
|
||||
ext4_unlock_group(sb, block_group);
|
||||
@@ -401,6 +403,7 @@ static int ext4_validate_block_bitmap(struct super_block *sb,
|
||||
return -EFSCORRUPTED;
|
||||
}
|
||||
set_buffer_verified(bh);
|
||||
verified:
|
||||
ext4_unlock_group(sb, block_group);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -91,6 +91,8 @@ static int ext4_validate_inode_bitmap(struct super_block *sb,
|
||||
return -EFSCORRUPTED;
|
||||
|
||||
ext4_lock_group(sb, block_group);
|
||||
if (buffer_verified(bh))
|
||||
goto verified;
|
||||
blk = ext4_inode_bitmap(sb, desc);
|
||||
if (!ext4_inode_bitmap_csum_verify(sb, block_group, desc, bh,
|
||||
EXT4_INODES_PER_GROUP(sb) / 8)) {
|
||||
@@ -108,6 +110,7 @@ static int ext4_validate_inode_bitmap(struct super_block *sb,
|
||||
return -EFSBADCRC;
|
||||
}
|
||||
set_buffer_verified(bh);
|
||||
verified:
|
||||
ext4_unlock_group(sb, block_group);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user