diff options
author | Kevin Wolf <kwolf@redhat.com> | 2025-02-04 22:14:00 +0100 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2025-02-06 14:26:51 +0100 |
commit | c1c5c7cc4ef6c45ca769c640566fd40d2cb7d5c1 (patch) | |
tree | 60cb1cd4b307899332df44a8e38f3c4e1fcd42d5 | |
parent | 8cd37207f8a90c5f995283ecf95f1cb5f7518a77 (diff) | |
download | qemu-c1c5c7cc4ef6c45ca769c640566fd40d2cb7d5c1.zip qemu-c1c5c7cc4ef6c45ca769c640566fd40d2cb7d5c1.tar.gz qemu-c1c5c7cc4ef6c45ca769c640566fd40d2cb7d5c1.tar.bz2 |
block: Support inactive nodes in blk_insert_bs()
Device models have a relatively complex way to set up their block
backends, in which blk_attach_dev() sets blk->disable_perm = true.
We want to support inactive images in exports, too, so that
qemu-storage-daemon can be used with migration. Because they don't use
blk_attach_dev(), they need another way to set this flag. The most
convenient is to do this automatically when an inactive node is attached
to a BlockBackend that can be inactivated.
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Acked-by: Fabiano Rosas <farosas@suse.de>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Message-ID: <20250204211407.381505-10-kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
-rw-r--r-- | block/block-backend.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/block/block-backend.c b/block/block-backend.c index cc6f58a..9288f7e 100644 --- a/block/block-backend.c +++ b/block/block-backend.c @@ -900,14 +900,24 @@ void blk_remove_bs(BlockBackend *blk) int blk_insert_bs(BlockBackend *blk, BlockDriverState *bs, Error **errp) { ThrottleGroupMember *tgm = &blk->public.throttle_group_member; + uint64_t perm, shared_perm; GLOBAL_STATE_CODE(); bdrv_ref(bs); bdrv_graph_wrlock(); + + if ((bs->open_flags & BDRV_O_INACTIVE) && blk_can_inactivate(blk)) { + blk->disable_perm = true; + perm = 0; + shared_perm = BLK_PERM_ALL; + } else { + perm = blk->perm; + shared_perm = blk->shared_perm; + } + blk->root = bdrv_root_attach_child(bs, "root", &child_root, BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY, - blk->perm, blk->shared_perm, - blk, errp); + perm, shared_perm, blk, errp); bdrv_graph_wrunlock(); if (blk->root == NULL) { return -EPERM; |