From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:42430) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZXWtv-00046C-FO for qemu-devel@nongnu.org; Thu, 03 Sep 2015 11:58:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZXWts-0007UE-76 for qemu-devel@nongnu.org; Thu, 03 Sep 2015 11:58:11 -0400 Received: from mx1.redhat.com ([209.132.183.28]:14568) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZXWtr-0007Tu-Ur for qemu-devel@nongnu.org; Thu, 03 Sep 2015 11:58:08 -0400 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 8D34CA19BA for ; Thu, 3 Sep 2015 15:58:07 +0000 (UTC) From: "Daniel P. Berrange" Date: Thu, 3 Sep 2015 16:39:05 +0100 Message-Id: <1441294768-8712-24-git-send-email-berrange@redhat.com> In-Reply-To: <1441294768-8712-1-git-send-email-berrange@redhat.com> References: <1441294768-8712-1-git-send-email-berrange@redhat.com> Subject: [Qemu-devel] [PATCH FYI 23/46] nbd: convert to use the QAPI SocketAddress object List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Juan Quintela , "Dr. David Alan Gilbert" , Gerd Hoffmann , Amit Shah , Paolo Bonzini The nbd block driver currently uses a QemuOpts objects when setting up sockets. Switch it over to use the QAPI SocketAddress objects instead. Signed-off-by: Daniel P. Berrange --- block/nbd.c | 66 +++++++++++++++++++++++++++++++------------------------------ 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/block/nbd.c b/block/nbd.c index 2176186..f896146 100644 --- a/block/nbd.c +++ b/block/nbd.c @@ -43,7 +43,6 @@ typedef struct BDRVNBDState { NbdClientSession client; - QemuOpts *socket_opts; } BDRVNBDState; static int nbd_parse_uri(const char *filename, QDict *options) @@ -190,10 +189,10 @@ out: g_free(file); } -static void nbd_config(BDRVNBDState *s, QDict *options, char **export, - Error **errp) +static SocketAddress *nbd_config(BDRVNBDState *s, QDict *options, char **export, + Error **errp) { - Error *local_err = NULL; + SocketAddress *saddr; if (qdict_haskey(options, "path") == qdict_haskey(options, "host")) { if (qdict_haskey(options, "path")) { @@ -201,28 +200,34 @@ static void nbd_config(BDRVNBDState *s, QDict *options, char **export, } else { error_setg(errp, "one of path and host must be specified."); } - return; + return NULL; } - s->client.is_unix = qdict_haskey(options, "path"); - s->socket_opts = qemu_opts_create(&socket_optslist, NULL, 0, - &error_abort); + saddr = g_new0(SocketAddress, 1); - qemu_opts_absorb_qdict(s->socket_opts, options, &local_err); - if (local_err) { - error_propagate(errp, local_err); - return; + if (qdict_haskey(options, "path")) { + saddr->kind = SOCKET_ADDRESS_KIND_UNIX; + saddr->q_unix = g_new0(UnixSocketAddress, 1); + saddr->q_unix->path = g_strdup(qdict_get_str(options, "path")); + } else { + saddr->kind = SOCKET_ADDRESS_KIND_INET; + saddr->inet = g_new0(InetSocketAddress, 1); + saddr->inet->host = g_strdup(qdict_get_str(options, "host")); + if (!qdict_get_try_str(options, "port")) { + saddr->inet->port = g_strdup_printf("%d", NBD_DEFAULT_PORT); + } else { + saddr->inet->port = g_strdup(qdict_get_str(options, "port")); + } } - if (!qemu_opt_get(s->socket_opts, "port")) { - qemu_opt_set_number(s->socket_opts, "port", NBD_DEFAULT_PORT, - &error_abort); - } + s->client.is_unix = qdict_haskey(options, "path"); *export = g_strdup(qdict_get_try_str(options, "export")); if (*export) { qdict_del(options, "export"); } + + return saddr; } NbdClientSession *nbd_get_client_session(BlockDriverState *bs) @@ -231,26 +236,24 @@ NbdClientSession *nbd_get_client_session(BlockDriverState *bs) return &s->client; } -static int nbd_establish_connection(BlockDriverState *bs, Error **errp) +static int nbd_establish_connection(BlockDriverState *bs, + SocketAddress *saddr, + Error **errp) { BDRVNBDState *s = bs->opaque; int sock; - if (s->client.is_unix) { - sock = unix_connect_opts(s->socket_opts, errp, NULL, NULL); - } else { - sock = inet_connect_opts(s->socket_opts, errp, NULL, NULL); - if (sock >= 0) { - socket_set_nodelay(sock); - } - } + sock = socket_connect(saddr, errp, NULL, NULL); - /* Failed to establish connection */ if (sock < 0) { logout("Failed to establish connection to NBD server\n"); return -EIO; } + if (!s->client.is_unix) { + socket_set_nodelay(sock); + } + return sock; } @@ -261,10 +264,11 @@ static int nbd_open(BlockDriverState *bs, QDict *options, int flags, char *export = NULL; int result, sock; Error *local_err = NULL; + SocketAddress *saddr; /* Pop the config into our state object. Exit if invalid. */ - nbd_config(s, options, &export, &local_err); - if (local_err) { + saddr = nbd_config(s, options, &export, &local_err); + if (!saddr) { error_propagate(errp, local_err); return -EINVAL; } @@ -272,7 +276,8 @@ static int nbd_open(BlockDriverState *bs, QDict *options, int flags, /* establish TCP connection, return error if it fails * TODO: Configurable retry-until-timeout behaviour. */ - sock = nbd_establish_connection(bs, errp); + sock = nbd_establish_connection(bs, saddr, errp); + qapi_free_SocketAddress(saddr); if (sock < 0) { g_free(export); return sock; @@ -315,9 +320,6 @@ static int nbd_co_discard(BlockDriverState *bs, int64_t sector_num, static void nbd_close(BlockDriverState *bs) { - BDRVNBDState *s = bs->opaque; - - qemu_opts_del(s->socket_opts); nbd_client_close(bs); } -- 2.4.3