diff options
author | Kevin Wolf <kwolf@redhat.com> | 2023-05-04 13:57:49 +0200 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2023-05-10 14:16:54 +0200 |
commit | 533c6e4ee8885cb9e7c6ac36e8e9fa92bea64f97 (patch) | |
tree | d490bdbbc180f6ce60879f21404b9f075f4fe713 /block | |
parent | 4f0bef8b36eb33efbba0a216b233265d734bdbfb (diff) | |
download | qemu-533c6e4ee8885cb9e7c6ac36e8e9fa92bea64f97.zip qemu-533c6e4ee8885cb9e7c6ac36e8e9fa92bea64f97.tar.gz qemu-533c6e4ee8885cb9e7c6ac36e8e9fa92bea64f97.tar.bz2 |
block: Mark bdrv_recurse_can_replace() and callers GRAPH_RDLOCK
This adds GRAPH_RDLOCK annotations to declare that callers of
bdrv_recurse_can_replace() need to hold a reader lock for the graph
because it accesses the children list of a node.
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Message-Id: <20230504115750.54437-20-kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'block')
-rw-r--r-- | block/blkverify.c | 5 | ||||
-rw-r--r-- | block/mirror.c | 4 | ||||
-rw-r--r-- | block/quorum.c | 4 |
3 files changed, 9 insertions, 4 deletions
diff --git a/block/blkverify.c b/block/blkverify.c index 1c16f86..7326461 100644 --- a/block/blkverify.c +++ b/block/blkverify.c @@ -265,8 +265,9 @@ static int coroutine_fn GRAPH_RDLOCK blkverify_co_flush(BlockDriverState *bs) return bdrv_co_flush(s->test_file->bs); } -static bool blkverify_recurse_can_replace(BlockDriverState *bs, - BlockDriverState *to_replace) +static bool GRAPH_RDLOCK +blkverify_recurse_can_replace(BlockDriverState *bs, + BlockDriverState *to_replace) { BDRVBlkverifyState *s = bs->opaque; diff --git a/block/mirror.c b/block/mirror.c index e48ed0a..717442c 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -747,7 +747,10 @@ static int mirror_exit_common(Job *job) * Cannot use check_to_replace_node() here, because that would * check for an op blocker on @to_replace, and we have our own * there. + * + * TODO Pull out the writer lock from bdrv_replace_node() to here */ + bdrv_graph_rdlock_main_loop(); if (bdrv_recurse_can_replace(src, to_replace)) { bdrv_replace_node(to_replace, target_bs, &local_err); } else { @@ -756,6 +759,7 @@ static int mirror_exit_common(Job *job) "would not lead to an abrupt change of visible data", to_replace->node_name, target_bs->node_name); } + bdrv_graph_rdunlock_main_loop(); bdrv_drained_end(target_bs); if (local_err) { error_report_err(local_err); diff --git a/block/quorum.c b/block/quorum.c index ff5a0a2..f28758c 100644 --- a/block/quorum.c +++ b/block/quorum.c @@ -825,8 +825,8 @@ static coroutine_fn GRAPH_RDLOCK int quorum_co_flush(BlockDriverState *bs) return result; } -static bool quorum_recurse_can_replace(BlockDriverState *bs, - BlockDriverState *to_replace) +static bool GRAPH_RDLOCK +quorum_recurse_can_replace(BlockDriverState *bs, BlockDriverState *to_replace) { BDRVQuorumState *s = bs->opaque; int i; |