Commit d9d55675 authored by Johannes Thumshirn's avatar Johannes Thumshirn Committed by Jens Axboe

btrfs: zoned: call blkdev_zone_mgmt in nofs scope

Add a memalloc_nofs scope around all calls to blkdev_zone_mgmt(). This
allows us to further get rid of the GFP_NOFS argument for
blkdev_zone_mgmt().
Signed-off-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: default avatarDamien Le Moal <dlemoal@kernel.org>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Link: https://lore.kernel.org/r/20240128-zonefs_nofs-v3-3-ae3b7c8def61@wdc.comSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 21808201
...@@ -824,11 +824,15 @@ static int sb_log_location(struct block_device *bdev, struct blk_zone *zones, ...@@ -824,11 +824,15 @@ static int sb_log_location(struct block_device *bdev, struct blk_zone *zones,
reset = &zones[1]; reset = &zones[1];
if (reset && reset->cond != BLK_ZONE_COND_EMPTY) { if (reset && reset->cond != BLK_ZONE_COND_EMPTY) {
unsigned int nofs_flags;
ASSERT(sb_zone_is_full(reset)); ASSERT(sb_zone_is_full(reset));
nofs_flags = memalloc_nofs_save();
ret = blkdev_zone_mgmt(bdev, REQ_OP_ZONE_RESET, ret = blkdev_zone_mgmt(bdev, REQ_OP_ZONE_RESET,
reset->start, reset->len, reset->start, reset->len,
GFP_NOFS); GFP_KERNEL);
memalloc_nofs_restore(nofs_flags);
if (ret) if (ret)
return ret; return ret;
...@@ -974,11 +978,14 @@ int btrfs_advance_sb_log(struct btrfs_device *device, int mirror) ...@@ -974,11 +978,14 @@ int btrfs_advance_sb_log(struct btrfs_device *device, int mirror)
* explicit ZONE_FINISH is not necessary. * explicit ZONE_FINISH is not necessary.
*/ */
if (zone->wp != zone->start + zone->capacity) { if (zone->wp != zone->start + zone->capacity) {
unsigned int nofs_flags;
int ret; int ret;
nofs_flags = memalloc_nofs_save();
ret = blkdev_zone_mgmt(device->bdev, ret = blkdev_zone_mgmt(device->bdev,
REQ_OP_ZONE_FINISH, zone->start, REQ_OP_ZONE_FINISH, zone->start,
zone->len, GFP_NOFS); zone->len, GFP_KERNEL);
memalloc_nofs_restore(nofs_flags);
if (ret) if (ret)
return ret; return ret;
} }
...@@ -996,11 +1003,13 @@ int btrfs_advance_sb_log(struct btrfs_device *device, int mirror) ...@@ -996,11 +1003,13 @@ int btrfs_advance_sb_log(struct btrfs_device *device, int mirror)
int btrfs_reset_sb_log_zones(struct block_device *bdev, int mirror) int btrfs_reset_sb_log_zones(struct block_device *bdev, int mirror)
{ {
unsigned int nofs_flags;
sector_t zone_sectors; sector_t zone_sectors;
sector_t nr_sectors; sector_t nr_sectors;
u8 zone_sectors_shift; u8 zone_sectors_shift;
u32 sb_zone; u32 sb_zone;
u32 nr_zones; u32 nr_zones;
int ret;
zone_sectors = bdev_zone_sectors(bdev); zone_sectors = bdev_zone_sectors(bdev);
zone_sectors_shift = ilog2(zone_sectors); zone_sectors_shift = ilog2(zone_sectors);
...@@ -1011,9 +1020,13 @@ int btrfs_reset_sb_log_zones(struct block_device *bdev, int mirror) ...@@ -1011,9 +1020,13 @@ int btrfs_reset_sb_log_zones(struct block_device *bdev, int mirror)
if (sb_zone + 1 >= nr_zones) if (sb_zone + 1 >= nr_zones)
return -ENOENT; return -ENOENT;
return blkdev_zone_mgmt(bdev, REQ_OP_ZONE_RESET, nofs_flags = memalloc_nofs_save();
zone_start_sector(sb_zone, bdev), ret = blkdev_zone_mgmt(bdev, REQ_OP_ZONE_RESET,
zone_sectors * BTRFS_NR_SB_LOG_ZONES, GFP_NOFS); zone_start_sector(sb_zone, bdev),
zone_sectors * BTRFS_NR_SB_LOG_ZONES,
GFP_KERNEL);
memalloc_nofs_restore(nofs_flags);
return ret;
} }
/* /*
...@@ -1124,12 +1137,15 @@ static void btrfs_dev_clear_active_zone(struct btrfs_device *device, u64 pos) ...@@ -1124,12 +1137,15 @@ static void btrfs_dev_clear_active_zone(struct btrfs_device *device, u64 pos)
int btrfs_reset_device_zone(struct btrfs_device *device, u64 physical, int btrfs_reset_device_zone(struct btrfs_device *device, u64 physical,
u64 length, u64 *bytes) u64 length, u64 *bytes)
{ {
unsigned int nofs_flags;
int ret; int ret;
*bytes = 0; *bytes = 0;
nofs_flags = memalloc_nofs_save();
ret = blkdev_zone_mgmt(device->bdev, REQ_OP_ZONE_RESET, ret = blkdev_zone_mgmt(device->bdev, REQ_OP_ZONE_RESET,
physical >> SECTOR_SHIFT, length >> SECTOR_SHIFT, physical >> SECTOR_SHIFT, length >> SECTOR_SHIFT,
GFP_NOFS); GFP_KERNEL);
memalloc_nofs_restore(nofs_flags);
if (ret) if (ret)
return ret; return ret;
...@@ -2234,14 +2250,17 @@ static int do_zone_finish(struct btrfs_block_group *block_group, bool fully_writ ...@@ -2234,14 +2250,17 @@ static int do_zone_finish(struct btrfs_block_group *block_group, bool fully_writ
struct btrfs_device *device = map->stripes[i].dev; struct btrfs_device *device = map->stripes[i].dev;
const u64 physical = map->stripes[i].physical; const u64 physical = map->stripes[i].physical;
struct btrfs_zoned_device_info *zinfo = device->zone_info; struct btrfs_zoned_device_info *zinfo = device->zone_info;
unsigned int nofs_flags;
if (zinfo->max_active_zones == 0) if (zinfo->max_active_zones == 0)
continue; continue;
nofs_flags = memalloc_nofs_save();
ret = blkdev_zone_mgmt(device->bdev, REQ_OP_ZONE_FINISH, ret = blkdev_zone_mgmt(device->bdev, REQ_OP_ZONE_FINISH,
physical >> SECTOR_SHIFT, physical >> SECTOR_SHIFT,
zinfo->zone_size >> SECTOR_SHIFT, zinfo->zone_size >> SECTOR_SHIFT,
GFP_NOFS); GFP_KERNEL);
memalloc_nofs_restore(nofs_flags);
if (ret) if (ret)
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment