[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 13/21] block: Introduce bs->explicit_options
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] [PATCH v3 13/21] block: Introduce bs->explicit_options |
Date: |
Fri, 4 Dec 2015 14:35:16 +0100 |
bs->options doesn't only contain options that the user explicitly
requested, but also option that were derived from flags, the filename or
inherited from the parent node.
For reopen, it is important to know the difference because reopening the
parent can change inherited values in child nodes, but it shouldn't
change any options that were explicitly specified for the child.
Signed-off-by: Kevin Wolf <address@hidden>
Reviewed-by: Max Reitz <address@hidden>
---
block.c | 24 ++++++++++++++++++++++--
include/block/block.h | 1 +
include/block/block_int.h | 1 +
3 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/block.c b/block.c
index 8ac1669..2dd2830 100644
--- a/block.c
+++ b/block.c
@@ -1495,12 +1495,15 @@ static int bdrv_open_inherit(BlockDriverState **pbs,
const char *filename,
options = qdict_new();
}
+ /* json: syntax counts as explicit options, as if in the QDict */
parse_json_protocol(options, &filename, &local_err);
if (local_err) {
ret = -EINVAL;
goto fail;
}
+ bs->explicit_options = qdict_clone_shallow(options);
+
if (child_role) {
bs->inherits_from = parent;
child_role->inherit_options(&flags, options,
@@ -1655,6 +1658,7 @@ fail:
if (file != NULL) {
bdrv_unref_child(bs, file);
}
+ QDECREF(bs->explicit_options);
QDECREF(bs->options);
QDECREF(options);
bs->options = NULL;
@@ -1729,7 +1733,7 @@ static BlockReopenQueue
*bdrv_reopen_queue_child(BlockReopenQueue *bs_queue,
BlockReopenQueueEntry *bs_entry;
BdrvChild *child;
- QDict *old_options;
+ QDict *old_options, *explicit_options;
if (bs_queue == NULL) {
bs_queue = g_new0(BlockReopenQueue, 1);
@@ -1744,11 +1748,18 @@ static BlockReopenQueue
*bdrv_reopen_queue_child(BlockReopenQueue *bs_queue,
* Precedence of options:
* 1. Explicitly passed in options (highest)
* 2. TODO Set in flags (only for top level)
- * 3. TODO Retained from explicitly set options of bs
+ * 3. Retained from explicitly set options of bs
* 4. Inherited from parent node
* 5. Retained from effective options of bs
*/
+ /* Old explicitly set values (don't overwrite by inherited value) */
+ old_options = qdict_clone_shallow(bs->explicit_options);
+ bdrv_join_options(bs, options, old_options);
+ QDECREF(old_options);
+
+ explicit_options = qdict_clone_shallow(options);
+
/* Inherit from parent node */
if (parent_options) {
assert(!flags);
@@ -1787,6 +1798,7 @@ static BlockReopenQueue
*bdrv_reopen_queue_child(BlockReopenQueue *bs_queue,
bs_entry->state.bs = bs;
bs_entry->state.options = options;
+ bs_entry->state.explicit_options = explicit_options;
bs_entry->state.flags = flags;
return bs_queue;
@@ -1846,6 +1858,8 @@ cleanup:
QSIMPLEQ_FOREACH_SAFE(bs_entry, bs_queue, entry, next) {
if (ret && bs_entry->prepared) {
bdrv_reopen_abort(&bs_entry->state);
+ } else if (ret) {
+ QDECREF(bs_entry->state.explicit_options);
}
QDECREF(bs_entry->state.options);
g_free(bs_entry);
@@ -1980,6 +1994,9 @@ void bdrv_reopen_commit(BDRVReopenState *reopen_state)
}
/* set BDS specific flags now */
+ QDECREF(reopen_state->bs->explicit_options);
+
+ reopen_state->bs->explicit_options = reopen_state->explicit_options;
reopen_state->bs->open_flags = reopen_state->flags;
reopen_state->bs->enable_write_cache = !!(reopen_state->flags &
BDRV_O_CACHE_WB);
@@ -2003,6 +2020,8 @@ void bdrv_reopen_abort(BDRVReopenState *reopen_state)
if (drv->bdrv_reopen_abort) {
drv->bdrv_reopen_abort(reopen_state);
}
+
+ QDECREF(reopen_state->explicit_options);
}
@@ -2061,6 +2080,7 @@ void bdrv_close(BlockDriverState *bs)
bs->sg = 0;
bs->zero_beyond_eof = false;
QDECREF(bs->options);
+ QDECREF(bs->explicit_options);
bs->options = NULL;
QDECREF(bs->full_open_options);
bs->full_open_options = NULL;
diff --git a/include/block/block.h b/include/block/block.h
index 589be29..17557c3 100644
--- a/include/block/block.h
+++ b/include/block/block.h
@@ -150,6 +150,7 @@ typedef struct BDRVReopenState {
BlockDriverState *bs;
int flags;
QDict *options;
+ QDict *explicit_options;
void *opaque;
} BDRVReopenState;
diff --git a/include/block/block_int.h b/include/block/block_int.h
index 04daa55..6d7bd3b 100644
--- a/include/block/block_int.h
+++ b/include/block/block_int.h
@@ -459,6 +459,7 @@ struct BlockDriverState {
QLIST_HEAD(, BdrvChild) parents;
QDict *options;
+ QDict *explicit_options;
BlockdevDetectZeroesOptions detect_zeroes;
/* The error object in use for blocking operations on backing_hd */
--
1.8.3.1
- [Qemu-devel] [PATCH v3 06/21] block: Exclude nested options only for children in append_open_options(), (continued)
- [Qemu-devel] [PATCH v3 06/21] block: Exclude nested options only for children in append_open_options(), Kevin Wolf, 2015/12/04
- [Qemu-devel] [PATCH v3 04/21] block: Allow references for backing files, Kevin Wolf, 2015/12/04
- [Qemu-devel] [PATCH v3 07/21] block: Pass driver-specific options to .bdrv_refresh_filename(), Kevin Wolf, 2015/12/04
- [Qemu-devel] [PATCH v3 05/21] block: Consider all block layer options in append_open_options, Kevin Wolf, 2015/12/04
- [Qemu-devel] [PATCH v3 09/21] block: Allow specifying child options in reopen, Kevin Wolf, 2015/12/04
- [Qemu-devel] [PATCH v3 08/21] block: Keep "driver" in bs->options, Kevin Wolf, 2015/12/04
- [Qemu-devel] [PATCH v3 10/21] block: reopen: Document option precedence and refactor accordingly, Kevin Wolf, 2015/12/04
- [Qemu-devel] [PATCH v3 11/21] block: Add infrastructure for option inheritance, Kevin Wolf, 2015/12/04
- [Qemu-devel] [PATCH v3 13/21] block: Introduce bs->explicit_options,
Kevin Wolf <=
- [Qemu-devel] [PATCH v3 14/21] blockdev: Set 'format' indicates non-empty drive, Kevin Wolf, 2015/12/04
- [Qemu-devel] [PATCH v3 15/21] qemu-iotests: Remove cache mode test without medium, Kevin Wolf, 2015/12/04
- [Qemu-devel] [PATCH v3 12/21] block: Split out parse_json_protocol(), Kevin Wolf, 2015/12/04
- [Qemu-devel] [PATCH v3 18/21] blkdebug: Enable reopen, Kevin Wolf, 2015/12/04
- [Qemu-devel] [PATCH v3 16/21] block: reopen: Extract QemuOpts for generic block layer options, Kevin Wolf, 2015/12/04
- [Qemu-devel] [PATCH v3 17/21] block: Move cache options into options QDict, Kevin Wolf, 2015/12/04
- [Qemu-devel] [PATCH v3 21/21] qemu-iotests: Test reopen with node-name/driver options, Kevin Wolf, 2015/12/04
- [Qemu-devel] [PATCH v3 19/21] qemu-iotests: Try setting cache mode for children, Kevin Wolf, 2015/12/04