Skip to content

Commit 539fb77

Browse files
Christoph Hellwigaxboe
authored andcommitted
block: refactor blkdev_zone_mgmt_ioctl
Split the zone reset case into a separate helper so that the conditional locking goes away. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Reviewed-by: Bart Van Assche <bvanassche@acm.org> Reviewed-by: Damien Le Moal <dlemoal@kernel.org> Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com> Link: https://patch.msgid.link/20260327090032.3722065-1-hch@lst.de Signed-off-by: Jens Axboe <axboe@kernel.dk>
1 parent b774765 commit 539fb77

1 file changed

Lines changed: 18 additions & 23 deletions

File tree

block/blk-zoned.c

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -417,20 +417,32 @@ int blkdev_report_zones_ioctl(struct block_device *bdev, unsigned int cmd,
417417
return 0;
418418
}
419419

420-
static int blkdev_truncate_zone_range(struct block_device *bdev,
421-
blk_mode_t mode, const struct blk_zone_range *zrange)
420+
static int blkdev_reset_zone(struct block_device *bdev, blk_mode_t mode,
421+
struct blk_zone_range *zrange)
422422
{
423423
loff_t start, end;
424+
int ret = -EINVAL;
424425

426+
inode_lock(bdev->bd_mapping->host);
427+
filemap_invalidate_lock(bdev->bd_mapping);
425428
if (zrange->sector + zrange->nr_sectors <= zrange->sector ||
426429
zrange->sector + zrange->nr_sectors > get_capacity(bdev->bd_disk))
427430
/* Out of range */
428-
return -EINVAL;
431+
goto out_unlock;
429432

430433
start = zrange->sector << SECTOR_SHIFT;
431434
end = ((zrange->sector + zrange->nr_sectors) << SECTOR_SHIFT) - 1;
432435

433-
return truncate_bdev_range(bdev, mode, start, end);
436+
ret = truncate_bdev_range(bdev, mode, start, end);
437+
if (ret)
438+
goto out_unlock;
439+
440+
ret = blkdev_zone_mgmt(bdev, REQ_OP_ZONE_RESET, zrange->sector,
441+
zrange->nr_sectors);
442+
out_unlock:
443+
filemap_invalidate_unlock(bdev->bd_mapping);
444+
inode_unlock(bdev->bd_mapping->host);
445+
return ret;
434446
}
435447

436448
/*
@@ -443,7 +455,6 @@ int blkdev_zone_mgmt_ioctl(struct block_device *bdev, blk_mode_t mode,
443455
void __user *argp = (void __user *)arg;
444456
struct blk_zone_range zrange;
445457
enum req_op op;
446-
int ret;
447458

448459
if (!argp)
449460
return -EINVAL;
@@ -459,15 +470,7 @@ int blkdev_zone_mgmt_ioctl(struct block_device *bdev, blk_mode_t mode,
459470

460471
switch (cmd) {
461472
case BLKRESETZONE:
462-
op = REQ_OP_ZONE_RESET;
463-
464-
/* Invalidate the page cache, including dirty pages. */
465-
inode_lock(bdev->bd_mapping->host);
466-
filemap_invalidate_lock(bdev->bd_mapping);
467-
ret = blkdev_truncate_zone_range(bdev, mode, &zrange);
468-
if (ret)
469-
goto fail;
470-
break;
473+
return blkdev_reset_zone(bdev, mode, &zrange);
471474
case BLKOPENZONE:
472475
op = REQ_OP_ZONE_OPEN;
473476
break;
@@ -481,15 +484,7 @@ int blkdev_zone_mgmt_ioctl(struct block_device *bdev, blk_mode_t mode,
481484
return -ENOTTY;
482485
}
483486

484-
ret = blkdev_zone_mgmt(bdev, op, zrange.sector, zrange.nr_sectors);
485-
486-
fail:
487-
if (cmd == BLKRESETZONE) {
488-
filemap_invalidate_unlock(bdev->bd_mapping);
489-
inode_unlock(bdev->bd_mapping->host);
490-
}
491-
492-
return ret;
487+
return blkdev_zone_mgmt(bdev, op, zrange.sector, zrange.nr_sectors);
493488
}
494489

495490
static bool disk_zone_is_last(struct gendisk *disk, struct blk_zone *zone)

0 commit comments

Comments
 (0)