|
@@ -953,15 +953,23 @@ static int nbd_start_negotiate(QIOChannel *ioc, QCryptoTLSCreds *tlscreds,
|
|
|
if (fixedNewStyle) {
|
|
|
int result = 0;
|
|
|
|
|
|
+ if (max_mode >= NBD_MODE_EXTENDED) {
|
|
|
+ result = nbd_request_simple_option(ioc,
|
|
|
+ NBD_OPT_EXTENDED_HEADERS,
|
|
|
+ false, errp);
|
|
|
+ if (result) {
|
|
|
+ return result < 0 ? -EINVAL : NBD_MODE_EXTENDED;
|
|
|
+ }
|
|
|
+ }
|
|
|
if (max_mode >= NBD_MODE_STRUCTURED) {
|
|
|
result = nbd_request_simple_option(ioc,
|
|
|
NBD_OPT_STRUCTURED_REPLY,
|
|
|
false, errp);
|
|
|
- if (result < 0) {
|
|
|
- return -EINVAL;
|
|
|
+ if (result) {
|
|
|
+ return result < 0 ? -EINVAL : NBD_MODE_STRUCTURED;
|
|
|
}
|
|
|
}
|
|
|
- return result ? NBD_MODE_STRUCTURED : NBD_MODE_SIMPLE;
|
|
|
+ return NBD_MODE_SIMPLE;
|
|
|
} else {
|
|
|
return NBD_MODE_EXPORT_NAME;
|
|
|
}
|
|
@@ -1034,6 +1042,7 @@ int nbd_receive_negotiate(QIOChannel *ioc, QCryptoTLSCreds *tlscreds,
|
|
|
}
|
|
|
|
|
|
switch (info->mode) {
|
|
|
+ case NBD_MODE_EXTENDED:
|
|
|
case NBD_MODE_STRUCTURED:
|
|
|
if (base_allocation) {
|
|
|
result = nbd_negotiate_simple_meta_context(ioc, info, errp);
|
|
@@ -1144,7 +1153,7 @@ int nbd_receive_export_list(QIOChannel *ioc, QCryptoTLSCreds *tlscreds,
|
|
|
|
|
|
*info = NULL;
|
|
|
result = nbd_start_negotiate(ioc, tlscreds, hostname, &sioc,
|
|
|
- NBD_MODE_STRUCTURED, NULL, errp);
|
|
|
+ NBD_MODE_EXTENDED, NULL, errp);
|
|
|
if (tlscreds && sioc) {
|
|
|
ioc = sioc;
|
|
|
}
|
|
@@ -1155,6 +1164,7 @@ int nbd_receive_export_list(QIOChannel *ioc, QCryptoTLSCreds *tlscreds,
|
|
|
switch ((NBDMode)result) {
|
|
|
case NBD_MODE_SIMPLE:
|
|
|
case NBD_MODE_STRUCTURED:
|
|
|
+ case NBD_MODE_EXTENDED:
|
|
|
/* newstyle - use NBD_OPT_LIST to populate array, then try
|
|
|
* NBD_OPT_INFO on each array member. If structured replies
|
|
|
* are enabled, also try NBD_OPT_LIST_META_CONTEXT. */
|
|
@@ -1191,7 +1201,7 @@ int nbd_receive_export_list(QIOChannel *ioc, QCryptoTLSCreds *tlscreds,
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- if (result == NBD_MODE_STRUCTURED &&
|
|
|
+ if (result >= NBD_MODE_STRUCTURED &&
|
|
|
nbd_list_meta_contexts(ioc, &array[i], errp) < 0) {
|
|
|
goto out;
|
|
|
}
|