btrfs: zoned: call blkdev_zone_mgmt in nofs scope
authorJohannes Thumshirn <johannes.thumshirn@wdc.com>
Mon, 29 Jan 2024 07:52:18 +0000 (23:52 -0800)
committerJens Axboe <axboe@kernel.dk>
Mon, 12 Feb 2024 15:41:16 +0000 (08:41 -0700)
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: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: David Sterba <dsterba@suse.com>
Link: https://lore.kernel.org/r/20240128-zonefs_nofs-v3-3-ae3b7c8def61@wdc.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/btrfs/zoned.c

index 168af9d000d168324fcc8355781517ddeedeefd1..05640d61e435f504ea033ee3276aa18d907c8dbd 100644 (file)
@@ -824,11 +824,15 @@ static int sb_log_location(struct block_device *bdev, struct blk_zone *zones,
                        reset = &zones[1];
 
                if (reset && reset->cond != BLK_ZONE_COND_EMPTY) {
+                       unsigned int nofs_flags;
+
                        ASSERT(sb_zone_is_full(reset));
 
+                       nofs_flags = memalloc_nofs_save();
                        ret = blkdev_zone_mgmt(bdev, REQ_OP_ZONE_RESET,
                                               reset->start, reset->len,
-                                              GFP_NOFS);
+                                              GFP_KERNEL);
+                       memalloc_nofs_restore(nofs_flags);
                        if (ret)
                                return ret;
 
@@ -974,11 +978,14 @@ int btrfs_advance_sb_log(struct btrfs_device *device, int mirror)
                         * explicit ZONE_FINISH is not necessary.
                         */
                        if (zone->wp != zone->start + zone->capacity) {
+                               unsigned int nofs_flags;
                                int ret;
 
+                               nofs_flags = memalloc_nofs_save();
                                ret = blkdev_zone_mgmt(device->bdev,
                                                REQ_OP_ZONE_FINISH, zone->start,
-                                               zone->len, GFP_NOFS);
+                                               zone->len, GFP_KERNEL);
+                               memalloc_nofs_restore(nofs_flags);
                                if (ret)
                                        return ret;
                        }
@@ -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)
 {
+       unsigned int nofs_flags;
        sector_t zone_sectors;
        sector_t nr_sectors;
        u8 zone_sectors_shift;
        u32 sb_zone;
        u32 nr_zones;
+       int ret;
 
        zone_sectors = bdev_zone_sectors(bdev);
        zone_sectors_shift = ilog2(zone_sectors);
@@ -1011,9 +1020,13 @@ int btrfs_reset_sb_log_zones(struct block_device *bdev, int mirror)
        if (sb_zone + 1 >= nr_zones)
                return -ENOENT;
 
-       return blkdev_zone_mgmt(bdev, REQ_OP_ZONE_RESET,
-                               zone_start_sector(sb_zone, bdev),
-                               zone_sectors * BTRFS_NR_SB_LOG_ZONES, GFP_NOFS);
+       nofs_flags = memalloc_nofs_save();
+       ret = blkdev_zone_mgmt(bdev, REQ_OP_ZONE_RESET,
+                              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)
 int btrfs_reset_device_zone(struct btrfs_device *device, u64 physical,
                            u64 length, u64 *bytes)
 {
+       unsigned int nofs_flags;
        int ret;
 
        *bytes = 0;
+       nofs_flags = memalloc_nofs_save();
        ret = blkdev_zone_mgmt(device->bdev, REQ_OP_ZONE_RESET,
                               physical >> SECTOR_SHIFT, length >> SECTOR_SHIFT,
-                              GFP_NOFS);
+                              GFP_KERNEL);
+       memalloc_nofs_restore(nofs_flags);
        if (ret)
                return ret;
 
@@ -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;
                const u64 physical = map->stripes[i].physical;
                struct btrfs_zoned_device_info *zinfo = device->zone_info;
+               unsigned int nofs_flags;
 
                if (zinfo->max_active_zones == 0)
                        continue;
 
+               nofs_flags = memalloc_nofs_save();
                ret = blkdev_zone_mgmt(device->bdev, REQ_OP_ZONE_FINISH,
                                       physical >> SECTOR_SHIFT,
                                       zinfo->zone_size >> SECTOR_SHIFT,
-                                      GFP_NOFS);
+                                      GFP_KERNEL);
+               memalloc_nofs_restore(nofs_flags);
 
                if (ret)
                        return ret;