@@ -421,7 +421,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);
@@ -368,7 +368,7 @@ static int nbd_co_do_establish_connection(BlockDriverState *bs, Error **errp)
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;
}
@@ -251,6 +251,8 @@ void nbd_client_connection_release(NBDClientConnection *conn)
* result, just return it now
* otherwise if thread is not running, 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
@@ -259,7 +261,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;
@@ -299,6 +301,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();
}
We'll need a possibility of non-blocking nbd_co_establish_connection(), so that it returns immediately, and it returns success only if connections was previously established in background. Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> --- include/block/nbd.h | 2 +- block/nbd.c | 2 +- nbd/client-connection.c | 8 +++++++- 3 files changed, 9 insertions(+), 3 deletions(-)