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;
|
||||
u8 model;
|
||||
int ret;
|
||||
|
||||
virtio_cread(vdev, struct virtio_blk_config,
|
||||
zoned.model, &model);
|
||||
|
@ -836,6 +835,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)) {
|
||||
|
@ -844,26 +844,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
|
||||
|
|
Loading…
Reference in New Issue