scsi: block: virtio_blk: Set zone limits before revalidating zones
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> Link: https://lore.kernel.org/r/20230703024812.76778-5-dlemoal@kernel.org Reviewed-by: Bart Van Assche <bvanassche@acm.org> Reviewed-by: Dmitry Fomichev <dmitry.fomichev@wdc.com> Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
a442b899fe
commit
a3d96ed215
|
@ -781,7 +781,6 @@ static int virtblk_probe_zoned_device(struct virtio_device *vdev,
|
||||||
{
|
{
|
||||||
u32 v, wg;
|
u32 v, wg;
|
||||||
u8 model;
|
u8 model;
|
||||||
int ret;
|
|
||||||
|
|
||||||
virtio_cread(vdev, struct virtio_blk_config,
|
virtio_cread(vdev, struct virtio_blk_config,
|
||||||
zoned.model, &model);
|
zoned.model, &model);
|
||||||
|
@ -836,6 +835,7 @@ static int virtblk_probe_zoned_device(struct virtio_device *vdev,
|
||||||
vblk->zone_sectors);
|
vblk->zone_sectors);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
blk_queue_chunk_sectors(q, vblk->zone_sectors);
|
||||||
dev_dbg(&vdev->dev, "zone sectors = %u\n", vblk->zone_sectors);
|
dev_dbg(&vdev->dev, "zone sectors = %u\n", vblk->zone_sectors);
|
||||||
|
|
||||||
if (virtio_has_feature(vdev, VIRTIO_BLK_F_DISCARD)) {
|
if (virtio_has_feature(vdev, VIRTIO_BLK_F_DISCARD)) {
|
||||||
|
@ -844,26 +844,22 @@ static int virtblk_probe_zoned_device(struct virtio_device *vdev,
|
||||||
blk_queue_max_discard_sectors(q, 0);
|
blk_queue_max_discard_sectors(q, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = blk_revalidate_disk_zones(vblk->disk, NULL);
|
virtio_cread(vdev, struct virtio_blk_config,
|
||||||
if (!ret) {
|
zoned.max_append_sectors, &v);
|
||||||
virtio_cread(vdev, struct virtio_blk_config,
|
if (!v) {
|
||||||
zoned.max_append_sectors, &v);
|
dev_warn(&vdev->dev, "zero max_append_sectors reported\n");
|
||||||
if (!v) {
|
return -ENODEV;
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
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
|
#else
|
||||||
|
|
Loading…
Reference in New Issue