[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [libnbd PATCH v4 3/6] protocol: Add definitions for extended headers
From: |
Laszlo Ersek |
Subject: |
Re: [libnbd PATCH v4 3/6] protocol: Add definitions for extended headers |
Date: |
Mon, 24 Jul 2023 11:21:59 +0200 |
On 7/21/23 18:08, Eric Blake wrote:
> Add the magic numbers and new structs necessary to implement the NBD
> protocol extension of extended headers providing 64-bit lengths. This
> corresponds to upstream nbd commits 36abf47d and a9384e2f on the
> extension-ext-header branch[1] (commit e6f3b94a for
> NBD_FLAG_BLOCK_STATUS_PAYLOAD is saved for a later patch).
>
> [1]
> https://github.com/NetworkBlockDevice/nbd/blob/extension-ext-header/doc/proto.md
>
> Signed-off-by: Eric Blake <eblake@redhat.com>
> Reviewed-by: Laszlo Ersek <lersek@redhat.com>
> ---
>
> v4: tweak comment on block_status_64.count [Laszlo], rebase to earlier
> struct renames (for example, nbd_block_descriptor_64 instead of
> nbd_structured_reply_block_status_hdr). Seemed obvious enough that I
> felt okay keeping Laszlo's R-b.
> ---
> lib/nbd-protocol.h | 55 ++++++++++++++++++++++++++++++++++++++--------
> 1 file changed, 46 insertions(+), 9 deletions(-)
Certainly, thanks!
Laszlo
>
> diff --git a/lib/nbd-protocol.h b/lib/nbd-protocol.h
> index 58583d1d..b5a28ae4 100644
> --- a/lib/nbd-protocol.h
> +++ b/lib/nbd-protocol.h
> @@ -124,6 +124,7 @@ struct nbd_fixed_new_option_reply {
> #define NBD_OPT_STRUCTURED_REPLY 8
> #define NBD_OPT_LIST_META_CONTEXT 9
> #define NBD_OPT_SET_META_CONTEXT 10
> +#define NBD_OPT_EXTENDED_HEADERS 11
>
> #define NBD_REP_ERR(val) (0x80000000 | (val))
> #define NBD_REP_IS_ERR(val) (!!((val) & 0x80000000))
> @@ -141,6 +142,7 @@ struct nbd_fixed_new_option_reply {
> #define NBD_REP_ERR_SHUTDOWN NBD_REP_ERR (7)
> #define NBD_REP_ERR_BLOCK_SIZE_REQD NBD_REP_ERR (8)
> #define NBD_REP_ERR_TOO_BIG NBD_REP_ERR (9)
> +#define NBD_REP_ERR_EXT_HEADER_REQD NBD_REP_ERR (10)
>
> #define NBD_INFO_EXPORT 0
> #define NBD_INFO_NAME 1
> @@ -182,16 +184,26 @@ struct nbd_fixed_new_option_reply_meta_context {
> /* followed by a string */
> } NBD_ATTRIBUTE_PACKED;
>
> -/* Request (client -> server). */
> +/* Compact request (client -> server). */
> struct nbd_request {
> uint32_t magic; /* NBD_REQUEST_MAGIC. */
> - uint16_t flags; /* Request flags. */
> - uint16_t type; /* Request type. */
> + uint16_t flags; /* Request flags: NBD_CMD_FLAG_*. */
> + uint16_t type; /* Request type: NBD_CMD_*. */
> uint64_t cookie; /* Opaque handle. */
> uint64_t offset; /* Request offset. */
> uint32_t count; /* Request length. */
> } NBD_ATTRIBUTE_PACKED;
>
> +/* Extended request (client -> server). */
> +struct nbd_request_ext {
> + uint32_t magic; /* NBD_EXTENDED_REQUEST_MAGIC. */
> + uint16_t flags; /* Request flags: NBD_CMD_FLAG_*. */
> + uint16_t type; /* Request type: NBD_CMD_*. */
> + uint64_t cookie; /* Opaque handle. */
> + uint64_t offset; /* Request offset. */
> + uint64_t count; /* Request effect or payload length. */
> +} NBD_ATTRIBUTE_PACKED;
> +
> /* Simple reply (server -> client). */
> struct nbd_simple_reply {
> uint32_t magic; /* NBD_SIMPLE_REPLY_MAGIC. */
> @@ -208,6 +220,16 @@ struct nbd_structured_reply {
> uint32_t length; /* Length of following nbd_chunk_* payload.
> */
> } NBD_ATTRIBUTE_PACKED;
>
> +/* Extended reply (server -> client). */
> +struct nbd_extended_reply {
> + uint32_t magic; /* NBD_EXTENDED_REPLY_MAGIC. */
> + uint16_t flags; /* NBD_REPLY_FLAG_* */
> + uint16_t type; /* NBD_REPLY_TYPE_* */
> + uint64_t cookie; /* Opaque handle. */
> + uint64_t offset; /* Client's offset. */
> + uint64_t length; /* Length of following nbd_chunk_* payload.
> */
> +} NBD_ATTRIBUTE_PACKED;
> +
> struct nbd_chunk_offset_data {
> uint64_t offset; /* offset */
> /* Followed by data. */
> @@ -228,6 +250,17 @@ struct nbd_block_descriptor_32 {
> uint32_t status_flags; /* block type (hole etc) */
> } NBD_ATTRIBUTE_PACKED;
>
> +struct nbd_chunk_block_status_64 {
> + uint32_t context_id; /* metadata context ID */
> + uint32_t count; /* non-zero descriptor count */
> + /* followed by nbd_block_descriptor_64[count] extents */
> +} NBD_ATTRIBUTE_PACKED;
> +
> +struct nbd_block_descriptor_64 {
> + uint64_t length; /* length of block */
> + uint64_t status_flags; /* block type (hole etc) */
> +} NBD_ATTRIBUTE_PACKED;
> +
> struct nbd_chunk_error {
> uint32_t error; /* NBD_E* error number */
> uint16_t len; /* Length of human readable error. */
> @@ -235,8 +268,10 @@ struct nbd_chunk_error {
> } NBD_ATTRIBUTE_PACKED;
>
> #define NBD_REQUEST_MAGIC 0x25609513
> +#define NBD_EXTENDED_REQUEST_MAGIC 0x21e41c71
> #define NBD_SIMPLE_REPLY_MAGIC 0x67446698
> #define NBD_STRUCTURED_REPLY_MAGIC 0x668e33ef
> +#define NBD_EXTENDED_REPLY_MAGIC 0x6e8a278c
>
> /* Structured reply flags. */
> #define NBD_REPLY_FLAG_DONE (1U << 0)
> @@ -245,12 +280,13 @@ struct nbd_chunk_error {
> #define NBD_REPLY_TYPE_IS_ERR(val) (!!((val) & (1U<<15)))
>
> /* Structured reply types. */
> -#define NBD_REPLY_TYPE_NONE 0
> -#define NBD_REPLY_TYPE_OFFSET_DATA 1
> -#define NBD_REPLY_TYPE_OFFSET_HOLE 2
> -#define NBD_REPLY_TYPE_BLOCK_STATUS 5
> -#define NBD_REPLY_TYPE_ERROR NBD_REPLY_TYPE_ERR (1)
> -#define NBD_REPLY_TYPE_ERROR_OFFSET NBD_REPLY_TYPE_ERR (2)
> +#define NBD_REPLY_TYPE_NONE 0
> +#define NBD_REPLY_TYPE_OFFSET_DATA 1
> +#define NBD_REPLY_TYPE_OFFSET_HOLE 2
> +#define NBD_REPLY_TYPE_BLOCK_STATUS 5
> +#define NBD_REPLY_TYPE_BLOCK_STATUS_EXT 6
> +#define NBD_REPLY_TYPE_ERROR NBD_REPLY_TYPE_ERR (1)
> +#define NBD_REPLY_TYPE_ERROR_OFFSET NBD_REPLY_TYPE_ERR (2)
>
> /* NBD commands. */
> #define NBD_CMD_READ 0
> @@ -267,6 +303,7 @@ struct nbd_chunk_error {
> #define NBD_CMD_FLAG_DF (1U << 2)
> #define NBD_CMD_FLAG_REQ_ONE (1U << 3)
> #define NBD_CMD_FLAG_FAST_ZERO (1U << 4)
> +#define NBD_CMD_FLAG_PAYLOAD_LEN (1U << 5)
>
> /* NBD error codes. */
> #define NBD_SUCCESS 0
- [libnbd PATCH v4 0/6] NBD 64-bit extensions (libnbd portions, prep work), Eric Blake, 2023/07/21
- [libnbd PATCH v4 2/6] block_status: Refactor array storage, Eric Blake, 2023/07/21
- [libnbd PATCH v4 1/6] internal: Track chunk payload length left, Eric Blake, 2023/07/21
- [libnbd PATCH v4 3/6] protocol: Add definitions for extended headers, Eric Blake, 2023/07/21
- Re: [libnbd PATCH v4 3/6] protocol: Add definitions for extended headers,
Laszlo Ersek <=
- [libnbd PATCH v4 4/6] states: Prepare to send 64-bit requests, Eric Blake, 2023/07/21
- [libnbd PATCH v4 5/6] states: Prepare to receive 64-bit replies, Eric Blake, 2023/07/21
- [libnbd PATCH v4 6/6] states: Break deadlock if server goofs on extended replies, Eric Blake, 2023/07/21