On Mon, Sep 21, 2026 at 04:28:07PM +0200, Niklas Cassel wrote:
> For ZBC/ZAC devices the write granularity is the physical block size, so
> a 512e SMR disk exposed through a host_device backend has a logical block
> size of 512 and a zone write granularity of 4096. We told the guest
> driver 512 while raw_co_zone_append() rejects anything that is not 4096
> byte aligned, so the driver saw a plain I/O error for a request it had
> been told was valid.
>
> Report the larger of the logical and the physical block size instead.
> Both are properties of the device model, so the value that a guest is
> given does not change when it is migrated to a host whose disks differ,
> which a value taken from BlockLimits would. It is also what a guest
> derives for itself: blk_validate_zoned_limits() raises
> zone_write_granularity to the logical block size, and for a SCSI disk
> sd_zbc_read_zones() takes it from the physical block size.
>
> blkconf_blocksizes() rejects a logical block size larger than the
> physical block size, so this is the physical block size in practice. It
> is expressed as the larger of the two because that is the constraint
> which applies: a guest cannot issue a write finer than the logical block
> size, and the medium cannot take one finer than the physical block size.
>
> Add it as a helper next to blkconf_blocksizes(), since it is derived from
> a BlockConf, and use it for the zone append offset check in
> check_zoned_request(), which validated against bs->bl.write_granularity.
> The value reported to the driver and the value that requests are
> validated against then cannot drift apart. The helper cannot return zero
> because blkconf_blocksizes() always leaves a logical block size behind,
> so the check no longer needs to guard against an unset granularity.
>
> Fixes: 4f7366506a96 ("virtio-blk: add zoned storage emulation for zoned
> devices")
> Signed-off-by: Niklas Cassel <[email protected]>
> ---
> hw/block/block.c | 5 +++++
> hw/block/virtio-blk.c | 13 +++++++------
> include/block/block_int-common.h | 7 +++++++
> include/hw/block/block.h | 13 +++++++++++++
> 4 files changed, 32 insertions(+), 6 deletions(-)Reviewed-by: Stefan Hajnoczi <[email protected]>
signature.asc
Description: PGP signature
