diff mbox

[30/34] block: reopen: Extract QemuOpts for generic block layer options

Message ID 1431105726-3682-31-git-send-email-kwolf@redhat.com
State New
Headers show

Commit Message

Kevin Wolf May 8, 2015, 5:22 p.m. UTC
This patch adds a QemuOpts for generic block layer options to
bdrv_reopen_prepare(). The only two options that exist currently
(node-name and driver) cannot be changed, so the only thing we do is
putting them right back into the QDict so that we check at the end that
they are indeed unchanged.

We will add new options soon that can actually be changed.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 block.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

Comments

Max Reitz May 15, 2015, 6:07 p.m. UTC | #1
On 08.05.2015 19:22, Kevin Wolf wrote:
> This patch adds a QemuOpts for generic block layer options to
> bdrv_reopen_prepare(). The only two options that exist currently
> (node-name and driver) cannot be changed

And I don't suppose we want them to be changed at some point.

(changing node-name doesn't really make sense, because it's not really 
meant for human usage anyway, and tools don't need to change it once 
it's set, they just need a unique name; and I can't think of a useful 
use case for changing the driver)

> , so the only thing we do is
> putting them right back into the QDict so that we check at the end that
> they are indeed unchanged.
>
> We will add new options soon that can actually be changed.
>
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
>   block.c | 24 ++++++++++++++++++++++++
>   1 file changed, 24 insertions(+)

Reviewed-by: Max Reitz <mreitz@redhat.com>
diff mbox

Patch

diff --git a/block.c b/block.c
index d76e385..8faa5ce 100644
--- a/block.c
+++ b/block.c
@@ -1808,11 +1808,34 @@  int bdrv_reopen_prepare(BDRVReopenState *reopen_state, BlockReopenQueue *queue,
     int ret = -1;
     Error *local_err = NULL;
     BlockDriver *drv;
+    QemuOpts *opts;
+    const char *value;
 
     assert(reopen_state != NULL);
     assert(reopen_state->bs->drv != NULL);
     drv = reopen_state->bs->drv;
 
+    /* Process generic block layer options */
+    opts = qemu_opts_create(&bdrv_runtime_opts, NULL, 0, &error_abort);
+    qemu_opts_absorb_qdict(opts, reopen_state->options, &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        ret = -EINVAL;
+        goto error;
+    }
+
+    /* node-name and driver must be unchanged. Put them back into the QDict, so
+     * that they are checked at the end of this function. */
+    value = qemu_opt_get(opts, "node-name");
+    if (value) {
+        qdict_put(reopen_state->options, "node-name", qstring_from_str(value));
+    }
+
+    value = qemu_opt_get(opts, "driver");
+    if (value) {
+        qdict_put(reopen_state->options, "driver", qstring_from_str(value));
+    }
+
     /* if we are to stay read-only, do not allow permission change
      * to r/w */
     if (!(reopen_state->bs->open_flags & BDRV_O_ALLOW_RDWR) &&
@@ -1874,6 +1897,7 @@  int bdrv_reopen_prepare(BDRVReopenState *reopen_state, BlockReopenQueue *queue,
     ret = 0;
 
 error:
+    qemu_opts_del(opts);
     return ret;
 }