All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v16 0/9] Add full zoned storage emulation to the qcow2 driver
@ 2026-10-30 17:10 Niklas Cassel
  2026-10-30 17:10 ` [PATCH v16 1/9] docs/qcow2: add the zoned format feature Niklas Cassel
                   ` (8 more replies)
  0 siblings, 9 replies; 10+ messages in thread
From: Niklas Cassel @ 2026-10-30 17:10 UTC (permalink / raw)
  To: qemu-devel
  Cc: Niklas Cassel, dlemoal, Stefan Hajnoczi, Pierrick Bouvier,
	Michael S. Tsirkin, Hanna Reitz, Markus Armbruster, Kevin Wolf,
	Eric Blake, qemu-block, Sam Li, Paolo Bonzini, Fam Zheng,
	Jeuk Kim, Daejun Park

This patch series adds a new extension - zoned format - to the
qcow2 driver, allowing full zoned storage emulation on a qcow2
image file. A user can attach such an image to a guest and have
it appear as a host-managed zoned block device.

The zoned format is opt-in through a new qcow2 header extension
that pins the zone geometry. Behind the extension is a dedicated
zoned metadata region that stores one 8-byte write pointer (WP)
per zone. The extension is gated by an incompatible bit, so an
older qcow2 implementation cannot accidentally open the image.

Each write pointer is routed through the write pointer cache,
a Qcow2Cache object. The write pointer cache is written to disk
after the qcow2 metadata is written, thus guaranteeing that
the write pointer is updated after the corresponding data is
written.

Zone states are in memory. Read-only and offline states are
device-internal events, which are not modelled in qcow2
emulation for simplicity. The other zone states
(closed, empty, full) can be inferred from write pointer
values, persistent across QEMU reboots. The open states are
kept in memory using open zone lists.

To create a qcow2 file with the zoned format:

    qemu-img create -f qcow2 zbc.qcow2 \
        -o size=768M \
        -o zone.size=64M \
        -o zone.capacity=64M \
        -o zone.conventional_zones=0 \
        -o zone.max_open_zones=6 \
        -o zone.max_active_zones=8 \
        -o zone.mode=host-managed

Then attach it to a guest via the QEMU command line:
    -blockdev node-name=drive1,driver=qcow2,file.driver=file,file.filename=zbc.qcow2 \
    -device virtio-blk-pci,drive=drive1 \

Tested with blktests, fio, zbd_state (an internal test suite) and
zonefs, comparing a zoned qcow2 image attached via virtio-blk with
zloop, null_blk and scsi_debug (passed/failed/skipped):

    +--------------------+----------+---------+-----------+---------+
    | Testrun            | blktests | fio     | zbd_state | zonefs  |
    +--------------------+----------+---------+-----------+---------+
    | zloop              | 9/0/10   | 57/0/18 | 29/0/8    | 113/0/0 |
    | null_blk           | 9/0/10   | 57/0/18 | 29/0/8    | 113/0/0 |
    | scsi_debug         | 10/0/12  | 61/0/14 | 29/0/8    | 113/0/0 |
    | virtio-blk + qcow2 | 9/0/10   | 57/0/18 | 29/0/8    | 113/0/0 |
    +--------------------+----------+---------+-----------+---------+

The last two patches are not used by the qcow2 driver. Both Daejun
Park's zoned UFS series and an upcoming series that adds zoned support
to ATA depend on this series, and both also require these two patches,
so they are included here, to avoid both series needing to carry them
separately as dependencies.

Git branch can be found at:
https://github.com/floatious/qemu/tree/qcow2-v16

v15->v16:
- rebase on master, which now contains the series "block: fix the zone
  write granularity and the zone append limit"
- report a write to a full zone with a dedicated errno, BLK_ZE_FULL
  (EXFULL), as ZAC, ZBC, NVMe ZNS and virtio-blk all report it
  differently from a write that is not at the write pointer; virtio-blk
  reports it as VIRTIO_BLK_S_ZONE_INVALID_CMD (pointed out by Daejun
  Park)
