From: Niklas Cassel <cassel@kernel.org>
To: Stefan Hajnoczi <stefanha@redhat.com>,
Kevin Wolf <kwolf@redhat.com>,
"Michael S. Tsirkin" <mst@redhat.com>,
Hanna Reitz <hreitz@redhat.com>
Cc: Sam Li <faithilikerun@gmail.com>,
Damien Le Moal <dlemoal@kernel.org>,
Niklas Cassel <cassel@kernel.org>,
qemu-block@nongnu.org, qemu-devel@nongnu.org
Subject: [PATCH v4 10/12] virtio-blk: derive the maximum zone append size
Date: Mon, 7 Sep 2026 13:07:45 +0200 [thread overview]
Message-ID: <20260907110748.1868714-11-cassel@kernel.org> (raw)
In-Reply-To: <20260907110748.1868714-1-cassel@kernel.org>
The max_append_sectors field of virtio_blk_zoned_characteristics must be
set by the device to the largest zone append request that can be issued
to it, and a value of zero tells the guest driver that zone append is not
supported at all (virtio 1.4, 5.2.5.2). Linux refuses to attach a zoned
device that reports zero.
We pass BlockLimits.max_append_sectors straight through, which makes that
field mean "zone append unsupported" when it is unset, rather than "this
backend imposes no limit of its own". Only a backend that has a limit of
its own has anything to put there.
Derive the value instead. A backend limit is honoured when there is one,
and otherwise the request is bounded by the zone size, since an append
cannot cross a zone boundary, and by the largest request the block layer
can carry. The result cannot be zero.
A backend that carries out an append itself, rather than passing it to a
device that has a limit of its own, is the one that knows how large a
request its implementation can take, so it reports that in
BlockLimits.max_append_sectors and this does not have to guess at it.
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Signed-off-by: Niklas Cassel <cassel@kernel.org>
---
hw/block/virtio-blk.c | 31 ++++++++++++++++++++++++-------
1 file changed, 24 insertions(+), 7 deletions(-)
diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c
index c2acf59c6d..131516a167 100644
--- a/hw/block/virtio-blk.c
+++ b/hw/block/virtio-blk.c
@@ -525,6 +525,27 @@ typedef struct ZoneCmdData {
};
} ZoneCmdData;
+/*
+ * The maximum zone append data size that the device reports to the driver in
+ * virtio_blk_zoned_characteristics, in 512 byte sectors.
+ *
+ * A backend that has no limit of its own leaves BlockLimits.max_append_sectors
+ * at zero, in which case the limit is whatever else bounds the request: an
+ * append cannot cross a zone boundary, and the block layer cannot carry a
+ * larger one. The result is never zero, which the driver would read as zone
+ * append not being supported at all.
+ */
+static uint32_t virtio_blk_max_append_sectors(VirtIOBlock *s)
+{
+ BlockDriverState *bs = blk_bs(s->blk);
+ uint64_t sectors;
+
+ sectors = MIN_NON_ZERO(bs->bl.zone_size >> BDRV_SECTOR_BITS,
+ bs->bl.max_append_sectors);
+
+ return MIN_NON_ZERO(sectors, BDRV_REQUEST_MAX_SECTORS);
+}
+
/*
* check zoned_request: error checking before issuing requests. If all checks
* passed, return true.
@@ -560,12 +581,8 @@ static bool check_zoned_request(VirtIOBlock *s, int64_t offset, int64_t len,
return false;
}
- if (len / 512 > bs->bl.max_append_sectors) {
- if (bs->bl.max_append_sectors == 0) {
- *status = VIRTIO_BLK_S_UNSUPP;
- } else {
- *status = VIRTIO_BLK_S_ZONE_INVALID_CMD;
- }
+ if ((len >> BDRV_SECTOR_BITS) > virtio_blk_max_append_sectors(s)) {
+ *status = VIRTIO_BLK_S_ZONE_INVALID_CMD;
return false;
}
}
@@ -1313,7 +1330,7 @@ static void virtio_blk_update_config(VirtIODevice *vdev, uint8_t *config)
virtio_stl_p(vdev, &blkcfg.zoned.write_granularity,
blkconf_zone_write_granularity(conf));
virtio_stl_p(vdev, &blkcfg.zoned.max_append_sectors,
- bs->bl.max_append_sectors);
+ virtio_blk_max_append_sectors(s));
} else {
blkcfg.zoned.model = VIRTIO_BLK_Z_NONE;
}
--
2.55.0
next prev parent reply other threads:[~2026-09-07 11:09 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-07 11:07 [PATCH v4 00/12] block: fix the zone write granularity and the zone append limit Niklas Cassel
2026-09-07 11:07 ` [PATCH v4 01/12] block: widen BlockLimits.zone_size to uint64_t Niklas Cassel
2026-09-09 18:04 ` Stefan Hajnoczi
2026-09-07 11:07 ` [PATCH v4 02/12] virtio-blk: do not merge requests across a zone boundary Niklas Cassel
2026-09-07 11:07 ` [PATCH v4 03/12] block: add a helper for the index of the zone an offset falls in Niklas Cassel
2026-09-09 18:05 ` Stefan Hajnoczi
2026-09-07 11:07 ` [PATCH v4 04/12] virtio-blk: report the effective zone write granularity Niklas Cassel
2026-09-09 18:27 ` Stefan Hajnoczi
2026-09-07 11:07 ` [PATCH v4 05/12] virtio-blk: check the write granularity of writes to sequential zones Niklas Cassel
2026-09-09 18:31 ` Stefan Hajnoczi
2026-09-07 11:07 ` [PATCH v4 06/12] hw/block: reject a zoned device whose write pointers are unaddressable Niklas Cassel
2026-09-09 18:34 ` Stefan Hajnoczi
2026-09-07 11:07 ` [PATCH v4 07/12] block: reject zone appends that are not a multiple of the sector size Niklas Cassel
2026-09-09 18:37 ` Stefan Hajnoczi
2026-09-09 18:42 ` Stefan Hajnoczi
2026-09-07 11:07 ` [PATCH v4 08/12] file-posix: remove the zone append write granularity check Niklas Cassel
2026-09-09 18:38 ` Stefan Hajnoczi
2026-09-07 11:07 ` [PATCH v4 09/12] file-posix: base the zone append limit on the transfer limit Niklas Cassel
2026-09-09 18:43 ` Stefan Hajnoczi
2026-09-07 11:07 ` Niklas Cassel [this message]
2026-09-09 18:52 ` [PATCH v4 10/12] virtio-blk: derive the maximum zone append size Stefan Hajnoczi
2026-09-07 11:07 ` [PATCH v4 11/12] file-posix: reject a zone append past the device capacity Niklas Cassel
2026-09-09 18:53 ` Stefan Hajnoczi
2026-09-07 11:07 ` [PATCH v4 12/12] file-posix: reject a zone append to a full or conventional zone Niklas Cassel
2026-09-09 18:54 ` Stefan Hajnoczi
2026-09-09 18:58 ` [PATCH v4 00/12] block: fix the zone write granularity and the zone append limit Stefan Hajnoczi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260907110748.1868714-11-cassel@kernel.org \
--to=cassel@kernel.org \
--cc=dlemoal@kernel.org \
--cc=faithilikerun@gmail.com \
--cc=hreitz@redhat.com \
--cc=kwolf@redhat.com \
--cc=mst@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.