9c1d261437
Time to start supporting clients that request extended headers. Now we can finally reach the code added across several previous patches. Even though the NBD spec has been altered to allow us to accept NBD_CMD_READ larger than the max payload size (provided our response is a hole or broken up over more than one data chunk), we are not planning to take advantage of that, and continue to cap NBD_CMD_READ to 32M regardless of header size. For NBD_CMD_WRITE_ZEROES and NBD_CMD_TRIM, the block layer already supports 64-bit operations without any effort on our part. For NBD_CMD_BLOCK_STATUS, the client's length is a hint, and the previous patch took care of implementing the required NBD_REPLY_TYPE_BLOCK_STATUS_EXT. We do not yet support clients that want to do request payload filtering of NBD_CMD_BLOCK_STATUS; that will be added in later patches, but is not essential for qemu as a client since qemu only requests the single context base:allocation. Signed-off-by: Eric Blake <eblake@redhat.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> Message-ID: <20230925192229.3186470-19-eblake@redhat.com>
73 lines
2.8 KiB
Plaintext
73 lines
2.8 KiB
Plaintext
QEMU supports the NBD protocol, and has an internal NBD client (see
|
|
block/nbd.c), an internal NBD server (see blockdev-nbd.c), and an
|
|
external NBD server tool (see qemu-nbd.c). The common code is placed
|
|
in nbd/*.
|
|
|
|
The NBD protocol is specified here:
|
|
https://github.com/NetworkBlockDevice/nbd/blob/master/doc/proto.md
|
|
|
|
The following paragraphs describe some specific properties of NBD
|
|
protocol realization in QEMU.
|
|
|
|
= Metadata namespaces =
|
|
|
|
QEMU supports the "base:allocation" metadata context as defined in the
|
|
NBD protocol specification, and also defines an additional metadata
|
|
namespace "qemu".
|
|
|
|
== "qemu" namespace ==
|
|
|
|
The "qemu" namespace currently contains two available metadata context
|
|
types. The first is related to exposing the contents of a dirty
|
|
bitmap alongside the associated disk contents. That metadata context
|
|
is named with the following form:
|
|
|
|
qemu:dirty-bitmap:<dirty-bitmap-export-name>
|
|
|
|
Each dirty-bitmap metadata context defines only one flag for extents
|
|
in reply for NBD_CMD_BLOCK_STATUS:
|
|
|
|
bit 0: NBD_STATE_DIRTY, set when the extent is "dirty"
|
|
|
|
The second is related to exposing the source of various extents within
|
|
the image, with a single metadata context named:
|
|
|
|
qemu:allocation-depth
|
|
|
|
In the allocation depth context, the entire 32-bit value represents a
|
|
depth of which layer in a thin-provisioned backing chain provided the
|
|
data (0 for unallocated, 1 for the active layer, 2 for the first
|
|
backing layer, and so forth).
|
|
|
|
For NBD_OPT_LIST_META_CONTEXT the following queries are supported
|
|
in addition to the specific "qemu:allocation-depth" and
|
|
"qemu:dirty-bitmap:<dirty-bitmap-export-name>":
|
|
|
|
* "qemu:" - returns list of all available metadata contexts in the
|
|
namespace.
|
|
* "qemu:dirty-bitmap:" - returns list of all available dirty-bitmap
|
|
metadata contexts.
|
|
|
|
= Features by version =
|
|
|
|
The following list documents which qemu version first implemented
|
|
various features (both as a server exposing the feature, and as a
|
|
client taking advantage of the feature when present), to make it
|
|
easier to plan for cross-version interoperability. Note that in
|
|
several cases, the initial release containing a feature may require
|
|
additional patches from the corresponding stable branch to fix bugs in
|
|
the operation of that feature.
|
|
|
|
* 2.6: NBD_OPT_STARTTLS with TLS X.509 Certificates
|
|
* 2.8: NBD_CMD_WRITE_ZEROES
|
|
* 2.10: NBD_OPT_GO, NBD_INFO_BLOCK
|
|
* 2.11: NBD_OPT_STRUCTURED_REPLY
|
|
* 2.12: NBD_CMD_BLOCK_STATUS for "base:allocation"
|
|
* 3.0: NBD_OPT_STARTTLS with TLS Pre-Shared Keys (PSK),
|
|
NBD_CMD_BLOCK_STATUS for "qemu:dirty-bitmap:", NBD_CMD_CACHE
|
|
* 4.2: NBD_FLAG_CAN_MULTI_CONN for shareable read-only exports,
|
|
NBD_CMD_FLAG_FAST_ZERO
|
|
* 5.2: NBD_CMD_BLOCK_STATUS for "qemu:allocation-depth"
|
|
* 7.1: NBD_FLAG_CAN_MULTI_CONN for shareable writable exports
|
|
* 8.2: NBD_OPT_EXTENDED_HEADERS
|