Skip to content

Commit a91e138

Browse files
damien-lemoalaxboe
authored andcommitted
block: Introduce blkdev_nr_zones() helper
Introduce the blkdev_nr_zones() helper function to get the total number of zones of a zoned block device. This number is always 0 for a regular block device (q->limits.zoned == BLK_ZONED_NONE case). Replace hard-coded number of zones calculation in dmz_get_zoned_device() with a call to this helper. Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Hannes Reinecke <hare@suse.com> Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
1 parent 5f832a3 commit a91e138

File tree

3 files changed

+33
-2
lines changed

3 files changed

+33
-2
lines changed

block/blk-zoned.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,33 @@ void __blk_req_zone_write_unlock(struct request *rq)
6363
}
6464
EXPORT_SYMBOL_GPL(__blk_req_zone_write_unlock);
6565

66+
static inline unsigned int __blkdev_nr_zones(struct request_queue *q,
67+
sector_t nr_sectors)
68+
{
69+
unsigned long zone_sectors = blk_queue_zone_sectors(q);
70+
71+
return (nr_sectors + zone_sectors - 1) >> ilog2(zone_sectors);
72+
}
73+
74+
/**
75+
* blkdev_nr_zones - Get number of zones
76+
* @bdev: Target block device
77+
*
78+
* Description:
79+
* Return the total number of zones of a zoned block device.
80+
* For a regular block device, the number of zones is always 0.
81+
*/
82+
unsigned int blkdev_nr_zones(struct block_device *bdev)
83+
{
84+
struct request_queue *q = bdev_get_queue(bdev);
85+
86+
if (!blk_queue_is_zoned(q))
87+
return 0;
88+
89+
return __blkdev_nr_zones(q, bdev->bd_part->nr_sects);
90+
}
91+
EXPORT_SYMBOL_GPL(blkdev_nr_zones);
92+
6693
/*
6794
* Check that a zone report belongs to the partition.
6895
* If yes, fix its start sector and write pointer, copy it in the

drivers/md/dm-zoned-target.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -702,8 +702,7 @@ static int dmz_get_zoned_device(struct dm_target *ti, char *path)
702702
dev->zone_nr_blocks = dmz_sect2blk(dev->zone_nr_sectors);
703703
dev->zone_nr_blocks_shift = ilog2(dev->zone_nr_blocks);
704704

705-
dev->nr_zones = (dev->capacity + dev->zone_nr_sectors - 1)
706-
>> dev->zone_nr_sectors_shift;
705+
dev->nr_zones = blkdev_nr_zones(dev->bdev);
707706

708707
dmz->dev = dev;
709708

include/linux/blkdev.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,7 @@ struct blk_zone_report_hdr {
401401
u8 padding[60];
402402
};
403403

404+
extern unsigned int blkdev_nr_zones(struct block_device *bdev);
404405
extern int blkdev_report_zones(struct block_device *bdev,
405406
sector_t sector, struct blk_zone *zones,
406407
unsigned int *nr_zones, gfp_t gfp_mask);
@@ -414,6 +415,10 @@ extern int blkdev_reset_zones_ioctl(struct block_device *bdev, fmode_t mode,
414415

415416
#else /* CONFIG_BLK_DEV_ZONED */
416417

418+
static inline unsigned int blkdev_nr_zones(struct block_device *bdev)
419+
{
420+
return 0;
421+
}
417422
static inline int blkdev_report_zones_ioctl(struct block_device *bdev,
418423
fmode_t mode, unsigned int cmd,
419424
unsigned long arg)

0 commit comments

Comments
 (0)