All of lore.kernel.org
 help / color / mirror / Atom feed
From: Max Reitz <mreitz@redhat.com>
To: qemu-block@nongnu.org
Cc: qemu-devel@nongnu.org, Max Reitz <mreitz@redhat.com>,
	Markus Armbruster <armbru@redhat.com>,
	Eric Blake <eblake@redhat.com>, Kevin Wolf <kwolf@redhat.com>
Subject: [Qemu-devel] [PATCH v5 4/6] block: qobject_is_equal() in bdrv_reopen_prepare()
Date: Sat, 16 Sep 2017 20:51:21 +0200	[thread overview]
Message-ID: <20170916185123.29255-5-mreitz@redhat.com> (raw)
In-Reply-To: <20170916185123.29255-1-mreitz@redhat.com>

Currently, bdrv_reopen_prepare() assumes that all BDS options are
strings. However, this is not the case if the BDS has been created
through the json: pseudo-protocol or blockdev-add.

Note that the user-invokable reopen command is an HMP command, so you
can only specify strings there. Therefore, specifying a non-string
option with the "same" value as it was when originally created will now
return an error because the values are supposedly similar (and there is
no way for the user to circumvent this but to just not specify the
option again -- however, this is still strictly better than just
crashing).

Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Max Reitz <mreitz@redhat.com>
---
 block.c | 29 ++++++++++++++++++-----------
 1 file changed, 18 insertions(+), 11 deletions(-)

diff --git a/block.c b/block.c
index 6dd47e414e..0c16f4dff1 100644
--- a/block.c
+++ b/block.c
@@ -2956,19 +2956,26 @@ int bdrv_reopen_prepare(BDRVReopenState *reopen_state, BlockReopenQueue *queue,
         const QDictEntry *entry = qdict_first(reopen_state->options);
 
         do {
-            QString *new_obj = qobject_to_qstring(entry->value);
-            const char *new = qstring_get_str(new_obj);
+            QObject *new = entry->value;
+            QObject *old = qdict_get(reopen_state->bs->options, entry->key);
+
             /*
-             * 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.
+             * TODO: When using -drive to specify blockdev options, all values
+             * will be strings; however, when using -blockdev, blockdev-add or
+             * filenames using the json:{} pseudo-protocol, they will be
+             * correctly typed.
+             * In contrast, reopening options are (currently) always strings
+             * (because you can only specify them through qemu-io; all other
+             * callers do not specify any options).
+             * Therefore, when using anything other than -drive to create a BDS,
+             * this cannot detect non-string options as unchanged, because
+             * qobject_is_equal() always returns false for objects of different
+             * type.  In the future, this should be remedied by correctly typing
+             * all options.  For now, this is not too big of an issue because
+             * the user can simply omit options which cannot be changed anyway,
+             * so they will stay unchanged.
              */
-            const char *old = qdict_get_try_str(reopen_state->bs->options,
-                                                entry->key);
-
-            if (!old || strcmp(new, old)) {
+            if (!qobject_is_equal(new, old)) {
                 error_setg(errp, "Cannot change the option '%s'", entry->key);
                 ret = -EINVAL;
                 goto error;
-- 
2.13.5

  parent reply	other threads:[~2017-09-16 18:51 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-09-16 18:51 [Qemu-devel] [PATCH v5 0/6] block: Don't compare strings in bdrv_reopen_prepare() Max Reitz
2017-09-16 18:51 ` [Qemu-devel] [PATCH v5 1/6] qapi/qnull: Add own header Max Reitz
2017-09-18 14:05   ` Eric Blake
2017-09-21 11:45   ` [Qemu-devel] [Qemu-block] " Alberto Garcia
2017-10-02 13:13   ` [Qemu-devel] " Markus Armbruster
2017-09-16 18:51 ` [Qemu-devel] [PATCH v5 2/6] qapi/qlist: Add qlist_append_null() macro Max Reitz
2017-09-18 14:08   ` Eric Blake
2017-09-21 11:46   ` [Qemu-devel] [Qemu-block] " Alberto Garcia
2017-10-02 13:13   ` [Qemu-devel] " Markus Armbruster
2017-09-16 18:51 ` [Qemu-devel] [PATCH v5 3/6] qapi: Add qobject_is_equal() Max Reitz
2017-09-18 14:15   ` Eric Blake
2017-09-21 12:03   ` [Qemu-devel] [Qemu-block] " Alberto Garcia
2017-10-02 13:13   ` [Qemu-devel] " Markus Armbruster
2017-09-16 18:51 ` Max Reitz [this message]
2017-09-16 18:51 ` [Qemu-devel] [PATCH v5 5/6] iotests: Add test for non-string option reopening Max Reitz
2017-09-18 14:17   ` Eric Blake
2017-09-16 18:51 ` [Qemu-devel] [PATCH v5 6/6] tests: Add check-qobject for equality tests Max Reitz
2017-09-18 14:25   ` Eric Blake
2017-10-02 13:34   ` Markus Armbruster
2017-10-03 21:19     ` Max Reitz

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=20170916185123.29255-5-mreitz@redhat.com \
    --to=mreitz@redhat.com \
    --cc=armbru@redhat.com \
    --cc=eblake@redhat.com \
    --cc=kwolf@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.