Patch "btrfs: subpage: fix the bitmap dump which can cause bitmap corruption" has been added to the 6.6-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

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

to the 6.6-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     btrfs-subpage-fix-the-bitmap-dump-which-can-cause-bi.patch
and it can be found in the queue-6.6 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 0ee6c631ddf129206d318890c6460cdceb05603e
Author: Qu Wenruo <wqu@xxxxxxxx>
Date:   Fri Aug 30 16:35:48 2024 +0930

    btrfs: subpage: fix the bitmap dump which can cause bitmap corruption
    
    [ Upstream commit 77b0b98bb743f5d04d8f995ba1936e1143689d4a ]
    
    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 problem.
    
    Fix it to use bitmap_read() to only grab the desired sub-bitmap.
    
    Fixes: 75258f20fb70 ("btrfs: subpage: dump extra subpage bitmaps for debug")
    CC: stable@xxxxxxxxxxxxxxx # 6.6+
    Signed-off-by: Qu Wenruo <wqu@xxxxxxxx>
    Reviewed-by: David Sterba <dsterba@xxxxxxxx>
    Signed-off-by: David Sterba <dsterba@xxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/fs/btrfs/subpage.c b/fs/btrfs/subpage.c
index 1b999c6e41930..b98d42ca55647 100644
--- a/fs/btrfs/subpage.c
+++ b/fs/btrfs/subpage.c
@@ -713,8 +713,14 @@ void btrfs_page_unlock_writer(struct btrfs_fs_info *fs_info, struct page *page,
 }
 
 #define GET_SUBPAGE_BITMAP(subpage, subpage_info, name, dst)		\
-	bitmap_cut(dst, subpage->bitmaps, 0,				\
-		   subpage_info->name##_offset, subpage_info->bitmap_nr_bits)
+{									\
+	const int bitmap_nr_bits = subpage_info->bitmap_nr_bits;	\
+									\
+	ASSERT(bitmap_nr_bits < BITS_PER_LONG);				\
+	*dst = bitmap_read(subpage->bitmaps,				\
+			   subpage_info->name##_offset,			\
+			   bitmap_nr_bits);				\
+}
 
 void __cold btrfs_subpage_dump_bitmap(const struct btrfs_fs_info *fs_info,
 				      struct page *page, u64 start, u32 len)




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux