[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 5/7] block: Don't queue the same BDS twice in bdr
From: |
Alberto Garcia |
Subject: |
[Qemu-devel] [PATCH v2 5/7] block: Don't queue the same BDS twice in bdrv_reopen_queue_child() |
Date: |
Thu, 15 Sep 2016 17:53:03 +0300 |
bdrv_reopen_queue_child() assumes that a BlockDriverState is never
added twice to BlockReopenQueue.
That's however not the case: commit_start() adds 'base' (and its
children) to a new reopen queue, and then 'overlay_bs' (and its
children, which include 'base') to the same queue. The effect of this
is that the first set of options is ignored and overriden by the
second.
We fixed this by swapping the order in which both BDSs were added to
the queue in 3db2bd5508c86a1605258bc77c9672d93b5c350e. This patch
checks if a BDS is already in the reopen queue and keeps its options.
Signed-off-by: Alberto Garcia <address@hidden>
Reviewed-by: Kevin Wolf <address@hidden>
---
block.c | 22 +++++++++++++++++++---
1 file changed, 19 insertions(+), 3 deletions(-)
diff --git a/block.c b/block.c
index 663104e..1e9d66b 100644
--- a/block.c
+++ b/block.c
@@ -1877,6 +1877,13 @@ static BlockReopenQueue
*bdrv_reopen_queue_child(BlockReopenQueue *bs_queue,
options = qdict_new();
}
+ /* Check if this BlockDriverState is already in the queue */
+ QSIMPLEQ_FOREACH(bs_entry, bs_queue, entry) {
+ if (bs == bs_entry->state.bs) {
+ break;
+ }
+ }
+
/*
* Precedence of options:
* 1. Explicitly passed in options (highest)
@@ -1897,7 +1904,11 @@ static BlockReopenQueue
*bdrv_reopen_queue_child(BlockReopenQueue *bs_queue,
}
/* Old explicitly set values (don't overwrite by inherited value) */
- old_options = qdict_clone_shallow(bs->explicit_options);
+ if (bs_entry) {
+ old_options = qdict_clone_shallow(bs_entry->state.explicit_options);
+ } else {
+ old_options = qdict_clone_shallow(bs->explicit_options);
+ }
bdrv_join_options(bs, options, old_options);
QDECREF(old_options);
@@ -1936,8 +1947,13 @@ static BlockReopenQueue
*bdrv_reopen_queue_child(BlockReopenQueue *bs_queue,
child->role, options, flags);
}
- bs_entry = g_new0(BlockReopenQueueEntry, 1);
- QSIMPLEQ_INSERT_TAIL(bs_queue, bs_entry, entry);
+ if (!bs_entry) {
+ bs_entry = g_new0(BlockReopenQueueEntry, 1);
+ QSIMPLEQ_INSERT_TAIL(bs_queue, bs_entry, entry);
+ } else {
+ QDECREF(bs_entry->state.options);
+ QDECREF(bs_entry->state.explicit_options);
+ }
bs_entry->state.bs = bs;
bs_entry->state.options = options;
--
2.9.3
- [Qemu-devel] [PATCH v2 0/7] Add "read-only" to the options QDict, Alberto Garcia, 2016/09/15
- [Qemu-devel] [PATCH v2 1/7] block: Remove bdrv_is_snapshot, Alberto Garcia, 2016/09/15
- [Qemu-devel] [PATCH v2 2/7] block: Set BDRV_O_ALLOW_RDWR and snapshot_options before storing the flags, Alberto Garcia, 2016/09/15
- [Qemu-devel] [PATCH v2 6/7] commit: Add 'base' to the reopen queue before 'overlay_bs', Alberto Garcia, 2016/09/15
- [Qemu-devel] [PATCH v2 5/7] block: Don't queue the same BDS twice in bdrv_reopen_queue_child(),
Alberto Garcia <=
- [Qemu-devel] [PATCH v2 7/7] block: rename "read-only" to BDRV_OPT_READ_ONLY, Alberto Garcia, 2016/09/15
- [Qemu-devel] [PATCH v2 3/7] block: Update bs->open_flags earlier in bdrv_open_common(), Alberto Garcia, 2016/09/15
- [Qemu-devel] [PATCH v2 4/7] block: Add "read-only" to the options QDict, Alberto Garcia, 2016/09/15
- Re: [Qemu-devel] [PATCH v2 0/7] Add "read-only" to the options QDict, Kevin Wolf, 2016/09/16