[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v4 09/19] block: Use bdrv_recurse_can_replace()
From: |
Max Reitz |
Subject: |
[PATCH v4 09/19] block: Use bdrv_recurse_can_replace() |
Date: |
Tue, 18 Feb 2020 11:34:44 +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 553ccff216..7efe8f3b03 100644
--- a/block.c
+++ b/block.c
@@ -6273,6 +6273,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)
{
@@ -6297,8 +6308,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 v4 00/19] block: Fix check_to_replace_node(), Max Reitz, 2020/02/18
- [PATCH v4 01/19] blockdev: Allow external snapshots everywhere, Max Reitz, 2020/02/18
- [PATCH v4 02/19] blockdev: Allow resizing everywhere, Max Reitz, 2020/02/18
- [PATCH v4 03/19] block: Drop bdrv_is_first_non_filter(), Max Reitz, 2020/02/18
- [PATCH v4 04/19] iotests: Let 041 use -blockdev for quorum children, Max Reitz, 2020/02/18
- [PATCH v4 05/19] quorum: Fix child permissions, Max Reitz, 2020/02/18
- [PATCH v4 06/19] block: Add bdrv_recurse_can_replace(), Max Reitz, 2020/02/18
- [PATCH v4 07/19] blkverify: Implement .bdrv_recurse_can_replace(), Max Reitz, 2020/02/18
- [PATCH v4 08/19] quorum: Implement .bdrv_recurse_can_replace(), Max Reitz, 2020/02/18
- [PATCH v4 09/19] block: Use bdrv_recurse_can_replace(),
Max Reitz <=
- [PATCH v4 10/19] block: Remove bdrv_recurse_is_first_non_filter(), Max Reitz, 2020/02/18
- [PATCH v4 12/19] quorum: Stop marking it as a filter, Max Reitz, 2020/02/18
- [PATCH v4 11/19] mirror: Double-check immediately before replacing, Max Reitz, 2020/02/18
- [PATCH v4 13/19] iotests: Use complete_and_wait() in 155, Max Reitz, 2020/02/18
- [PATCH v4 14/19] iotests: Add VM.assert_block_path(), Max Reitz, 2020/02/18
- [PATCH v4 16/19] iotests: Resolve TODOs in 041, Max Reitz, 2020/02/18
- [PATCH v4 15/19] iotests/041: Drop superfluous shutdowns, Max Reitz, 2020/02/18
- [PATCH v4 17/19] iotests: Use self.image_len in TestRepairQuorum, Max Reitz, 2020/02/18
- [PATCH v4 18/19] iotests: Add tests for invalid Quorum @replaces, Max Reitz, 2020/02/18