ext4: get block from bh in ext4_free_blocks for fast commit replay
commit 11b6890be0084ad4df0e06d89a9fdcc948472c65 upstream. ext4_free_blocks will retrieve block from bh if block parameter is zero. Retrieve block before ext4_free_blocks_simple to avoid potentially passing wrong block to ext4_free_blocks_simple. Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com> Cc: stable@kernel.org Reviewed-by: Ojaswin Mujoo <ojaswin@linux.ibm.com> Link: https://lore.kernel.org/r/20230603150327.3596033-9-shikemeng@huaweicloud.com Signed-off-by: Theodore Ts'o <tytso@mit.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
d054422eb6
commit
514220246a
@ -5634,12 +5634,6 @@ void ext4_free_blocks(handle_t *handle, struct inode *inode,
|
|||||||
|
|
||||||
sbi = EXT4_SB(sb);
|
sbi = EXT4_SB(sb);
|
||||||
|
|
||||||
if (sbi->s_mount_state & EXT4_FC_REPLAY) {
|
|
||||||
ext4_free_blocks_simple(inode, block, count);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
might_sleep();
|
|
||||||
if (bh) {
|
if (bh) {
|
||||||
if (block)
|
if (block)
|
||||||
BUG_ON(block != bh->b_blocknr);
|
BUG_ON(block != bh->b_blocknr);
|
||||||
@ -5647,6 +5641,13 @@ void ext4_free_blocks(handle_t *handle, struct inode *inode,
|
|||||||
block = bh->b_blocknr;
|
block = bh->b_blocknr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sbi->s_mount_state & EXT4_FC_REPLAY) {
|
||||||
|
ext4_free_blocks_simple(inode, block, count);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
might_sleep();
|
||||||
|
|
||||||
if (!(flags & EXT4_FREE_BLOCKS_VALIDATED) &&
|
if (!(flags & EXT4_FREE_BLOCKS_VALIDATED) &&
|
||||||
!ext4_inode_block_valid(inode, block, count)) {
|
!ext4_inode_block_valid(inode, block, count)) {
|
||||||
ext4_error(sb, "Freeing blocks not in datazone - "
|
ext4_error(sb, "Freeing blocks not in datazone - "
|
||||||
|
Loading…
Reference in New Issue
Block a user