From: Kevin Wolf <kwolf@redhat.com>
To: anthony@codemonkey.ws
Cc: kwolf@redhat.com, qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH 05/13] qemu-option: Add qemu_opts_absorb_qdict()
Date: Tue, 12 Mar 2013 15:41:11 +0100 [thread overview]
Message-ID: <1363099279-403-6-git-send-email-kwolf@redhat.com> (raw)
In-Reply-To: <1363099279-403-1-git-send-email-kwolf@redhat.com>
This adds a function that adds all entries of a QDict to a QemuOpts if
the keys are known, and leaves only the rest in the QDict.
This way a single QDict of -drive options can be processed in multiple
places (generic block layer, block driver, backing file block driver,
etc.), where each part picks the options it knows. If at the end of the
process the QDict isn't empty, the user specified an invalid option.
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
include/qemu/option.h | 1 +
util/qemu-option.c | 34 ++++++++++++++++++++++++++++++++++
2 files changed, 35 insertions(+)
diff --git a/include/qemu/option.h b/include/qemu/option.h
index ba197cd..bdb6d21 100644
--- a/include/qemu/option.h
+++ b/include/qemu/option.h
@@ -149,6 +149,7 @@ void qemu_opts_set_defaults(QemuOptsList *list, const char *params,
QemuOpts *qemu_opts_from_qdict(QemuOptsList *list, const QDict *qdict,
Error **errp);
QDict *qemu_opts_to_qdict(QemuOpts *opts, QDict *qdict);
+void qemu_opts_absorb_qdict(QemuOpts *opts, QDict *qdict, Error **errp);
typedef int (*qemu_opts_loopfunc)(QemuOpts *opts, void *opaque);
int qemu_opts_print(QemuOpts *opts, void *dummy);
diff --git a/util/qemu-option.c b/util/qemu-option.c
index 5a1d03c..8b74bf1 100644
--- a/util/qemu-option.c
+++ b/util/qemu-option.c
@@ -1067,6 +1067,40 @@ QemuOpts *qemu_opts_from_qdict(QemuOptsList *list, const QDict *qdict,
}
/*
+ * Adds all QDict entries to the QemuOpts that can be added and removes them
+ * from the QDict. When this function returns, the QDict contains only those
+ * entries that couldn't be added to the QemuOpts.
+ */
+void qemu_opts_absorb_qdict(QemuOpts *opts, QDict *qdict, Error **errp)
+{
+ const QDictEntry *entry, *next;
+
+ entry = qdict_first(qdict);
+
+ while (entry != NULL) {
+ Error *local_err = NULL;
+ OptsFromQDictState state = {
+ .errp = &local_err,
+ .opts = opts,
+ };
+
+ next = qdict_next(qdict, entry);
+
+ if (find_desc_by_name(opts->list->desc, entry->key)) {
+ qemu_opts_from_qdict_1(entry->key, entry->value, &state);
+ if (error_is_set(&local_err)) {
+ error_propagate(errp, local_err);
+ return;
+ } else {
+ qdict_del(qdict, entry->key);
+ }
+ }
+
+ entry = next;
+ }
+}
+
+/*
* Convert from QemuOpts to QDict.
* The QDict values are of type QString.
* TODO We'll want to use types appropriate for opt->desc->type, but
--
1.8.1.4
next prev parent reply other threads:[~2013-03-12 14:41 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-12 14:41 [Qemu-devel] [PULL 00/13] Block patches Kevin Wolf
2013-03-12 14:41 ` [Qemu-devel] [PATCH 01/13] block: Add options QDict to .bdrv_open() Kevin Wolf
2013-03-12 14:41 ` [Qemu-devel] [PATCH 02/13] block: Add options QDict to bdrv_open() prototype Kevin Wolf
2013-03-12 14:41 ` [Qemu-devel] [PATCH 03/13] Add qdict_clone_shallow() Kevin Wolf
2013-03-12 14:41 ` [Qemu-devel] [PATCH 04/13] block: Add options QDict to bdrv_open_common() Kevin Wolf
2013-03-12 14:41 ` Kevin Wolf [this message]
2013-03-12 14:41 ` [Qemu-devel] [PATCH 06/13] block: Support driver specific options in drive_init() Kevin Wolf
2013-03-14 21:11 ` Anthony Liguori
2013-03-12 14:41 ` [Qemu-devel] [PATCH 07/13] qcow2: Allow lazy refcounts to be enabled on the command line Kevin Wolf
2013-03-14 14:45 ` Eric Blake
2013-03-14 15:00 ` Kevin Wolf
2013-03-12 14:41 ` [Qemu-devel] [PATCH 08/13] qcow2: flush refcount cache correctly in alloc_refcount_block() Kevin Wolf
2013-03-12 14:41 ` [Qemu-devel] [PATCH 09/13] qcow2: flush refcount cache correctly in qcow2_write_snapshots() Kevin Wolf
2013-03-12 14:41 ` [Qemu-devel] [PATCH 10/13] qcow2: set L2 cache dependency in qcow2_alloc_bytes() Kevin Wolf
2013-03-12 14:41 ` [Qemu-devel] [PATCH 11/13] qcow2: flush in qcow2_update_snapshot_refcount() Kevin Wolf
2013-03-12 14:41 ` [Qemu-devel] [PATCH 12/13] qcow2: drop flush in update_cluster_refcount() Kevin Wolf
2013-03-12 14:41 ` [Qemu-devel] [PATCH 13/13] qcow2: drop unnecessary flush in qcow2_update_snapshot_refcount() 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=1363099279-403-6-git-send-email-kwolf@redhat.com \
--to=kwolf@redhat.com \
--cc=anthony@codemonkey.ws \
--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 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).