[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH RFC v3 5/5] block: Crude initial implementation
From: |
Eric Blake |
Subject: |
Re: [Qemu-devel] [PATCH RFC v3 5/5] block: Crude initial implementation of -blockdev |
Date: |
Wed, 22 Feb 2017 17:29:54 -0600 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.7.0 |
On 02/21/2017 03:01 PM, Markus Armbruster wrote:
> The new command line option -blockdev works like QMP command
> blockdev-add.
>
> The option argument may be given in JSON syntax, exactly as in QMP.
> Example usage:
>
> -blockdev '{"node-name": "foo", "driver": "raw", "file": {"driver":
> "file", "filename": "foo.img"} }'
>
> The JSON argument doesn't exactly blend into the existing option
> syntax, so the traditional KEY=VALUE,... syntax is also supported,
> using dotted keys to do the nesting:
>
> -blockdev node-name=foo,driver=raw,file.driver=file,file.filename=foo.img
Some of the list ideas were allowing mix-and-match or re-opening the
dict; do we want to allow any of these? (maybe as followups?)
-blockdev
node-name=foo,driver=raw,file='{"driver":"file"}',file.filename=foo.img
>
> Note that calling qmp_blockdev_add() (say via qmp_marshal_block_add())
> right away would crash. We need to stash the configuration for later
> instead. This is crudely done, and bypasses QemuOpts, even though
> storing configuration is what QemuOpts is for. Need to revamp option
> infrastructure to support QAPI types like BlockdevOptions.
>
> Signed-off-by: Markus Armbruster <address@hidden>
> ---
> qemu-options.hx | 3 +++
> vl.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 53 insertions(+)
>
> diff --git a/qemu-options.hx b/qemu-options.hx
> index 9936cf3..36a38d7 100644
> --- a/qemu-options.hx
> +++ b/qemu-options.hx
> @@ -512,6 +512,9 @@ Use @var{file} as CD-ROM image (you cannot use
> @option{-hdc} and
> using @file{/dev/cdrom} as filename (@pxref{host_drives}).
> ETEXI
>
> +DEF("blockdev", HAS_ARG, QEMU_OPTION_blockdev,
> + "-blockdev FIXME document\n", QEMU_OPTION_blockdev)
Adequate for an RFC, but I can see how you want to improve it.
> @@ -3095,6 +3104,37 @@ int main(int argc, char **argv, char **envp)
> drive_add(IF_DEFAULT, popt->index - QEMU_OPTION_hda, optarg,
> HD_OPTS);
> break;
> + case QEMU_OPTION_blockdev:
> + {
> + BlockdevOptions_queue *bdo =
> g_new(BlockdevOptions_queue, 1);
> + bool is_json = optarg[0] == '{';
> + QObject *obj;
> + QDict *args;
> + Visitor *v;
> +
> + if (is_json) {
> + obj = qobject_from_json(optarg);
> + // TODO get error out of parser
Yeah, that's something we still need to improve.
> + if (!obj) {
> + error_report("invalid JSON");
> + exit(1);
> + }
> + args = qobject_to_qdict(obj);
> + assert(args);
> + v = qobject_input_visitor_new(QOBJECT(args), true);
> + } else {
> + args = keyval_parse(optarg, "driver", &error_fatal);
> + v =
> qobject_input_visitor_new_autocast(QOBJECT(args));
> + }
Pretty slick! And answers my question: no mix-and-match of JSON and
dotted (all one or the other) within a single -blockdev argument.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
signature.asc
Description: OpenPGP digital signature
- [Qemu-devel] [PATCH RFC v3 0/5] block: Crude initial implementation of -blockdev, Markus Armbruster, 2017/02/21
- [Qemu-devel] [PATCH RFC v3 1/5] tests: Fix gcov-files-test-qemu-opts-y, gcov-files-test-logging-y, Markus Armbruster, 2017/02/21
- [Qemu-devel] [PATCH RFC v3 5/5] block: Crude initial implementation of -blockdev, Markus Armbruster, 2017/02/21
- Re: [Qemu-devel] [PATCH RFC v3 5/5] block: Crude initial implementation of -blockdev,
Eric Blake <=
- [Qemu-devel] [PATCH RFC v3 4/5] qapi: Factor qobject_input_get_autocast() out of methods, Markus Armbruster, 2017/02/21
- [Qemu-devel] [PATCH RFC v3 2/5] keyval: New keyval_parse(), Markus Armbruster, 2017/02/21