Skip to content

Commit d205bde

Browse files
damien-lemoalaxboe
authored andcommitted
null_blk: Cleanup zoned device initialization
Move all zoned mode related code from null_blk_main.c to null_blk_zoned.c, avoiding an ugly #ifdef in the process. Rename null_zone_init() into null_init_zoned_dev(), null_zone_exit() into null_free_zoned_dev() and add the new function null_register_zoned_dev() to finalize the zoned dev setup before add_disk(). Signed-off-by: Damien Le Moal <[email protected]> Reviewed-by: Christoph Hellwig <[email protected]> Reviewed-by: Johannes Thumshirn <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
1 parent 9dd44c7 commit d205bde

File tree

3 files changed

+36
-26
lines changed

3 files changed

+36
-26
lines changed

drivers/block/null_blk.h

+10-4
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,9 @@ blk_status_t null_process_cmd(struct nullb_cmd *cmd,
9090
unsigned int nr_sectors);
9191

9292
#ifdef CONFIG_BLK_DEV_ZONED
93-
int null_zone_init(struct nullb_device *dev);
94-
void null_zone_exit(struct nullb_device *dev);
93+
int null_init_zoned_dev(struct nullb_device *dev, struct request_queue *q);
94+
int null_register_zoned_dev(struct nullb *nullb);
95+
void null_free_zoned_dev(struct nullb_device *dev);
9596
int null_report_zones(struct gendisk *disk, sector_t sector,
9697
unsigned int nr_zones, report_zones_cb cb, void *data);
9798
blk_status_t null_process_zoned_cmd(struct nullb_cmd *cmd,
@@ -100,12 +101,17 @@ blk_status_t null_process_zoned_cmd(struct nullb_cmd *cmd,
100101
size_t null_zone_valid_read_len(struct nullb *nullb,
101102
sector_t sector, unsigned int len);
102103
#else
103-
static inline int null_zone_init(struct nullb_device *dev)
104+
static inline int null_init_zoned_dev(struct nullb_device *dev,
105+
struct request_queue *q)
104106
{
105107
pr_err("CONFIG_BLK_DEV_ZONED not enabled\n");
106108
return -EINVAL;
107109
}
108-
static inline void null_zone_exit(struct nullb_device *dev) {}
110+
static inline int null_register_zoned_dev(struct nullb *nullb)
111+
{
112+
return -ENODEV;
113+
}
114+
static inline void null_free_zoned_dev(struct nullb_device *dev) {}
109115
static inline blk_status_t null_process_zoned_cmd(struct nullb_cmd *cmd,
110116
enum req_opf op, sector_t sector, sector_t nr_sectors)
111117
{

drivers/block/null_blk_main.c

+7-20
Original file line numberDiff line numberDiff line change
@@ -580,7 +580,7 @@ static void null_free_dev(struct nullb_device *dev)
580580
if (!dev)
581581
return;
582582

583-
null_zone_exit(dev);
583+
null_free_zoned_dev(dev);
584584
badblocks_exit(&dev->badblocks);
585585
kfree(dev);
586586
}
@@ -1618,19 +1618,12 @@ static int null_gendisk_register(struct nullb *nullb)
16181618
disk->queue = nullb->q;
16191619
strncpy(disk->disk_name, nullb->disk_name, DISK_NAME_LEN);
16201620

1621-
#ifdef CONFIG_BLK_DEV_ZONED
16221621
if (nullb->dev->zoned) {
1623-
if (queue_is_mq(nullb->q)) {
1624-
int ret = blk_revalidate_disk_zones(disk);
1625-
if (ret)
1626-
return ret;
1627-
} else {
1628-
blk_queue_chunk_sectors(nullb->q,
1629-
nullb->dev->zone_size_sects);
1630-
nullb->q->nr_zones = blkdev_nr_zones(disk);
1631-
}
1622+
int ret = null_register_zoned_dev(nullb);
1623+
1624+
if (ret)
1625+
return ret;
16321626
}
1633-
#endif
16341627

16351628
add_disk(disk);
16361629
return 0;
@@ -1786,14 +1779,9 @@ static int null_add_dev(struct nullb_device *dev)
17861779
}
17871780

17881781
if (dev->zoned) {
1789-
rv = null_zone_init(dev);
1782+
rv = null_init_zoned_dev(dev, nullb->q);
17901783
if (rv)
17911784
goto out_cleanup_blk_queue;
1792-
1793-
nullb->q->limits.zoned = BLK_ZONED_HM;
1794-
blk_queue_flag_set(QUEUE_FLAG_ZONE_RESETALL, nullb->q);
1795-
blk_queue_required_elevator_features(nullb->q,
1796-
ELEVATOR_F_ZBD_SEQ_WRITE);
17971785
}
17981786

17991787
nullb->q->queuedata = nullb;
@@ -1822,8 +1810,7 @@ static int null_add_dev(struct nullb_device *dev)
18221810

18231811
return 0;
18241812
out_cleanup_zone:
1825-
if (dev->zoned)
1826-
null_zone_exit(dev);
1813+
null_free_zoned_dev(dev);
18271814
out_cleanup_blk_queue:
18281815
blk_cleanup_queue(nullb->q);
18291816
out_cleanup_tags:

drivers/block/null_blk_zoned.c

+19-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ static inline unsigned int null_zone_no(struct nullb_device *dev, sector_t sect)
1313
return sect >> ilog2(dev->zone_size_sects);
1414
}
1515

16-
int null_zone_init(struct nullb_device *dev)
16+
int null_init_zoned_dev(struct nullb_device *dev, struct request_queue *q)
1717
{
1818
sector_t dev_size = (sector_t)dev->size * 1024 * 1024;
1919
sector_t sector = 0;
@@ -61,10 +61,27 @@ int null_zone_init(struct nullb_device *dev)
6161
sector += dev->zone_size_sects;
6262
}
6363

64+
q->limits.zoned = BLK_ZONED_HM;
65+
blk_queue_flag_set(QUEUE_FLAG_ZONE_RESETALL, q);
66+
blk_queue_required_elevator_features(q, ELEVATOR_F_ZBD_SEQ_WRITE);
67+
68+
return 0;
69+
}
70+
71+
int null_register_zoned_dev(struct nullb *nullb)
72+
{
73+
struct request_queue *q = nullb->q;
74+
75+
if (queue_is_mq(q))
76+
return blk_revalidate_disk_zones(nullb->disk);
77+
78+
blk_queue_chunk_sectors(q, nullb->dev->zone_size_sects);
79+
q->nr_zones = blkdev_nr_zones(nullb->disk);
80+
6481
return 0;
6582
}
6683

67-
void null_zone_exit(struct nullb_device *dev)
84+
void null_free_zoned_dev(struct nullb_device *dev)
6885
{
6986
kvfree(dev->zones);
7087
}

0 commit comments

Comments
 (0)