[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC PATCH v2 05/12] block: Add 'keep_old_opts' parameter t
From: |
Alberto Garcia |
Subject: |
[Qemu-devel] [RFC PATCH v2 05/12] block: Add 'keep_old_opts' parameter to bdrv_reopen_queue() |
Date: |
Fri, 30 Nov 2018 17:17:43 +0200 |
The bdrv_reopen_queue() function is used to create a queue with
the BDSs that are going to be reopened and their new options. Once
the queue is ready bdrv_reopen_multiple() is called to perform the
operation.
The original options from each one of the BDSs are kept, with the new
options passed to bdrv_reopen_queue() applied on top of them.
For "x-blockdev-reopen" we want a function that behaves much like
"blockdev-add". We want to ignore the previous set of options so that
only the ones actually specified by the user are applied, with the
rest having their default values.
One of the things that we need is a way to tell bdrv_reopen_queue()
whether we want to keep the old set of options or not, and that's what
this patch does. All current callers are setting this new parameter to
true and x-blockdev-reopen will set it to false.
Signed-off-by: Alberto Garcia <address@hidden>
---
block.c | 34 +++++++++++++++++++---------------
block/replication.c | 4 ++--
include/block/block.h | 3 ++-
qemu-io-cmds.c | 2 +-
4 files changed, 24 insertions(+), 19 deletions(-)
diff --git a/block.c b/block.c
index 4f55fb339a..da4e062178 100644
--- a/block.c
+++ b/block.c
@@ -2935,7 +2935,8 @@ static BlockReopenQueue
*bdrv_reopen_queue_child(BlockReopenQueue *bs_queue,
QDict *options,
const BdrvChildRole *role,
QDict *parent_options,
- int parent_flags)
+ int parent_flags,
+ bool keep_old_opts)
{
assert(bs != NULL);
@@ -2975,13 +2976,13 @@ static BlockReopenQueue
*bdrv_reopen_queue_child(BlockReopenQueue *bs_queue,
*/
/* Old explicitly set values (don't overwrite by inherited value) */
- if (bs_entry) {
- old_options = qdict_clone_shallow(bs_entry->state.explicit_options);
- } else {
- old_options = qdict_clone_shallow(bs->explicit_options);
+ if (bs_entry || keep_old_opts) {
+ old_options = qdict_clone_shallow(bs_entry ?
+ bs_entry->state.explicit_options :
+ bs->explicit_options);
+ bdrv_join_options(bs, options, old_options);
+ qobject_unref(old_options);
}
- bdrv_join_options(bs, options, old_options);
- qobject_unref(old_options);
explicit_options = qdict_clone_shallow(options);
@@ -2993,10 +2994,12 @@ static BlockReopenQueue
*bdrv_reopen_queue_child(BlockReopenQueue *bs_queue,
flags = bdrv_get_flags(bs);
}
- /* Old values are used for options that aren't set yet */
- old_options = qdict_clone_shallow(bs->options);
- bdrv_join_options(bs, options, old_options);
- qobject_unref(old_options);
+ if (keep_old_opts) {
+ /* Old values are used for options that aren't set yet */
+ old_options = qdict_clone_shallow(bs->options);
+ bdrv_join_options(bs, options, old_options);
+ qobject_unref(old_options);
+ }
/* We have the final set of options so let's update the flags */
options_copy = qdict_clone_shallow(options);
@@ -3046,7 +3049,7 @@ static BlockReopenQueue
*bdrv_reopen_queue_child(BlockReopenQueue *bs_queue,
g_free(child_key_dot);
bdrv_reopen_queue_child(bs_queue, child->bs, new_child_options,
- child->role, options, flags);
+ child->role, options, flags, keep_old_opts);
}
return bs_queue;
@@ -3054,9 +3057,10 @@ static BlockReopenQueue
*bdrv_reopen_queue_child(BlockReopenQueue *bs_queue,
BlockReopenQueue *bdrv_reopen_queue(BlockReopenQueue *bs_queue,
BlockDriverState *bs,
- QDict *options)
+ QDict *options, bool keep_old_opts)
{
- return bdrv_reopen_queue_child(bs_queue, bs, options, NULL, NULL, 0);
+ return bdrv_reopen_queue_child(bs_queue, bs, options, NULL, NULL, 0,
+ keep_old_opts);
}
/*
@@ -3128,7 +3132,7 @@ int bdrv_reopen_set_read_only(BlockDriverState *bs, bool
read_only,
qdict_put_bool(opts, BDRV_OPT_READ_ONLY, read_only);
bdrv_subtree_drained_begin(bs);
- queue = bdrv_reopen_queue(NULL, bs, opts);
+ queue = bdrv_reopen_queue(NULL, bs, opts, true);
ret = bdrv_reopen_multiple(bdrv_get_aio_context(bs), queue, errp);
bdrv_subtree_drained_end(bs);
diff --git a/block/replication.c b/block/replication.c
index fdbfe47fa4..027cc02542 100644
--- a/block/replication.c
+++ b/block/replication.c
@@ -396,14 +396,14 @@ static void reopen_backing_file(BlockDriverState *bs,
bool writable,
QDict *opts = qdict_new();
qdict_put_bool(opts, BDRV_OPT_READ_ONLY, !writable);
reopen_queue = bdrv_reopen_queue(reopen_queue, s->hidden_disk->bs,
- opts);
+ opts, true);
}
if (s->orig_secondary_read_only) {
QDict *opts = qdict_new();
qdict_put_bool(opts, BDRV_OPT_READ_ONLY, !writable);
reopen_queue = bdrv_reopen_queue(reopen_queue, s->secondary_disk->bs,
- opts);
+ opts, true);
}
if (reopen_queue) {
diff --git a/include/block/block.h b/include/block/block.h
index 6f10a8fcfc..a061ef3944 100644
--- a/include/block/block.h
+++ b/include/block/block.h
@@ -299,7 +299,8 @@ BlockDriverState *bdrv_open(const char *filename, const
char *reference,
BlockDriverState *bdrv_new_open_driver(BlockDriver *drv, const char *node_name,
int flags, Error **errp);
BlockReopenQueue *bdrv_reopen_queue(BlockReopenQueue *bs_queue,
- BlockDriverState *bs, QDict *options);
+ BlockDriverState *bs, QDict *options,
+ bool keep_old_opts);
int bdrv_reopen_multiple(AioContext *ctx, BlockReopenQueue *bs_queue, Error
**errp);
int bdrv_reopen_set_read_only(BlockDriverState *bs, bool read_only,
Error **errp);
diff --git a/qemu-io-cmds.c b/qemu-io-cmds.c
index 2c39124036..db8887205e 100644
--- a/qemu-io-cmds.c
+++ b/qemu-io-cmds.c
@@ -2075,7 +2075,7 @@ static int reopen_f(BlockBackend *blk, int argc, char
**argv)
}
bdrv_subtree_drained_begin(bs);
- brq = bdrv_reopen_queue(NULL, bs, opts);
+ brq = bdrv_reopen_queue(NULL, bs, opts, true);
bdrv_reopen_multiple(bdrv_get_aio_context(bs), brq, &local_err);
bdrv_subtree_drained_end(bs);
--
2.11.0
- [Qemu-devel] [RFC PATCH v2 00/12] Add a 'x-blockdev-reopen' QMP command, Alberto Garcia, 2018/11/30
- [Qemu-devel] [RFC PATCH v2 06/12] block: Handle child references in bdrv_reopen_queue(), Alberto Garcia, 2018/11/30
- [Qemu-devel] [RFC PATCH v2 02/12] block: Freeze the backing chain for the duration of the commit job, Alberto Garcia, 2018/11/30
- [Qemu-devel] [RFC PATCH v2 08/12] block: Allow changing the backing file on reopen, Alberto Garcia, 2018/11/30
- [Qemu-devel] [RFC PATCH v2 07/12] block: Allow omitting the 'backing' option in certain cases, Alberto Garcia, 2018/11/30
- [Qemu-devel] [RFC PATCH v2 05/12] block: Add 'keep_old_opts' parameter to bdrv_reopen_queue(),
Alberto Garcia <=
- [Qemu-devel] [RFC PATCH v2 11/12] block: Add an 'x-blockdev-reopen' QMP command, Alberto Garcia, 2018/11/30
- [Qemu-devel] [RFC PATCH v2 04/12] block: Freeze the backing chain for the duration of the stream job, Alberto Garcia, 2018/11/30
- [Qemu-devel] [RFC PATCH v2 01/12] block: Allow freezing BdrvChild links, Alberto Garcia, 2018/11/30
- [Qemu-devel] [RFC PATCH v2 03/12] block: Freeze the backing chain for the duration of the mirror job, Alberto Garcia, 2018/11/30
- [Qemu-devel] [RFC PATCH v2 09/12] block: Add 'runtime_opts' and 'mutable_opts' fields to BlockDriver, Alberto Garcia, 2018/11/30
- [Qemu-devel] [RFC PATCH v2 10/12] block: Add bdrv_reset_options_allowed(), Alberto Garcia, 2018/11/30
- [Qemu-devel] [RFC PATCH v2 12/12] qemu-iotests: Test the x-blockdev-reopen QMP command, Alberto Garcia, 2018/11/30