diff options
author | Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> | 2021-06-10 13:07:56 +0300 |
---|---|---|
committer | Eric Blake <eblake@redhat.com> | 2021-06-18 12:20:53 -0500 |
commit | 43cb34dede464c2e9a51ea33bc246b40db5d68d4 (patch) | |
tree | b7615e2527419f62b44a5b705644143a01def90a /nbd | |
parent | 95a078ea3e4863c0d516cf19ebcb5130bc760f49 (diff) | |
download | qemu-43cb34dede464c2e9a51ea33bc246b40db5d68d4.zip qemu-43cb34dede464c2e9a51ea33bc246b40db5d68d4.tar.gz qemu-43cb34dede464c2e9a51ea33bc246b40db5d68d4.tar.bz2 |
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.c | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/nbd/client-connection.c b/nbd/client-connection.c index 883f9cf..955edaf 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)); } } |