diff options
| author | Fiona Ebner <f.ebner@proxmox.com> | 2025-05-30 17:10:50 +0200 |
|---|---|---|
| committer | Kevin Wolf <kwolf@redhat.com> | 2025-06-04 18:16:34 +0200 |
| commit | 77f3965ba7fed5b35212171a1e41c20c05a7ef11 (patch) | |
| tree | d67e74a5a6fe80a054d1d7140a82bf9a0b717b1e /block.c | |
| parent | ffdcd081f52544f065020c780a6c522dace6b0af (diff) | |
| download | focaccia-qemu-77f3965ba7fed5b35212171a1e41c20c05a7ef11.tar.gz focaccia-qemu-77f3965ba7fed5b35212171a1e41c20c05a7ef11.zip | |
block: move drain outside of bdrv_attach_child()
This is part of resolving the deadlock mentioned in commit "block: move draining out of bdrv_change_aio_context() and mark GRAPH_RDLOCK". The function bdrv_attach_child() runs under the graph lock, so it is not allowed to drain. It is called by: 1. replication_start() 2. quorum_add_child() 3. bdrv_open_child_common() 4. Throughout test-bdrv-graph-mod.c and test-bdrv-drain.c unit tests. In all callers, a drained section is introduced. The function quorum_add_child() runs under the graph lock, so it is not actually allowed to drain. This will be addressed by the following commit. Signed-off-by: Fiona Ebner <f.ebner@proxmox.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Message-ID: <20250530151125.955508-14-f.ebner@proxmox.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'block.c')
| -rw-r--r-- | block.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/block.c b/block.c index 17c34dc240..6fc87aa318 100644 --- a/block.c +++ b/block.c @@ -3269,6 +3269,8 @@ out: * * On failure NULL is returned, errp is set and the reference to * child_bs is also dropped. + * + * All block nodes must be drained. */ BdrvChild *bdrv_attach_child(BlockDriverState *parent_bs, BlockDriverState *child_bs, @@ -3283,7 +3285,6 @@ BdrvChild *bdrv_attach_child(BlockDriverState *parent_bs, GLOBAL_STATE_CODE(); - bdrv_drain_all_begin(); child = bdrv_attach_child_noperm(parent_bs, child_bs, child_name, child_class, child_role, tran, errp); if (!child) { @@ -3298,7 +3299,6 @@ BdrvChild *bdrv_attach_child(BlockDriverState *parent_bs, out: tran_finalize(tran, ret); - bdrv_drain_all_end(); bdrv_schedule_unref(child_bs); @@ -3789,10 +3789,12 @@ static BdrvChild *bdrv_open_child_common(const char *filename, return NULL; } + bdrv_drain_all_begin(); bdrv_graph_wrlock(); child = bdrv_attach_child(parent, bs, bdref_key, child_class, child_role, errp); bdrv_graph_wrunlock(); + bdrv_drain_all_end(); return child; } |