[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v3 11/21] block: Use bdrv_recurse_can_replace()
From: |
Max Reitz |
Subject: |
[PATCH v3 11/21] block: Use bdrv_recurse_can_replace() |
Date: |
Thu, 30 Jan 2020 22:44:21 +0100 |
Let check_to_replace_node() use the more specialized
bdrv_recurse_can_replace() instead of
bdrv_recurse_is_first_non_filter(), which is too restrictive (or, in the
case of quorum, sometimes not restrictive enough).
Signed-off-by: Max Reitz <address@hidden>
Reviewed-by: Vladimir Sementsov-Ogievskiy <address@hidden>
---
block.c | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/block.c b/block.c
index 6623248443..67844ad5ac 100644
--- a/block.c
+++ b/block.c
@@ -6250,6 +6250,17 @@ bool bdrv_recurse_can_replace(BlockDriverState *bs,
return false;
}
+/*
+ * Check whether the given @node_name can be replaced by a node that
+ * has the same data as @parent_bs. If so, return @node_name's BDS;
+ * NULL otherwise.
+ *
+ * @node_name must be a (recursive) *child of @parent_bs (or this
+ * function will return NULL).
+ *
+ * The result (whether the node can be replaced or not) is only valid
+ * for as long as no graph or permission changes occur.
+ */
BlockDriverState *check_to_replace_node(BlockDriverState *parent_bs,
const char *node_name, Error **errp)
{
@@ -6274,8 +6285,11 @@ BlockDriverState *check_to_replace_node(BlockDriverState
*parent_bs,
* Another benefit is that this tests exclude backing files which are
* blocked by the backing blockers.
*/
- if (!bdrv_recurse_is_first_non_filter(parent_bs, to_replace_bs)) {
- error_setg(errp, "Only top most non filter can be replaced");
+ if (!bdrv_recurse_can_replace(parent_bs, to_replace_bs)) {
+ error_setg(errp, "Cannot replace '%s' by a node mirrored from '%s', "
+ "because it cannot be guaranteed that doing so would not "
+ "lead to an abrupt change of visible data",
+ node_name, parent_bs->node_name);
to_replace_bs = NULL;
goto out;
}
--
2.24.1
- [PATCH v3 01/21] blockdev: Allow external snapshots everywhere, (continued)
- [PATCH v3 01/21] blockdev: Allow external snapshots everywhere, Max Reitz, 2020/01/30
- [PATCH v3 02/21] blockdev: Allow resizing everywhere, Max Reitz, 2020/01/30
- [PATCH v3 04/21] iotests: Let 041 use -blockdev for quorum children, Max Reitz, 2020/01/30
- [PATCH v3 03/21] block: Drop bdrv_is_first_non_filter(), Max Reitz, 2020/01/30
- [PATCH v3 05/21] quorum: Fix child permissions, Max Reitz, 2020/01/30
- [PATCH v3 06/21] block: Add bdrv_recurse_can_replace(), Max Reitz, 2020/01/30
- [PATCH v3 07/21] blkverify: Implement .bdrv_recurse_can_replace(), Max Reitz, 2020/01/30
- [PATCH v3 09/21] quorum: Add QuorumChild.to_be_replaced, Max Reitz, 2020/01/30
- [PATCH v3 08/21] quorum: Store children in own structure, Max Reitz, 2020/01/30
- [PATCH v3 10/21] quorum: Implement .bdrv_recurse_can_replace(), Max Reitz, 2020/01/30
- [PATCH v3 11/21] block: Use bdrv_recurse_can_replace(),
Max Reitz <=
- [PATCH v3 12/21] block: Remove bdrv_recurse_is_first_non_filter(), Max Reitz, 2020/01/30
- [PATCH v3 13/21] mirror: Double-check immediately before replacing, Max Reitz, 2020/01/30
- [PATCH v3 14/21] quorum: Stop marking it as a filter, Max Reitz, 2020/01/30
- [PATCH v3 16/21] iotests: Add VM.assert_block_path(), Max Reitz, 2020/01/30
- [PATCH v3 18/21] iotests: Resolve TODOs in 041, Max Reitz, 2020/01/30
- [PATCH v3 15/21] iotests: Use complete_and_wait() in 155, Max Reitz, 2020/01/30
- [PATCH v3 17/21] iotests/041: Drop superfluous shutdowns, Max Reitz, 2020/01/30
- [PATCH v3 19/21] iotests: Use self.image_len in TestRepairQuorum, Max Reitz, 2020/01/30
- [PATCH v3 20/21] iotests: Add tests for invalid Quorum @replaces, Max Reitz, 2020/01/30
- [PATCH v3 21/21] iotests: Check that @replaces can replace filters, Max Reitz, 2020/01/30