[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 28/34] block: Introduce bs->explicit_options
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] [PATCH 28/34] block: Introduce bs->explicit_options |
Date: |
Fri, 8 May 2015 19:22:00 +0200 |
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>
---
block.c | 20 ++++++++++++++++++--
include/block/block.h | 1 +
include/block/block_int.h | 1 +
3 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/block.c b/block.c
index 9259b42..d76e385 100644
--- a/block.c
+++ b/block.c
@@ -1408,6 +1408,7 @@ static int bdrv_open_inherit(BlockDriverState **pbs,
const char *filename,
if (options == NULL) {
options = qdict_new();
}
+ bs->explicit_options = qdict_clone_shallow(options);
if (child_role) {
bs->inherits_from = parent;
@@ -1559,6 +1560,7 @@ fail:
if (file != NULL) {
bdrv_unref(file);
}
+ QDECREF(bs->explicit_options);
QDECREF(bs->options);
QDECREF(options);
bs->options = NULL;
@@ -1634,7 +1636,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);
@@ -1649,11 +1651,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);
+ qdict_join(options, old_options, false);
+ QDECREF(old_options);
+
+ explicit_options = qdict_clone_shallow(options);
+
/* Inherit from parent node */
if (parent_options) {
assert(!flags);
@@ -1692,6 +1701,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;
@@ -1886,6 +1896,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);
@@ -1909,6 +1922,8 @@ void bdrv_reopen_abort(BDRVReopenState *reopen_state)
if (drv->bdrv_reopen_abort) {
drv->bdrv_reopen_abort(reopen_state);
}
+
+ QDECREF(reopen_state->explicit_options);
}
@@ -1952,6 +1967,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 1287013..08bd0fe 100644
--- a/include/block/block.h
+++ b/include/block/block.h
@@ -147,6 +147,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 1cae8d4..a2e96bb 100644
--- a/include/block/block_int.h
+++ b/include/block/block_int.h
@@ -443,6 +443,7 @@ struct BlockDriverState {
QLIST_HEAD(, BdrvChild) children;
QDict *options;
+ QDict *explicit_options;
BlockdevDetectZeroesOptions detect_zeroes;
/* The error object in use for blocking operations on backing_hd */
--
1.8.3.1
- Re: [Qemu-devel] [PATCH 23/34] block: Pass driver-specific options to .bdrv_refresh_filename(), (continued)
- [Qemu-devel] [PATCH 25/34] block: Allow specifying child options in reopen, Kevin Wolf, 2015/05/08
- [Qemu-devel] [PATCH 26/34] block: reopen: Document option precedence and refactor accordingly, Kevin Wolf, 2015/05/08
- [Qemu-devel] [PATCH 24/34] block: Keep "driver" in bs->options, Kevin Wolf, 2015/05/08
- [Qemu-devel] [PATCH 27/34] block: Add infrastructure for option inheritance, Kevin Wolf, 2015/05/08
- [Qemu-devel] [PATCH 28/34] block: Introduce bs->explicit_options,
Kevin Wolf <=
- [Qemu-devel] [PATCH 29/34] qemu-iotests: Remove cache mode test without medium, Kevin Wolf, 2015/05/08
- [Qemu-devel] [PATCH 30/34] block: reopen: Extract QemuOpts for generic block layer options, Kevin Wolf, 2015/05/08
- [Qemu-devel] [PATCH 31/34] block: Move cache options into options QDict, Kevin Wolf, 2015/05/08
- [Qemu-devel] [PATCH 32/34] qemu-iotests: Try setting cache mode for children, Kevin Wolf, 2015/05/08