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 <vsement...@virtuozzo.com> Reviewed-by: Eric Blake <ebl...@redhat.com> --- include/block/nbd.h | 2 +- block/nbd.c | 2 +- nbd/client-connection.c | 8 +++++++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/include/block/nbd.h b/include/block/nbd.h index 10c8a0bcca..78d101b774 100644 --- a/include/block/nbd.h +++ b/include/block/nbd.h @@ -420,7 +420,7 @@ void nbd_client_connection_release(NBDClientConnection *conn); QIOChannel *coroutine_fn nbd_co_establish_connection(NBDClientConnection *conn, NBDExportInfo *info, - Error **errp); + bool blocking, Error **errp); void coroutine_fn nbd_co_establish_connection_cancel(NBDClientConnection *conn); diff --git a/block/nbd.c b/block/nbd.c index 8caeafc8d3..bf2e939314 100644 --- a/block/nbd.c +++ b/block/nbd.c @@ -364,7 +364,7 @@ static int coroutine_fn nbd_co_do_establish_connection(BlockDriverState *bs, 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) { return -ECONNREFUSED; } diff --git a/nbd/client-connection.c b/nbd/client-connection.c index 500b8591e8..250d094b4d 100644 --- a/nbd/client-connection.c +++ b/nbd/client-connection.c @@ -265,6 +265,8 @@ void nbd_client_connection_release(NBDClientConnection *conn) * otherwise the thread is not running, so start a thread and wait for * 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. * 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 @@ -273,7 +275,7 @@ void nbd_client_connection_release(NBDClientConnection *conn) */ QIOChannel *coroutine_fn nbd_co_establish_connection(NBDClientConnection *conn, NBDExportInfo *info, - Error **errp) + bool blocking, Error **errp) { QIOChannel *ioc; QemuThread thread; @@ -313,6 +315,10 @@ nbd_co_establish_connection(NBDClientConnection *conn, NBDExportInfo *info, connect_thread_func, conn, QEMU_THREAD_DETACHED); } + if (!blocking) { + return NULL; + } + conn->wait_co = qemu_coroutine_self(); } -- 2.29.2