From: Eric Blake <eblake@redhat.com>
To: Max Reitz <mreitz@redhat.com>, qemu-block@nongnu.org
Cc: qemu-devel@nongnu.org, Kevin Wolf <kwolf@redhat.com>,
Paolo Bonzini <pbonzini@redhat.com>,
"Daniel P . Berrange" <berrange@redhat.com>,
Markus Armbruster <armbru@redhat.com>,
Luiz Capitulino <lcapitulino@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v3 08/14] block/nbd: Accept SocketAddress
Date: Tue, 14 Jun 2016 17:14:47 -0600 [thread overview]
Message-ID: <57608FE7.1070000@redhat.com> (raw)
In-Reply-To: <1459967330-4573-9-git-send-email-mreitz@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 6166 bytes --]
On 04/06/2016 12:28 PM, Max Reitz wrote:
> Add a new option "address" to the NBD block driver which accepts a
> SocketAddress.
>
> "path", "host" and "port" are still supported as legacy options and are
> mapped to their corresponding SocketAddress representation.
The back-compat work is pretty slick.
>
> Signed-off-by: Max Reitz <mreitz@redhat.com>
> ---
> block/nbd.c | 97 ++++++++++++++++++++++++++-----------------
> tests/qemu-iotests/051.out | 4 +-
> tests/qemu-iotests/051.pc.out | 4 +-
> 3 files changed, 64 insertions(+), 41 deletions(-)
>
> diff --git a/block/nbd.c b/block/nbd.c
> index 3adf302..9ae66ba 100644
> --- a/block/nbd.c
> +++ b/block/nbd.c
> @@ -32,6 +32,8 @@
> #include "qemu/uri.h"
> #include "block/block_int.h"
> #include "qemu/module.h"
> +#include "qapi-visit.h"
> +#include "qapi/qmp-input-visitor.h"
> #include "qapi/qmp/qdict.h"
> #include "qapi/qmp/qjson.h"
> #include "qapi/qmp/qint.h"
> @@ -128,7 +130,9 @@ static bool nbd_has_filename_options_conflict(QDict *options, Error **errp)
> if (!strcmp(e->key, "host")
> || !strcmp(e->key, "port")
> || !strcmp(e->key, "path")
> - || !strcmp(e->key, "export"))
> + || !strcmp(e->key, "export")
> + || !strcmp(e->key, "address")
> + || !strncmp(e->key, "address.", 8))
May need a tweak if you break before '||'
> {
> error_setg(errp, "Option '%s' cannot be used with a file name",
> e->key);
> @@ -202,46 +206,66 @@ out:
> g_free(file);
> }
>
> +static bool nbd_process_legacy_socket_options(QDict *options, Error **errp)
> +{
> + if (qdict_haskey(options, "path") && qdict_haskey(options, "host")) {
> + error_setg(errp, "path and host may not be used at the same time");
> + return false;
> + } else if (qdict_haskey(options, "path")) {
> + if (qdict_haskey(options, "port")) {
> + error_setg(errp, "port may not be used without host");
> + return false;
> + }
> +
> + qdict_put(options, "address.type", qstring_from_str("unix"));
> + qdict_change_key(options, "path", "address.data.path");
> + } else if (qdict_haskey(options, "host")) {
> + qdict_put(options, "address.type", qstring_from_str("inet"));
> + qdict_change_key(options, "host", "address.data.host");
> + if (!qdict_change_key(options, "port", "address.data.port")) {
> + qdict_put(options, "address.data.port",
> + qstring_from_str(stringify(NBD_DEFAULT_PORT)));
> + }
The rewrite from old to modern is rather nice. I wonder if we could
then use a generated qapi_visit_SocketAddress instead of manually
handling all the complication of SocketAddress proper.
> + }
> +
> + return true;
> +}
> +
> static SocketAddress *nbd_config(BDRVNBDState *s, QDict *options, char **export,
> Error **errp)
> {
> - SocketAddress *saddr;
> + SocketAddress *saddr = NULL;
> + QDict *addr = NULL;
> + QObject *crumpled_addr;
> + QmpInputVisitor *iv;
> + Error *local_err = NULL;
>
> - if (qdict_haskey(options, "path") == qdict_haskey(options, "host")) {
> - if (qdict_haskey(options, "path")) {
> - error_setg(errp, "path and host may not be used at the same time");
> - } else {
> - error_setg(errp, "one of path and host must be specified");
> - }
> - return NULL;
> + if (!nbd_process_legacy_socket_options(options, errp)) {
> + goto fail;
> }
> - if (qdict_haskey(options, "port") && !qdict_haskey(options, "host")) {
> - error_setg(errp, "port may not be used without host");
> - return NULL;
> +
> + qdict_extract_subqdict(options, &addr, "address.");
> + if (!qdict_size(addr)) {
> + error_setg(errp, "NBD server address missing");
> + goto fail;
> }
>
> - saddr = g_new0(SocketAddress, 1);
> + crumpled_addr = qdict_crumple(addr, true, errp);
> + if (!crumpled_addr) {
> + goto fail;
> + }
>
Ah, so you ARE depending on Dan's qdict_crumple().
> - if (qdict_haskey(options, "path")) {
> - UnixSocketAddress *q_unix;
> - saddr->type = SOCKET_ADDRESS_KIND_UNIX;
> - q_unix = saddr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
> - q_unix->path = g_strdup(qdict_get_str(options, "path"));
> - qdict_del(options, "path");
> - } else {
> - InetSocketAddress *inet;
> - saddr->type = SOCKET_ADDRESS_KIND_INET;
> - inet = saddr->u.inet.data = g_new0(InetSocketAddress, 1);
> - inet->host = g_strdup(qdict_get_str(options, "host"));
> - if (!qdict_get_try_str(options, "port")) {
> - inet->port = g_strdup_printf("%d", NBD_DEFAULT_PORT);
> - } else {
> - inet->port = g_strdup(qdict_get_str(options, "port"));
> - }
> - qdict_del(options, "host");
> - qdict_del(options, "port");
> + iv = qmp_input_visitor_new(crumpled_addr);
> + visit_type_SocketAddress(qmp_input_get_visitor(iv), NULL, &saddr,
> + &local_err);
and you DO use the generated QAPI code. Cool!
> + qmp_input_visitor_cleanup(iv);
> + if (local_err) {
> + error_propagate(errp, local_err);
> + goto fail;
> }
>
> + /* TODO: Detect superfluous (unused) options under in addr */
Is this TODO addressed anywhere, or mentioned in the commit message?
In fact, I think it's quite easy to address: qmp_input_visitor_new()
recently changed signatures (commit fc471c18), so all you have to do is
pass strict=true to that function as part of rebasing your work, at
which point you will automatically reject any leftover keys in addr that
didn't get parsed by SocketAddress.
Needs a rebase, but looks promising.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]
next prev parent reply other threads:[~2016-06-14 23:15 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-06 18:28 [Qemu-devel] [PATCH v3 for-2.7 00/14] qapi: Allow blockdev-add for NBD Max Reitz
2016-04-06 18:28 ` [Qemu-devel] [PATCH v3 01/14] qdict: Add qdict_change_key() Max Reitz
2016-06-14 22:03 ` Eric Blake
2016-04-06 18:28 ` [Qemu-devel] [PATCH v3 02/14] block/nbd: Drop trailing "." in error messages Max Reitz
2016-06-14 22:04 ` [Qemu-trivial] " Eric Blake
2016-06-14 22:04 ` [Qemu-devel] " Eric Blake
2016-04-06 18:28 ` [Qemu-devel] [PATCH v3 03/14] block/nbd: Reject port parameter without host Max Reitz
2016-04-06 18:28 ` [Qemu-devel] [PATCH v3 04/14] block/nbd: Default port in nbd_refresh_filename() Max Reitz
2016-06-14 22:39 ` Eric Blake
2016-04-06 18:28 ` [Qemu-devel] [PATCH v3 05/14] block/nbd: Use qdict_put() Max Reitz
2016-06-14 22:40 ` Eric Blake
2016-04-06 18:28 ` [Qemu-devel] [PATCH v3 06/14] block/nbd: Add nbd_has_filename_options_conflict() Max Reitz
2016-06-14 22:54 ` Eric Blake
2016-04-06 18:28 ` [Qemu-devel] [PATCH v3 07/14] block/nbd: "address" in nbd_refresh_filename() Max Reitz
2016-06-14 23:03 ` Eric Blake
2016-04-06 18:28 ` [Qemu-devel] [PATCH v3 08/14] block/nbd: Accept SocketAddress Max Reitz
2016-06-14 23:14 ` Eric Blake [this message]
2016-06-15 14:40 ` Max Reitz
2016-04-06 18:28 ` [Qemu-devel] [PATCH v3 09/14] block/nbd: Use SocketAddress options Max Reitz
2016-04-06 18:28 ` [Qemu-devel] [PATCH v3 10/14] qapi: Allow blockdev-add for NBD Max Reitz
2016-04-06 18:28 ` [Qemu-devel] [PATCH v3 11/14] iotests.py: Add qemu_nbd function Max Reitz
2016-04-06 18:28 ` [Qemu-devel] [PATCH v3 12/14] iotests.py: Allow concurrent qemu instances Max Reitz
2016-04-06 18:28 ` [Qemu-devel] [PATCH v3 13/14] socket_scm_helper: Accept fd directly Max Reitz
2016-04-06 18:28 ` [Qemu-devel] [PATCH v3 14/14] iotests: Add test for NBD's blockdev-add interface Max Reitz
2016-05-03 13:51 ` [Qemu-devel] [PATCH v3 for-2.7 00/14] qapi: Allow blockdev-add for NBD Max Reitz
2016-05-03 15:23 ` Kevin Wolf
2016-06-14 22:42 ` Eric Blake
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=57608FE7.1070000@redhat.com \
--to=eblake@redhat.com \
--cc=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=kwolf@redhat.com \
--cc=lcapitulino@redhat.com \
--cc=mreitz@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.