diff mbox series

btrfs: subpage: fix the bitmap dump which can cause bitmap corruption

Message ID 2d1b89e8400e2a536dc5b43bf1e35821b469a14d.1724997259.git.wqu@suse.com (mailing list archive)
State New
Headers show
Series btrfs: subpage: fix the bitmap dump which can cause bitmap corruption | expand

Commit Message

Qu Wenruo Aug. 30, 2024, 5:54 a.m. UTC
In commit 75258f20fb70 ("btrfs: subpage: dump extra subpage bitmaps for
debug") an internal macro GET_SUBPAGE_BITMAP() is introduced to grab the
bitmap of each attribute.

But that commit is using bitmap_cut() which will do the left shift of
the larger bitmap, causing incorrect values.

Thankfully this bitmap_cut() is only called for debug usage, and so far
it's not yet causing problems.

Fix it to use bitmap_read() to only grab the desired sub-bitmap.

Fixes: 75258f20fb70 ("btrfs: subpage: dump extra subpage bitmaps for debug")
Signed-off-by: Qu Wenruo <wqu@suse.com>
---
This patch contains the fix for patch "btrfs: refactor
__extent_writepage_io() to do sector-by-sector submission", thankfully
that patch is not yet upstreamed.

I'll put the fix before that commit when merging.
---
 fs/btrfs/subpage.c | 21 ++++++++++-----------
 1 file changed, 10 insertions(+), 11 deletions(-)
diff mbox series

Patch

diff --git a/fs/btrfs/subpage.c b/fs/btrfs/subpage.c
index 663f2f953a65..6a73834368c8 100644
--- a/fs/btrfs/subpage.c
+++ b/fs/btrfs/subpage.c
@@ -869,10 +869,10 @@  void btrfs_folio_end_all_writers(const struct btrfs_fs_info *fs_info, struct fol
 	}
 }
 
-#define GET_SUBPAGE_BITMAP(subpage, fs_info, name, dst)			\
-	bitmap_cut(dst, subpage->bitmaps, 0,				\
-		   fs_info->sectors_per_page * btrfs_bitmap_nr_##name,	\
-		   fs_info->sectors_per_page)
+#define GET_SUBPAGE_BITMAP(subpage, fs_info, name)			\
+	bitmap_read(subpage->bitmaps,					\
+		    fs_info->sectors_per_page * btrfs_bitmap_nr_##name,	\
+		    fs_info->sectors_per_page)
 
 void __cold btrfs_subpage_dump_bitmap(const struct btrfs_fs_info *fs_info,
 				      struct folio *folio, u64 start, u32 len)
@@ -891,12 +891,11 @@  void __cold btrfs_subpage_dump_bitmap(const struct btrfs_fs_info *fs_info,
 	subpage = folio_get_private(folio);
 
 	spin_lock_irqsave(&subpage->lock, flags);
-	GET_SUBPAGE_BITMAP(subpage, fs_info, uptodate, &uptodate_bitmap);
-	GET_SUBPAGE_BITMAP(subpage, fs_info, dirty, &dirty_bitmap);
-	GET_SUBPAGE_BITMAP(subpage, fs_info, writeback, &writeback_bitmap);
-	GET_SUBPAGE_BITMAP(subpage, fs_info, ordered, &ordered_bitmap);
-	GET_SUBPAGE_BITMAP(subpage, fs_info, checked, &checked_bitmap);
-	GET_SUBPAGE_BITMAP(subpage, fs_info, locked, &checked_bitmap);
+	uptodate_bitmap = GET_SUBPAGE_BITMAP(subpage, fs_info, uptodate);
+	dirty_bitmap = GET_SUBPAGE_BITMAP(subpage, fs_info, dirty);
+	writeback_bitmap = GET_SUBPAGE_BITMAP(subpage, fs_info, writeback);
+	ordered_bitmap = GET_SUBPAGE_BITMAP(subpage, fs_info, ordered);
+	checked_bitmap = GET_SUBPAGE_BITMAP(subpage, fs_info, checked);
 	spin_unlock_irqrestore(&subpage->lock, flags);
 
 	dump_page(folio_page(folio, 0), "btrfs subpage dump");
@@ -922,6 +921,6 @@  void btrfs_get_subpage_dirty_bitmap(struct btrfs_fs_info *fs_info,
 	subpage = folio_get_private(folio);
 
 	spin_lock_irqsave(&subpage->lock, flags);
-	GET_SUBPAGE_BITMAP(subpage, fs_info, dirty, ret_bitmap);
+	*ret_bitmap = GET_SUBPAGE_BITMAP(subpage, fs_info, dirty);
 	spin_unlock_irqrestore(&subpage->lock, flags);
 }