aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
authorKangNing Liao <lkangn.kernel@gmail.com>2026-05-21 20:29:45 +0800
committerDavid Sterba <dsterba@suse.com>2026-05-24 03:01:10 +0200
commit060bd618196fc3c432386b28c072b524f4d2de38 (patch)
treeefc37817a05fff559b3a39a74800231eb33421fa /fs
parent1f064323fb2fcdb9b163494518b0324bf7751b5f (diff)
downloadlinux-next-history-060bd618196fc3c432386b28c072b524f4d2de38.tar.gz
btrfs: protect sb_write_pointer() with invalidate lock
sb_write_pointer() reads the super block from the block device page cache using read_cache_page_gfp(). This has the same race with BLKBSZSET as the one fixed by commit 3f29d661e568 ("btrfs: sync read disk super and set block size"). Take the mapping invalidate lock around read_cache_page_gfp() to serialize the read against block size changes. Signed-off-by: KangNing Liao <lkangn.kernel@gmail.com> Reviewed-by: Qu Wenruo <wqu@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/btrfs/zoned.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/fs/btrfs/zoned.c b/fs/btrfs/zoned.c
index 16dd87aa06f20..5f75cf0e14b95 100644
--- a/fs/btrfs/zoned.c
+++ b/fs/btrfs/zoned.c
@@ -131,8 +131,10 @@ static int sb_write_pointer(struct block_device *bdev, struct blk_zone *zones,
u64 bytenr = ALIGN_DOWN(zone_end, BTRFS_SUPER_INFO_SIZE) -
BTRFS_SUPER_INFO_SIZE;
+ filemap_invalidate_lock(mapping);
page[i] = read_cache_page_gfp(mapping,
bytenr >> PAGE_SHIFT, GFP_NOFS);
+ filemap_invalidate_unlock(mapping);
if (IS_ERR(page[i])) {
if (i == 1)
btrfs_release_disk_super(super[0]);