mirror of
https://github.com/mii443/qemu.git
synced 2025-12-03 11:08:25 +00:00
nbd: Replace bool structured_reply with mode enum
The upcoming patches for 64-bit extensions requires various points in
the protocol to make decisions based on what was negotiated. While we
could easily add a 'bool extended_headers' alongside the existing
'bool structured_reply', this does not scale well if more modes are
added in the future. Better is to expose the mode enum added in the
recent commit bfe04d0a7d out to a wider use in the code base.
Where the code previously checked for structured_reply being set or
clear, it now prefers checking for an inequality; this works because
the nodes are in a continuum of increasing abilities, and allows us to
touch fewer places if we ever insert other modes in the middle of the
enum. There should be no semantic change in this patch.
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-ID: <20230829175826.377251-20-eblake@redhat.com>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
This commit is contained in:
18
nbd/client.c
18
nbd/client.c
@@ -879,7 +879,7 @@ static int nbd_list_meta_contexts(QIOChannel *ioc,
|
||||
*/
|
||||
static int nbd_start_negotiate(QIOChannel *ioc, QCryptoTLSCreds *tlscreds,
|
||||
const char *hostname, QIOChannel **outioc,
|
||||
bool structured_reply, bool *zeroes,
|
||||
NBDMode max_mode, bool *zeroes,
|
||||
Error **errp)
|
||||
{
|
||||
ERRP_GUARD();
|
||||
@@ -953,7 +953,7 @@ static int nbd_start_negotiate(QIOChannel *ioc, QCryptoTLSCreds *tlscreds,
|
||||
if (fixedNewStyle) {
|
||||
int result = 0;
|
||||
|
||||
if (structured_reply) {
|
||||
if (max_mode >= NBD_MODE_STRUCTURED) {
|
||||
result = nbd_request_simple_option(ioc,
|
||||
NBD_OPT_STRUCTURED_REPLY,
|
||||
false, errp);
|
||||
@@ -1022,20 +1022,19 @@ int nbd_receive_negotiate(QIOChannel *ioc, QCryptoTLSCreds *tlscreds,
|
||||
trace_nbd_receive_negotiate_name(info->name);
|
||||
|
||||
result = nbd_start_negotiate(ioc, tlscreds, hostname, outioc,
|
||||
info->structured_reply, &zeroes, errp);
|
||||
info->mode, &zeroes, errp);
|
||||
if (result < 0) {
|
||||
return result;
|
||||
}
|
||||
|
||||
info->structured_reply = false;
|
||||
info->mode = result;
|
||||
info->base_allocation = false;
|
||||
if (tlscreds && *outioc) {
|
||||
ioc = *outioc;
|
||||
}
|
||||
|
||||
switch ((NBDMode)result) {
|
||||
switch (info->mode) {
|
||||
case NBD_MODE_STRUCTURED:
|
||||
info->structured_reply = true;
|
||||
if (base_allocation) {
|
||||
result = nbd_negotiate_simple_meta_context(ioc, info, errp);
|
||||
if (result < 0) {
|
||||
@@ -1144,8 +1143,8 @@ int nbd_receive_export_list(QIOChannel *ioc, QCryptoTLSCreds *tlscreds,
|
||||
QIOChannel *sioc = NULL;
|
||||
|
||||
*info = NULL;
|
||||
result = nbd_start_negotiate(ioc, tlscreds, hostname, &sioc, true,
|
||||
NULL, errp);
|
||||
result = nbd_start_negotiate(ioc, tlscreds, hostname, &sioc,
|
||||
NBD_MODE_STRUCTURED, NULL, errp);
|
||||
if (tlscreds && sioc) {
|
||||
ioc = sioc;
|
||||
}
|
||||
@@ -1176,7 +1175,7 @@ int nbd_receive_export_list(QIOChannel *ioc, QCryptoTLSCreds *tlscreds,
|
||||
memset(&array[count - 1], 0, sizeof(*array));
|
||||
array[count - 1].name = name;
|
||||
array[count - 1].description = desc;
|
||||
array[count - 1].structured_reply = result == NBD_MODE_STRUCTURED;
|
||||
array[count - 1].mode = result;
|
||||
}
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
@@ -1209,6 +1208,7 @@ int nbd_receive_export_list(QIOChannel *ioc, QCryptoTLSCreds *tlscreds,
|
||||
/* Lone export name is implied, but we can parse length and flags */
|
||||
array = g_new0(NBDExportInfo, 1);
|
||||
array->name = g_strdup("");
|
||||
array->mode = NBD_MODE_OLDSTYLE;
|
||||
count = 1;
|
||||
|
||||
if (nbd_negotiate_finish_oldstyle(ioc, array, errp) < 0) {
|
||||
|
||||
Reference in New Issue
Block a user