[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v6 01/11] blockdev: abort transactions in reverse or
From: |
John Snow |
Subject: |
[Qemu-devel] [PATCH v6 01/11] blockdev: abort transactions in reverse order |
Date: |
Fri, 21 Dec 2018 04:35:19 -0500 |
Presently, we abort transactions in the same order they were processed in.
Bitmap commands, though, attempt to restore backup data structures on abort.
That's not valid, they need to be aborted in reverse chronological order.
Replace the QSIMPLEQ data structure with a QTAILQ one, so we can iterate
in reverse for the abort phase of the transaction.
Signed-off-by: John Snow <address@hidden>
Reviewed-by: Eric Blake <address@hidden>
Reviewed-by: Vladimir Sementsov-Ogievskiy <address@hidden>
---
blockdev.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/blockdev.c b/blockdev.c
index a6f71f9d83..43e4c22da5 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -1339,7 +1339,7 @@ struct BlkActionState {
const BlkActionOps *ops;
JobTxn *block_job_txn;
TransactionProperties *txn_props;
- QSIMPLEQ_ENTRY(BlkActionState) entry;
+ QTAILQ_ENTRY(BlkActionState) entry;
};
/* internal snapshot private data */
@@ -2266,8 +2266,8 @@ void qmp_transaction(TransactionActionList *dev_list,
BlkActionState *state, *next;
Error *local_err = NULL;
- QSIMPLEQ_HEAD(snap_bdrv_states, BlkActionState) snap_bdrv_states;
- QSIMPLEQ_INIT(&snap_bdrv_states);
+ QTAILQ_HEAD(snap_bdrv_states, BlkActionState) snap_bdrv_states;
+ QTAILQ_INIT(&snap_bdrv_states);
/* Does this transaction get canceled as a group on failure?
* If not, we don't really need to make a JobTxn.
@@ -2298,7 +2298,7 @@ void qmp_transaction(TransactionActionList *dev_list,
state->action = dev_info;
state->block_job_txn = block_job_txn;
state->txn_props = props;
- QSIMPLEQ_INSERT_TAIL(&snap_bdrv_states, state, entry);
+ QTAILQ_INSERT_TAIL(&snap_bdrv_states, state, entry);
state->ops->prepare(state, &local_err);
if (local_err) {
@@ -2307,7 +2307,7 @@ void qmp_transaction(TransactionActionList *dev_list,
}
}
- QSIMPLEQ_FOREACH(state, &snap_bdrv_states, entry) {
+ QTAILQ_FOREACH(state, &snap_bdrv_states, entry) {
if (state->ops->commit) {
state->ops->commit(state);
}
@@ -2318,13 +2318,13 @@ void qmp_transaction(TransactionActionList *dev_list,
delete_and_fail:
/* failure, and it is all-or-none; roll back all operations */
- QSIMPLEQ_FOREACH(state, &snap_bdrv_states, entry) {
+ QTAILQ_FOREACH_REVERSE(state, &snap_bdrv_states, snap_bdrv_states, entry) {
if (state->ops->abort) {
state->ops->abort(state);
}
}
exit:
- QSIMPLEQ_FOREACH_SAFE(state, &snap_bdrv_states, entry, next) {
+ QTAILQ_FOREACH_SAFE(state, &snap_bdrv_states, entry, next) {
if (state->ops->clean) {
state->ops->clean(state);
}
--
2.17.2
- [Qemu-devel] [PATCH v6 00/11] bitmaps: remove x- prefix from QMP api, John Snow, 2018/12/21
- [Qemu-devel] [PATCH v6 01/11] blockdev: abort transactions in reverse order,
John Snow <=
- [Qemu-devel] [PATCH v6 06/11] iotests: add filter_generated_node_ids, John Snow, 2018/12/21
- [Qemu-devel] [PATCH v6 05/11] iotests.py: don't abort if IMGKEYSECRET is undefined, John Snow, 2018/12/21
- [Qemu-devel] [PATCH v6 02/11] block/dirty-bitmap: remove assertion from restore, John Snow, 2018/12/21
- [Qemu-devel] [PATCH v6 07/11] iotests: add qmp recursive sorting function, John Snow, 2018/12/21
- [Qemu-devel] [PATCH v6 08/11] iotests: remove default filters from qmp_log, John Snow, 2018/12/21
- [Qemu-devel] [PATCH v6 03/11] blockdev: n-ary bitmap merge, John Snow, 2018/12/21
- [Qemu-devel] [PATCH v6 04/11] block: remove 'x' prefix from experimental bitmap APIs, John Snow, 2018/12/21
- [Qemu-devel] [PATCH v6 09/11] iotests: change qmp_log filters to expect QMP objects only, John Snow, 2018/12/21