[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 08/15] nbd/server: Enable initial support for extended headers
|
From: |
Eric Blake |
|
Subject: |
[PULL 08/15] nbd/server: Enable initial support for extended headers |
|
Date: |
Thu, 5 Oct 2023 13:44:55 -0500 |
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>
---
docs/interop/nbd.txt | 1 +
nbd/server.c | 21 +++++++++++++++++++++
2 files changed, 22 insertions(+)
diff --git a/docs/interop/nbd.txt b/docs/interop/nbd.txt
index f5ca25174a6..9aae5e1f294 100644
--- a/docs/interop/nbd.txt
+++ b/docs/interop/nbd.txt
@@ -69,3 +69,4 @@ NBD_CMD_BLOCK_STATUS for "qemu:dirty-bitmap:", NBD_CMD_CACHE
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
diff --git a/nbd/server.c b/nbd/server.c
index 183efe27bf8..d3eed6535bf 100644
--- a/nbd/server.c
+++ b/nbd/server.c
@@ -482,6 +482,10 @@ static int nbd_negotiate_handle_export_name(NBDClient
*client, bool no_zeroes,
[10 .. 133] reserved (0) [unless no_zeroes]
*/
trace_nbd_negotiate_handle_export_name();
+ if (client->mode >= NBD_MODE_EXTENDED) {
+ error_setg(errp, "Extended headers already negotiated");
+ return -EINVAL;
+ }
if (client->optlen > NBD_MAX_STRING_SIZE) {
error_setg(errp, "Bad length received");
return -EINVAL;
@@ -1264,6 +1268,10 @@ static int nbd_negotiate_options(NBDClient *client,
Error **errp)
case NBD_OPT_STRUCTURED_REPLY:
if (length) {
ret = nbd_reject_length(client, false, errp);
+ } else if (client->mode >= NBD_MODE_EXTENDED) {
+ ret = nbd_negotiate_send_rep_err(
+ client, NBD_REP_ERR_EXT_HEADER_REQD, errp,
+ "extended headers already negotiated");
} else if (client->mode >= NBD_MODE_STRUCTURED) {
ret = nbd_negotiate_send_rep_err(
client, NBD_REP_ERR_INVALID, errp,
@@ -1280,6 +1288,19 @@ static int nbd_negotiate_options(NBDClient *client,
Error **errp)
errp);
break;
+ case NBD_OPT_EXTENDED_HEADERS:
+ if (length) {
+ ret = nbd_reject_length(client, false, errp);
+ } else if (client->mode >= NBD_MODE_EXTENDED) {
+ ret = nbd_negotiate_send_rep_err(
+ client, NBD_REP_ERR_INVALID, errp,
+ "extended headers already negotiated");
+ } else {
+ ret = nbd_negotiate_send_rep(client, NBD_REP_ACK, errp);
+ client->mode = NBD_MODE_EXTENDED;
+ }
+ break;
+
default:
ret = nbd_opt_drop(client, NBD_REP_ERR_UNSUP, errp,
"Unsupported option %" PRIu32 " (%s)",
--
2.41.0
- [PULL 00/15] NBD patches through 2023-10-05, Eric Blake, 2023/10/05
- [PULL 04/15] nbd/server: Support a request payload, Eric Blake, 2023/10/05
- [PULL 05/15] nbd/server: Prepare to receive extended header requests, Eric Blake, 2023/10/05
- [PULL 01/15] mailmap: Fix Andrey Drobyshev author email, Eric Blake, 2023/10/05
- [PULL 06/15] nbd/server: Prepare to send extended header replies, Eric Blake, 2023/10/05
- [PULL 07/15] nbd/server: Support 64-bit block status, Eric Blake, 2023/10/05
- [PULL 11/15] nbd/client: Accept 64-bit block status chunks, Eric Blake, 2023/10/05
- [PULL 08/15] nbd/server: Enable initial support for extended headers,
Eric Blake <=
- [PULL 14/15] nbd/server: Prepare for per-request filtering of BLOCK_STATUS, Eric Blake, 2023/10/05
- [PULL 02/15] maint: Tweak comments in mailmap regarding SPF, Eric Blake, 2023/10/05
- [PULL 09/15] nbd/client: Plumb errp through nbd_receive_replies, Eric Blake, 2023/10/05
- [PULL 10/15] nbd/client: Initial support for extended headers, Eric Blake, 2023/10/05
- [PULL 03/15] mailmap: Fix BALATON Zoltan author email, Eric Blake, 2023/10/05
- [PULL 13/15] nbd/server: Refactor list of negotiated meta contexts, Eric Blake, 2023/10/05
- [PULL 15/15] nbd/server: Add FLAG_PAYLOAD support to CMD_BLOCK_STATUS, Eric Blake, 2023/10/05
- [PULL 12/15] nbd/client: Request extended headers during negotiation, Eric Blake, 2023/10/05
- Re: [PULL 00/15] NBD patches through 2023-10-05, Stefan Hajnoczi, 2023/10/09