connect-thread part is not directly connected to block-layer. Good place for it is nbd/ directory.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsement...@virtuozzo.com> --- include/block/nbd.h | 6 ++++ block/nbd.c | 46 ---------------------------- nbd/client-connect.c | 72 ++++++++++++++++++++++++++++++++++++++++++++ nbd/meson.build | 1 + 4 files changed, 79 insertions(+), 46 deletions(-) create mode 100644 nbd/client-connect.c diff --git a/include/block/nbd.h b/include/block/nbd.h index 5f34d23bb0..660ab4c266 100644 --- a/include/block/nbd.h +++ b/include/block/nbd.h @@ -406,4 +406,10 @@ const char *nbd_info_lookup(uint16_t info); const char *nbd_cmd_lookup(uint16_t info); const char *nbd_err_lookup(int err); + +typedef void (*NBDConnectThreadCallback)(QIOChannelSocket *sioc, int ret, + void *opaque); +void nbd_connect_thread_start(const SocketAddress *saddr, + NBDConnectThreadCallback cb, void *cb_opaque); + #endif diff --git a/block/nbd.c b/block/nbd.c index 4e669d762a..ba281e2d5a 100644 --- a/block/nbd.c +++ b/block/nbd.c @@ -101,15 +101,6 @@ typedef struct NBDConnectCB { AioContext *bh_ctx; /* where to schedule bh (NULL means don't schedule) */ } NBDConnectCB; -typedef void (*NBDConnectThreadCallback)(QIOChannelSocket *sioc, int ret, - void *opaque); - -typedef struct NBDConnectThread { - SocketAddress *saddr; /* address to connect to */ - NBDConnectThreadCallback cb; - void *cb_opaque; -} NBDConnectThread; - typedef struct BDRVNBDState { QIOChannelSocket *sioc; /* The master data channel */ QIOChannel *ioc; /* The current I/O channel which may differ (eg TLS) */ @@ -415,43 +406,6 @@ static void connect_thread_cb(QIOChannelSocket *sioc, int ret, void *opaque) } } -static void *connect_thread_func(void *opaque) -{ - NBDConnectThread *thr = opaque; - int ret; - QIOChannelSocket *sioc = qio_channel_socket_new(); - - ret = qio_channel_socket_connect_sync(sioc, thr->saddr, NULL); - if (ret < 0) { - object_unref(OBJECT(sioc)); - sioc = NULL; - } - - thr->cb(sioc, ret, thr->cb_opaque); - - qapi_free_SocketAddress(thr->saddr); - g_free(thr); - - return NULL; -} - -static void nbd_connect_thread_start(const SocketAddress *saddr, - NBDConnectThreadCallback cb, - void *cb_opaque) -{ - QemuThread thread; - NBDConnectThread *thr = g_new(NBDConnectThread, 1); - - *thr = (NBDConnectThread) { - .saddr = QAPI_CLONE(SocketAddress, saddr), - .cb = cb, - .cb_opaque = cb_opaque, - }; - - qemu_thread_create(&thread, "nbd-connect", - connect_thread_func, thr, QEMU_THREAD_DETACHED); -} - static int coroutine_fn nbd_co_establish_connection(BlockDriverState *bs) { diff --git a/nbd/client-connect.c b/nbd/client-connect.c new file mode 100644 index 0000000000..9f22c41a34 --- /dev/null +++ b/nbd/client-connect.c @@ -0,0 +1,72 @@ +/* + * QEMU Block driver for NBD + * + * Copyright (c) 2020 Virtuozzo International GmbH. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "qemu/osdep.h" + +#include "qapi/qapi-visit-sockets.h" +#include "qapi/clone-visitor.h" + +#include "block/nbd.h" + +typedef struct NBDConnectThread { + SocketAddress *saddr; /* address to connect to */ + NBDConnectThreadCallback cb; + void *cb_opaque; +} NBDConnectThread; + +static void *connect_thread_func(void *opaque) +{ + NBDConnectThread *thr = opaque; + int ret; + QIOChannelSocket *sioc = qio_channel_socket_new(); + + ret = qio_channel_socket_connect_sync(sioc, thr->saddr, NULL); + if (ret < 0) { + object_unref(OBJECT(sioc)); + sioc = NULL; + } + + thr->cb(sioc, ret, thr->cb_opaque); + + qapi_free_SocketAddress(thr->saddr); + g_free(thr); + + return NULL; +} + +void nbd_connect_thread_start(const SocketAddress *saddr, + NBDConnectThreadCallback cb, void *cb_opaque) +{ + QemuThread thread; + NBDConnectThread *thr = g_new(NBDConnectThread, 1); + + *thr = (NBDConnectThread) { + .saddr = QAPI_CLONE(SocketAddress, saddr), + .cb = cb, + .cb_opaque = cb_opaque, + }; + + qemu_thread_create(&thread, "nbd-connect", + connect_thread_func, thr, QEMU_THREAD_DETACHED); +} diff --git a/nbd/meson.build b/nbd/meson.build index 2baaa36948..da8c65ae59 100644 --- a/nbd/meson.build +++ b/nbd/meson.build @@ -1,5 +1,6 @@ block_ss.add(files( 'client.c', + 'client-connect.c', 'common.c', )) blockdev_ss.add(files( -- 2.29.2