[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 1/9] block: Allow inactivating already inactive nodes
From: |
Kevin Wolf |
Subject: |
[PATCH 1/9] block: Allow inactivating already inactive nodes |
Date: |
Wed, 22 Jan 2025 12:50:38 +0100 |
What we wanted to catch with the assertion is cases where the recursion
finds that a child was inactive before its parent. This should never
happen. But if the user tries to inactivate an image that is already
inactive, that's harmless and we don't want to fail the assertion.
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
block.c | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
diff --git a/block.c b/block.c
index f60606f242..43ed632a7a 100644
--- a/block.c
+++ b/block.c
@@ -6955,7 +6955,8 @@ bdrv_has_bds_parent(BlockDriverState *bs, bool
only_active)
return false;
}
-static int GRAPH_RDLOCK bdrv_inactivate_recurse(BlockDriverState *bs)
+static int GRAPH_RDLOCK
+bdrv_inactivate_recurse(BlockDriverState *bs, bool top_level)
{
BdrvChild *child, *parent;
int ret;
@@ -6973,7 +6974,14 @@ static int GRAPH_RDLOCK
bdrv_inactivate_recurse(BlockDriverState *bs)
return 0;
}
- assert(!(bs->open_flags & BDRV_O_INACTIVE));
+ /*
+ * Inactivating an already inactive node on user request is harmless, but
if
+ * a child is already inactive before its parent, that's bad.
+ */
+ if (bs->open_flags & BDRV_O_INACTIVE) {
+ assert(top_level);
+ return 0;
+ }
/* Inactivate this node */
if (bs->drv->bdrv_inactivate) {
@@ -7010,7 +7018,7 @@ static int GRAPH_RDLOCK
bdrv_inactivate_recurse(BlockDriverState *bs)
/* Recursively inactivate children */
QLIST_FOREACH(child, &bs->children, next) {
- ret = bdrv_inactivate_recurse(child->bs);
+ ret = bdrv_inactivate_recurse(child->bs, false);
if (ret < 0) {
return ret;
}
@@ -7035,7 +7043,7 @@ int bdrv_inactivate_all(void)
if (bdrv_has_bds_parent(bs, false)) {
continue;
}
- ret = bdrv_inactivate_recurse(bs);
+ ret = bdrv_inactivate_recurse(bs, true);
if (ret < 0) {
bdrv_next_cleanup(&it);
break;
--
2.48.1
- [PATCH 4/9] block/export: Don't ignore image activation error in blk_exp_add(), (continued)
- [PATCH 4/9] block/export: Don't ignore image activation error in blk_exp_add(), Kevin Wolf, 2025/01/22
- [PATCH 3/9] block: Support inactive nodes in blk_insert_bs(), Kevin Wolf, 2025/01/22
- [PATCH 2/9] block: Add option to create inactive nodes, Kevin Wolf, 2025/01/22
- [PATCH 6/9] nbd/server: Support inactive nodes, Kevin Wolf, 2025/01/22
- [PATCH 7/9] block: Add blockdev-set-active QMP command, Kevin Wolf, 2025/01/22
- [PATCH 8/9] iotests: Add filter_qtest(), Kevin Wolf, 2025/01/22
- [PATCH 9/9] iotests: Add qsd-migrate case, Kevin Wolf, 2025/01/22
- [PATCH 1/9] block: Allow inactivating already inactive nodes,
Kevin Wolf <=
- [PATCH 5/9] block/export: Add option to allow export of inactive nodes, Kevin Wolf, 2025/01/22
- Re: [PATCH 0/9] block: Managing inactive nodes (QSD migration), Eric Blake, 2025/01/30