diff options
| author | Kevin Wolf <kwolf@redhat.com> | 2023-09-11 11:46:11 +0200 |
|---|---|---|
| committer | Kevin Wolf <kwolf@redhat.com> | 2023-09-20 17:46:01 +0200 |
| commit | afdaeb9ea06ea641ccc4226964b8e278af5e7685 (patch) | |
| tree | ca548ea5c809b8c5c5825294e367b02b159f6deb /block.c | |
| parent | 5661a00d40a59c28796a59c9df55d03efe8c56fc (diff) | |
| download | focaccia-qemu-afdaeb9ea06ea641ccc4226964b8e278af5e7685.tar.gz focaccia-qemu-afdaeb9ea06ea641ccc4226964b8e278af5e7685.zip | |
block: Mark bdrv_attach_child() GRAPH_WRLOCK
Instead of taking the writer lock internally, require callers to already hold it when calling bdrv_attach_child_common(). These callers will typically already hold the graph lock once the locking work is completed, which means that they can't call functions that take it internally. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Emanuele Giuseppe Esposito <eesposit@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Message-ID: <20230911094620.45040-13-kwolf@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'block.c')
| -rw-r--r-- | block.c | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/block.c b/block.c index f06de58a3b..369023872a 100644 --- a/block.c +++ b/block.c @@ -3219,8 +3219,6 @@ BdrvChild *bdrv_attach_child(BlockDriverState *parent_bs, GLOBAL_STATE_CODE(); - bdrv_graph_wrlock(child_bs); - child = bdrv_attach_child_noperm(parent_bs, child_bs, child_name, child_class, child_role, tran, errp); if (!child) { @@ -3235,9 +3233,8 @@ BdrvChild *bdrv_attach_child(BlockDriverState *parent_bs, out: tran_finalize(tran, ret); - bdrv_graph_wrunlock(); - bdrv_unref(child_bs); + bdrv_schedule_unref(child_bs); return ret < 0 ? NULL : child; } @@ -3758,11 +3755,13 @@ BdrvChild *bdrv_open_child(const char *filename, return NULL; } + bdrv_graph_wrlock(NULL); ctx = bdrv_get_aio_context(bs); aio_context_acquire(ctx); child = bdrv_attach_child(parent, bs, bdref_key, child_class, child_role, errp); aio_context_release(ctx); + bdrv_graph_wrunlock(); return child; } |