block/stream: mark stream_prepare() as GRAPH_UNLOCKED

The function stream_prepare() calls bdrv_drain_all_begin(), which
must be called with the graph unlocked.

Also mark the JobDriver's prepare() callback as GRAPH_UNLOCKED_PTR,
because that is the callback via which stream_prepare() is reached.

Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
Message-ID: <20250530151125.955508-34-f.ebner@proxmox.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Fiona Ebner
2025-05-30 17:11:10 +02:00
committed by Kevin Wolf
parent c6b5328b5b
commit 0a0474b065
2 changed files with 2 additions and 2 deletions

View File

@@ -51,7 +51,7 @@ static int coroutine_fn stream_populate(BlockBackend *blk,
return blk_co_preadv(blk, offset, bytes, NULL, BDRV_REQ_PREFETCH); return blk_co_preadv(blk, offset, bytes, NULL, BDRV_REQ_PREFETCH);
} }
static int stream_prepare(Job *job) static int GRAPH_UNLOCKED stream_prepare(Job *job)
{ {
StreamBlockJob *s = container_of(job, StreamBlockJob, common.job); StreamBlockJob *s = container_of(job, StreamBlockJob, common.job);
BlockDriverState *unfiltered_bs; BlockDriverState *unfiltered_bs;

View File

@@ -263,7 +263,7 @@ struct JobDriver {
* This callback will not be invoked if the job has already failed. * This callback will not be invoked if the job has already failed.
* If it fails, abort and then clean will be called. * If it fails, abort and then clean will be called.
*/ */
int (*prepare)(Job *job); int GRAPH_UNLOCKED_PTR (*prepare)(Job *job);
/** /**
* If the callback is not NULL, it will be invoked when all the jobs * If the callback is not NULL, it will be invoked when all the jobs