[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v5 36/45] block: bdrv_replace_child_bs(): move to external transa
From: |
Vladimir Sementsov-Ogievskiy |
Subject: |
[PATCH v5 36/45] block: bdrv_replace_child_bs(): move to external transaction |
Date: |
Thu, 31 Mar 2022 00:28:53 +0300 |
We'll need this functionality as part of external transaction, so make
the whole function to be transaction action. For this we need to
introduce a transaction action helper: bdrv_drained(), which calls
bdrv_drained_begin() and postpone bdrv_drained_end() to .clean() phase.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@openvz.org>
---
block.c | 42 +++++++++++++++++++-----------
block/block-backend.c | 9 ++++++-
include/block/block-global-state.h | 2 +-
3 files changed, 36 insertions(+), 17 deletions(-)
diff --git a/block.c b/block.c
index 9e1be402e2..4b5b7d8794 100644
--- a/block.c
+++ b/block.c
@@ -5341,32 +5341,44 @@ out:
return ret;
}
+static void bdrv_drained_clean(void *opaque)
+{
+ BlockDriverState *bs = opaque;
+
+ bdrv_drained_end(bs);
+ bdrv_unref(bs);
+}
+
+TransactionActionDrv bdrv_drained_drv = {
+ .clean = bdrv_drained_clean,
+};
+
+/*
+ * Start drained section on @bs, and finish it in .clean action.
+ * Reference to @bs is kept, so @bs can't be removed during transaction.
+ */
+static void bdrv_drained(BlockDriverState *bs, Transaction *tran)
+{
+ bdrv_ref(bs);
+ bdrv_drained_begin(bs);
+ tran_add(tran, &bdrv_drained_drv, bs);
+}
+
/* Not for empty child */
int bdrv_replace_child_bs(BdrvChild *child, BlockDriverState *new_bs,
- Error **errp)
+ Transaction *tran, Error **errp)
{
- int ret;
- Transaction *tran = tran_new();
g_autoptr(GSList) refresh_list = NULL;
BlockDriverState *old_bs = child->bs;
GLOBAL_STATE_CODE();
- bdrv_ref(old_bs);
- bdrv_drained_begin(old_bs);
- bdrv_drained_begin(new_bs);
+ bdrv_drained(old_bs, tran);
+ bdrv_drained(new_bs, tran);
bdrv_replace_child_tran(child, new_bs, &refresh_list, tran);
- ret = bdrv_list_refresh_perms(refresh_list, NULL, tran, errp);
-
- tran_finalize(tran, ret);
-
- bdrv_drained_end(old_bs);
- bdrv_drained_end(new_bs);
- bdrv_unref(old_bs);
-
- return ret;
+ return bdrv_list_refresh_perms(refresh_list, NULL, tran, errp);
}
static void bdrv_delete(BlockDriverState *bs)
diff --git a/block/block-backend.c b/block/block-backend.c
index f5476bb9fc..fa1d810da2 100644
--- a/block/block-backend.c
+++ b/block/block-backend.c
@@ -929,8 +929,15 @@ int blk_insert_bs(BlockBackend *blk, BlockDriverState *bs,
Error **errp)
*/
int blk_replace_bs(BlockBackend *blk, BlockDriverState *new_bs, Error **errp)
{
+ int ret;
+ Transaction *tran = tran_new();
+
GLOBAL_STATE_CODE();
- return bdrv_replace_child_bs(blk->root, new_bs, errp);
+
+ ret = bdrv_replace_child_bs(blk->root, new_bs, tran, errp);
+ tran_finalize(tran, ret);
+
+ return ret;
}
/*
diff --git a/include/block/block-global-state.h
b/include/block/block-global-state.h
index 8527bcad28..fa5f698228 100644
--- a/include/block/block-global-state.h
+++ b/include/block/block-global-state.h
@@ -65,7 +65,7 @@ int bdrv_append(BlockDriverState *bs_new, BlockDriverState
*bs_top,
int bdrv_replace_node(BlockDriverState *from, BlockDriverState *to,
Error **errp);
int bdrv_replace_child_bs(BdrvChild *child, BlockDriverState *new_bs,
- Error **errp);
+ Transaction *tran, Error **errp);
BlockDriverState *bdrv_insert_node(BlockDriverState *bs, QDict *node_options,
int flags, Error **errp);
int bdrv_drop_filter(BlockDriverState *bs, Error **errp);
--
2.35.1
- [PATCH v5 03/45] block/blklogwrites: don't care to remove bs->file child on failure, (continued)
- [PATCH v5 03/45] block/blklogwrites: don't care to remove bs->file child on failure, Vladimir Sementsov-Ogievskiy, 2022/03/30
- [PATCH v5 12/45] Revert "block: Pass BdrvChild ** to replace_child_noperm", Vladimir Sementsov-Ogievskiy, 2022/03/30
- [PATCH v5 15/45] block: refactor bdrv_remove_file_or_backing_child to bdrv_remove_child, Vladimir Sementsov-Ogievskiy, 2022/03/30
- [PATCH v5 19/45] block: refactor bdrv_list_refresh_perms to allow any list of nodes, Vladimir Sementsov-Ogievskiy, 2022/03/30
- [PATCH v5 24/45] blockdev: transactions: rename some things, Vladimir Sementsov-Ogievskiy, 2022/03/30
- [PATCH v5 26/45] blockdev: transaction: refactor handling transaction properties, Vladimir Sementsov-Ogievskiy, 2022/03/30
- [PATCH v5 25/45] blockdev: qmp_transaction: refactor loop to classic for, Vladimir Sementsov-Ogievskiy, 2022/03/30
- [PATCH v5 30/45] block: bdrv_insert_node(): use BDRV_O_NOPERM, Vladimir Sementsov-Ogievskiy, 2022/03/30
- [PATCH v5 33/45] block-backend: blk_root(): drop const specifier on return type, Vladimir Sementsov-Ogievskiy, 2022/03/30
- [PATCH v5 29/45] block: introduce BDRV_O_NOPERM flag, Vladimir Sementsov-Ogievskiy, 2022/03/30
- [PATCH v5 36/45] block: bdrv_replace_child_bs(): move to external transaction,
Vladimir Sementsov-Ogievskiy <=
- [PATCH v5 39/45] block: bdrv_get_xdbg_block_graph(): report export ids, Vladimir Sementsov-Ogievskiy, 2022/03/30
- [PATCH v5 42/45] iotests.py: add VM.qmp_check() helper, Vladimir Sementsov-Ogievskiy, 2022/03/30
- [PATCH v5 43/45] iotests: add filter-insertion, Vladimir Sementsov-Ogievskiy, 2022/03/30
- [PATCH v5 27/45] blockdev: qmp_transaction: drop extra generic layer, Vladimir Sementsov-Ogievskiy, 2022/03/30
- [PATCH v5 44/45] block: bdrv_open_inherit: create BlockBackend only when necessary, Vladimir Sementsov-Ogievskiy, 2022/03/30
- [PATCH v5 32/45] iotests: add blockdev-add-transaction, Vladimir Sementsov-Ogievskiy, 2022/03/30
- [PATCH v5 16/45] block: drop bdrv_detach_child(), Vladimir Sementsov-Ogievskiy, 2022/03/30
- [PATCH v5 34/45] block/export: add blk_by_export_id(), Vladimir Sementsov-Ogievskiy, 2022/03/30