- refuse the management of a conventional zone with EINVAL instead of
  EIO
- trace rejected zone requests instead of reporting them with
  error_report(), which a guest could use to flood stderr (pointed out
  by Daejun Park)
- add "block: add accessors for the zone model, capacity and open zone
  limit" and "scsi: add the sense codes of zoned block devices" (new
  patches), for the zoned UFS and zoned ATA series

Niklas Cassel (5):
  block: define errnos for zone protocol errors
  qcow2: validate the write pointer table when opening an image
  virtio-blk: report zone errors with their zone status codes
  block: add accessors for the zone model, capacity and open zone limit
  scsi: add the sense codes of zoned block devices

Sam Li (4):
  docs/qcow2: add the zoned format feature
  qcow2: add configurations for zoned format extension
  qcow2: add zoned emulation capability
  iotests: test the zoned format feature for qcow2 file

 MAINTAINERS                                   |    1 +
 block/block-backend.c                         |   33 +
 block/io.c                                    |   13 +-
 block/qcow2-cache.c                           |   11 +-
 block/qcow2-refcount.c                        |   18 +
 block/qcow2.c                                 | 1674 ++++++++++++++++-
 block/qcow2.h                                 |   86 +-
 block/trace-events                            |   10 +
 docs/interop/qcow2.rst                        |  115 +-
 docs/system/qemu-block-drivers.rst.inc        |   44 +
 hw/block/block.c                              |    7 +
 hw/block/virtio-blk.c                         |   49 +-
 include/block/block-common.h                  |   17 +
 include/block/block-io.h                      |    6 +
 include/block/block_int-common.h              |   12 +
 include/qemu/osdep.h                          |    6 +
 include/scsi/utils.h                          |    6 +
 include/system/block-backend-io.h             |    3 +
 qapi/block-core.json                          |   86 +-
 scsi/utils.c                                  |   15 +
 tests/qemu-iotests/031.out                    |    8 +-
 tests/qemu-iotests/036.out                    |    4 +-
 tests/qemu-iotests/061.out                    |   14 +-
 tests/qemu-iotests/082.out                    |  108 ++
 tests/qemu-iotests/303.out                    |    4 +-
 tests/qemu-iotests/tests/qcow2-encryption.out |    4 +-
 tests/qemu-iotests/tests/zoned-qcow2          |  362 ++++
 tests/qemu-iotests/tests/zoned-qcow2.out      |  258 +++
 28 files changed, 2937 insertions(+), 37 deletions(-)
 create mode 100755 tests/qemu-iotests/tests/zoned-qcow2
 create mode 100644 tests/qemu-iotests/tests/zoned-qcow2.out


base-commit: 9703b6cf418d2ce72fae8d00e511135ce0bfda43
-- 
2.56.0



^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2026-10-30 17:12 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-30 17:10 [PATCH v16 0/9] Add full zoned storage emulation to the qcow2 driver Niklas Cassel
2026-10-30 17:10 ` [PATCH v16 1/9] docs/qcow2: add the zoned format feature Niklas Cassel
2026-10-30 17:10 ` [PATCH v16 2/9] qcow2: add configurations for zoned format extension Niklas Cassel
2026-10-30 17:10 ` [PATCH v16 3/9] block: define errnos for zone protocol errors Niklas Cassel
2026-10-30 17:10 ` [PATCH v16 4/9] qcow2: add zoned emulation capability Niklas Cassel
2026-10-30 17:10 ` [PATCH v16 5/9] iotests: test the zoned format feature for qcow2 file Niklas Cassel
2026-10-30 17:10 ` [PATCH v16 6/9] qcow2: validate the write pointer table when opening an image Niklas Cassel
2026-10-30 17:10 ` [PATCH v16 7/9] virtio-blk: report zone errors with their zone status codes Niklas Cassel
2026-10-30 17:10 ` [PATCH v16 8/9] block: add accessors for the zone model, capacity and open zone limit Niklas Cassel
2026-10-30 17:10 ` [PATCH v16 9/9] scsi: add the sense codes of zoned block devices Niklas Cassel

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.