Skip to content

Commit

Permalink
nbd/client: Request extended headers during negotiation
Browse files Browse the repository at this point in the history
All the pieces are in place for a client to finally request extended
headers.  Note that we must not request extended headers when qemu-nbd
is used to connect to the kernel module (as nbd.ko does not expect
them, but expects us to do the negotiation in userspace before handing
the socket over to the kernel), but there is no harm in all other
clients requesting them.

Extended headers are not essential to the information collected during
'qemu-nbd --list', but probing for it gives us one more piece of
information in that output.  Update the iotests affected by the new
line of output.

Signed-off-by: Eric Blake <[email protected]>
Reviewed-by: Vladimir Sementsov-Ogievskiy <[email protected]>
Message-ID: <[email protected]>
  • Loading branch information
ebblake committed Oct 5, 2023
1 parent a7c1867 commit 56cf9d0
Show file tree
Hide file tree
Showing 8 changed files with 38 additions and 6 deletions.
2 changes: 1 addition & 1 deletion nbd/client-connection.c
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ NBDClientConnection *nbd_client_connection_new(const SocketAddress *saddr,
.do_negotiation = do_negotiation,

.initial_info.request_sizes = true,
.initial_info.mode = NBD_MODE_STRUCTURED,
.initial_info.mode = NBD_MODE_EXTENDED,
.initial_info.base_allocation = true,
.initial_info.x_dirty_bitmap = g_strdup(x_dirty_bitmap),
.initial_info.name = g_strdup(export_name ?: "")
Expand Down
20 changes: 15 additions & 5 deletions nbd/client.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}
Expand All @@ -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. */
Expand Down Expand Up @@ -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;
}
Expand Down
3 changes: 3 additions & 0 deletions qemu-nbd.c
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,9 @@ static int qemu_nbd_client_list(SocketAddress *saddr, QCryptoTLSCreds *tls,
printf(" opt block: %u\n", list[i].opt_block);
printf(" max block: %u\n", list[i].max_block);
}
printf(" transaction size: %s\n",
list[i].mode >= NBD_MODE_EXTENDED ?
"64-bit" : "32-bit");
if (list[i].n_contexts) {
printf(" available meta contexts: %d\n", list[i].n_contexts);
for (j = 0; j < list[i].n_contexts; j++) {
Expand Down
6 changes: 6 additions & 0 deletions tests/qemu-iotests/223.out
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ exports available: 3
min block: 1
opt block: 4096
max block: 33554432
transaction size: 64-bit
available meta contexts: 2
base:allocation
qemu:dirty-bitmap:b
Expand All @@ -97,6 +98,7 @@ exports available: 3
min block: 1
opt block: 4096
max block: 33554432
transaction size: 64-bit
available meta contexts: 2
base:allocation
qemu:dirty-bitmap:b2
Expand All @@ -106,6 +108,7 @@ exports available: 3
min block: 1
opt block: 4096
max block: 33554432
transaction size: 64-bit
available meta contexts: 2
base:allocation
qemu:dirty-bitmap:b3
Expand Down Expand Up @@ -206,6 +209,7 @@ exports available: 3
min block: 1
opt block: 4096
max block: 33554432
transaction size: 64-bit
available meta contexts: 2
base:allocation
qemu:dirty-bitmap:b
Expand All @@ -216,6 +220,7 @@ exports available: 3
min block: 1
opt block: 4096
max block: 33554432
transaction size: 64-bit
available meta contexts: 2
base:allocation
qemu:dirty-bitmap:b2
Expand All @@ -225,6 +230,7 @@ exports available: 3
min block: 1
opt block: 4096
max block: 33554432
transaction size: 64-bit
available meta contexts: 2
base:allocation
qemu:dirty-bitmap:b3
Expand Down
4 changes: 4 additions & 0 deletions tests/qemu-iotests/233.out
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ exports available: 1
export: ''
size: 67108864
min block: 1
transaction size: 64-bit

== check TLS fail over TCP with mismatched hostname ==
qemu-img: Could not open 'driver=nbd,host=localhost,port=PORT,tls-creds=tls0': Certificate does not match the hostname localhost
Expand All @@ -53,6 +54,7 @@ exports available: 1
export: ''
size: 67108864
min block: 1
transaction size: 64-bit

== check TLS with different CA fails ==
qemu-img: Could not open 'driver=nbd,host=127.0.0.1,port=PORT,tls-creds=tls0': The certificate hasn't got a known issuer
Expand Down Expand Up @@ -83,6 +85,7 @@ exports available: 1
export: ''
size: 67108864
min block: 1
transaction size: 64-bit

== check TLS works over UNIX with PSK ==
image: nbd+unix://?socket=SOCK_DIR/qemu-nbd.sock
Expand All @@ -93,6 +96,7 @@ exports available: 1
export: ''
size: 67108864
min block: 1
transaction size: 64-bit

== check TLS fails over UNIX with mismatch PSK ==
qemu-img: Could not open 'driver=nbd,path=SOCK_DIR/qemu-nbd.sock,tls-creds=tls0': TLS handshake failed: The TLS connection was non-properly terminated.
Expand Down
3 changes: 3 additions & 0 deletions tests/qemu-iotests/241.out
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ exports available: 1
export: ''
size: 1024
min block: 1
transaction size: 64-bit
[{ "start": 0, "length": 1000, "depth": 0, "present": true, "zero": false, "data": true, "compressed": false, "offset": OFFSET},
{ "start": 1000, "length": 24, "depth": 0, "present": true, "zero": true, "data": false, "compressed": false, "offset": OFFSET}]
1 KiB (0x400) bytes allocated at offset 0 bytes (0x0)
Expand All @@ -16,6 +17,7 @@ exports available: 1
export: ''
size: 1024
min block: 512
transaction size: 64-bit
[{ "start": 0, "length": 1024, "depth": 0, "present": true, "zero": false, "data": true, "compressed": false, "offset": OFFSET}]
1 KiB (0x400) bytes allocated at offset 0 bytes (0x0)
WARNING: Image format was not specified for 'TEST_DIR/t.raw' and probing guessed raw.
Expand All @@ -28,6 +30,7 @@ exports available: 1
export: ''
size: 1024
min block: 1
transaction size: 64-bit
[{ "start": 0, "length": 1000, "depth": 0, "present": true, "zero": false, "data": true, "compressed": false, "offset": OFFSET},
{ "start": 1000, "length": 24, "depth": 0, "present": true, "zero": true, "data": false, "compressed": false, "offset": OFFSET}]
1 KiB (0x400) bytes allocated at offset 0 bytes (0x0)
Expand Down
5 changes: 5 additions & 0 deletions tests/qemu-iotests/307.out
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ exports available: 1
min block: XXX
opt block: XXX
max block: XXX
transaction size: 64-bit
available meta contexts: 1
base:allocation

Expand Down Expand Up @@ -47,6 +48,7 @@ exports available: 1
min block: XXX
opt block: XXX
max block: XXX
transaction size: 64-bit
available meta contexts: 1
base:allocation

Expand Down Expand Up @@ -78,6 +80,7 @@ exports available: 2
min block: XXX
opt block: XXX
max block: XXX
transaction size: 64-bit
available meta contexts: 1
base:allocation
export: 'export1'
Expand All @@ -87,6 +90,7 @@ exports available: 2
min block: XXX
opt block: XXX
max block: XXX
transaction size: 64-bit
available meta contexts: 1
base:allocation

Expand All @@ -113,6 +117,7 @@ exports available: 1
min block: XXX
opt block: XXX
max block: XXX
transaction size: 64-bit
available meta contexts: 1
base:allocation

Expand Down
1 change: 1 addition & 0 deletions tests/qemu-iotests/tests/nbd-qemu-allocation.out
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ exports available: 1
min block: 1
opt block: 4096
max block: 33554432
transaction size: 64-bit
available meta contexts: 2
base:allocation
qemu:allocation-depth
Expand Down

0 comments on commit 56cf9d0

Please sign in to comment.