From: Coiby Xu <coiby.xu@gmail.com>
To: Kevin Wolf <kwolf@redhat.com>
Cc: qemu-block@nongnu.org, qemu-devel@nongnu.org, armbru@redhat.com,
stefanha@redhat.com, mreitz@redhat.com
Subject: Re: [PATCH v2 08/20] qemu-storage-daemon: Add --object option
Date: Thu, 16 Apr 2020 13:20:56 +0800 [thread overview]
Message-ID: <20200416052056.7l5ohyn73pjsivur@r> (raw)
In-Reply-To: <20200224143008.13362-9-kwolf@redhat.com>
Hi Kevin,
I tried to start vhost-user block device backend server with the
following command,
$ qemu-storage-daemon --blockdev driver=file,node-name=disk,filename=file.img,read-only=off \
--object vhost-user-blk-server,id=disk,unix-socket=/tmp/vu_blk.socket,node-name=disk,writable=off
but the following error occurred,
qemu-storage-daemon: Invalid parameter type for 'writable', expected: boolean
I notice qmp_object_add is used. Should we use user_creatable_add_opts
instead?
diff --git a/qemu-storage-daemon.c b/qemu-storage-daemon.c
index dd128978cc..9d21aaaf54 100644
--- a/qemu-storage-daemon.c
+++ b/qemu-storage-daemon.c
@@ -277,8 +277,6 @@ static void process_options(int argc, char *argv[])
{
QemuOpts *opts;
const char *type;
- QDict *args;
- QObject *ret_data = NULL;
/* FIXME The keyval parser rejects 'help' arguments, so we must
* unconditionall try QemuOpts first. */
@@ -288,12 +286,11 @@ static void process_options(int argc, char *argv[])
if (type && user_creatable_print_help(type, opts)) {
exit(EXIT_SUCCESS);
}
+
+
+ user_creatable_add_opts(opts, &error_fatal);
qemu_opts_del(opts);
- args = keyval_parse(optarg, "qom-type", &error_fatal);
- qmp_object_add(args, &ret_data, &error_fatal);
- qobject_unref(args);
- qobject_unref(ret_data);
break;
}
default:
On Mon, Feb 24, 2020 at 03:29:56PM +0100, Kevin Wolf wrote:
>Add a command line option to create user-creatable QOM objects.
>
>Signed-off-by: Kevin Wolf <kwolf@redhat.com>
>---
> qemu-storage-daemon.c | 47 +++++++++++++++++++++++++++++++++++++++++++
> Makefile.objs | 2 +-
> qom/Makefile.objs | 1 +
> 3 files changed, 49 insertions(+), 1 deletion(-)
>
>diff --git a/qemu-storage-daemon.c b/qemu-storage-daemon.c
>index c30caaf59e..0cd8144c81 100644
>--- a/qemu-storage-daemon.c
>+++ b/qemu-storage-daemon.c
>@@ -33,15 +33,19 @@
> #include "qapi/error.h"
> #include "qapi/qapi-visit-block-core.h"
> #include "qapi/qapi-commands-block-core.h"
>+#include "qapi/qmp/qdict.h"
> #include "qapi/qobject-input-visitor.h"
>
> #include "qemu-common.h"
> #include "qemu-version.h"
> #include "qemu/config-file.h"
> #include "qemu/error-report.h"
>+#include "qemu/help_option.h"
> #include "qemu/log.h"
> #include "qemu/main-loop.h"
> #include "qemu/module.h"
>+#include "qemu/option.h"
>+#include "qom/object_interfaces.h"
>
> #include "trace/control.h"
>
>@@ -63,12 +67,31 @@ static void help(void)
> " [,driver specific parameters...]\n"
> " configure a block backend\n"
> "\n"
>+" --object help list object types that can be added\n"
>+" --object <type>,help list properties for the given object type\n"
>+" --object <type>[,<property>=<value>...]\n"
>+" create a new object of type <type>, setting\n"
>+" properties in the order they are specified. Note\n"
>+" that the 'id' property must be set.\n"
>+" See the qemu(1) man page for documentation of the\n"
>+" objects that can be added.\n"
>+"\n"
> QEMU_HELP_BOTTOM "\n",
> error_get_progname());
> }
>
> enum {
> OPTION_BLOCKDEV = 256,
>+ OPTION_OBJECT,
>+};
>+
>+static QemuOptsList qemu_object_opts = {
>+ .name = "object",
>+ .implied_opt_name = "qom-type",
>+ .head = QTAILQ_HEAD_INITIALIZER(qemu_object_opts.head),
>+ .desc = {
>+ { }
>+ },
> };
>
> static void process_options(int argc, char *argv[])
>@@ -78,6 +101,7 @@ static void process_options(int argc, char *argv[])
> static const struct option long_options[] = {
> {"blockdev", required_argument, NULL, OPTION_BLOCKDEV},
> {"help", no_argument, NULL, 'h'},
>+ {"object", required_argument, NULL, OPTION_OBJECT},
> {"trace", required_argument, NULL, 'T'},
> {"version", no_argument, NULL, 'V'},
> {0, 0, 0, 0}
>@@ -121,6 +145,29 @@ static void process_options(int argc, char *argv[])
> qapi_free_BlockdevOptions(options);
> break;
> }
>+ case OPTION_OBJECT:
>+ {
>+ QemuOpts *opts;
>+ const char *type;
>+ QDict *args;
>+ QObject *ret_data = NULL;
>+
>+ /* FIXME The keyval parser rejects 'help' arguments, so we must
>+ * unconditionall try QemuOpts first. */
>+ opts = qemu_opts_parse(&qemu_object_opts,
>+ optarg, true, &error_fatal);
>+ type = qemu_opt_get(opts, "qom-type");
>+ if (type && user_creatable_print_help(type, opts)) {
>+ exit(EXIT_SUCCESS);
>+ }
>+ qemu_opts_del(opts);
>+
>+ args = keyval_parse(optarg, "qom-type", &error_fatal);
>+ qmp_object_add(args, &ret_data, &error_fatal);
>+ qobject_unref(args);
>+ qobject_unref(ret_data);
>+ break;
>+ }
> default:
> g_assert_not_reached();
> }
>diff --git a/Makefile.objs b/Makefile.objs
>index c7e1b36130..fa92b00427 100644
>--- a/Makefile.objs
>+++ b/Makefile.objs
>@@ -31,7 +31,7 @@ endif # CONFIG_SOFTMMU or CONFIG_TOOLS
> # storage-daemon-obj-y is code used by qemu-storage-daemon (these objects are
> # used for system emulation, too, but specified separately there)
>
>-storage-daemon-obj-y = block/
>+storage-daemon-obj-y = block/ qom/
> storage-daemon-obj-y += blockdev.o iothread.o
>
> ######################################################################
>diff --git a/qom/Makefile.objs b/qom/Makefile.objs
>index f9d77350ac..1b45d104ba 100644
>--- a/qom/Makefile.objs
>+++ b/qom/Makefile.objs
>@@ -2,3 +2,4 @@ qom-obj-y = object.o container.o qom-qobject.o
> qom-obj-y += object_interfaces.o
>
> common-obj-$(CONFIG_SOFTMMU) += qom-hmp-cmds.o qom-qmp-cmds.o
>+storage-daemon-obj-y += qom-qmp-cmds.o
>--
>2.20.1
>
next prev parent reply other threads:[~2020-04-16 5:21 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-02-24 14:29 [PATCH v2 00/20] Add qemu-storage-daemon Kevin Wolf
2020-02-24 14:29 ` [PATCH v2 01/20] qemu-storage-daemon: Add barebone tool Kevin Wolf
2020-02-24 14:29 ` [PATCH v2 02/20] stubs: Add arch_type Kevin Wolf
2020-02-24 14:29 ` [PATCH v2 03/20] block: Move system emulator QMP commands to block/qapi-sysemu.c Kevin Wolf
2020-02-24 14:29 ` [PATCH v2 04/20] block: Move common QMP commands to block-core QAPI module Kevin Wolf
2020-02-24 14:29 ` [PATCH v2 05/20] block: Move sysemu QMP commands to QAPI block module Kevin Wolf
2020-02-24 14:29 ` [PATCH v2 06/20] qemu-storage-daemon: Add --blockdev option Kevin Wolf
2020-02-24 14:29 ` [PATCH v2 07/20] qapi: Flatten object-add Kevin Wolf
2020-02-24 14:29 ` [PATCH v2 08/20] qemu-storage-daemon: Add --object option Kevin Wolf
2020-04-16 5:20 ` Coiby Xu [this message]
2020-06-09 23:25 ` Coiby Xu
2020-02-24 14:29 ` [PATCH v2 09/20] qemu-storage-daemon: Add --nbd-server option Kevin Wolf
2020-02-24 14:29 ` [PATCH v2 10/20] blockdev-nbd: Boxed argument type for nbd-server-add Kevin Wolf
2020-02-24 14:29 ` [PATCH v2 11/20] qemu-storage-daemon: Add --export option Kevin Wolf
2020-02-24 14:30 ` [PATCH v2 12/20] qemu-storage-daemon: Add main loop Kevin Wolf
2020-02-24 14:30 ` [PATCH v2 13/20] qemu-storage-daemon: Add --chardev option Kevin Wolf
2020-02-24 14:30 ` [PATCH v2 14/20] stubs: Update monitor stubs for qemu-storage-daemon Kevin Wolf
2020-02-24 14:30 ` [PATCH v2 15/20] qapi: Create 'pragma' module Kevin Wolf
2020-02-24 14:30 ` [PATCH v2 16/20] monitor: Create QAPIfied monitor_init() Kevin Wolf
2020-02-24 14:30 ` [PATCH v2 17/20] qmp: Fail gracefully if chardev is already in use Kevin Wolf
2020-02-24 14:30 ` [PATCH v2 18/20] hmp: " Kevin Wolf
2020-02-24 14:30 ` [PATCH v2 19/20] monitor: Add allow_hmp parameter to monitor_init() Kevin Wolf
2020-02-24 14:30 ` [PATCH v2 20/20] qemu-storage-daemon: Add --monitor option Kevin Wolf
2020-02-24 15:34 ` [PATCH v2 00/20] Add qemu-storage-daemon no-reply
2020-02-28 11:16 ` Stefan Hajnoczi
2020-03-03 17:00 ` Kevin Wolf
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=20200416052056.7l5ohyn73pjsivur@r \
--to=coiby.xu@gmail.com \
--cc=armbru@redhat.com \
--cc=kwolf@redhat.com \
--cc=mreitz@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).