mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 18:21:24 +02:00
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 3f29d661e5 ("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>
This commit is contained in:
parent
d8576024fa
commit
123b9a545f
|
|
@ -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]);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user