============= zoned-storage ============= Zoned Block Devices (ZBDs) divide the LBA space into block regions called zones that are larger than the LBA size. They can only allow sequential writes, which can reduce write amplification in SSDs, and potentially lead to higher throughput and increased capacity. More details about ZBDs can be found at: https://zonedstorage.io/docs/introduction/zoned-storage 1. Block layer APIs for zoned storage ------------------------------------- QEMU block layer supports three zoned storage models: - BLK_Z_HM: The host-managed zoned model only allows sequential writes access to zones. It supports ZBD-specific I/O commands that can be used by a host to manage the zones of a device. - BLK_Z_HA: The host-aware zoned model allows random write operations in zones, making it backward compatible with regular block devices. - BLK_Z_NONE: The non-zoned model has no zones support. It includes both regular and drive-managed ZBD devices. ZBD-specific I/O commands are not supported. The block device information resides inside BlockDriverState. QEMU uses BlockLimits struct(BlockDriverState::bl) that is continuously accessed by the block layer while processing I/O requests. A BlockBackend has a root pointer to a BlockDriverState graph(for example, raw format on top of file-posix). The zoned storage information can be propagated from the leaf BlockDriverState all the way up to the BlockBackend. If the zoned storage model in file-posix is set to BLK_Z_HM, then block drivers will declare support for zoned host device. The block layer APIs support commands needed for zoned storage devices, including report zones, four zone operations, and zone append. 2. Emulating zoned storage controllers -------------------------------------- When the BlockBackend's BlockLimits model reports a zoned storage device, users like the virtio-blk emulation or the qemu-io-cmds.c utility can use block layer APIs for zoned storage emulation or testing. For example, to test zone_report on a null_blk device using qemu-io is:: $ path/to/qemu-io --image-opts -n driver=host_device,filename=/dev/nullb0 -c "zrp offset nr_zones"