From nobody Wed May 1 10:09:24 2024 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 1490880076122278.669712287891; Thu, 30 Mar 2017 06:21:16 -0700 (PDT) Received: from localhost ([::1]:35609 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cta0o-00075d-JD for importer@patchew.org; Thu, 30 Mar 2017 09:21:14 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58819) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ctZvE-0002mJ-As for qemu-devel@nongnu.org; Thu, 30 Mar 2017 09:15:29 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ctZvD-0002dj-9a for qemu-devel@nongnu.org; Thu, 30 Mar 2017 09:15:28 -0400 Received: from mx1.redhat.com ([209.132.183.28]:49436) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ctZv2-0002NX-Sv; Thu, 30 Mar 2017 09:15:17 -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 8D0BDC05AA6F; Thu, 30 Mar 2017 13:15:15 +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 5102671D4A; Thu, 30 Mar 2017 13:15:09 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id B8C3C1138648; Thu, 30 Mar 2017 15:15:07 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 8D0BDC05AA6F Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=armbru@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 8D0BDC05AA6F From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 30 Mar 2017 15:14:58 +0200 Message-Id: <1490879707-6060-2-git-send-email-armbru@redhat.com> In-Reply-To: <1490879707-6060-1-git-send-email-armbru@redhat.com> References: <1490879707-6060-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.32]); Thu, 30 Mar 2017 13:15:16 +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] [RFC v2 for-2.9 01/10] nbd sockets vnc: Mark problematic address family tests TODO 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, Gerd Hoffmann , 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" Certain features make sense only with certain address families. For instance, passing file descriptors requires AF_UNIX. Testing SocketAddress's saddr->type =3D=3D SOCKET_ADDRESS_KIND_UNIX is obvious, but problematic: it can't recognize AF_UNIX when type =3D=3D SOCKET_ADDRESS_KIND_FD. Mark such tests of saddr->type TODO. We may want to check the address family with getsockname() there. Cc: Paolo Bonzini Cc: Gerd Hoffmann Cc: Daniel P. Berrange Signed-off-by: Markus Armbruster Reviewed-by: Max Reitz Reviewed-by: Eric Blake Tested-by: Kashyap Chamarthy --- block/nbd.c | 1 + blockdev-nbd.c | 1 + chardev/char-socket.c | 5 ++--- ui/vnc.c | 1 + util/qemu-sockets.c | 4 ++++ 5 files changed, 9 insertions(+), 3 deletions(-) diff --git a/block/nbd.c b/block/nbd.c index 1b832c2..36ea617 100644 --- a/block/nbd.c +++ b/block/nbd.c @@ -421,6 +421,7 @@ static int nbd_open(BlockDriverState *bs, QDict *option= s, int flags, goto error; } =20 + /* TODO SOCKET_ADDRESS_KIND_FD where fd has AF_INET or AF_INET6 */ if (s->saddr->type !=3D SOCKET_ADDRESS_KIND_INET) { error_setg(errp, "TLS only supported over IP sockets"); goto error; diff --git a/blockdev-nbd.c b/blockdev-nbd.c index 7ea836b..8a11807 100644 --- a/blockdev-nbd.c +++ b/blockdev-nbd.c @@ -124,6 +124,7 @@ void qmp_nbd_server_start(SocketAddress *addr, goto error; } =20 + /* TODO SOCKET_ADDRESS_KIND_FD where fd has AF_INET or AF_INET6 */ if (addr->type !=3D SOCKET_ADDRESS_KIND_INET) { error_setg(errp, "TLS is only supported with IPv4/IPv6"); goto error; diff --git a/chardev/char-socket.c b/chardev/char-socket.c index d7e92e1..6344b07 100644 --- a/chardev/char-socket.c +++ b/chardev/char-socket.c @@ -47,7 +47,6 @@ typedef struct { int max_size; int do_telnetopt; int do_nodelay; - int is_unix; int *read_msgfds; size_t read_msgfds_num; int *write_msgfds; @@ -825,7 +824,6 @@ static void qmp_chardev_open_socket(Chardev *chr, int64_t reconnect =3D sock->has_reconnect ? sock->reconnect : 0; QIOChannelSocket *sioc =3D NULL; =20 - s->is_unix =3D addr->type =3D=3D SOCKET_ADDRESS_KIND_UNIX; s->is_listen =3D is_listen; s->is_telnet =3D is_telnet; s->do_nodelay =3D do_nodelay; @@ -865,7 +863,8 @@ static void qmp_chardev_open_socket(Chardev *chr, s->addr =3D QAPI_CLONE(SocketAddress, sock->addr); =20 qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_RECONNECTABLE); - if (s->is_unix) { + /* TODO SOCKET_ADDRESS_FD where fd has AF_UNIX */ + if (addr->type =3D=3D SOCKET_ADDRESS_KIND_UNIX) { qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_FD_PASS); } =20 diff --git a/ui/vnc.c b/ui/vnc.c index 821acdd..fe0a46a 100644 --- a/ui/vnc.c +++ b/ui/vnc.c @@ -3642,6 +3642,7 @@ static int vnc_display_connect(VncDisplay *vd, error_setg(errp, "Expected a single address in reverse mode"); return -1; } + /* TODO SOCKET_ADDRESS_KIND_FD when fd has AF_UNIX */ vd->is_unix =3D saddr[0]->type =3D=3D SOCKET_ADDRESS_KIND_UNIX; sioc =3D qio_channel_socket_new(); qio_channel_set_name(QIO_CHANNEL(sioc), "vnc-reverse"); diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c index 40164bf..9b73681 100644 --- a/util/qemu-sockets.c +++ b/util/qemu-sockets.c @@ -1154,6 +1154,10 @@ int socket_dgram(SocketAddress *remote, SocketAddres= s *local, Error **errp) { int fd; =20 + /* + * TODO SOCKET_ADDRESS_KIND_FD when fd is AF_INET or AF_INET6 + * (although other address families can do SOCK_DGRAM, too) + */ switch (remote->type) { case SOCKET_ADDRESS_KIND_INET: fd =3D inet_dgram_saddr(remote->u.inet.data, --=20 2.7.4 From nobody Wed May 1 10:09:24 2024 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 1490880198041636.906352055315; Thu, 30 Mar 2017 06:23:18 -0700 (PDT) Received: from localhost ([::1]:35618 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cta2m-0000PO-Gr for importer@patchew.org; Thu, 30 Mar 2017 09:23:16 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58798) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ctZvD-0002jc-5X for qemu-devel@nongnu.org; Thu, 30 Mar 2017 09:15:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ctZvA-0002aJ-09 for qemu-devel@nongnu.org; Thu, 30 Mar 2017 09:15:27 -0400 Received: from mx1.redhat.com ([209.132.183.28]:48398) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ctZv4-0002RS-Vz; Thu, 30 Mar 2017 09:15:19 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E5909C050919; Thu, 30 Mar 2017 13:15:17 +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 539CA18E27; Thu, 30 Mar 2017 13:15:09 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id BD2D5113864C; Thu, 30 Mar 2017 15:15:07 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com E5909C050919 Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=armbru@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com E5909C050919 From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 30 Mar 2017 15:14:59 +0200 Message-Id: <1490879707-6060-3-git-send-email-armbru@redhat.com> In-Reply-To: <1490879707-6060-1-git-send-email-armbru@redhat.com> References: <1490879707-6060-1-git-send-email-armbru@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Thu, 30 Mar 2017 13:15:18 +0000 (UTC) Content-Transfer-Encoding: quoted-printable 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] [RFC v2 for-2.9 02/10] char: Fix socket with "type": "vsock" address 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, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Stefan Hajnoczi , 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-Type: text/plain; charset="utf-8" Watch this: $ qemu-system-x86_64 -nodefaults -S -display none -qmp stdio {"QMP": {"version": {"qemu": {"micro": 91, "minor": 8, "major": 2}, "pa= ckage": " (v2.8.0-1195-gf84141e-dirty)"}, "capabilities": []}} { "execute": "qmp_capabilities" } {"return": {}} { "execute": "chardev-add", "arguments": { "id": "chr0", "backend": { "= type": "socket", "data": { "addr": { "type": "vsock", "data": { "cid": "CID= ", "port": "P" }}}}}} Aborted (core dumped) Crashes because SocketAddress_to_str() is blissfully unaware of SOCKET_ADDRESS_KIND_VSOCK. Fix that. Pick the output format to match socket_parse(), just like the existing formats. Cc: Stefan Hajnoczi Cc: Paolo Bonzini Cc: Marc-Andr=C3=A9 Lureau Signed-off-by: Markus Armbruster Reviewed-by: Marc-Andr=C3=A9 Lureau Reviewed-by: Max Reitz Tested-by: Kashyap Chamarthy --- chardev/char-socket.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/chardev/char-socket.c b/chardev/char-socket.c index 6344b07..36ab0d6 100644 --- a/chardev/char-socket.c +++ b/chardev/char-socket.c @@ -357,6 +357,10 @@ static char *SocketAddress_to_str(const char *prefix, = SocketAddress *addr, return g_strdup_printf("%sfd:%s%s", prefix, addr->u.fd.data->str, is_listen ? ",server" : ""); break; + case SOCKET_ADDRESS_KIND_VSOCK: + return g_strdup_printf("%svsock:%s:%s", prefix, + addr->u.vsock.data->cid, + addr->u.vsock.data->port); default: abort(); } --=20 2.7.4 From nobody Wed May 1 10:09:24 2024 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 1490879825288939.4954860772717; Thu, 30 Mar 2017 06:17:05 -0700 (PDT) Received: from localhost ([::1]:35587 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ctZwl-0003qO-N2 for importer@patchew.org; Thu, 30 Mar 2017 09:17:03 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58682) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ctZv4-0002ZM-TW for qemu-devel@nongnu.org; Thu, 30 Mar 2017 09:15:19 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ctZv4-0002Qm-2j for qemu-devel@nongnu.org; Thu, 30 Mar 2017 09:15:18 -0400 Received: from mx1.redhat.com ([209.132.183.28]:49302) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ctZux-0002DF-6q; Thu, 30 Mar 2017 09:15:11 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A3C4FC05B1C8; Thu, 30 Mar 2017 13:15:09 +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 61EF783869; Thu, 30 Mar 2017 13:15:09 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id C0E691138651; Thu, 30 Mar 2017 15:15:07 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com A3C4FC05B1C8 Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=armbru@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com A3C4FC05B1C8 From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 30 Mar 2017 15:15:00 +0200 Message-Id: <1490879707-6060-4-git-send-email-armbru@redhat.com> In-Reply-To: <1490879707-6060-1-git-send-email-armbru@redhat.com> References: <1490879707-6060-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Thu, 30 Mar 2017 13:15:09 +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] [RFC v2 for-2.9 03/10] io vnc sockets: Clean up SocketAddressKind switches 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" We have quite a few switches over SocketAddressKind. Some have case labels for all enumeration values, others rely on a default label. Some abort when the value isn't a valid SocketAddressKind, others report an error then. Unify as follows. Always provide case labels for all enumeration values, to clarify intent. Abort when the value isn't a valid SocketAddressKind, because the program state is messed up then. Improve a few error messages while there. Signed-off-by: Markus Armbruster Reviewed-by: Max Reitz Tested-by: Kashyap Chamarthy --- io/dns-resolver.c | 7 +++++-- ui/vnc.c | 18 ++++++++++++------ util/qemu-sockets.c | 4 +--- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/io/dns-resolver.c b/io/dns-resolver.c index 0ac6b23..a407075 100644 --- a/io/dns-resolver.c +++ b/io/dns-resolver.c @@ -164,9 +164,12 @@ int qio_dns_resolver_lookup_sync(QIODNSResolver *resol= ver, addrs, errp); =20 + case SOCKET_ADDRESS_KIND_FD: + error_setg(errp, "Unsupported socket address type 'fd'"); + return -1; + default: - error_setg(errp, "Unknown socket address kind"); - return -1; + abort(); } } =20 diff --git a/ui/vnc.c b/ui/vnc.c index fe0a46a..0be77ba 100644 --- a/ui/vnc.c +++ b/ui/vnc.c @@ -129,10 +129,13 @@ static void vnc_init_basic_info(SocketAddress *addr, info->family =3D NETWORK_ADDRESS_FAMILY_UNIX; break; =20 - default: - error_setg(errp, "Unsupported socket kind %d", - addr->type); + case SOCKET_ADDRESS_KIND_VSOCK: + case SOCKET_ADDRESS_KIND_FD: + error_setg(errp, "Unsupported socket address type %s", + SocketAddressKind_lookup[addr->type]); break; + default: + abort(); } =20 return; @@ -411,10 +414,13 @@ VncInfo *qmp_query_vnc(Error **errp) info->family =3D NETWORK_ADDRESS_FAMILY_UNIX; break; =20 - default: - error_setg(errp, "Unsupported socket kind %d", - addr->type); + case SOCKET_ADDRESS_KIND_VSOCK: + case SOCKET_ADDRESS_KIND_FD: + error_setg(errp, "Unsupported socket address type %s", + SocketAddressKind_lookup[addr->type]); goto out_error; + default: + abort(); } =20 info->has_host =3D true; diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c index 9b73681..4ae37bd 100644 --- a/util/qemu-sockets.c +++ b/util/qemu-sockets.c @@ -1337,9 +1337,7 @@ char *socket_address_to_string(struct SocketAddress *= addr, Error **errp) break; =20 default: - error_setg(errp, "socket family %d unsupported", - addr->type); - return NULL; + abort(); } return buf; } --=20 2.7.4 From nobody Wed May 1 10:09:24 2024 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 1490879957098709.6415190656887; Thu, 30 Mar 2017 06:19:17 -0700 (PDT) Received: from localhost ([::1]:35597 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ctZyt-0005Vg-NY for importer@patchew.org; Thu, 30 Mar 2017 09:19:15 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58719) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ctZv6-0002av-1v for qemu-devel@nongnu.org; Thu, 30 Mar 2017 09:15:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ctZv4-0002Ra-Di for qemu-devel@nongnu.org; Thu, 30 Mar 2017 09:15:20 -0400 Received: from mx1.redhat.com ([209.132.183.28]:47420) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ctZux-0002DN-6s; Thu, 30 Mar 2017 09:15:11 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id CB0736AAD3; Thu, 30 Mar 2017 13:15:09 +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 6379B7FB61; Thu, 30 Mar 2017 13:15:09 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id C434511386CB; Thu, 30 Mar 2017 15:15:07 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com CB0736AAD3 Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=armbru@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com CB0736AAD3 From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 30 Mar 2017 15:15:01 +0200 Message-Id: <1490879707-6060-5-git-send-email-armbru@redhat.com> In-Reply-To: <1490879707-6060-1-git-send-email-armbru@redhat.com> References: <1490879707-6060-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Thu, 30 Mar 2017 13:15:10 +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] [RFC v2 for-2.9 04/10] block: Document -drive problematic code and bugs 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" -blockdev and blockdev_add convert their arguments via QObject to BlockdevOptions for qmp_blockdev_add(), which converts them back to QObject, then to a flattened QDict. The QDict's members are typed according to the QAPI schema. -drive converts its argument via QemuOpts to a (flat) QDict. This QDict's members are all QString. Thus, the QType of a flat QDict member depends on whether it comes from -drive or -blockdev/blockdev_add, except when the QAPI type maps to QString, which is the case for 'str' and enumeration types. The block layer core extracts generic configuration from the flat QDict, and the block driver extracts driver-specific configuration. Both commonly do so by converting (parts of) the flat QDict to QemuOpts, which turns all values into strings. Not exactly elegant, but correct. However, A few places access the flat QDict directly: * Most of them access members that are always QString. Correct. * bdrv_open_inherit() accesses a boolean, carefully. Correct. * nfs_config() uses a QObject input visitor. Correct only because the visited type contains nothing but QStrings. * nbd_config() and ssh_config() use a QObject input visitor, and the visited types contain non-QStrings: InetSocketAddress members @numeric, @to, @ipv4, @ipv6. -drive works as long as you don't try to use them (they're all optional). @to is ignored anyway. Reproducer: -drive driver=3Dssh,server.host=3Dh,server.port=3D22,server.ipv4,path=3Dp -drive driver=3Dnbd,server.type=3Dinet,server.data.host=3Dh,server.data.p= ort=3D22,server.data.ipv4 both fail with "Invalid parameter type for 'data.ipv4', expected: boolean" Add suitable comments to all these places. Mark the buggy ones FIXME. "Fortunately", -drive's driver-specific options are entirely undocumented. Signed-off-by: Markus Armbruster Tested-by: Kashyap Chamarthy --- block.c | 41 +++++++++++++++++++++++++++++++++++++++-- block/file-posix.c | 6 ++++++ block/nbd.c | 8 ++++++++ block/nfs.c | 7 +++++++ block/rbd.c | 6 ++++++ block/ssh.c | 8 ++++++++ 6 files changed, 74 insertions(+), 2 deletions(-) diff --git a/block.c b/block.c index 6e906ec..b3ce23f 100644 --- a/block.c +++ b/block.c @@ -1157,6 +1157,12 @@ static int bdrv_open_common(BlockDriverState *bs, Bl= ockBackend *file, if (file !=3D NULL) { filename =3D blk_bs(file)->filename; } else { + /* + * Caution: direct use of non-string @options members is + * problematic. When they come from -blockdev or blockdev_add, + * members are typed according to the QAPI schema, but when + * they come from -drive, they're all QString. + */ filename =3D qdict_get_try_str(options, "filename"); } =20 @@ -1324,6 +1330,12 @@ static int bdrv_fill_options(QDict **options, const = char *filename, BlockDriver *drv =3D NULL; Error *local_err =3D NULL; =20 + /* + * Caution: direct use of non-string @options members is + * problematic. When they come from -blockdev or blockdev_add, + * members are typed according to the QAPI schema, but when they + * come from -drive, they're all QString. + */ drvname =3D qdict_get_try_str(*options, "driver"); if (drvname) { drv =3D bdrv_find_format(drvname); @@ -1358,6 +1370,7 @@ static int bdrv_fill_options(QDict **options, const c= har *filename, } =20 /* Find the right block driver */ + /* Direct use of @options members is problematic, see note above */ filename =3D qdict_get_try_str(*options, "filename"); =20 if (!drvname && protocol) { @@ -1987,6 +2000,12 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDi= ct *parent_options, qdict_extract_subqdict(parent_options, &options, bdref_key_dot); g_free(bdref_key_dot); =20 + /* + * Caution: direct use of non-string @parent_options members is + * problematic. When they come from -blockdev or blockdev_add, + * members are typed according to the QAPI schema, but when they + * come from -drive, they're all QString. + */ reference =3D qdict_get_try_str(parent_options, bdref_key); if (reference || qdict_haskey(options, "file.filename")) { backing_filename[0] =3D '\0'; @@ -2059,6 +2078,12 @@ bdrv_open_child_bs(const char *filename, QDict *opti= ons, const char *bdref_key, qdict_extract_subqdict(options, &image_options, bdref_key_dot); g_free(bdref_key_dot); =20 + /* + * Caution: direct use of non-string @options members is + * problematic. When they come from -blockdev or blockdev_add, + * members are typed according to the QAPI schema, but when they + * come from -drive, they're all QString. + */ reference =3D qdict_get_try_str(options, bdref_key); if (!filename && !reference && !qdict_size(image_options)) { if (!allow_none) { @@ -2275,8 +2300,11 @@ static BlockDriverState *bdrv_open_inherit(const cha= r *filename, } =20 /* Set the BDRV_O_RDWR and BDRV_O_ALLOW_RDWR flags. - * FIXME: we're parsing the QDict to avoid having to create a - * QemuOpts just for this, but neither option is optimal. */ + * Caution: direct use of non-string @options members is + * problematic. When they come from -blockdev or blockdev_add, + * members are typed according to the QAPI schema, but when they + * come from -drive, they're all QString. + */ if (g_strcmp0(qdict_get_try_str(options, BDRV_OPT_READ_ONLY), "on") && !qdict_get_try_bool(options, BDRV_OPT_READ_ONLY, false)) { flags |=3D (BDRV_O_RDWR | BDRV_O_ALLOW_RDWR); @@ -2298,6 +2326,7 @@ static BlockDriverState *bdrv_open_inherit(const char= *filename, options =3D qdict_clone_shallow(options); =20 /* Find the right image format driver */ + /* Direct use of @options members is problematic, see note above */ drvname =3D qdict_get_try_str(options, "driver"); if (drvname) { drv =3D bdrv_find_format(drvname); @@ -2309,6 +2338,7 @@ static BlockDriverState *bdrv_open_inherit(const char= *filename, =20 assert(drvname || !(flags & BDRV_O_PROTOCOL)); =20 + /* Direct use of @options members is problematic, see note above */ backing =3D qdict_get_try_str(options, "backing"); if (backing && *backing =3D=3D '\0') { flags |=3D BDRV_O_NO_BACKING; @@ -2787,6 +2817,13 @@ int bdrv_reopen_prepare(BDRVReopenState *reopen_stat= e, BlockReopenQueue *queue, do { QString *new_obj =3D qobject_to_qstring(entry->value); const char *new =3D qstring_get_str(new_obj); + /* + * Caution: direct use of non-string bs->options members is + * problematic. When they come from -blockdev or + * blockdev_add, members are typed according to the QAPI + * schema, but when they come from -drive, they're all + * QString. + */ const char *old =3D qdict_get_try_str(reopen_state->bs->option= s, entry->key); =20 diff --git a/block/file-posix.c b/block/file-posix.c index 0841a08..738541e 100644 --- a/block/file-posix.c +++ b/block/file-posix.c @@ -2193,6 +2193,12 @@ static int hdev_open(BlockDriverState *bs, QDict *op= tions, int flags, int ret; =20 #if defined(__APPLE__) && defined(__MACH__) + /* + * Caution: direct use of non-string @options members is + * problematic. When they come from -blockdev or blockdev_add, + * members are typed according to the QAPI schema, but when they + * come from -drive, they're all QString. + */ const char *filename =3D qdict_get_str(options, "filename"); char bsd_path[MAXPATHLEN] =3D ""; bool error_occurred =3D false; diff --git a/block/nbd.c b/block/nbd.c index 36ea617..11e3ba7 100644 --- a/block/nbd.c +++ b/block/nbd.c @@ -278,6 +278,14 @@ static SocketAddress *nbd_config(BDRVNBDState *s, QDic= t *options, Error **errp) goto done; } =20 + /* + * FIXME .numeric, .to, .ipv4 or .ipv6 don't work with -drive + * server.type=3Dinet. .to doesn't matter, it's ignored anyway. + * That's because when @options come from -blockdev or + * blockdev_add, members are typed according to the QAPI schema, + * but when they come from -drive, they're all QString. The + * visitor expects the former. + */ iv =3D qobject_input_visitor_new(crumpled_addr); visit_type_SocketAddress(iv, NULL, &saddr, &local_err); if (local_err) { diff --git a/block/nfs.c b/block/nfs.c index 3f43f6e..42407de 100644 --- a/block/nfs.c +++ b/block/nfs.c @@ -474,6 +474,13 @@ static NFSServer *nfs_config(QDict *options, Error **e= rrp) goto out; } =20 + /* + * Caution: this works only because all scalar members of + * NFSServer are QString in @crumpled_addr. The visitor expects + * @crumpled_addr to be typed according to the QAPI scherma. It + * is when @options come from -blockdev or blockdev_add. But when + * they come from -drive, they're all QString. + */ iv =3D qobject_input_visitor_new(crumpled_addr); visit_type_NFSServer(iv, NULL, &server, &local_error); if (local_error) { diff --git a/block/rbd.c b/block/rbd.c index 498322b..b9a9526 100644 --- a/block/rbd.c +++ b/block/rbd.c @@ -384,6 +384,12 @@ static int qemu_rbd_create(const char *filename, QemuO= pts *opts, Error **errp) goto exit; } =20 + /* + * Caution: direct use of non-string @options members is + * problematic. When they come from -blockdev or blockdev_add, + * members are typed according to the QAPI schema, but when they + * come from -drive, they're all QString. + */ pool =3D qdict_get_try_str(options, "pool"); conf =3D qdict_get_try_str(options, "conf"); clientname =3D qdict_get_try_str(options, "user"); diff --git a/block/ssh.c b/block/ssh.c index 278e66f..471ba8a 100644 --- a/block/ssh.c +++ b/block/ssh.c @@ -601,6 +601,14 @@ static InetSocketAddress *ssh_config(QDict *options, E= rror **errp) goto out; } =20 + /* + * FIXME .numeric, .to, .ipv4 or .ipv6 don't work with -drive. + * .to doesn't matter, it's ignored anyway. + * That's because when @options come from -blockdev or + * blockdev_add, members are typed according to the QAPI schema, + * but when they come from -drive, they're all QString. The + * visitor expects the former. + */ iv =3D qobject_input_visitor_new(crumpled_addr); visit_type_InetSocketAddress(iv, NULL, &inet, &local_error); if (local_error) { --=20 2.7.4 From nobody Wed May 1 10:09:24 2024 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 149087997106817.392213574555967; Thu, 30 Mar 2017 06:19:31 -0700 (PDT) Received: from localhost ([::1]:35598 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ctZz7-0005ey-TZ for importer@patchew.org; Thu, 30 Mar 2017 09:19:29 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58737) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ctZv6-0002bC-DC for qemu-devel@nongnu.org; Thu, 30 Mar 2017 09:15:21 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ctZv5-0002TF-66 for qemu-devel@nongnu.org; Thu, 30 Mar 2017 09:15:20 -0400 Received: from mx1.redhat.com ([209.132.183.28]:42436) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ctZv1-0002Kx-7B; Thu, 30 Mar 2017 09:15:15 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 371032E605F; Thu, 30 Mar 2017 13:15:14 +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 ED3697ADAC; Thu, 30 Mar 2017 13:15:10 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id C7C3A11385E2; Thu, 30 Mar 2017 15:15:07 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 371032E605F Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=armbru@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 371032E605F From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 30 Mar 2017 15:15:02 +0200 Message-Id: <1490879707-6060-6-git-send-email-armbru@redhat.com> In-Reply-To: <1490879707-6060-1-git-send-email-armbru@redhat.com> References: <1490879707-6060-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Thu, 30 Mar 2017 13:15:14 +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] [RFC v2 for-2.9 05/10] gluster: Prepare for SocketAddressFlat extension 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" qemu_gluster_glfs_init() and qemu_gluster_parse_json() rely on the fact that SocketAddressFlatType has only two members SOCKET_ADDRESS_FLAT_TYPE_INET and SOCKET_ADDRESS_FLAT_TYPE_UNIX. Correct, but won't stay correct. Make them more robust. Signed-off-by: Markus Armbruster Reviewed-by: Max Reitz Reviewed-by: Jeff Cody Tested-by: Kashyap Chamarthy --- block/gluster.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/block/gluster.c b/block/gluster.c index a577dae..fb0aafe 100644 --- a/block/gluster.c +++ b/block/gluster.c @@ -412,10 +412,12 @@ static struct glfs *qemu_gluster_glfs_init(BlockdevOp= tionsGluster *gconf, glfs_set_preopened(gconf->volume, glfs); =20 for (server =3D gconf->server; server; server =3D server->next) { - if (server->value->type =3D=3D SOCKET_ADDRESS_FLAT_TYPE_UNIX) { + switch (server->value->type) { + case SOCKET_ADDRESS_FLAT_TYPE_UNIX: ret =3D glfs_set_volfile_server(glfs, "unix", server->value->u.q_unix.path, 0); - } else { + break; + case SOCKET_ADDRESS_FLAT_TYPE_INET: if (parse_uint_full(server->value->u.inet.port, &port, 10) < 0= || port > 65535) { error_setg(errp, "'%s' is not a valid port number", @@ -426,6 +428,9 @@ static struct glfs *qemu_gluster_glfs_init(BlockdevOpti= onsGluster *gconf, ret =3D glfs_set_volfile_server(glfs, "tcp", server->value->u.inet.host, (int)port); + break; + default: + abort(); } =20 if (ret < 0) { @@ -487,7 +492,7 @@ static int qemu_gluster_parse_json(BlockdevOptionsGlust= er *gconf, char *str =3D NULL; const char *ptr; size_t num_servers; - int i; + int i, type; =20 /* create opts info from runtime_json_opts list */ opts =3D qemu_opts_create(&runtime_json_opts, NULL, 0, &error_abort); @@ -539,16 +544,17 @@ static int qemu_gluster_parse_json(BlockdevOptionsGlu= ster *gconf, if (!strcmp(ptr, "tcp")) { ptr =3D "inet"; /* accept legacy "tcp" */ } - gsconf->type =3D qapi_enum_parse(SocketAddressFlatType_lookup, ptr, - SOCKET_ADDRESS_FLAT_TYPE__MAX, -1, - &local_err); - if (local_err) { - error_append_hint(&local_err, - "Parameter '%s' may be 'inet' or 'unix'\n", - GLUSTER_OPT_TYPE); + type =3D qapi_enum_parse(SocketAddressFlatType_lookup, ptr, + SOCKET_ADDRESS_FLAT_TYPE__MAX, -1, NULL); + if (type !=3D SOCKET_ADDRESS_FLAT_TYPE_INET + && type !=3D SOCKET_ADDRESS_FLAT_TYPE_UNIX) { + error_setg(&local_err, + "Parameter '%s' may be 'inet' or 'unix'", + GLUSTER_OPT_TYPE); error_append_hint(&local_err, GERR_INDEX_HINT, i); goto out; } + gsconf->type =3D type; qemu_opts_del(opts); =20 if (gsconf->type =3D=3D SOCKET_ADDRESS_FLAT_TYPE_INET) { --=20 2.7.4 From nobody Wed May 1 10:09:24 2024 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 1490880087086279.9275461571673; Thu, 30 Mar 2017 06:21:27 -0700 (PDT) Received: from localhost ([::1]:35611 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cta0z-0007EF-M1 for importer@patchew.org; Thu, 30 Mar 2017 09:21:25 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58765) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ctZv8-0002cu-25 for qemu-devel@nongnu.org; Thu, 30 Mar 2017 09:15:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ctZv7-0002V1-10 for qemu-devel@nongnu.org; Thu, 30 Mar 2017 09:15:22 -0400 Received: from mx1.redhat.com ([209.132.183.28]:47530) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ctZv0-0002KP-Kj; Thu, 30 Mar 2017 09:15:14 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id AE2EA7E9E5; Thu, 30 Mar 2017 13:15:13 +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 ED3D47ADAE; Thu, 30 Mar 2017 13:15:10 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id CB62611385EF; Thu, 30 Mar 2017 15:15:07 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com AE2EA7E9E5 Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=armbru@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com AE2EA7E9E5 From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 30 Mar 2017 15:15:03 +0200 Message-Id: <1490879707-6060-7-git-send-email-armbru@redhat.com> In-Reply-To: <1490879707-6060-1-git-send-email-armbru@redhat.com> References: <1490879707-6060-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Thu, 30 Mar 2017 13:15:13 +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] [RFC v2 for-2.9 06/10] qapi-schema: SocketAddressFlat variants 'vsock' and 'fd' 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" Note that the new variants are impossible in qemu_gluster_glfs_init(), because the gconf->server can only come from qemu_gluster_parse_uri() or qemu_gluster_parse_json(), and neither can create anything but 'inet' or 'unix'. Signed-off-by: Markus Armbruster Reviewed-by: Max Reitz Reviewed-by: Eric Blake Tested-by: Kashyap Chamarthy --- block/gluster.c | 2 ++ qapi-schema.json | 19 ++++++++----------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/block/gluster.c b/block/gluster.c index fb0aafe..cf29b5f 100644 --- a/block/gluster.c +++ b/block/gluster.c @@ -429,6 +429,8 @@ static struct glfs *qemu_gluster_glfs_init(BlockdevOpti= onsGluster *gconf, server->value->u.inet.host, (int)port); break; + case SOCKET_ADDRESS_FLAT_TYPE_VSOCK: + case SOCKET_ADDRESS_FLAT_TYPE_FD: default: abort(); } diff --git a/qapi-schema.json b/qapi-schema.json index b921994..927c9a2 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -4144,7 +4144,7 @@ # Since: 2.9 ## { 'enum': 'SocketAddressFlatType', - 'data': [ 'unix', 'inet' ] } + 'data': [ 'inet', 'unix', 'vsock', 'fd' ] } =20 ## # @SocketAddressFlat: @@ -4153,22 +4153,19 @@ # # @type: Transport type # -# This is similar to SocketAddress, only distinction: -# -# 1. SocketAddressFlat is a flat union, SocketAddress is a simple union. -# A flat union is nicer than simple because it avoids nesting -# (i.e. more {}) on the wire. -# -# 2. SocketAddressFlat supports only types 'unix' and 'inet', because -# that's what its current users need. +# This is just like SocketAddress, except it's a flat union rather +# than a simple union. Nicer because it avoids nesting (i.e. more {}) +# on the wire. # # Since: 2.9 ## { 'union': 'SocketAddressFlat', 'base': { 'type': 'SocketAddressFlatType' }, 'discriminator': 'type', - 'data': { 'unix': 'UnixSocketAddress', - 'inet': 'InetSocketAddress' } } + 'data': { 'inet': 'InetSocketAddress', + 'unix': 'UnixSocketAddress', + 'vsock': 'VsockSocketAddress', + 'fd': 'String' } } =20 ## # @getfd: --=20 2.7.4 From nobody Wed May 1 10:09:24 2024 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 1490880071511663.9670703450652; Thu, 30 Mar 2017 06:21:11 -0700 (PDT) Received: from localhost ([::1]:35608 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cta0k-00072L-3z for importer@patchew.org; Thu, 30 Mar 2017 09:21:10 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58799) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ctZvD-0002jd-5c for qemu-devel@nongnu.org; Thu, 30 Mar 2017 09:15:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ctZvA-0002bG-Os for qemu-devel@nongnu.org; Thu, 30 Mar 2017 09:15:27 -0400 Received: from mx1.redhat.com ([209.132.183.28]:40158) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ctZuz-0002He-9F; Thu, 30 Mar 2017 09:15:13 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 44A2F7AEA7; Thu, 30 Mar 2017 13:15:12 +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 EF4DB18627; Thu, 30 Mar 2017 13:15:10 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id CE59A11385FD; Thu, 30 Mar 2017 15:15:07 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 44A2F7AEA7 Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=armbru@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 44A2F7AEA7 From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 30 Mar 2017 15:15:04 +0200 Message-Id: <1490879707-6060-8-git-send-email-armbru@redhat.com> In-Reply-To: <1490879707-6060-1-git-send-email-armbru@redhat.com> References: <1490879707-6060-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Thu, 30 Mar 2017 13:15:12 +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] [RFC v2 for-2.9 07/10] sockets: New helper socket_address_crumple() 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. New ones should use SocketAddressFlat. I further intend to convert all internal interfaces to SocketAddressFlat. This helper should go away then. Signed-off-by: Markus Armbruster Tested-by: Kashyap Chamarthy --- include/qemu/sockets.h | 11 +++++++++++ util/qemu-sockets.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/include/qemu/sockets.h b/include/qemu/sockets.h index 5f1bab9..cef05a5 100644 --- a/include/qemu/sockets.h +++ b/include/qemu/sockets.h @@ -119,4 +119,15 @@ SocketAddress *socket_remote_address(int fd, Error **e= rrp); */ char *socket_address_to_string(struct SocketAddress *addr, Error **errp); =20 +/** + * socket_address_crumple: + * @addr_flat: the socket addres to crumple + * + * Convert SocketAddressFlat to SocketAddress. Caller is responsible + * for freeing with qapi_free_SocketAddress(). + * + * Returns: the argument converted to SocketAddress. + */ +SocketAddress *socket_address_crumple(SocketAddressFlat *addr_flat); + #endif /* QEMU_SOCKETS_H */ diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c index 4ae37bd..03a2a47 100644 --- a/util/qemu-sockets.c +++ b/util/qemu-sockets.c @@ -25,6 +25,7 @@ #include "qapi/error.h" #include "qemu/sockets.h" #include "qemu/main-loop.h" +#include "qapi/clone-visitor.h" #include "qapi/qobject-input-visitor.h" #include "qapi/qobject-output-visitor.h" #include "qapi-visit.h" @@ -1341,3 +1342,31 @@ char *socket_address_to_string(struct SocketAddress = *addr, Error **errp) } return buf; } + +SocketAddress *socket_address_crumple(SocketAddressFlat *addr_flat) +{ + SocketAddress *addr =3D g_new(SocketAddress, 1); + + addr->type =3D addr_flat->type; + switch (addr->type) { + case SOCKET_ADDRESS_FLAT_TYPE_INET: + addr->u.inet.data =3D QAPI_CLONE(InetSocketAddress, + &addr_flat->u.inet); + break; + case SOCKET_ADDRESS_FLAT_TYPE_UNIX: + addr->u.q_unix.data =3D QAPI_CLONE(UnixSocketAddress, & + addr_flat->u.q_unix); + break; + case SOCKET_ADDRESS_FLAT_TYPE_VSOCK: + addr->u.vsock.data =3D QAPI_CLONE(VsockSocketAddress, + &addr_flat->u.vsock); + break; + case SOCKET_ADDRESS_FLAT_TYPE_FD: + addr->u.fd.data =3D QAPI_CLONE(String, &addr_flat->u.fd); + break; + default: + abort(); + } + + return addr; +} --=20 2.7.4 From nobody Wed May 1 10:09:24 2024 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 149087995152673.68540444827886; Thu, 30 Mar 2017 06:19:11 -0700 (PDT) Received: from localhost ([::1]:35596 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ctZyo-0005RV-Ao for importer@patchew.org; Thu, 30 Mar 2017 09:19:10 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58744) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ctZv6-0002bH-F7 for qemu-devel@nongnu.org; Thu, 30 Mar 2017 09:15:22 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ctZv4-0002Rv-HV for qemu-devel@nongnu.org; Thu, 30 Mar 2017 09:15:20 -0400 Received: from mx1.redhat.com ([209.132.183.28]:39994) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ctZuz-0002HY-5s; Thu, 30 Mar 2017 09:15:13 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3457965750; Thu, 30 Mar 2017 13:15:12 +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 0375283E8F; Thu, 30 Mar 2017 13:15:11 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id D10DA1138606; Thu, 30 Mar 2017 15:15:07 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 3457965750 Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=armbru@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 3457965750 From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 30 Mar 2017 15:15:05 +0200 Message-Id: <1490879707-6060-9-git-send-email-armbru@redhat.com> In-Reply-To: <1490879707-6060-1-git-send-email-armbru@redhat.com> References: <1490879707-6060-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Thu, 30 Mar 2017 13:15:12 +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] [RFC v2 for-2.9 08/10] 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. Add still more gunk to nbd_process_legacy_socket_options(). You can now shorten -drive if=3Dnone,driver=3Dnbd,server.type=3Dinet,server.data.host=3D127= .0.0.1,server.data.port=3D12345 to -drive if=3Dnone,driver=3Dnbd,server.type=3Dinet,server.host=3D127.0.0.= 1,server.port=3D12345 Signed-off-by: Markus Armbruster Reviewed-by: Max Reitz Tested-by: Kashyap Chamarthy --- block/nbd.c | 94 +++++++++++++++++++++++++++++++++++++-----------= ---- qapi/block-core.json | 2 +- 2 files changed, 69 insertions(+), 27 deletions(-) diff --git a/block/nbd.c b/block/nbd.c index 11e3ba7..ea9d8dc 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 @@ -223,12 +223,51 @@ static bool nbd_process_legacy_socket_options(QDict *= output_options, const char *path =3D qemu_opt_get(legacy_opts, "path"); const char *host =3D qemu_opt_get(legacy_opts, "host"); const char *port =3D qemu_opt_get(legacy_opts, "port"); + const char *sd_path =3D qdict_get_try_str(output_options, + "server.data.path"); + const char *sd_host =3D qdict_get_try_str(output_options, + "server.data.host"); + const char *sd_port =3D qdict_get_try_str(output_options, + "server.data.port"); + bool bare =3D path || host || port; + bool server_data =3D sd_path || sd_host || sd_port; + QObject *val; const QDictEntry *e; =20 - if (!path && !host && !port) { + if (!bare && !server_data) { return true; } =20 + if (bare && server_data) { + error_setg(errp, "Cannot use 'server' and path/host/port at the " + "same time"); + return false; + } + + if (server_data) { + if (sd_host) { + val =3D qdict_get(output_options, "server.data.host"); + qobject_incref(val); + qdict_put_obj(output_options, "server.host", val); + qdict_del(output_options, "server.data.host"); + } + if (sd_port) { + val =3D qdict_get(output_options, "server.data.port"); + qobject_incref(val); + qdict_put_obj(output_options, "server.port", val); + qdict_del(output_options, "server.data.port"); + } + if (sd_path) { + val =3D qdict_get(output_options, "server.data.path"); + qobject_incref(val); + qdict_put_obj(output_options, "server.path", val); + qdict_del(output_options, "server.data.path"); + } + return true; + } + + assert(bare); + for (e =3D qdict_first(output_options); e; e =3D qdict_next(output_opt= ions, e)) { if (strstart(e->key, "server.", NULL)) { @@ -248,20 +287,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 +327,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 +346,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 +359,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 +451,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 +472,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 +499,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 +525,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 +556,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 +583,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 From nobody Wed May 1 10:09:24 2024 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 1490879837091142.27279055849715; Thu, 30 Mar 2017 06:17:17 -0700 (PDT) Received: from localhost ([::1]:35588 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ctZwx-0003yX-Ss for importer@patchew.org; Thu, 30 Mar 2017 09:17:15 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58678) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ctZv4-0002ZF-My for qemu-devel@nongnu.org; Thu, 30 Mar 2017 09:15:19 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ctZv3-0002QS-Oo for qemu-devel@nongnu.org; Thu, 30 Mar 2017 09:15:18 -0400 Received: from mx1.redhat.com ([209.132.183.28]:60694) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ctZuz-0002HN-2n; Thu, 30 Mar 2017 09:15:13 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 10E0380496; Thu, 30 Mar 2017 13:15:12 +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 27FBB78433; Thu, 30 Mar 2017 13:15:11 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id D3D661138609; Thu, 30 Mar 2017 15:15:07 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 10E0380496 Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=armbru@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 10E0380496 From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 30 Mar 2017 15:15:06 +0200 Message-Id: <1490879707-6060-10-git-send-email-armbru@redhat.com> In-Reply-To: <1490879707-6060-1-git-send-email-armbru@redhat.com> References: <1490879707-6060-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Thu, 30 Mar 2017 13:15:12 +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] [RFC v2 for-2.9 09/10] squash! 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" Drop backward -drive server.data.* compatibility gunk. On squash, replace commit message's last paragraph "Unfortunately, SocketAddress is also visible..." by: 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 Tested-by: Kashyap Chamarthy --- block/nbd.c | 41 +---------------------------------------- 1 file changed, 1 insertion(+), 40 deletions(-) diff --git a/block/nbd.c b/block/nbd.c index ea9d8dc..8bb29a9 100644 --- a/block/nbd.c +++ b/block/nbd.c @@ -223,51 +223,12 @@ static bool nbd_process_legacy_socket_options(QDict *= output_options, const char *path =3D qemu_opt_get(legacy_opts, "path"); const char *host =3D qemu_opt_get(legacy_opts, "host"); const char *port =3D qemu_opt_get(legacy_opts, "port"); - const char *sd_path =3D qdict_get_try_str(output_options, - "server.data.path"); - const char *sd_host =3D qdict_get_try_str(output_options, - "server.data.host"); - const char *sd_port =3D qdict_get_try_str(output_options, - "server.data.port"); - bool bare =3D path || host || port; - bool server_data =3D sd_path || sd_host || sd_port; - QObject *val; const QDictEntry *e; =20 - if (!bare && !server_data) { + if (!path && !host && !port) { return true; } =20 - if (bare && server_data) { - error_setg(errp, "Cannot use 'server' and path/host/port at the " - "same time"); - return false; - } - - if (server_data) { - if (sd_host) { - val =3D qdict_get(output_options, "server.data.host"); - qobject_incref(val); - qdict_put_obj(output_options, "server.host", val); - qdict_del(output_options, "server.data.host"); - } - if (sd_port) { - val =3D qdict_get(output_options, "server.data.port"); - qobject_incref(val); - qdict_put_obj(output_options, "server.port", val); - qdict_del(output_options, "server.data.port"); - } - if (sd_path) { - val =3D qdict_get(output_options, "server.data.path"); - qobject_incref(val); - qdict_put_obj(output_options, "server.path", val); - qdict_del(output_options, "server.data.path"); - } - return true; - } - - assert(bare); - for (e =3D qdict_first(output_options); e; e =3D qdict_next(output_opt= ions, e)) { if (strstart(e->key, "server.", NULL)) { --=20 2.7.4 From nobody Wed May 1 10:09:24 2024 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 1490879825322442.0670360882501; Thu, 30 Mar 2017 06:17:05 -0700 (PDT) Received: from localhost ([::1]:35586 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ctZwm-0003q2-0T for importer@patchew.org; Thu, 30 Mar 2017 09:17:04 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58696) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ctZv5-0002a2-FH for qemu-devel@nongnu.org; Thu, 30 Mar 2017 09:15:20 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ctZv3-0002Qd-RF for qemu-devel@nongnu.org; Thu, 30 Mar 2017 09:15:19 -0400 Received: from mx1.redhat.com ([209.132.183.28]:48204) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ctZuz-0002Hj-D6; Thu, 30 Mar 2017 09:15:13 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6C00AC04D2F1; Thu, 30 Mar 2017 13:15:12 +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 2D2061862F; Thu, 30 Mar 2017 13:15:11 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id D6B2D113860E; Thu, 30 Mar 2017 15:15:07 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 6C00AC04D2F1 Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=armbru@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 6C00AC04D2F1 From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 30 Mar 2017 15:15:07 +0200 Message-Id: <1490879707-6060-11-git-send-email-armbru@redhat.com> In-Reply-To: <1490879707-6060-1-git-send-email-armbru@redhat.com> References: <1490879707-6060-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Thu, 30 Mar 2017 13:15:12 +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] [RFC v2 for-2.9 10/10] sheepdog: Fix blockdev-add 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" Commit 831acdc "sheepdog: Implement bdrv_parse_filename()" and commit d282f34 "sheepdog: Support blockdev-add" have different ideas on how the QemuOpts parameters for the server address are named. Fix that. While there, rename BlockdevOptionsSheepdog member addr to server, for consistency with BlockdevOptionsSsh, BlockdevOptionsGluster, BlockdevOptionsNbd. Commit 831acdc's example becomes --drive driver=3Dsheepdog,server.type=3Dinet,server.host=3Dfido,server.= port=3D7000,vdi=3Ddolly instead of --drive driver=3Dsheepdog,host=3Dfido,vdi=3Ddolly Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake Tested-by: Kashyap Chamarthy --- block/sheepdog.c | 84 ++++++++++++++++++++++++++++++++++--------------= ---- qapi/block-core.json | 4 +-- 2 files changed, 58 insertions(+), 30 deletions(-) diff --git a/block/sheepdog.c b/block/sheepdog.c index 89e98ed..c81013d 100644 --- a/block/sheepdog.c +++ b/block/sheepdog.c @@ -13,9 +13,11 @@ */ =20 #include "qemu/osdep.h" +#include "qapi-visit.h" #include "qapi/error.h" #include "qapi/qmp/qdict.h" #include "qapi/qmp/qint.h" +#include "qapi/qobject-input-visitor.h" #include "qemu/uri.h" #include "qemu/error-report.h" #include "qemu/sockets.h" @@ -547,6 +549,47 @@ static SocketAddress *sd_socket_address(const char *pa= th, return addr; } =20 +static SocketAddress *sd_server_config(QDict *options, Error **errp) +{ + QDict *server =3D NULL; + QObject *crumpled_server =3D NULL; + Visitor *iv =3D NULL; + SocketAddressFlat *saddr_flat =3D NULL; + SocketAddress *saddr =3D NULL; + Error *local_err =3D NULL; + + qdict_extract_subqdict(options, &server, "server."); + + crumpled_server =3D qdict_crumple(server, errp); + if (!crumpled_server) { + goto done; + } + + /* + * FIXME .numeric, .to, .ipv4 or .ipv6 don't work with -drive + * server.type=3Dinet. .to doesn't matter, it's ignored anyway. + * That's because when @options come from -blockdev or + * blockdev_add, members are typed according to the QAPI schema, + * but when they come from -drive, they're all QString. The + * visitor expects the former. + */ + iv =3D qobject_input_visitor_new(crumpled_server); + visit_type_SocketAddressFlat(iv, NULL, &saddr_flat, &local_err); + if (local_err) { + error_propagate(errp, local_err); + goto done; + } + + saddr =3D socket_address_crumple(saddr_flat); + +done: + qapi_free_SocketAddressFlat(saddr_flat); + visit_free(iv); + qobject_decref(crumpled_server); + QDECREF(server); + return saddr; +} + /* Return -EIO in case of error, file descriptor on success */ static int connect_to_sdog(BDRVSheepdogState *s, Error **errp) { @@ -1175,15 +1218,17 @@ static void sd_parse_filename(const char *filename,= QDict *options, } =20 if (cfg.host) { - qdict_set_default_str(options, "host", cfg.host); + qdict_set_default_str(options, "server.host", cfg.host); + qdict_set_default_str(options, "server.type", "inet"); } if (cfg.port) { snprintf(buf, sizeof(buf), "%d", cfg.port); - qdict_set_default_str(options, "port", buf); + qdict_set_default_str(options, "server.port", buf); } if (cfg.path) { - qdict_set_default_str(options, "path", cfg.path); - } + qdict_set_default_str(options, "server.path", cfg.path);=20 + qdict_set_default_str(options, "server.type", "unix"); + } qdict_set_default_str(options, "vdi", cfg.vdi); qdict_set_default_str(options, "tag", cfg.tag); if (cfg.snap_id) { @@ -1510,18 +1555,6 @@ static QemuOptsList runtime_opts =3D { .head =3D QTAILQ_HEAD_INITIALIZER(runtime_opts.head), .desc =3D { { - .name =3D "host", - .type =3D QEMU_OPT_STRING, - }, - { - .name =3D "port", - .type =3D QEMU_OPT_STRING, - }, - { - .name =3D "path", - .type =3D QEMU_OPT_STRING, - }, - { .name =3D "vdi", .type =3D QEMU_OPT_STRING, }, @@ -1543,7 +1576,7 @@ static int sd_open(BlockDriverState *bs, QDict *optio= ns, int flags, int ret, fd; uint32_t vid =3D 0; BDRVSheepdogState *s =3D bs->opaque; - const char *host, *port, *path, *vdi, *snap_id_str, *tag; + const char *vdi, *snap_id_str, *tag; uint64_t snap_id; char *buf =3D NULL; QemuOpts *opts; @@ -1560,20 +1593,17 @@ static int sd_open(BlockDriverState *bs, QDict *opt= ions, int flags, goto err_no_fd; } =20 - host =3D qemu_opt_get(opts, "host"); - port =3D qemu_opt_get(opts, "port"); - path =3D qemu_opt_get(opts, "path"); + s->addr =3D sd_server_config(options, errp); + if (!s->addr) { + ret =3D -EINVAL; + goto err_no_fd; + } + =20 vdi =3D qemu_opt_get(opts, "vdi"); snap_id_str =3D qemu_opt_get(opts, "snap-id"); snap_id =3D qemu_opt_get_number(opts, "snap-id", CURRENT_VDI_ID); tag =3D qemu_opt_get(opts, "tag"); =20 - if ((host || port) && path) { - error_setg(errp, "can't use 'path' together with 'host' or 'port'"= ); - ret =3D -EINVAL; - goto err_no_fd; - } - if (!vdi) { error_setg(errp, "parameter 'vdi' is missing"); ret =3D -EINVAL; @@ -1604,8 +1634,6 @@ static int sd_open(BlockDriverState *bs, QDict *optio= ns, int flags, goto err_no_fd; } =20 - s->addr =3D sd_socket_address(path, host, port); - QLIST_INIT(&s->inflight_aio_head); QLIST_INIT(&s->failed_aio_head); QLIST_INIT(&s->inflight_aiocb_head); diff --git a/qapi/block-core.json b/qapi/block-core.json index 8d87962..b5f0e99 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -2623,7 +2623,7 @@ # Driver specific block device options for sheepdog # # @vdi: Virtual disk image name -# @addr: The Sheepdog server to connect to +# @server: The Sheepdog server to connect to # @snap-id: Snapshot ID # @tag: Snapshot tag name # @@ -2632,7 +2632,7 @@ # Since: 2.9 ## { 'struct': 'BlockdevOptionsSheepdog', - 'data': { 'addr': 'SocketAddressFlat', + 'data': { 'server': 'SocketAddressFlat', 'vdi': 'str', '*snap-id': 'uint32', '*tag': 'str' } } --=20 2.7.4