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:
parent
51edbf537d
commit
97cf89259e
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user