On 8/26/26 05:57, 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 backend granularity and the logical block size
> instead. The guest driver cannot issue writes finer than the logical
> size, so the larger of the two is the constraint that applies. This
> matches what a Linux guest derives for itself: blk_validate_zoned_limits()
> raises zone_write_granularity to the logical block size, and
> blk_stack_limits() stacks it with max().
> 
> Add it as a helper next to blkconf_blocksizes(), since it is derived from
> a BlockConf and the limits of the backend below it, 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]>

Reviewed-by: Damien Le Moal <[email protected]>

-- 
Damien Le Moal
Western Digital Research

Reply via email to