mirror of https://github.com/proxmox/mirror_qemu
block: Mark bdrv_(un)register_buf() GRAPH_RDLOCK
This adds GRAPH_RDLOCK annotations to declare that callers of bdrv_register_buf() and bdrv_unregister_buf() need to hold a reader lock for the graph. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Message-Id: <20230203152202.49054-21-kwolf@redhat.com> Reviewed-by: Emanuele Giuseppe Esposito <eesposit@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>master
parent
79a292e5ec
commit
d9249c253c
14
block/io.c
14
block/io.c
|
@ -3187,13 +3187,15 @@ void coroutine_fn bdrv_co_io_unplug(BlockDriverState *bs)
|
|||
}
|
||||
|
||||
/* Helper that undoes bdrv_register_buf() when it fails partway through */
|
||||
static void bdrv_register_buf_rollback(BlockDriverState *bs,
|
||||
void *host,
|
||||
size_t size,
|
||||
BdrvChild *final_child)
|
||||
static void GRAPH_RDLOCK
|
||||
bdrv_register_buf_rollback(BlockDriverState *bs, void *host, size_t size,
|
||||
BdrvChild *final_child)
|
||||
{
|
||||
BdrvChild *child;
|
||||
|
||||
GLOBAL_STATE_CODE();
|
||||
assert_bdrv_graph_readable();
|
||||
|
||||
QLIST_FOREACH(child, &bs->children, next) {
|
||||
if (child == final_child) {
|
||||
break;
|
||||
|
@ -3213,6 +3215,8 @@ bool bdrv_register_buf(BlockDriverState *bs, void *host, size_t size,
|
|||
BdrvChild *child;
|
||||
|
||||
GLOBAL_STATE_CODE();
|
||||
GRAPH_RDLOCK_GUARD_MAINLOOP();
|
||||
|
||||
if (bs->drv && bs->drv->bdrv_register_buf) {
|
||||
if (!bs->drv->bdrv_register_buf(bs, host, size, errp)) {
|
||||
return false;
|
||||
|
@ -3232,6 +3236,8 @@ void bdrv_unregister_buf(BlockDriverState *bs, void *host, size_t size)
|
|||
BdrvChild *child;
|
||||
|
||||
GLOBAL_STATE_CODE();
|
||||
GRAPH_RDLOCK_GUARD_MAINLOOP();
|
||||
|
||||
if (bs->drv && bs->drv->bdrv_unregister_buf) {
|
||||
bs->drv->bdrv_unregister_buf(bs, host, size);
|
||||
}
|
||||
|
|
|
@ -445,9 +445,10 @@ struct BlockDriver {
|
|||
*
|
||||
* Returns: true on success, false on failure
|
||||
*/
|
||||
bool (*bdrv_register_buf)(BlockDriverState *bs, void *host, size_t size,
|
||||
Error **errp);
|
||||
void (*bdrv_unregister_buf)(BlockDriverState *bs, void *host, size_t size);
|
||||
bool GRAPH_RDLOCK_PTR (*bdrv_register_buf)(
|
||||
BlockDriverState *bs, void *host, size_t size, Error **errp);
|
||||
void GRAPH_RDLOCK_PTR (*bdrv_unregister_buf)(
|
||||
BlockDriverState *bs, void *host, size_t size);
|
||||
|
||||
/*
|
||||
* This field is modified only under the BQL, and is part of
|
||||
|
|
Loading…
Reference in New Issue