diff options
author | Fiona Ebner <f.ebner@proxmox.com> | 2025-05-30 17:10:53 +0200 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2025-06-04 18:16:34 +0200 |
commit | d75f8ed1d7fc27cf1643e549cd006a68d3bf6ef1 (patch) | |
tree | 03576a4b9840eaa0a78a2ceafd85236e02a0d7bb | |
parent | b13f54654546cbc0661d3fe9d25f7543535c2bee (diff) | |
download | qemu-d75f8ed1d7fc27cf1643e549cd006a68d3bf6ef1.zip qemu-d75f8ed1d7fc27cf1643e549cd006a68d3bf6ef1.tar.gz qemu-d75f8ed1d7fc27cf1643e549cd006a68d3bf6ef1.tar.bz2 |
block: move drain outside of quorum_del_child()
The quorum_del_child() callback runs under the graph lock, so it is
not allowed to drain. It is only called as the .bdrv_del_child()
callback, which is only called in the bdrv_del_child() function, which
also runs under the graph lock.
The bdrv_del_child() function is called by qmp_x_blockdev_change().
A drained section was already introduced there by commit "block: move
drain out of quorum_add_child()".
This finally finishes moving out the drain to places that are not
under the graph lock started in "block: move draining out of
bdrv_change_aio_context() and mark GRAPH_RDLOCK".
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
Message-ID: <20250530151125.955508-17-f.ebner@proxmox.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
-rw-r--r-- | block.c | 2 | ||||
-rw-r--r-- | block/quorum.c | 2 | ||||
-rw-r--r-- | include/block/block_int-common.h | 7 |
3 files changed, 9 insertions, 2 deletions
@@ -8276,6 +8276,8 @@ void bdrv_add_child(BlockDriverState *parent_bs, BlockDriverState *child_bs, /* * Hot remove a BDS's child. Used in combination with bdrv_add_child, so the * user can take a child offline when it is broken and take a new child online. + * + * All block nodes must be drained. */ void bdrv_del_child(BlockDriverState *parent_bs, BdrvChild *child, Error **errp) { diff --git a/block/quorum.c b/block/quorum.c index 81407a3..cc3bc5f 100644 --- a/block/quorum.c +++ b/block/quorum.c @@ -1147,9 +1147,7 @@ quorum_del_child(BlockDriverState *bs, BdrvChild *child, Error **errp) (s->num_children - i - 1) * sizeof(BdrvChild *)); s->children = g_renew(BdrvChild *, s->children, --s->num_children); - bdrv_drain_all_begin(); bdrv_unref_child(bs, child); - bdrv_drain_all_end(); quorum_refresh_flags(bs); } diff --git a/include/block/block_int-common.h b/include/block/block_int-common.h index f9e742f..925a3e7 100644 --- a/include/block/block_int-common.h +++ b/include/block/block_int-common.h @@ -406,6 +406,13 @@ struct BlockDriver { void GRAPH_WRLOCK_PTR (*bdrv_add_child)( BlockDriverState *parent, BlockDriverState *child, Error **errp); + /** + * Hot remove a BDS's child. Used in combination with bdrv_add_child, so the + * user can take a child offline when it is broken and take a new child + * online. + * + * All block nodes must be drained. + */ void GRAPH_WRLOCK_PTR (*bdrv_del_child)( BlockDriverState *parent, BdrvChild *child, Error **errp); |