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>
This commit is contained in:
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 */
|
/* Helper that undoes bdrv_register_buf() when it fails partway through */
|
||||||
static void bdrv_register_buf_rollback(BlockDriverState *bs,
|
static void GRAPH_RDLOCK
|
||||||
void *host,
|
bdrv_register_buf_rollback(BlockDriverState *bs, void *host, size_t size,
|
||||||
size_t size,
|
BdrvChild *final_child)
|
||||||
BdrvChild *final_child)
|
|
||||||
{
|
{
|
||||||
BdrvChild *child;
|
BdrvChild *child;
|
||||||
|
|
||||||
|
GLOBAL_STATE_CODE();
|
||||||
|
assert_bdrv_graph_readable();
|
||||||
|
|
||||||
QLIST_FOREACH(child, &bs->children, next) {
|
QLIST_FOREACH(child, &bs->children, next) {
|
||||||
if (child == final_child) {
|
if (child == final_child) {
|
||||||
break;
|
break;
|
||||||
@ -3213,6 +3215,8 @@ bool bdrv_register_buf(BlockDriverState *bs, void *host, size_t size,
|
|||||||
BdrvChild *child;
|
BdrvChild *child;
|
||||||
|
|
||||||
GLOBAL_STATE_CODE();
|
GLOBAL_STATE_CODE();
|
||||||
|
GRAPH_RDLOCK_GUARD_MAINLOOP();
|
||||||
|
|
||||||
if (bs->drv && bs->drv->bdrv_register_buf) {
|
if (bs->drv && bs->drv->bdrv_register_buf) {
|
||||||
if (!bs->drv->bdrv_register_buf(bs, host, size, errp)) {
|
if (!bs->drv->bdrv_register_buf(bs, host, size, errp)) {
|
||||||
return false;
|
return false;
|
||||||
@ -3232,6 +3236,8 @@ void bdrv_unregister_buf(BlockDriverState *bs, void *host, size_t size)
|
|||||||
BdrvChild *child;
|
BdrvChild *child;
|
||||||
|
|
||||||
GLOBAL_STATE_CODE();
|
GLOBAL_STATE_CODE();
|
||||||
|
GRAPH_RDLOCK_GUARD_MAINLOOP();
|
||||||
|
|
||||||
if (bs->drv && bs->drv->bdrv_unregister_buf) {
|
if (bs->drv && bs->drv->bdrv_unregister_buf) {
|
||||||
bs->drv->bdrv_unregister_buf(bs, host, size);
|
bs->drv->bdrv_unregister_buf(bs, host, size);
|
||||||
}
|
}
|
||||||
|
@ -445,9 +445,10 @@ struct BlockDriver {
|
|||||||
*
|
*
|
||||||
* Returns: true on success, false on failure
|
* Returns: true on success, false on failure
|
||||||
*/
|
*/
|
||||||
bool (*bdrv_register_buf)(BlockDriverState *bs, void *host, size_t size,
|
bool GRAPH_RDLOCK_PTR (*bdrv_register_buf)(
|
||||||
Error **errp);
|
BlockDriverState *bs, void *host, size_t size, Error **errp);
|
||||||
void (*bdrv_unregister_buf)(BlockDriverState *bs, void *host, size_t size);
|
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
|
* This field is modified only under the BQL, and is part of
|
||||||
|
Loading…
Reference in New Issue
Block a user