* [PATCH v2 0/5] Improve checks in blk_revalidate_disk_zones()
@ 2023-06-30 8:39 Damien Le Moal
2023-06-30 8:39 ` [PATCH v2 1/5] scsi: sd_zbc: Set zone limits before revalidating zones Damien Le Moal
` (5 more replies)
0 siblings, 6 replies; 13+ messages in thread
From: Damien Le Moal @ 2023-06-30 8:39 UTC (permalink / raw)
To: linux-block, Jens Axboe, linux-nvme, Christoph Hellwig,
Keith Busch, linux-scsi, Martin K . Petersen
blk_revalidate_disk_zones() implements checks of the zones of a zoned
block device, verifying that the zone size is a power of 2 number of
sectors, that all zones (except possibly the last one) have the same
size and that zones cover the entire addressing space of the device.
While these checks are appropriate to verify that well tested hardware
devices have an adequate zone configurations, they lack in certain areas
which may result in issues with potentially buggy emulated devices
implemented with user drivers such as ublk or tcmu. Specifically, this
function does not check if the device driver indicated support for the
mandatory zone append writes, that is, if the device
max_zone_append_sectors queue limit is set to a non-zero value.
Additionally, invalid zones such as a zero length zone with a start
sector equal to the device capacity will not be detected and result in
out of bounds use of the zone bitmaps prepared with the callback
function blk_revalidate_zone_cb().
This series address these issues by modifying the 4 block device drivers
that currently support zoned block devices to ensure that they all set a
zoned device zone size and max zone append sectors limit before
executing blk_revalidate_disk_zones(). With these changes in place,
patch 5 improves blk_revalidate_disk_zones() to address the missing
checks, relying on the fact that the zone size and zone append limit are
normally set when this function is called.
Changes from v1:
- Updated this cover letter and commit messages to include better
explain for these patches
- Reworked patch 5 to simplify the checks
Damien Le Moal (5):
scsi: sd_zbc: Set zone limits before revalidating zones
nvme: zns: Set zone limits before revalidating zones
block: nullblk: Set zone limits before revalidating zones
block: virtio_blk: Set zone limits before revalidating zones
block: improve checks in blk_revalidate_disk_zones()
block/blk-zoned.c | 86 ++++++++++++++++++++--------------
drivers/block/null_blk/zoned.c | 16 ++-----
drivers/block/virtio_blk.c | 34 ++++++--------
drivers/nvme/host/zns.c | 9 ++--
drivers/scsi/sd_zbc.c | 12 ++---
5 files changed, 79 insertions(+), 78 deletions(-)
--
2.41.0
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v2 1/5] scsi: sd_zbc: Set zone limits before revalidating zones
2023-06-30 8:39 [PATCH v2 0/5] Improve checks in blk_revalidate_disk_zones() Damien Le Moal
@ 2023-06-30 8:39 ` Damien Le Moal
2023-07-06 12:39 ` Christoph Hellwig
2023-06-30 8:39 ` [PATCH v2 2/5] nvme: zns: " Damien Le Moal
` (4 subsequent siblings)
5 siblings, 1 reply; 13+ messages in thread
From: Damien Le Moal @ 2023-06-30 8:39 UTC (permalink / raw)
To: linux-block, Jens Axboe, linux-nvme, Christoph Hellwig,
Keith Busch, linux-scsi, Martin K . Petersen
In sd_zbc_revalidate_zones(), execute blk_queue_chunk_sectors() and
blk_queue_max_zone_append_sectors() to respectively set a ZBC device
zone size and maximum zone append sector limit before executing
blk_revalidate_disk_zones(). This is to allow the block layer zone
reavlidation to check these device characteristics prior to checking all
zones of the device.
Since blk_queue_max_zone_append_sectors() already caps the device
maximum zone append limit to the zone size and to the maximum command
size, the max_append value passed to blk_queue_max_zone_append_sectors()
is simplified to the maximum number of segments times the number of
sectors per page.
Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
---
drivers/scsi/sd_zbc.c | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/drivers/scsi/sd_zbc.c b/drivers/scsi/sd_zbc.c
index 22801c24ea19..a25215507668 100644
--- a/drivers/scsi/sd_zbc.c
+++ b/drivers/scsi/sd_zbc.c
@@ -831,7 +831,6 @@ int sd_zbc_revalidate_zones(struct scsi_disk *sdkp)
struct request_queue *q = disk->queue;
u32 zone_blocks = sdkp->early_zone_info.zone_blocks;
unsigned int nr_zones = sdkp->early_zone_info.nr_zones;
- u32 max_append;
int ret = 0;
unsigned int flags;
@@ -876,6 +875,11 @@ int sd_zbc_revalidate_zones(struct scsi_disk *sdkp)
goto unlock;
}
+ blk_queue_chunk_sectors(q,
+ logical_to_sectors(sdkp->device, zone_blocks));
+ blk_queue_max_zone_append_sectors(q,
+ q->limits.max_segments << PAGE_SECTORS_SHIFT);
+
ret = blk_revalidate_disk_zones(disk, sd_zbc_revalidate_zones_cb);
memalloc_noio_restore(flags);
@@ -888,12 +892,6 @@ int sd_zbc_revalidate_zones(struct scsi_disk *sdkp)
goto unlock;
}
- max_append = min_t(u32, logical_to_sectors(sdkp->device, zone_blocks),
- q->limits.max_segments << (PAGE_SHIFT - 9));
- max_append = min_t(u32, max_append, queue_max_hw_sectors(q));
-
- blk_queue_max_zone_append_sectors(q, max_append);
-
sd_zbc_print_zones(sdkp);
unlock:
--
2.41.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 2/5] nvme: zns: Set zone limits before revalidating zones
2023-06-30 8:39 [PATCH v2 0/5] Improve checks in blk_revalidate_disk_zones() Damien Le Moal
2023-06-30 8:39 ` [PATCH v2 1/5] scsi: sd_zbc: Set zone limits before revalidating zones Damien Le Moal
@ 2023-06-30 8:39 ` Damien Le Moal
2023-07-06 12:40 ` Christoph Hellwig
2023-06-30 8:39 ` [PATCH v2 3/5] block: nullblk: " Damien Le Moal
` (3 subsequent siblings)
5 siblings, 1 reply; 13+ messages in thread
From: Damien Le Moal @ 2023-06-30 8:39 UTC (permalink / raw)
To: linux-block, Jens Axboe, linux-nvme, Christoph Hellwig,
Keith Busch, linux-scsi, Martin K . Petersen
In nvme_revalidate_zones(), execute blk_queue_chunk_sectors() and
blk_queue_max_zone_append_sectors() to respectively set a ZNS namespace
zone size and maximum zone append sector limit before executing
blk_revalidate_disk_zones(). This is to allow the block layer zone
reavlidation to check these device characteristics prior to checking all
zones of the device.
Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
---
drivers/nvme/host/zns.c | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/drivers/nvme/host/zns.c b/drivers/nvme/host/zns.c
index 12316ab51bda..ec8557810c21 100644
--- a/drivers/nvme/host/zns.c
+++ b/drivers/nvme/host/zns.c
@@ -10,12 +10,11 @@
int nvme_revalidate_zones(struct nvme_ns *ns)
{
struct request_queue *q = ns->queue;
- int ret;
- ret = blk_revalidate_disk_zones(ns->disk, NULL);
- if (!ret)
- blk_queue_max_zone_append_sectors(q, ns->ctrl->max_zone_append);
- return ret;
+ blk_queue_chunk_sectors(q, ns->zsze);
+ blk_queue_max_zone_append_sectors(q, ns->ctrl->max_zone_append);
+
+ return blk_revalidate_disk_zones(ns->disk, NULL);
}
static int nvme_set_max_append(struct nvme_ctrl *ctrl)
--
2.41.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 3/5] block: nullblk: Set zone limits before revalidating zones
2023-06-30 8:39 [PATCH v2 0/5] Improve checks in blk_revalidate_disk_zones() Damien Le Moal
2023-06-30 8:39 ` [PATCH v2 1/5] scsi: sd_zbc: Set zone limits before revalidating zones Damien Le Moal
2023-06-30 8:39 ` [PATCH v2 2/5] nvme: zns: " Damien Le Moal
@ 2023-06-30 8:39 ` Damien Le Moal
2023-07-06 12:41 ` Christoph Hellwig
2023-06-30 8:39 ` [PATCH v2 4/5] block: virtio_blk: " Damien Le Moal
` (2 subsequent siblings)
5 siblings, 1 reply; 13+ messages in thread
From: Damien Le Moal @ 2023-06-30 8:39 UTC (permalink / raw)
To: linux-block, Jens Axboe, linux-nvme, Christoph Hellwig,
Keith Busch, linux-scsi, Martin K . Petersen
In null_register_zoned_dev(), execute blk_queue_chunk_sectors() and
blk_queue_max_zone_append_sectors() to respectively set the zoned device
zone size and maximum zone append sector limit before executing
blk_revalidate_disk_zones(). This is to allow the block layer zone
reavlidation to check these device characteristics prior to checking all
zones of the device.
Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
---
drivers/block/null_blk/zoned.c | 16 +++++-----------
1 file changed, 5 insertions(+), 11 deletions(-)
diff --git a/drivers/block/null_blk/zoned.c b/drivers/block/null_blk/zoned.c
index 635ce0648133..55c5b48bc276 100644
--- a/drivers/block/null_blk/zoned.c
+++ b/drivers/block/null_blk/zoned.c
@@ -162,21 +162,15 @@ int null_register_zoned_dev(struct nullb *nullb)
disk_set_zoned(nullb->disk, BLK_ZONED_HM);
blk_queue_flag_set(QUEUE_FLAG_ZONE_RESETALL, q);
blk_queue_required_elevator_features(q, ELEVATOR_F_ZBD_SEQ_WRITE);
-
- if (queue_is_mq(q)) {
- int ret = blk_revalidate_disk_zones(nullb->disk, NULL);
-
- if (ret)
- return ret;
- } else {
- blk_queue_chunk_sectors(q, dev->zone_size_sects);
- nullb->disk->nr_zones = bdev_nr_zones(nullb->disk->part0);
- }
-
+ blk_queue_chunk_sectors(q, dev->zone_size_sects);
+ nullb->disk->nr_zones = bdev_nr_zones(nullb->disk->part0);
blk_queue_max_zone_append_sectors(q, dev->zone_size_sects);
disk_set_max_open_zones(nullb->disk, dev->zone_max_open);
disk_set_max_active_zones(nullb->disk, dev->zone_max_active);
+ if (queue_is_mq(q))
+ return blk_revalidate_disk_zones(nullb->disk, NULL);
+
return 0;
}
--
2.41.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 4/5] block: virtio_blk: Set zone limits before revalidating zones
2023-06-30 8:39 [PATCH v2 0/5] Improve checks in blk_revalidate_disk_zones() Damien Le Moal
` (2 preceding siblings ...)
2023-06-30 8:39 ` [PATCH v2 3/5] block: nullblk: " Damien Le Moal
@ 2023-06-30 8:39 ` Damien Le Moal
2023-07-02 22:29 ` Dmitry Fomichev
2023-07-06 12:41 ` Christoph Hellwig
2023-06-30 8:39 ` [PATCH v2 5/5] block: improve checks in blk_revalidate_disk_zones() Damien Le Moal
2023-06-30 23:21 ` [PATCH v2 0/5] Improve " Bart Van Assche
5 siblings, 2 replies; 13+ messages in thread
From: Damien Le Moal @ 2023-06-30 8:39 UTC (permalink / raw)
To: linux-block, Jens Axboe, linux-nvme, Christoph Hellwig,
Keith Busch, linux-scsi, Martin K . Petersen
In virtblk_probe_zoned_device(), execute blk_queue_chunk_sectors() and
blk_queue_max_zone_append_sectors() to respectively set the zoned device
zone size and maximum zone append sector limit before executing
blk_revalidate_disk_zones(). This is to allow the block layer zone
reavlidation to check these device characteristics prior to checking all
zones of the device.
Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
---
drivers/block/virtio_blk.c | 34 +++++++++++++++-------------------
1 file changed, 15 insertions(+), 19 deletions(-)
diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
index b47358da92a2..1fe011676d07 100644
--- a/drivers/block/virtio_blk.c
+++ b/drivers/block/virtio_blk.c
@@ -751,7 +751,6 @@ static int virtblk_probe_zoned_device(struct virtio_device *vdev,
{
u32 v, wg;
u8 model;
- int ret;
virtio_cread(vdev, struct virtio_blk_config,
zoned.model, &model);
@@ -806,6 +805,7 @@ static int virtblk_probe_zoned_device(struct virtio_device *vdev,
vblk->zone_sectors);
return -ENODEV;
}
+ blk_queue_chunk_sectors(q, vblk->zone_sectors);
dev_dbg(&vdev->dev, "zone sectors = %u\n", vblk->zone_sectors);
if (virtio_has_feature(vdev, VIRTIO_BLK_F_DISCARD)) {
@@ -814,26 +814,22 @@ static int virtblk_probe_zoned_device(struct virtio_device *vdev,
blk_queue_max_discard_sectors(q, 0);
}
- ret = blk_revalidate_disk_zones(vblk->disk, NULL);
- if (!ret) {
- virtio_cread(vdev, struct virtio_blk_config,
- zoned.max_append_sectors, &v);
- if (!v) {
- dev_warn(&vdev->dev, "zero max_append_sectors reported\n");
- return -ENODEV;
- }
- if ((v << SECTOR_SHIFT) < wg) {
- dev_err(&vdev->dev,
- "write granularity %u exceeds max_append_sectors %u limit\n",
- wg, v);
- return -ENODEV;
- }
-
- blk_queue_max_zone_append_sectors(q, v);
- dev_dbg(&vdev->dev, "max append sectors = %u\n", v);
+ virtio_cread(vdev, struct virtio_blk_config,
+ zoned.max_append_sectors, &v);
+ if (!v) {
+ dev_warn(&vdev->dev, "zero max_append_sectors reported\n");
+ return -ENODEV;
+ }
+ if ((v << SECTOR_SHIFT) < wg) {
+ dev_err(&vdev->dev,
+ "write granularity %u exceeds max_append_sectors %u limit\n",
+ wg, v);
+ return -ENODEV;
}
+ blk_queue_max_zone_append_sectors(q, v);
+ dev_dbg(&vdev->dev, "max append sectors = %u\n", v);
- return ret;
+ return blk_revalidate_disk_zones(vblk->disk, NULL);
}
#else
--
2.41.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 5/5] block: improve checks in blk_revalidate_disk_zones()
2023-06-30 8:39 [PATCH v2 0/5] Improve checks in blk_revalidate_disk_zones() Damien Le Moal
` (3 preceding siblings ...)
2023-06-30 8:39 ` [PATCH v2 4/5] block: virtio_blk: " Damien Le Moal
@ 2023-06-30 8:39 ` Damien Le Moal
2023-07-06 12:42 ` Christoph Hellwig
2023-06-30 23:21 ` [PATCH v2 0/5] Improve " Bart Van Assche
5 siblings, 1 reply; 13+ messages in thread
From: Damien Le Moal @ 2023-06-30 8:39 UTC (permalink / raw)
To: linux-block, Jens Axboe, linux-nvme, Christoph Hellwig,
Keith Busch, linux-scsi, Martin K . Petersen
blk_revalidate_disk_zones() implements checks of the zones of a zoned
block device, verifying that the zone size is a power of 2 number of
sectors, that all zones (except possibly the last one) have the same
size and that zones cover the entire addressing space of the device.
While these checks are appropriate to verify that well tested hardware
devices have an adequate zone configurations, they lack in certain areas
which may result in issues with emulated devices implemented with user
drivers such as ublk or tcmu. Specifically, this function does not
check if the device driver indicated support for the mandatory zone
append writes, that is, if the device max_zone_append_sectors queue
limit is set to a non-zero value. Additionally, invalid zones such as
a zero length zone with a start sector equal to the device capacity will
not be detected and result in out of bounds use of the zone bitmaps
prepared with the callback function blk_revalidate_zone_cb().
Improve blk_revalidate_disk_zones() to address these inadequate checks,
relying on the fact that all device drivers supporting zoned block
devices must set the device zone size (chunk_sectors queue limit) and
the max_zone_append_sectors queue limit before executing this function.
The check for a non-zero max_zone_append_sectors value is done in
blk_revalidate_disk_zones() before executing the zone report. The zone
report callback function blk_revalidate_zone_cb() is also modified to
add a check that a zone start is below the device capacity.
The check that the zone size is a power of 2 number of sectors is moved
to blk_revalidate_disk_zones() as the zone size is already known.
Similarly, the number of zones of the device can be calculated in
blk_revalidate_disk_zones() before executing the zone report.
The kdoc comment for blk_revalidate_disk_zones() is also updated to
mention that device drivers must set the device zone size and the
max_zone_append_sectors queue limit before calling this function.
Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
---
block/blk-zoned.c | 86 +++++++++++++++++++++++++++--------------------
1 file changed, 50 insertions(+), 36 deletions(-)
diff --git a/block/blk-zoned.c b/block/blk-zoned.c
index 0f9f97cdddd9..619ee41a51cc 100644
--- a/block/blk-zoned.c
+++ b/block/blk-zoned.c
@@ -442,7 +442,6 @@ struct blk_revalidate_zone_args {
unsigned long *conv_zones_bitmap;
unsigned long *seq_zones_wlock;
unsigned int nr_zones;
- sector_t zone_sectors;
sector_t sector;
};
@@ -456,38 +455,34 @@ static int blk_revalidate_zone_cb(struct blk_zone *zone, unsigned int idx,
struct gendisk *disk = args->disk;
struct request_queue *q = disk->queue;
sector_t capacity = get_capacity(disk);
+ sector_t zone_sectors = q->limits.chunk_sectors;
+
+ /* Check for bad zones and holes in the zone report */
+ if (zone->start != args->sector) {
+ pr_warn("%s: Zone gap at sectors %llu..%llu\n",
+ disk->disk_name, args->sector, zone->start);
+ return -ENODEV;
+ }
+
+ if (zone->start >= capacity || !zone->len) {
+ pr_warn("%s: Invalid zone start %llu, length %llu\n",
+ disk->disk_name, zone->start, zone->len);
+ return -ENODEV;
+ }
/*
* All zones must have the same size, with the exception on an eventual
* smaller last zone.
*/
- if (zone->start == 0) {
- if (zone->len == 0 || !is_power_of_2(zone->len)) {
- pr_warn("%s: Invalid zoned device with non power of two zone size (%llu)\n",
- disk->disk_name, zone->len);
- return -ENODEV;
- }
-
- args->zone_sectors = zone->len;
- args->nr_zones = (capacity + zone->len - 1) >> ilog2(zone->len);
- } else if (zone->start + args->zone_sectors < capacity) {
- if (zone->len != args->zone_sectors) {
+ if (zone->start + zone->len < capacity) {
+ if (zone->len != zone_sectors) {
pr_warn("%s: Invalid zoned device with non constant zone size\n",
disk->disk_name);
return -ENODEV;
}
- } else {
- if (zone->len > args->zone_sectors) {
- pr_warn("%s: Invalid zoned device with larger last zone size\n",
- disk->disk_name);
- return -ENODEV;
- }
- }
-
- /* Check for holes in the zone report */
- if (zone->start != args->sector) {
- pr_warn("%s: Zone gap at sectors %llu..%llu\n",
- disk->disk_name, args->sector, zone->start);
+ } else if (zone->len > zone_sectors) {
+ pr_warn("%s: Invalid zoned device with larger last zone size\n",
+ disk->disk_name);
return -ENODEV;
}
@@ -526,11 +521,13 @@ static int blk_revalidate_zone_cb(struct blk_zone *zone, unsigned int idx,
* @disk: Target disk
* @update_driver_data: Callback to update driver data on the frozen disk
*
- * Helper function for low-level device drivers to (re) allocate and initialize
- * a disk request queue zone bitmaps. This functions should normally be called
- * within the disk ->revalidate method for blk-mq based drivers. For BIO based
- * drivers only q->nr_zones needs to be updated so that the sysfs exposed value
- * is correct.
+ * Helper function for low-level device drivers to check and (re) allocate and
+ * initialize a disk request queue zone bitmaps. This functions should normally
+ * be called within the disk ->revalidate method for blk-mq based drivers.
+ * Before calling this function, the device driver must already have set the
+ * device zone size (chunk_sector limit) and the max zone append limit.
+ * For BIO based drivers, this function cannot be used. BIO based device drivers
+ * only need to set disk->nr_zones so that the sysfs exposed value is correct.
* If the @update_driver_data callback function is not NULL, the callback is
* executed with the device request queue frozen after all zones have been
* checked.
@@ -539,9 +536,9 @@ int blk_revalidate_disk_zones(struct gendisk *disk,
void (*update_driver_data)(struct gendisk *disk))
{
struct request_queue *q = disk->queue;
- struct blk_revalidate_zone_args args = {
- .disk = disk,
- };
+ sector_t zone_sectors = q->limits.chunk_sectors;
+ sector_t capacity = get_capacity(disk);
+ struct blk_revalidate_zone_args args = { };
unsigned int noio_flag;
int ret;
@@ -550,13 +547,31 @@ int blk_revalidate_disk_zones(struct gendisk *disk,
if (WARN_ON_ONCE(!queue_is_mq(q)))
return -EIO;
- if (!get_capacity(disk))
- return -EIO;
+ if (!capacity)
+ return -ENODEV;
+
+ /*
+ * Checks that the device driver indicated a valid zone size and that
+ * the max zone append limit is set.
+ */
+ if (!zone_sectors || !is_power_of_2(zone_sectors)) {
+ pr_warn("%s: Invalid non power of two zone size (%llu)\n",
+ disk->disk_name, zone_sectors);
+ return -ENODEV;
+ }
+
+ if (!q->limits.max_zone_append_sectors) {
+ pr_warn("%s: Invalid 0 maximum zone append limit\n",
+ disk->disk_name);
+ return -ENODEV;
+ }
/*
* Ensure that all memory allocations in this context are done as if
* GFP_NOIO was specified.
*/
+ args.disk = disk;
+ args.nr_zones = (capacity + zone_sectors - 1) >> ilog2(zone_sectors);
noio_flag = memalloc_noio_save();
ret = disk->fops->report_zones(disk, 0, UINT_MAX,
blk_revalidate_zone_cb, &args);
@@ -570,7 +585,7 @@ int blk_revalidate_disk_zones(struct gendisk *disk,
* If zones where reported, make sure that the entire disk capacity
* has been checked.
*/
- if (ret > 0 && args.sector != get_capacity(disk)) {
+ if (ret > 0 && args.sector != capacity) {
pr_warn("%s: Missing zones from sector %llu\n",
disk->disk_name, args.sector);
ret = -ENODEV;
@@ -583,7 +598,6 @@ int blk_revalidate_disk_zones(struct gendisk *disk,
*/
blk_mq_freeze_queue(q);
if (ret > 0) {
- blk_queue_chunk_sectors(q, args.zone_sectors);
disk->nr_zones = args.nr_zones;
swap(disk->seq_zones_wlock, args.seq_zones_wlock);
swap(disk->conv_zones_bitmap, args.conv_zones_bitmap);
--
2.41.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v2 0/5] Improve checks in blk_revalidate_disk_zones()
2023-06-30 8:39 [PATCH v2 0/5] Improve checks in blk_revalidate_disk_zones() Damien Le Moal
` (4 preceding siblings ...)
2023-06-30 8:39 ` [PATCH v2 5/5] block: improve checks in blk_revalidate_disk_zones() Damien Le Moal
@ 2023-06-30 23:21 ` Bart Van Assche
5 siblings, 0 replies; 13+ messages in thread
From: Bart Van Assche @ 2023-06-30 23:21 UTC (permalink / raw)
To: Damien Le Moal, linux-block, Jens Axboe, linux-nvme,
Christoph Hellwig, Keith Busch, linux-scsi, Martin K . Petersen
On 6/30/23 01:39, Damien Le Moal wrote:
> blk_revalidate_disk_zones() implements checks of the zones of a zoned
> block device, verifying that the zone size is a power of 2 number of
> sectors, that all zones (except possibly the last one) have the same
> size and that zones cover the entire addressing space of the device.
For the entire series:
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 4/5] block: virtio_blk: Set zone limits before revalidating zones
2023-06-30 8:39 ` [PATCH v2 4/5] block: virtio_blk: " Damien Le Moal
@ 2023-07-02 22:29 ` Dmitry Fomichev
2023-07-06 12:41 ` Christoph Hellwig
1 sibling, 0 replies; 13+ messages in thread
From: Dmitry Fomichev @ 2023-07-02 22:29 UTC (permalink / raw)
To: dlemoal@kernel.org, hch@lst.de, linux-scsi@vger.kernel.org,
linux-nvme@lists.infradead.org, axboe@kernel.dk,
kbusch@kernel.org, linux-block@vger.kernel.org,
martin.petersen@oracle.com
On Fri, 2023-06-30 at 17:39 +0900, Damien Le Moal wrote:
> In virtblk_probe_zoned_device(), execute blk_queue_chunk_sectors() and
> blk_queue_max_zone_append_sectors() to respectively set the zoned device
> zone size and maximum zone append sector limit before executing
> blk_revalidate_disk_zones(). This is to allow the block layer zone
> reavlidation to check these device characteristics prior to checking all
> zones of the device.
>
> Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
Looks good.
Reviewed-by: Dmitry Fomichev <dmitry.fomichev@wdc.com>
> ---
> drivers/block/virtio_blk.c | 34 +++++++++++++++-------------------
> 1 file changed, 15 insertions(+), 19 deletions(-)
>
> diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
> index b47358da92a2..1fe011676d07 100644
> --- a/drivers/block/virtio_blk.c
> +++ b/drivers/block/virtio_blk.c
> @@ -751,7 +751,6 @@ static int virtblk_probe_zoned_device(struct virtio_device
> *vdev,
> {
> u32 v, wg;
> u8 model;
> - int ret;
>
> virtio_cread(vdev, struct virtio_blk_config,
> zoned.model, &model);
> @@ -806,6 +805,7 @@ static int virtblk_probe_zoned_device(struct virtio_device
> *vdev,
> vblk->zone_sectors);
> return -ENODEV;
> }
> + blk_queue_chunk_sectors(q, vblk->zone_sectors);
> dev_dbg(&vdev->dev, "zone sectors = %u\n", vblk->zone_sectors);
>
> if (virtio_has_feature(vdev, VIRTIO_BLK_F_DISCARD)) {
> @@ -814,26 +814,22 @@ static int virtblk_probe_zoned_device(struct
> virtio_device *vdev,
> blk_queue_max_discard_sectors(q, 0);
> }
>
> - ret = blk_revalidate_disk_zones(vblk->disk, NULL);
> - if (!ret) {
> - virtio_cread(vdev, struct virtio_blk_config,
> - zoned.max_append_sectors, &v);
> - if (!v) {
> - dev_warn(&vdev->dev, "zero max_append_sectors
> reported\n");
> - return -ENODEV;
> - }
> - if ((v << SECTOR_SHIFT) < wg) {
> - dev_err(&vdev->dev,
> - "write granularity %u exceeds
> max_append_sectors %u limit\n",
> - wg, v);
> - return -ENODEV;
> - }
> -
> - blk_queue_max_zone_append_sectors(q, v);
> - dev_dbg(&vdev->dev, "max append sectors = %u\n", v);
> + virtio_cread(vdev, struct virtio_blk_config,
> + zoned.max_append_sectors, &v);
> + if (!v) {
> + dev_warn(&vdev->dev, "zero max_append_sectors reported\n");
> + return -ENODEV;
> + }
> + if ((v << SECTOR_SHIFT) < wg) {
> + dev_err(&vdev->dev,
> + "write granularity %u exceeds max_append_sectors %u
> limit\n",
> + wg, v);
> + return -ENODEV;
> }
> + blk_queue_max_zone_append_sectors(q, v);
> + dev_dbg(&vdev->dev, "max append sectors = %u\n", v);
>
> - return ret;
> + return blk_revalidate_disk_zones(vblk->disk, NULL);
> }
>
> #else
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 1/5] scsi: sd_zbc: Set zone limits before revalidating zones
2023-06-30 8:39 ` [PATCH v2 1/5] scsi: sd_zbc: Set zone limits before revalidating zones Damien Le Moal
@ 2023-07-06 12:39 ` Christoph Hellwig
0 siblings, 0 replies; 13+ messages in thread
From: Christoph Hellwig @ 2023-07-06 12:39 UTC (permalink / raw)
To: Damien Le Moal
Cc: linux-block, Jens Axboe, linux-nvme, Christoph Hellwig,
Keith Busch, linux-scsi, Martin K . Petersen
Looks good:
Reviewed-by: Christoph Hellwig <hch@lst.de>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 2/5] nvme: zns: Set zone limits before revalidating zones
2023-06-30 8:39 ` [PATCH v2 2/5] nvme: zns: " Damien Le Moal
@ 2023-07-06 12:40 ` Christoph Hellwig
0 siblings, 0 replies; 13+ messages in thread
From: Christoph Hellwig @ 2023-07-06 12:40 UTC (permalink / raw)
To: Damien Le Moal
Cc: linux-block, Jens Axboe, linux-nvme, Christoph Hellwig,
Keith Busch, linux-scsi, Martin K . Petersen
On Fri, Jun 30, 2023 at 05:39:32PM +0900, Damien Le Moal wrote:
> In nvme_revalidate_zones(), execute blk_queue_chunk_sectors() and
> blk_queue_max_zone_append_sectors() to respectively set a ZNS namespace
> zone size and maximum zone append sector limit before executing
> blk_revalidate_disk_zones(). This is to allow the block layer zone
> reavlidation to check these device characteristics prior to checking all
> zones of the device.
Looks good:
Reviewed-by: Christoph Hellwig <hch@lst.de>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 3/5] block: nullblk: Set zone limits before revalidating zones
2023-06-30 8:39 ` [PATCH v2 3/5] block: nullblk: " Damien Le Moal
@ 2023-07-06 12:41 ` Christoph Hellwig
0 siblings, 0 replies; 13+ messages in thread
From: Christoph Hellwig @ 2023-07-06 12:41 UTC (permalink / raw)
To: Damien Le Moal
Cc: linux-block, Jens Axboe, linux-nvme, Christoph Hellwig,
Keith Busch, linux-scsi, Martin K . Petersen
On Fri, Jun 30, 2023 at 05:39:33PM +0900, Damien Le Moal wrote:
> + if (queue_is_mq(q))
> + return blk_revalidate_disk_zones(nullb->disk, NULL);
> +
> return 0;
I'd write this as:
if (!queue_is_mq(q)))
return 0;
return blk_revalidate_disk_zones(nullb->disk, NULL);
but that's just cosmetic. Otherwise looks good:
Reviewed-by: Christoph Hellwig <hch@lst.de>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 4/5] block: virtio_blk: Set zone limits before revalidating zones
2023-06-30 8:39 ` [PATCH v2 4/5] block: virtio_blk: " Damien Le Moal
2023-07-02 22:29 ` Dmitry Fomichev
@ 2023-07-06 12:41 ` Christoph Hellwig
1 sibling, 0 replies; 13+ messages in thread
From: Christoph Hellwig @ 2023-07-06 12:41 UTC (permalink / raw)
To: Damien Le Moal
Cc: linux-block, Jens Axboe, linux-nvme, Christoph Hellwig,
Keith Busch, linux-scsi, Martin K . Petersen
Looks good:
Reviewed-by: Christoph Hellwig <hch@lst.de>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 5/5] block: improve checks in blk_revalidate_disk_zones()
2023-06-30 8:39 ` [PATCH v2 5/5] block: improve checks in blk_revalidate_disk_zones() Damien Le Moal
@ 2023-07-06 12:42 ` Christoph Hellwig
0 siblings, 0 replies; 13+ messages in thread
From: Christoph Hellwig @ 2023-07-06 12:42 UTC (permalink / raw)
To: Damien Le Moal
Cc: linux-block, Jens Axboe, linux-nvme, Christoph Hellwig,
Keith Busch, linux-scsi, Martin K . Petersen
Looks good:
Reviewed-by: Christoph Hellwig <hch@lst.de>
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2023-07-06 12:42 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-06-30 8:39 [PATCH v2 0/5] Improve checks in blk_revalidate_disk_zones() Damien Le Moal
2023-06-30 8:39 ` [PATCH v2 1/5] scsi: sd_zbc: Set zone limits before revalidating zones Damien Le Moal
2023-07-06 12:39 ` Christoph Hellwig
2023-06-30 8:39 ` [PATCH v2 2/5] nvme: zns: " Damien Le Moal
2023-07-06 12:40 ` Christoph Hellwig
2023-06-30 8:39 ` [PATCH v2 3/5] block: nullblk: " Damien Le Moal
2023-07-06 12:41 ` Christoph Hellwig
2023-06-30 8:39 ` [PATCH v2 4/5] block: virtio_blk: " Damien Le Moal
2023-07-02 22:29 ` Dmitry Fomichev
2023-07-06 12:41 ` Christoph Hellwig
2023-06-30 8:39 ` [PATCH v2 5/5] block: improve checks in blk_revalidate_disk_zones() Damien Le Moal
2023-07-06 12:42 ` Christoph Hellwig
2023-06-30 23:21 ` [PATCH v2 0/5] Improve " Bart Van Assche
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).