nbd/client-connection: add option for non-blocking connection attempt

We'll need a possibility of non-blocking nbd_co_establish_connection(),
so that it returns immediately, and it returns success only if a
connections was previously established in background.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Message-Id: <20210610100802.5888-30-vsementsov@virtuozzo.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
Vladimir Sementsov-Ogievskiy 2021-06-10 13:07:59 +03:00 committed by Eric Blake
parent 51edbf537d
commit 97cf89259e
3 changed files with 9 additions and 3 deletions

View File

@ -364,7 +364,7 @@ static int coroutine_fn nbd_co_do_establish_connection(BlockDriverState *bs,
assert(!s->ioc); assert(!s->ioc);
s->ioc = nbd_co_establish_connection(s->conn, &s->info, errp); s->ioc = nbd_co_establish_connection(s->conn, &s->info, true, errp);
if (!s->ioc) { if (!s->ioc) {
return -ECONNREFUSED; return -ECONNREFUSED;
} }

View File

@ -420,7 +420,7 @@ void nbd_client_connection_release(NBDClientConnection *conn);
QIOChannel *coroutine_fn QIOChannel *coroutine_fn
nbd_co_establish_connection(NBDClientConnection *conn, NBDExportInfo *info, nbd_co_establish_connection(NBDClientConnection *conn, NBDExportInfo *info,
Error **errp); bool blocking, Error **errp);
void coroutine_fn nbd_co_establish_connection_cancel(NBDClientConnection *conn); void coroutine_fn nbd_co_establish_connection_cancel(NBDClientConnection *conn);

View File

@ -266,6 +266,8 @@ void nbd_client_connection_release(NBDClientConnection *conn)
* otherwise the thread is not running, so start a thread and wait for * otherwise the thread is not running, so start a thread and wait for
* completion * completion
* *
* If @blocking is false, don't wait for the thread, return immediately.
*
* If @info is not NULL, also do nbd-negotiation after successful connection. * If @info is not NULL, also do nbd-negotiation after successful connection.
* In this case info is used only as out parameter, and is fully initialized by * In this case info is used only as out parameter, and is fully initialized by
* nbd_co_establish_connection(). "IN" fields of info as well as related only to * nbd_co_establish_connection(). "IN" fields of info as well as related only to
@ -274,7 +276,7 @@ void nbd_client_connection_release(NBDClientConnection *conn)
*/ */
QIOChannel *coroutine_fn QIOChannel *coroutine_fn
nbd_co_establish_connection(NBDClientConnection *conn, NBDExportInfo *info, nbd_co_establish_connection(NBDClientConnection *conn, NBDExportInfo *info,
Error **errp) bool blocking, Error **errp)
{ {
QemuThread thread; QemuThread thread;
@ -315,6 +317,10 @@ nbd_co_establish_connection(NBDClientConnection *conn, NBDExportInfo *info,
connect_thread_func, conn, QEMU_THREAD_DETACHED); connect_thread_func, conn, QEMU_THREAD_DETACHED);
} }
if (!blocking) {
return NULL;
}
conn->wait_co = qemu_coroutine_self(); conn->wait_co = qemu_coroutine_self();
} }