Skip to content

Commit

Permalink
nbd/client: Pass mode through to nbd_send_request
Browse files Browse the repository at this point in the history
Once the 64-bit headers extension is enabled, the data layout we send
over the wire for a client request depends on the mode negotiated with
the server.  Rather than adding a parameter to nbd_send_request, we
can add a member to struct NBDRequest, since it already does not
reflect on-wire format.  Some callers initialize it directly; many
others rely on a common initialization point during
nbd_co_send_request().  At this point, there is no semantic change.

Signed-off-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
Message-ID: <20230829175826.377251-21-eblake@redhat.com>
  • Loading branch information
ebblake committed Sep 22, 2023
1 parent ac132d0 commit 297365b
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 8 deletions.
5 changes: 3 additions & 2 deletions block/nbd.c
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,7 @@ int coroutine_fn nbd_co_do_establish_connection(BlockDriverState *bs,
* We have connected, but must fail for other reasons.
* Send NBD_CMD_DISC as a courtesy to the server.
*/
NBDRequest request = { .type = NBD_CMD_DISC };
NBDRequest request = { .type = NBD_CMD_DISC, .mode = s->info.mode };

nbd_send_request(s->ioc, &request);

Expand Down Expand Up @@ -520,6 +520,7 @@ nbd_co_send_request(BlockDriverState *bs, NBDRequest *request,

qemu_co_mutex_lock(&s->send_mutex);
request->cookie = INDEX_TO_COOKIE(i);
request->mode = s->info.mode;

assert(s->ioc);

Expand Down Expand Up @@ -1465,7 +1466,7 @@ static void nbd_yank(void *opaque)
static void nbd_client_close(BlockDriverState *bs)
{
BDRVNBDState *s = (BDRVNBDState *)bs->opaque;
NBDRequest request = { .type = NBD_CMD_DISC };
NBDRequest request = { .type = NBD_CMD_DISC, .mode = s->info.mode };

if (s->ioc) {
nbd_send_request(s->ioc, &request);
Expand Down
12 changes: 7 additions & 5 deletions include/block/nbd.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,17 +63,19 @@ typedef enum NBDMode {
/* TODO add NBD_MODE_EXTENDED */
} NBDMode;

/* Transmission phase structs
*
* Note: these are _NOT_ the same as the network representation of an NBD
* request and reply!
/* Transmission phase structs */

/*
* Note: NBDRequest is _NOT_ the same as the network representation of an NBD
* request!
*/
typedef struct NBDRequest {
uint64_t cookie;
uint64_t from;
uint32_t len;
uint16_t flags; /* NBD_CMD_FLAG_* */
uint16_t type; /* NBD_CMD_* */
uint16_t type; /* NBD_CMD_* */
NBDMode mode; /* Determines which network representation to use */
} NBDRequest;

typedef struct NBDSimpleReply {
Expand Down
3 changes: 2 additions & 1 deletion nbd/client.c
Original file line number Diff line number Diff line change
Expand Up @@ -1218,7 +1218,7 @@ int nbd_receive_export_list(QIOChannel *ioc, QCryptoTLSCreds *tlscreds,
/* Send NBD_CMD_DISC as a courtesy to the server, but ignore all
* errors now that we have the information we wanted. */
if (nbd_drop(ioc, 124, NULL) == 0) {
NBDRequest request = { .type = NBD_CMD_DISC };
NBDRequest request = { .type = NBD_CMD_DISC, .mode = result };

nbd_send_request(ioc, &request);
}
Expand Down Expand Up @@ -1348,6 +1348,7 @@ int nbd_send_request(QIOChannel *ioc, NBDRequest *request)
{
uint8_t buf[NBD_REQUEST_SIZE];

assert(request->mode <= NBD_MODE_STRUCTURED); /* TODO handle extended */
trace_nbd_send_request(request->from, request->len, request->cookie,
request->flags, request->type,
nbd_cmd_lookup(request->type));
Expand Down

0 comments on commit 297365b

Please sign in to comment.