[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v6 16/17] nbd/server: Prepare for per-request filtering of BLOCK_
From: |
Eric Blake |
Subject: |
[PATCH v6 16/17] nbd/server: Prepare for per-request filtering of BLOCK_STATUS |
Date: |
Tue, 29 Aug 2023 12:58:43 -0500 |
The next commit will add support for the optional extension
NBD_CMD_FLAG_PAYLOAD during NBD_CMD_BLOCK_STATUS, where the client can
request that the server only return a subset of negotiated contexts,
rather than all contexts. To make that task easier, this patch
populates the list of contexts to return on a per-command basis (for
now, identical to the full set of negotiated contexts).
Signed-off-by: Eric Blake <eblake@redhat.com>
---
v5: fix null dereference on early error [Vladimir], hoist in assertion
from v4 24/24
v4: split out NBDMetaContexts refactoring to its own patch, track
NBDRequests.contexts as a pointer rather than inline
---
include/block/nbd.h | 1 +
nbd/server.c | 22 +++++++++++++++++-----
2 files changed, 18 insertions(+), 5 deletions(-)
diff --git a/include/block/nbd.h b/include/block/nbd.h
index 7643c321f36..9285aa85826 100644
--- a/include/block/nbd.h
+++ b/include/block/nbd.h
@@ -77,6 +77,7 @@ typedef struct NBDRequest {
uint16_t flags; /* NBD_CMD_FLAG_* */
uint16_t type; /* NBD_CMD_* */
NBDMode mode; /* Determines which network representation to use */
+ NBDMetaContexts *contexts; /* Used by NBD_CMD_BLOCK_STATUS */
} NBDRequest;
typedef struct NBDSimpleReply {
diff --git a/nbd/server.c b/nbd/server.c
index 72db982c9ca..f1805b39318 100644
--- a/nbd/server.c
+++ b/nbd/server.c
@@ -2511,6 +2511,7 @@ static int coroutine_fn
nbd_co_receive_request(NBDRequestData *req,
break;
case NBD_CMD_BLOCK_STATUS:
+ request->contexts = &client->contexts;
valid_flags |= NBD_CMD_FLAG_REQ_ONE;
break;
@@ -2751,17 +2752,18 @@ static coroutine_fn int nbd_handle_request(NBDClient
*client,
"discard failed", errp);
case NBD_CMD_BLOCK_STATUS:
+ assert(request->contexts);
if (!request->len) {
return nbd_send_generic_reply(client, request, -EINVAL,
"need non-zero length", errp);
}
assert(client->mode >= NBD_MODE_EXTENDED ||
request->len <= UINT32_MAX);
- if (client->contexts.count) {
+ if (request->contexts->count) {
bool dont_fragment = request->flags & NBD_CMD_FLAG_REQ_ONE;
- int contexts_remaining = client->contexts.count;
+ int contexts_remaining = request->contexts->count;
- if (client->contexts.base_allocation) {
+ if (request->contexts->base_allocation) {
ret = nbd_co_send_block_status(client, request,
exp->common.blk,
request->from,
@@ -2774,7 +2776,7 @@ static coroutine_fn int nbd_handle_request(NBDClient
*client,
}
}
- if (client->contexts.allocation_depth) {
+ if (request->contexts->allocation_depth) {
ret = nbd_co_send_block_status(client, request,
exp->common.blk,
request->from, request->len,
@@ -2787,8 +2789,9 @@ static coroutine_fn int nbd_handle_request(NBDClient
*client,
}
}
+ assert(request->contexts->exp == client->exp);
for (i = 0; i < client->exp->nr_export_bitmaps; i++) {
- if (!client->contexts.bitmaps[i]) {
+ if (!request->contexts->bitmaps[i]) {
continue;
}
ret = nbd_co_send_bitmap(client, request,
@@ -2804,6 +2807,10 @@ static coroutine_fn int nbd_handle_request(NBDClient
*client,
assert(!contexts_remaining);
return 0;
+ } else if (client->contexts.count) {
+ return nbd_send_generic_reply(client, request, -EINVAL,
+ "CMD_BLOCK_STATUS payload not valid",
+ errp);
} else {
return nbd_send_generic_reply(client, request, -EINVAL,
"CMD_BLOCK_STATUS not negotiated",
@@ -2882,6 +2889,11 @@ static coroutine_fn void nbd_trip(void *opaque)
} else {
ret = nbd_handle_request(client, &request, req->data, &local_err);
}
+ if (request.contexts && request.contexts != &client->contexts) {
+ assert(request.type == NBD_CMD_BLOCK_STATUS);
+ g_free(request.contexts->bitmaps);
+ g_free(request.contexts);
+ }
if (ret < 0) {
error_prepend(&local_err, "Failed to send reply: ");
goto disconnect;
--
2.41.0
- [PATCH v6 03/17] nbd: Add types for extended headers, (continued)
- [PATCH v6 03/17] nbd: Add types for extended headers, Eric Blake, 2023/08/29
- [PATCH v6 07/17] nbd/server: Prepare to receive extended header requests, Eric Blake, 2023/08/29
- [PATCH v6 06/17] nbd/server: Support a request payload, Eric Blake, 2023/08/29
- [PATCH v6 14/17] nbd/client: Request extended headers during negotiation, Eric Blake, 2023/08/29
- [PATCH v6 09/17] nbd/server: Support 64-bit block status, Eric Blake, 2023/08/29
- [PATCH v6 10/17] nbd/server: Enable initial support for extended headers, Eric Blake, 2023/08/29
- [PATCH v6 11/17] nbd/client: Plumb errp through nbd_receive_replies, Eric Blake, 2023/08/29
- [PATCH v6 17/17] nbd/server: Add FLAG_PAYLOAD support to CMD_BLOCK_STATUS, Eric Blake, 2023/08/29
- [PATCH v6 04/17] nbd: Prepare for 64-bit request effect lengths, Eric Blake, 2023/08/29
- [PATCH v6 13/17] nbd/client: Accept 64-bit block status chunks, Eric Blake, 2023/08/29
- [PATCH v6 16/17] nbd/server: Prepare for per-request filtering of BLOCK_STATUS,
Eric Blake <=
- [PATCH v6 15/17] nbd/server: Refactor list of negotiated meta contexts, Eric Blake, 2023/08/29
- [PATCH v6 12/17] nbd/client: Initial support for extended headers, Eric Blake, 2023/08/29
- [PATCH v6 01/17] nbd: Replace bool structured_reply with mode enum, Eric Blake, 2023/08/29