Message ID | 20230630083935.433334-5-dlemoal@kernel.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Improve checks in blk_revalidate_disk_zones() | expand |
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
Looks good:
Reviewed-by: Christoph Hellwig <hch@lst.de>
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
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(-)