From: Greg Kroah-Hartman Date: Tue, 27 Feb 2024 13:07:12 +0000 (+0100) Subject: 5.10-stable patches X-Git-Tag: v4.19.308~7 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=40f18179c028b2062e67c12dcbbad2caf7e9f198;p=thirdparty%2Fkernel%2Fstable-queue.git 5.10-stable patches added patches: ext4-regenerate-buddy-after-block-freeing-failed-if-under-fc-replay.patch --- diff --git a/queue-5.10/ext4-regenerate-buddy-after-block-freeing-failed-if-under-fc-replay.patch b/queue-5.10/ext4-regenerate-buddy-after-block-freeing-failed-if-under-fc-replay.patch new file mode 100644 index 00000000000..73fbec5df84 --- /dev/null +++ b/queue-5.10/ext4-regenerate-buddy-after-block-freeing-failed-if-under-fc-replay.patch @@ -0,0 +1,63 @@ +From c9b528c35795b711331ed36dc3dbee90d5812d4e Mon Sep 17 00:00:00 2001 +From: Baokun Li +Date: Thu, 4 Jan 2024 22:20:35 +0800 +Subject: ext4: regenerate buddy after block freeing failed if under fc replay + +From: Baokun Li + +commit c9b528c35795b711331ed36dc3dbee90d5812d4e upstream. + +This mostly reverts commit 6bd97bf273bd ("ext4: remove redundant +mb_regenerate_buddy()") and reintroduces mb_regenerate_buddy(). Based on +code in mb_free_blocks(), fast commit replay can end up marking as free +blocks that are already marked as such. This causes corruption of the +buddy bitmap so we need to regenerate it in that case. + +Reported-by: Jan Kara +Fixes: 6bd97bf273bd ("ext4: remove redundant mb_regenerate_buddy()") +Signed-off-by: Baokun Li +Reviewed-by: Jan Kara +Link: https://lore.kernel.org/r/20240104142040.2835097-4-libaokun1@huawei.com +Signed-off-by: Theodore Ts'o +Signed-off-by: Baokun Li +Signed-off-by: Greg Kroah-Hartman +--- + fs/ext4/mballoc.c | 20 ++++++++++++++++++++ + 1 file changed, 20 insertions(+) + +--- a/fs/ext4/mballoc.c ++++ b/fs/ext4/mballoc.c +@@ -823,6 +823,24 @@ void ext4_mb_generate_buddy(struct super + atomic64_add(period, &sbi->s_mb_generation_time); + } + ++static void mb_regenerate_buddy(struct ext4_buddy *e4b) ++{ ++ int count; ++ int order = 1; ++ void *buddy; ++ ++ while ((buddy = mb_find_buddy(e4b, order++, &count))) ++ ext4_set_bits(buddy, 0, count); ++ ++ e4b->bd_info->bb_fragments = 0; ++ memset(e4b->bd_info->bb_counters, 0, ++ sizeof(*e4b->bd_info->bb_counters) * ++ (e4b->bd_sb->s_blocksize_bits + 2)); ++ ++ ext4_mb_generate_buddy(e4b->bd_sb, e4b->bd_buddy, ++ e4b->bd_bitmap, e4b->bd_group, e4b->bd_info); ++} ++ + /* The buddy information is attached the buddy cache inode + * for convenience. The information regarding each group + * is loaded via ext4_mb_load_buddy. The information involve +@@ -1505,6 +1523,8 @@ static void mb_free_blocks(struct inode + ext4_mark_group_bitmap_corrupted( + sb, e4b->bd_group, + EXT4_GROUP_INFO_BBITMAP_CORRUPT); ++ } else { ++ mb_regenerate_buddy(e4b); + } + goto done; + } diff --git a/queue-5.10/series b/queue-5.10/series index 4d2bb5dde7d..d201dd7a35e 100644 --- a/queue-5.10/series +++ b/queue-5.10/series @@ -119,3 +119,4 @@ drm-amd-display-fix-memory-leak-in-dm_sw_fini.patch block-ataflop-more-blk-mq-refactoring-fixes.patch fs-aio-restrict-kiocb_set_cancel_fn-to-i-o-submitted-via-libaio.patch arp-prevent-overflow-in-arp_req_get.patch +ext4-regenerate-buddy-after-block-freeing-failed-if-under-fc-replay.patch