aboutsummaryrefslogtreecommitdiff
path: root/nbd
diff options
context:
space:
mode:
authorVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>2021-06-10 13:07:56 +0300
committerEric Blake <eblake@redhat.com>2021-06-18 12:20:53 -0500
commit43cb34dede464c2e9a51ea33bc246b40db5d68d4 (patch)
treeb7615e2527419f62b44a5b705644143a01def90a /nbd
parent95a078ea3e4863c0d516cf19ebcb5130bc760f49 (diff)
nbd/client-connection: return only one io channel
block/nbd doesn't need underlying sioc channel anymore. So, we can update nbd/client-connection interface to return only one top-most io channel, which is more straight forward. Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Reviewed-by: Eric Blake <eblake@redhat.com> Message-Id: <20210610100802.5888-27-vsementsov@virtuozzo.com> [eblake: squash in Vladimir's fixes for uninit usage caught by clang] Signed-off-by: Eric Blake <eblake@redhat.com>
Diffstat (limited to 'nbd')
-rw-r--r--nbd/client-connection.c36
1 files changed, 28 insertions, 8 deletions
diff --git a/nbd/client-connection.c b/nbd/client-connection.c
index 883f9cf158..955edafb7c 100644
--- a/nbd/client-connection.c
+++ b/nbd/client-connection.c
@@ -272,15 +272,14 @@ void nbd_client_connection_release(NBDClientConnection *conn)
* nbd_receive_export_list() would be zero (see description of NBDExportInfo in
* include/block/nbd.h).
*/
-QIOChannelSocket *coroutine_fn
+QIOChannel *coroutine_fn
nbd_co_establish_connection(NBDClientConnection *conn, NBDExportInfo *info,
- QIOChannel **ioc, Error **errp)
+ Error **errp)
{
QemuThread thread;
if (conn->do_negotiation) {
assert(info);
- assert(ioc);
}
WITH_QEMU_LOCK_GUARD(&conn->mutex) {
@@ -294,10 +293,19 @@ nbd_co_establish_connection(NBDClientConnection *conn, NBDExportInfo *info,
if (conn->sioc) {
/* Previous attempt finally succeeded in background */
if (conn->do_negotiation) {
- *ioc = g_steal_pointer(&conn->ioc);
memcpy(info, &conn->updated_info, sizeof(*info));
+ if (conn->ioc) {
+ /* TLS channel now has own reference to parent */
+ object_unref(OBJECT(conn->sioc));
+ conn->sioc = NULL;
+
+ return g_steal_pointer(&conn->ioc);
+ }
}
- return g_steal_pointer(&conn->sioc);
+
+ assert(!conn->ioc);
+
+ return QIO_CHANNEL(g_steal_pointer(&conn->sioc));
}
conn->running = true;
@@ -329,11 +337,23 @@ nbd_co_establish_connection(NBDClientConnection *conn, NBDExportInfo *info,
} else {
error_propagate(errp, conn->err);
conn->err = NULL;
- if (conn->sioc && conn->do_negotiation) {
- *ioc = g_steal_pointer(&conn->ioc);
+ if (!conn->sioc) {
+ return NULL;
+ }
+ if (conn->do_negotiation) {
memcpy(info, &conn->updated_info, sizeof(*info));
+ if (conn->ioc) {
+ /* TLS channel now has own reference to parent */
+ object_unref(OBJECT(conn->sioc));
+ conn->sioc = NULL;
+
+ return g_steal_pointer(&conn->ioc);
+ }
}
- return g_steal_pointer(&conn->sioc);
+
+ assert(!conn->ioc);
+
+ return QIO_CHANNEL(g_steal_pointer(&conn->sioc));
}
}