From nobody Thu May 2 08:14:47 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 1490896072147354.6002067187559; Thu, 30 Mar 2017 10:47:52 -0700 (PDT) Received: from localhost ([::1]:36977 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cteAp-00084t-1G for importer@patchew.org; Thu, 30 Mar 2017 13:47:51 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35420) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cte6Y-0004OW-Jk for qemu-devel@nongnu.org; Thu, 30 Mar 2017 13:43:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cte6X-00030m-Gc for qemu-devel@nongnu.org; Thu, 30 Mar 2017 13:43:26 -0400 Received: from mx1.redhat.com ([209.132.183.28]:57946) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cte6U-0002v2-2d; Thu, 30 Mar 2017 13:43:22 -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 08D60624B3; 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 D521019F0A; Thu, 30 Mar 2017 17:43:18 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 4A4641138648; Thu, 30 Mar 2017 19:43:17 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 08D60624B3 Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=armbru@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 08D60624B3 From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 30 Mar 2017 19:43:09 +0200 Message-Id: <1490895797-29094-2-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.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); 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 1/9] 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 --- 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 Thu May 2 08:14:47 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 1490896264758247.70900021148498; Thu, 30 Mar 2017 10:51:04 -0700 (PDT) Received: from localhost ([::1]:36994 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cteDv-0001yr-JT for importer@patchew.org; Thu, 30 Mar 2017 13:51:03 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35458) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cte6Z-0004RH-Kj for qemu-devel@nongnu.org; Thu, 30 Mar 2017 13:43:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cte6Y-00032D-PU for qemu-devel@nongnu.org; Thu, 30 Mar 2017 13:43:27 -0400 Received: from mx1.redhat.com ([209.132.183.28]:34054) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cte6W-0002xz-8N; Thu, 30 Mar 2017 13:43:24 -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 3079B75ED3; Thu, 30 Mar 2017 17:43:23 +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 D31A85C890; Thu, 30 Mar 2017 17:43:18 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 4E76A113864C; Thu, 30 Mar 2017 19:43:17 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 3079B75ED3 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 3079B75ED3 From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 30 Mar 2017 19:43:10 +0200 Message-Id: <1490895797-29094-3-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> MIME-Version: 1.0 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.28]); Thu, 30 Mar 2017 17:43:23 +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] [PATCH v3 for-2.9 2/9] 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 Reviewed-by: Stefan Hajnoczi --- 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 Thu May 2 08:14:47 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 1490896057548514.3757464205934; Thu, 30 Mar 2017 10:47:37 -0700 (PDT) Received: from localhost ([::1]:36976 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cteAa-0007tt-8g for importer@patchew.org; Thu, 30 Mar 2017 13:47:36 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35402) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cte6Y-0004Nv-8P for qemu-devel@nongnu.org; Thu, 30 Mar 2017 13:43:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cte6W-0002za-Tn for qemu-devel@nongnu.org; Thu, 30 Mar 2017 13:43:26 -0400 Received: from mx1.redhat.com ([209.132.183.28]:59732) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cte6S-0002tY-Cw; Thu, 30 Mar 2017 13:43:20 -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 3AA9383F46; Thu, 30 Mar 2017 17:43:19 +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 D99F890EC4; Thu, 30 Mar 2017 17:43:18 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 51BAA1138651; Thu, 30 Mar 2017 19:43:17 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 3AA9383F46 Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=armbru@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 3AA9383F46 From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 30 Mar 2017 19:43:11 +0200 Message-Id: <1490895797-29094-4-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.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Thu, 30 Mar 2017 17:43:19 +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 3/9] 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 --- 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 Thu May 2 08:14:47 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 1490896148632954.8373581548433; Thu, 30 Mar 2017 10:49:08 -0700 (PDT) Received: from localhost ([::1]:36984 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cteC2-0000de-DE for importer@patchew.org; Thu, 30 Mar 2017 13:49:06 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35452) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cte6Z-0004Q9-CF 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 1cte6X-000314-Lr for qemu-devel@nongnu.org; Thu, 30 Mar 2017 13:43:27 -0400 Received: from mx1.redhat.com ([209.132.183.28]:57886) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cte6S-0002td-Ea; Thu, 30 Mar 2017 13:43:20 -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 6185A61D3A; Thu, 30 Mar 2017 17:43:19 +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 E1D9D17ADA; Thu, 30 Mar 2017 17:43:18 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 54BD611386CB; Thu, 30 Mar 2017 19:43:17 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 6185A61D3A Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=armbru@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 6185A61D3A From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 30 Mar 2017 19:43:12 +0200 Message-Id: <1490895797-29094-5-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.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 30 Mar 2017 17:43:19 +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 4/9] 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 Reviewed-by: Eric Blake --- block.c | 48 +++++++++++++++++++++++++++++++++++++++++++++--- block/file-posix.c | 6 ++++++ block/nbd.c | 8 ++++++++ block/nfs.c | 7 +++++++ block/rbd.c | 6 ++++++ block/ssh.c | 8 ++++++++ 6 files changed, 80 insertions(+), 3 deletions(-) diff --git a/block.c b/block.c index 6e906ec..927ba89 100644 --- a/block.c +++ b/block.c @@ -1157,6 +1157,13 @@ static int bdrv_open_common(BlockDriverState *bs, Bl= ockBackend *file, if (file !=3D NULL) { filename =3D blk_bs(file)->filename; } else { + /* + * Caution: while qdict_get_try_str() is fine, getting + * non-string types would require more care. When @options + * come from -blockdev or blockdev_add, its 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 +1331,13 @@ static int bdrv_fill_options(QDict **options, const = char *filename, BlockDriver *drv =3D NULL; Error *local_err =3D NULL; =20 + /* + * Caution: while qdict_get_try_str() is fine, getting non-string + * types would require more care. When @options come from + * -blockdev or blockdev_add, its 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 +1372,7 @@ static int bdrv_fill_options(QDict **options, const c= har *filename, } =20 /* Find the right block driver */ + /* See cautionary note on accessing @options above */ filename =3D qdict_get_try_str(*options, "filename"); =20 if (!drvname && protocol) { @@ -1987,6 +2002,13 @@ 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: while qdict_get_try_str() is fine, getting non-string + * types would require more care. When @parent_options come from + * -blockdev or blockdev_add, its 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 +2081,13 @@ 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: while qdict_get_try_str() is fine, getting non-string + * types would require more care. When @options come from + * -blockdev or blockdev_add, its 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) { @@ -2274,9 +2303,13 @@ static BlockDriverState *bdrv_open_inherit(const cha= r *filename, goto fail; } =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. */ + /* + * Set the BDRV_O_RDWR and BDRV_O_ALLOW_RDWR flags. + * Caution: getting a boolean member of @options requires care. + * 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. + */ 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 +2331,7 @@ static BlockDriverState *bdrv_open_inherit(const char= *filename, options =3D qdict_clone_shallow(options); =20 /* Find the right image format driver */ + /* See cautionary note on accessing @options above */ drvname =3D qdict_get_try_str(options, "driver"); if (drvname) { drv =3D bdrv_find_format(drvname); @@ -2309,6 +2343,7 @@ static BlockDriverState *bdrv_open_inherit(const char= *filename, =20 assert(drvname || !(flags & BDRV_O_PROTOCOL)); =20 + /* See cautionary note on accessing @options above */ backing =3D qdict_get_try_str(options, "backing"); if (backing && *backing =3D=3D '\0') { flags |=3D BDRV_O_NO_BACKING; @@ -2787,6 +2822,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: while qdict_get_try_str() is fine, getting + * non-string types would require more care. When + * bs->options come from -blockdev or blockdev_add, its + * 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..2acc5c4 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: while qdict_get_try_str() is fine, getting non-string + * types would require more care. When @options come from -blockdev + * or blockdev_add, its 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..d8208bb 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: while qdict_get_try_str() is fine, getting non-string + * types would require more care. When @options come from -blockdev + * or blockdev_add, its 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 Thu May 2 08:14:47 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 1490896172263155.212749891474; Thu, 30 Mar 2017 10:49:32 -0700 (PDT) Received: from localhost ([::1]:36985 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cteCR-0000tn-02 for importer@patchew.org; Thu, 30 Mar 2017 13:49:31 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35413) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cte6Y-0004OG-Ff for qemu-devel@nongnu.org; Thu, 30 Mar 2017 13:43:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cte6X-00030a-CZ for qemu-devel@nongnu.org; Thu, 30 Mar 2017 13:43:26 -0400 Received: from mx1.redhat.com ([209.132.183.28]:44802) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cte6U-0002ux-1x; Thu, 30 Mar 2017 13:43:22 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D5EE87AEBB; Thu, 30 Mar 2017 17:43:20 +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 8D6D4183A9; Thu, 30 Mar 2017 17:43:20 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 57D4F11385E2; Thu, 30 Mar 2017 19:43:17 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com D5EE87AEBB 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 D5EE87AEBB From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 30 Mar 2017 19:43:13 +0200 Message-Id: <1490895797-29094-6-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.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); 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 5/9] 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 --- 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 Thu May 2 08:14:47 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 1490895946283790.9474405623573; Thu, 30 Mar 2017 10:45:46 -0700 (PDT) Received: from localhost ([::1]:36968 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cte8n-0006AV-4m for importer@patchew.org; Thu, 30 Mar 2017 13:45:45 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35390) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cte6Y-0004Nh-05 for qemu-devel@nongnu.org; Thu, 30 Mar 2017 13:43:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cte6X-000303-2m for qemu-devel@nongnu.org; Thu, 30 Mar 2017 13:43:26 -0400 Received: from mx1.redhat.com ([209.132.183.28]:57934) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cte6T-0002ui-Tg; Thu, 30 Mar 2017 13:43:22 -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 CF2D161E4B; Thu, 30 Mar 2017 17:43:20 +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 8F1ED90EC4; Thu, 30 Mar 2017 17:43:20 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 5B03711385EF; Thu, 30 Mar 2017 19:43:17 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com CF2D161E4B Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=armbru@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com CF2D161E4B From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 30 Mar 2017 19:43:14 +0200 Message-Id: <1490895797-29094-7-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.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); 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 6/9] 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 --- 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..250e4dc 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 on the wire, +# i.e. this form has fewer {}. # # 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 Thu May 2 08:14:47 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 1490895918619997.1731009614185; Thu, 30 Mar 2017 10:45:18 -0700 (PDT) Received: from localhost ([::1]:36958 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cte8L-0005hk-CI for importer@patchew.org; Thu, 30 Mar 2017 13:45:17 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35407) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cte6Y-0004Ny-A7 for qemu-devel@nongnu.org; Thu, 30 Mar 2017 13:43:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cte6X-00030W-AA for qemu-devel@nongnu.org; Thu, 30 Mar 2017 13:43:26 -0400 Received: from mx1.redhat.com ([209.132.183.28]:33442) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cte6U-0002us-0u; Thu, 30 Mar 2017 13:43:22 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id EBE65C04D294; Thu, 30 Mar 2017 17:43:20 +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 B070977D53; Thu, 30 Mar 2017 17:43:20 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 5E31D11385FD; Thu, 30 Mar 2017 19:43:17 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com EBE65C04D294 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 EBE65C04D294 From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 30 Mar 2017 19:43:15 +0200 Message-Id: <1490895797-29094-8-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.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); 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 7/9] 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 Reviewed-by: Eric Blake --- include/qemu/sockets.h | 11 +++++++++++ util/qemu-sockets.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/include/qemu/sockets.h b/include/qemu/sockets.h index 5f1bab9..7842f6d 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 address 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..21442c3 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,34 @@ 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); + + switch (addr_flat->type) { + case SOCKET_ADDRESS_FLAT_TYPE_INET: + addr->type =3D SOCKET_ADDRESS_KIND_INET; + addr->u.inet.data =3D QAPI_CLONE(InetSocketAddress, + &addr_flat->u.inet); + break; + case SOCKET_ADDRESS_FLAT_TYPE_UNIX: + addr->type =3D SOCKET_ADDRESS_KIND_UNIX; + addr->u.q_unix.data =3D QAPI_CLONE(UnixSocketAddress, + &addr_flat->u.q_unix); + break; + case SOCKET_ADDRESS_FLAT_TYPE_VSOCK: + addr->type =3D SOCKET_ADDRESS_KIND_VSOCK; + addr->u.vsock.data =3D QAPI_CLONE(VsockSocketAddress, + &addr_flat->u.vsock); + break; + case SOCKET_ADDRESS_FLAT_TYPE_FD: + addr->type =3D SOCKET_ADDRESS_KIND_FD; + addr->u.fd.data =3D QAPI_CLONE(String, &addr_flat->u.fd); + break; + default: + abort(); + } + + return addr; +} --=20 2.7.4 From nobody Thu May 2 08:14:47 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 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 From nobody Thu May 2 08:14:47 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 1490896030222374.3325891321814; Thu, 30 Mar 2017 10:47:10 -0700 (PDT) Received: from localhost ([::1]:36975 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cteA9-0007MS-4N for importer@patchew.org; Thu, 30 Mar 2017 13:47:09 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35443) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cte6Z-0004PI-3K for qemu-devel@nongnu.org; Thu, 30 Mar 2017 13:43:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cte6X-00030s-J8 for qemu-devel@nongnu.org; Thu, 30 Mar 2017 13:43:27 -0400 Received: from mx1.redhat.com ([209.132.183.28]:42940) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cte6U-0002vF-83; Thu, 30 Mar 2017 13:43:22 -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 2EEF9F6257; 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 BCC2C17AFA; Thu, 30 Mar 2017 17:43:20 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 64E3E1138609; Thu, 30 Mar 2017 19:43:17 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 2EEF9F6257 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 2EEF9F6257 From: Markus Armbruster To: qemu-devel@nongnu.org Date: Thu, 30 Mar 2017 19:43:17 +0200 Message-Id: <1490895797-29094-10-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.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 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 9/9] 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 | 90 +++++++++++++++++++++++++++++++++---------------= ---- qapi/block-core.json | 4 +-- 2 files changed, 60 insertions(+), 34 deletions(-) diff --git a/block/sheepdog.c b/block/sheepdog.c index 89e98ed..1b71fc8 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) { @@ -1174,15 +1217,15 @@ static void sd_parse_filename(const char *filename,= QDict *options, return; } =20 - if (cfg.host) { - qdict_set_default_str(options, "host", cfg.host); - } - if (cfg.port) { - snprintf(buf, sizeof(buf), "%d", cfg.port); - qdict_set_default_str(options, "port", buf); - } if (cfg.path) { - qdict_set_default_str(options, "path", cfg.path); + qdict_set_default_str(options, "server.path", cfg.path); + qdict_set_default_str(options, "server.type", "unix"); + } else { + qdict_set_default_str(options, "server.type", "inet"); + qdict_set_default_str(options, "server.host", + cfg.host ?: SD_DEFAULT_ADDR); + snprintf(buf, sizeof(buf), "%d", cfg.port ?: SD_DEFAULT_PORT); + qdict_set_default_str(options, "server.port", buf); } qdict_set_default_str(options, "vdi", cfg.vdi); qdict_set_default_str(options, "tag", cfg.tag); @@ -1510,18 +1553,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 +1574,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 +1591,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; + } + 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 +1632,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