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>
This commit is contained in:
parent
95a078ea3e
commit
43cb34dede
13
block/nbd.c
13
block/nbd.c
|
@ -360,7 +360,6 @@ static coroutine_fn void nbd_reconnect_attempt(BDRVNBDState *s)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
AioContext *aio_context = bdrv_get_aio_context(s->bs);
|
AioContext *aio_context = bdrv_get_aio_context(s->bs);
|
||||||
QIOChannelSocket *sioc;
|
|
||||||
|
|
||||||
if (!nbd_client_connecting(s)) {
|
if (!nbd_client_connecting(s)) {
|
||||||
return;
|
return;
|
||||||
|
@ -399,20 +398,12 @@ static coroutine_fn void nbd_reconnect_attempt(BDRVNBDState *s)
|
||||||
s->ioc = NULL;
|
s->ioc = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
sioc = nbd_co_establish_connection(s->conn, &s->info, &s->ioc, NULL);
|
s->ioc = nbd_co_establish_connection(s->conn, &s->info, NULL);
|
||||||
if (!sioc) {
|
if (!s->ioc) {
|
||||||
ret = -ECONNREFUSED;
|
ret = -ECONNREFUSED;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->ioc) {
|
|
||||||
/* sioc is referenced by s->ioc */
|
|
||||||
object_unref(OBJECT(sioc));
|
|
||||||
} else {
|
|
||||||
s->ioc = QIO_CHANNEL(sioc);
|
|
||||||
}
|
|
||||||
sioc = NULL;
|
|
||||||
|
|
||||||
qio_channel_set_blocking(QIO_CHANNEL(s->ioc), false, NULL);
|
qio_channel_set_blocking(QIO_CHANNEL(s->ioc), false, NULL);
|
||||||
qio_channel_attach_aio_context(QIO_CHANNEL(s->ioc), aio_context);
|
qio_channel_attach_aio_context(QIO_CHANNEL(s->ioc), aio_context);
|
||||||
|
|
||||||
|
|
|
@ -418,9 +418,9 @@ NBDClientConnection *nbd_client_connection_new(const SocketAddress *saddr,
|
||||||
QCryptoTLSCreds *tlscreds);
|
QCryptoTLSCreds *tlscreds);
|
||||||
void nbd_client_connection_release(NBDClientConnection *conn);
|
void nbd_client_connection_release(NBDClientConnection *conn);
|
||||||
|
|
||||||
QIOChannelSocket *coroutine_fn
|
QIOChannel *coroutine_fn
|
||||||
nbd_co_establish_connection(NBDClientConnection *conn, NBDExportInfo *info,
|
nbd_co_establish_connection(NBDClientConnection *conn, NBDExportInfo *info,
|
||||||
QIOChannel **ioc, Error **errp);
|
Error **errp);
|
||||||
|
|
||||||
void coroutine_fn nbd_co_establish_connection_cancel(NBDClientConnection *conn);
|
void coroutine_fn nbd_co_establish_connection_cancel(NBDClientConnection *conn);
|
||||||
|
|
||||||
|
|
|
@ -272,15 +272,14 @@ void nbd_client_connection_release(NBDClientConnection *conn)
|
||||||
* nbd_receive_export_list() would be zero (see description of NBDExportInfo in
|
* nbd_receive_export_list() would be zero (see description of NBDExportInfo in
|
||||||
* include/block/nbd.h).
|
* include/block/nbd.h).
|
||||||
*/
|
*/
|
||||||
QIOChannelSocket *coroutine_fn
|
QIOChannel *coroutine_fn
|
||||||
nbd_co_establish_connection(NBDClientConnection *conn, NBDExportInfo *info,
|
nbd_co_establish_connection(NBDClientConnection *conn, NBDExportInfo *info,
|
||||||
QIOChannel **ioc, Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
QemuThread thread;
|
QemuThread thread;
|
||||||
|
|
||||||
if (conn->do_negotiation) {
|
if (conn->do_negotiation) {
|
||||||
assert(info);
|
assert(info);
|
||||||
assert(ioc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
WITH_QEMU_LOCK_GUARD(&conn->mutex) {
|
WITH_QEMU_LOCK_GUARD(&conn->mutex) {
|
||||||
|
@ -294,10 +293,19 @@ nbd_co_establish_connection(NBDClientConnection *conn, NBDExportInfo *info,
|
||||||
if (conn->sioc) {
|
if (conn->sioc) {
|
||||||
/* Previous attempt finally succeeded in background */
|
/* Previous attempt finally succeeded in background */
|
||||||
if (conn->do_negotiation) {
|
if (conn->do_negotiation) {
|
||||||
*ioc = g_steal_pointer(&conn->ioc);
|
|
||||||
memcpy(info, &conn->updated_info, sizeof(*info));
|
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;
|
conn->running = true;
|
||||||
|
@ -329,11 +337,23 @@ nbd_co_establish_connection(NBDClientConnection *conn, NBDExportInfo *info,
|
||||||
} else {
|
} else {
|
||||||
error_propagate(errp, conn->err);
|
error_propagate(errp, conn->err);
|
||||||
conn->err = NULL;
|
conn->err = NULL;
|
||||||
if (conn->sioc && conn->do_negotiation) {
|
if (!conn->sioc) {
|
||||||
*ioc = g_steal_pointer(&conn->ioc);
|
return NULL;
|
||||||
memcpy(info, &conn->updated_info, sizeof(*info));
|
|
||||||
}
|
}
|
||||||
return g_steal_pointer(&conn->sioc);
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(!conn->ioc);
|
||||||
|
|
||||||
|
return QIO_CHANNEL(g_steal_pointer(&conn->sioc));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue