nbd/server: Prepare to send extended header replies
Although extended mode is not yet enabled, once we do turn it on, we need to reply with extended headers to all messages. Update the low level entry points necessary so that all other callers automatically get the right header based on the current mode. Signed-off-by: Eric Blake <eblake@redhat.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> Message-ID: <20230925192229.3186470-17-eblake@redhat.com>
This commit is contained in:
parent
c8720ca03e
commit
11d3355fc8
30
nbd/server.c
30
nbd/server.c
@ -1938,8 +1938,6 @@ static inline void set_be_chunk(NBDClient *client, struct iovec *iov,
|
||||
size_t niov, uint16_t flags, uint16_t type,
|
||||
NBDRequest *request)
|
||||
{
|
||||
/* TODO - handle structured vs. extended replies */
|
||||
NBDStructuredReplyChunk *chunk = iov->iov_base;
|
||||
size_t i, length = 0;
|
||||
|
||||
for (i = 1; i < niov; i++) {
|
||||
@ -1947,12 +1945,26 @@ static inline void set_be_chunk(NBDClient *client, struct iovec *iov,
|
||||
}
|
||||
assert(length <= NBD_MAX_BUFFER_SIZE + sizeof(NBDStructuredReadData));
|
||||
|
||||
iov[0].iov_len = sizeof(*chunk);
|
||||
stl_be_p(&chunk->magic, NBD_STRUCTURED_REPLY_MAGIC);
|
||||
stw_be_p(&chunk->flags, flags);
|
||||
stw_be_p(&chunk->type, type);
|
||||
stq_be_p(&chunk->cookie, request->cookie);
|
||||
stl_be_p(&chunk->length, length);
|
||||
if (client->mode >= NBD_MODE_EXTENDED) {
|
||||
NBDExtendedReplyChunk *chunk = iov->iov_base;
|
||||
|
||||
iov[0].iov_len = sizeof(*chunk);
|
||||
stl_be_p(&chunk->magic, NBD_EXTENDED_REPLY_MAGIC);
|
||||
stw_be_p(&chunk->flags, flags);
|
||||
stw_be_p(&chunk->type, type);
|
||||
stq_be_p(&chunk->cookie, request->cookie);
|
||||
stq_be_p(&chunk->offset, request->from);
|
||||
stq_be_p(&chunk->length, length);
|
||||
} else {
|
||||
NBDStructuredReplyChunk *chunk = iov->iov_base;
|
||||
|
||||
iov[0].iov_len = sizeof(*chunk);
|
||||
stl_be_p(&chunk->magic, NBD_STRUCTURED_REPLY_MAGIC);
|
||||
stw_be_p(&chunk->flags, flags);
|
||||
stw_be_p(&chunk->type, type);
|
||||
stq_be_p(&chunk->cookie, request->cookie);
|
||||
stl_be_p(&chunk->length, length);
|
||||
}
|
||||
}
|
||||
|
||||
static int coroutine_fn nbd_co_send_chunk_done(NBDClient *client,
|
||||
@ -2512,6 +2524,8 @@ static coroutine_fn int nbd_send_generic_reply(NBDClient *client,
|
||||
{
|
||||
if (client->mode >= NBD_MODE_STRUCTURED && ret < 0) {
|
||||
return nbd_co_send_chunk_error(client, request, -ret, error_msg, errp);
|
||||
} else if (client->mode >= NBD_MODE_EXTENDED) {
|
||||
return nbd_co_send_chunk_done(client, request, errp);
|
||||
} else {
|
||||
return nbd_co_send_simple_reply(client, request, ret < 0 ? -ret : 0,
|
||||
NULL, 0, errp);
|
||||
|
Loading…
Reference in New Issue
Block a user