From nobody Mon Feb 9 00:02:12 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1490896275567332.3896631121421; Thu, 30 Mar 2017 10:51:15 -0700 (PDT) Received: from localhost ([::1]:36995 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cteE6-00026f-Ev for importer@patchew.org; Thu, 30 Mar 2017 13:51:14 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35478) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cte6a-0004Se-8u for qemu-devel@nongnu.org; Thu, 30 Mar 2017 13:43:29 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cte6Y-00032I-QJ for qemu-devel@nongnu.org; Thu, 30 Mar 2017 13:43:28 -0400 Received: from mx1.redhat.com ([209.132.183.28]:32980) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cte6U-0002vP-IU; Thu, 30 Mar 2017 13:43:22 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7B3B63DBD8; Thu, 30 Mar 2017 17:43:21 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-26.ams2.redhat.com [10.36.116.26]) by smtp.corp.redhat.com (Postfix) with ESMTPS id B300B5C3FA; Thu, 30 Mar 2017 17:43:20 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 61E141138606; Thu, 30 Mar 2017 19:43:17 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 7B3B63DBD8 Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=armbru@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 7B3B63DBD8 From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 30 Mar 2017 19:43:16 +0200 Message-Id: <1490895797-29094-9-git-send-email-armbru@redhat.com> In-Reply-To: <1490895797-29094-1-git-send-email-armbru@redhat.com> References: <1490895797-29094-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Thu, 30 Mar 2017 17:43:21 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v3 for-2.9 8/9] nbd: Tidy up blockdev-add interface X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, qemu-block@nongnu.org, mitake.hitoshi@lab.ntt.co.jp, jcody@redhat.com, mreitz@redhat.com, pbonzini@redhat.com, namei.unix@gmail.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" SocketAddress is a simple union, and simple unions are awkward: they have their variant members wrapped in a "data" object on the wire, and require additional indirections in C. I intend to limit its use to existing external interfaces, and convert all internal interfaces to SocketAddressFlat. BlockdevOptionsNbd is an external interface using SocketAddress. We already use SocketAddressFlat elsewhere in blockdev=3Dadd. Replace it by SocketAddressFlat while we can (it's new in 2.9) for simplicity and consistency. For example, { "execute": "blockdev-add", "arguments": { "node-name": "foo", "driver": "nbd", "server": { "type": "inet", "data": { "host": "localhost", "port": "12345" } } } } becomes { "execute": "blockdev-add", "arguments": { "node-name": "foo", "driver": "nbd", "server": { "type": "inet", "host": "localhost", "port": "12345" } } } Since the internal interfaces still take SocketAddress, this requires conversion function socket_address_crumple(). It'll go away when I update the interfaces. Unfortunately, SocketAddress is also visible in -drive since 2.8: -drive if=3Dnone,driver=3Dnbd,server.type=3Dinet,server.data.host=3D127= .0.0.1,server.data.port=3D12345 Nobody should be using it, as it's fairly new and has never been documented, so adding still more compatibility gunk to keep it working isn't worth the trouble. You now have to use -drive if=3Dnone,driver=3Dnbd,server.type=3Dinet,server.host=3D127.0.0.= 1,server.port=3D12345 Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake Reviewed-by: Max Reitz --- block/nbd.c | 53 +++++++++++++++++++++++++++---------------------= ---- qapi/block-core.json | 2 +- 2 files changed, 29 insertions(+), 26 deletions(-) diff --git a/block/nbd.c b/block/nbd.c index 11e3ba7..8bb29a9 100644 --- a/block/nbd.c +++ b/block/nbd.c @@ -47,7 +47,7 @@ typedef struct BDRVNBDState { NBDClientSession client; =20 /* For nbd_refresh_filename() */ - SocketAddress *saddr; + SocketAddressFlat *saddr; char *export, *tlscredsid; } BDRVNBDState; =20 @@ -95,7 +95,7 @@ static int nbd_parse_uri(const char *filename, QDict *opt= ions) goto out; } qdict_put(options, "server.type", qstring_from_str("unix")); - qdict_put(options, "server.data.path", + qdict_put(options, "server.path", qstring_from_str(qp->p[0].value)); } else { QString *host; @@ -116,10 +116,10 @@ static int nbd_parse_uri(const char *filename, QDict = *options) } =20 qdict_put(options, "server.type", qstring_from_str("inet")); - qdict_put(options, "server.data.host", host); + qdict_put(options, "server.host", host); =20 port_str =3D g_strdup_printf("%d", uri->port ?: NBD_DEFAULT_PORT); - qdict_put(options, "server.data.port", qstring_from_str(port_str)); + qdict_put(options, "server.port", qstring_from_str(port_str)); g_free(port_str); } =20 @@ -197,7 +197,7 @@ static void nbd_parse_filename(const char *filename, QD= ict *options, /* are we a UNIX or TCP socket? */ if (strstart(host_spec, "unix:", &unixpath)) { qdict_put(options, "server.type", qstring_from_str("unix")); - qdict_put(options, "server.data.path", qstring_from_str(unixpath)); + qdict_put(options, "server.path", qstring_from_str(unixpath)); } else { InetSocketAddress *addr =3D NULL; =20 @@ -207,8 +207,8 @@ static void nbd_parse_filename(const char *filename, QD= ict *options, } =20 qdict_put(options, "server.type", qstring_from_str("inet")); - qdict_put(options, "server.data.host", qstring_from_str(addr->host= )); - qdict_put(options, "server.data.port", qstring_from_str(addr->port= )); + qdict_put(options, "server.host", qstring_from_str(addr->host)); + qdict_put(options, "server.port", qstring_from_str(addr->port)); qapi_free_InetSocketAddress(addr); } =20 @@ -248,20 +248,21 @@ static bool nbd_process_legacy_socket_options(QDict *= output_options, } =20 qdict_put(output_options, "server.type", qstring_from_str("unix")); - qdict_put(output_options, "server.data.path", qstring_from_str(pat= h)); + qdict_put(output_options, "server.path", qstring_from_str(path)); } else if (host) { qdict_put(output_options, "server.type", qstring_from_str("inet")); - qdict_put(output_options, "server.data.host", qstring_from_str(hos= t)); - qdict_put(output_options, "server.data.port", + qdict_put(output_options, "server.host", qstring_from_str(host)); + qdict_put(output_options, "server.port", qstring_from_str(port ?: stringify(NBD_DEFAULT_PORT))); } =20 return true; } =20 -static SocketAddress *nbd_config(BDRVNBDState *s, QDict *options, Error **= errp) +static SocketAddressFlat *nbd_config(BDRVNBDState *s, QDict *options, + Error **errp) { - SocketAddress *saddr =3D NULL; + SocketAddressFlat *saddr =3D NULL; QDict *addr =3D NULL; QObject *crumpled_addr =3D NULL; Visitor *iv =3D NULL; @@ -287,7 +288,7 @@ static SocketAddress *nbd_config(BDRVNBDState *s, QDict= *options, Error **errp) * visitor expects the former. */ iv =3D qobject_input_visitor_new(crumpled_addr); - visit_type_SocketAddress(iv, NULL, &saddr, &local_err); + visit_type_SocketAddressFlat(iv, NULL, &saddr, &local_err); if (local_err) { error_propagate(errp, local_err); goto done; @@ -306,9 +307,10 @@ NBDClientSession *nbd_get_client_session(BlockDriverSt= ate *bs) return &s->client; } =20 -static QIOChannelSocket *nbd_establish_connection(SocketAddress *saddr, +static QIOChannelSocket *nbd_establish_connection(SocketAddressFlat *saddr= _flat, Error **errp) { + SocketAddress *saddr =3D socket_address_crumple(saddr_flat); QIOChannelSocket *sioc; Error *local_err =3D NULL; =20 @@ -318,6 +320,7 @@ static QIOChannelSocket *nbd_establish_connection(Socke= tAddress *saddr, qio_channel_socket_connect_sync(sioc, saddr, &local_err); + qapi_free_SocketAddress(saddr); if (local_err) { error_propagate(errp, local_err); return NULL; @@ -409,7 +412,7 @@ static int nbd_open(BlockDriverState *bs, QDict *option= s, int flags, goto error; } =20 - /* Translate @host, @port, and @path to a SocketAddress */ + /* Translate @host, @port, and @path to a SocketAddressFlat */ if (!nbd_process_legacy_socket_options(options, opts, errp)) { goto error; } @@ -430,11 +433,11 @@ static int nbd_open(BlockDriverState *bs, QDict *opti= ons, int flags, } =20 /* TODO SOCKET_ADDRESS_KIND_FD where fd has AF_INET or AF_INET6 */ - if (s->saddr->type !=3D SOCKET_ADDRESS_KIND_INET) { + if (s->saddr->type !=3D SOCKET_ADDRESS_FLAT_TYPE_INET) { error_setg(errp, "TLS only supported over IP sockets"); goto error; } - hostname =3D s->saddr->u.inet.data->host; + hostname =3D s->saddr->u.inet.host; } =20 /* establish TCP connection, return error if it fails @@ -457,7 +460,7 @@ static int nbd_open(BlockDriverState *bs, QDict *option= s, int flags, object_unref(OBJECT(tlscreds)); } if (ret < 0) { - qapi_free_SocketAddress(s->saddr); + qapi_free_SocketAddressFlat(s->saddr); g_free(s->export); g_free(s->tlscredsid); } @@ -483,7 +486,7 @@ static void nbd_close(BlockDriverState *bs) =20 nbd_client_close(bs); =20 - qapi_free_SocketAddress(s->saddr); + qapi_free_SocketAddressFlat(s->saddr); g_free(s->export); g_free(s->tlscredsid); } @@ -514,15 +517,15 @@ static void nbd_refresh_filename(BlockDriverState *bs= , QDict *options) Visitor *ov; const char *host =3D NULL, *port =3D NULL, *path =3D NULL; =20 - if (s->saddr->type =3D=3D SOCKET_ADDRESS_KIND_INET) { - const InetSocketAddress *inet =3D s->saddr->u.inet.data; + if (s->saddr->type =3D=3D SOCKET_ADDRESS_FLAT_TYPE_INET) { + const InetSocketAddress *inet =3D &s->saddr->u.inet; if (!inet->has_ipv4 && !inet->has_ipv6 && !inet->has_to) { host =3D inet->host; port =3D inet->port; } - } else if (s->saddr->type =3D=3D SOCKET_ADDRESS_KIND_UNIX) { - path =3D s->saddr->u.q_unix.data->path; - } + } else if (s->saddr->type =3D=3D SOCKET_ADDRESS_FLAT_TYPE_UNIX) { + path =3D s->saddr->u.q_unix.path; + } /* else can't represent as pseudo-filename */ =20 qdict_put(opts, "driver", qstring_from_str("nbd")); =20 @@ -541,7 +544,7 @@ static void nbd_refresh_filename(BlockDriverState *bs, = QDict *options) } =20 ov =3D qobject_output_visitor_new(&saddr_qdict); - visit_type_SocketAddress(ov, NULL, &s->saddr, &error_abort); + visit_type_SocketAddressFlat(ov, NULL, &s->saddr, &error_abort); visit_complete(ov, &saddr_qdict); visit_free(ov); qdict_put_obj(opts, "server", saddr_qdict); diff --git a/qapi/block-core.json b/qapi/block-core.json index 4e8e4e3..8d87962 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -2762,7 +2762,7 @@ # Since: 2.9 ## { 'struct': 'BlockdevOptionsNbd', - 'data': { 'server': 'SocketAddress', + 'data': { 'server': 'SocketAddressFlat', '*export': 'str', '*tls-creds': 'str' } } =20 --=20 2.7.4