]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.10-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 27 Feb 2024 13:07:12 +0000 (14:07 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 27 Feb 2024 13:07:12 +0000 (14:07 +0100)
added patches:
ext4-regenerate-buddy-after-block-freeing-failed-if-under-fc-replay.patch

queue-5.10/ext4-regenerate-buddy-after-block-freeing-failed-if-under-fc-replay.patch [new file with mode: 0644]
queue-5.10/series

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 (file)
index 0000000..73fbec5
--- /dev/null
@@ -0,0 +1,63 @@
+From c9b528c35795b711331ed36dc3dbee90d5812d4e Mon Sep 17 00:00:00 2001
+From: Baokun Li <libaokun1@huawei.com>
+Date: Thu, 4 Jan 2024 22:20:35 +0800
+Subject: ext4: regenerate buddy after block freeing failed if under fc replay
+
+From: Baokun Li <libaokun1@huawei.com>
+
+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 <jack@suse.cz>
+Fixes: 6bd97bf273bd ("ext4: remove redundant mb_regenerate_buddy()")
+Signed-off-by: Baokun Li <libaokun1@huawei.com>
+Reviewed-by: Jan Kara <jack@suse.cz>
+Link: https://lore.kernel.org/r/20240104142040.2835097-4-libaokun1@huawei.com
+Signed-off-by: Theodore Ts'o <tytso@mit.edu>
+Signed-off-by: Baokun Li <libaokun1@huawei.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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;
+       }
index 4d2bb5dde7d32db5915671a67d960049e18f8782..d201dd7a35eb47ecb98e2aca237be52bbaccd669 100644 (file)
@@ -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