]> git.ipfire.org Git - thirdparty/qemu.git/commit
block: move drain outside of bdrv_root_attach_child()
authorFiona Ebner <f.ebner@proxmox.com>
Fri, 30 May 2025 15:10:49 +0000 (17:10 +0200)
committerKevin Wolf <kwolf@redhat.com>
Wed, 4 Jun 2025 16:16:34 +0000 (18:16 +0200)
commitffdcd081f52544f065020c780a6c522dace6b0af
treeb942680ca6b7c0e506172f39f7bccab3bc0d4e1e
parente66dbda11eab2b4a091d470f3508a4d6ca60eaf5
block: move drain outside of bdrv_root_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_root_attach_child() runs under the graph lock, so it
is not allowed to drain. It is called by:
1. blk_insert_bs(), where a drained section is introduced.
2. block_job_add_bdrv(), which holds the graph lock itself.

block_job_add_bdrv() is called by:
1. mirror_start_job()
2. stream_start()
3. commit_start()
4. backup_job_create()
5. block_job_create()
6. In the test_blockjob_common_drain_node() unit test

In all callers, a drained section is introduced.

Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Message-ID: <20250530151125.955508-13-f.ebner@proxmox.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
block.c
block/backup.c
block/block-backend.c
block/commit.c
block/mirror.c
block/stream.c
blockjob.c
include/block/blockjob.h
tests/unit/test-bdrv-drain.c