Add GRAPH_RDLOCK annotation to declare parallels_inactivate() have to hold a reader lock for the graph because it calls bdrv_get_device_or_node_name(), which accesses the parents list of a node.
Assert we are in the main thread in parallels_close() and guard the code with GRAPH_RDLOCK_GUARD_MAINLOOP(). Signed-off-by: Alexander Ivanov <alexander.iva...@virtuozzo.com> --- block/parallels.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/block/parallels.c b/block/parallels.c index 2d82e8ff6a..4c2cb09e43 100644 --- a/block/parallels.c +++ b/block/parallels.c @@ -1465,7 +1465,7 @@ fail: return ret; } -static int parallels_inactivate(BlockDriverState *bs) +static int GRAPH_RDLOCK parallels_inactivate(BlockDriverState *bs) { BDRVParallelsState *s = bs->opaque; Error *err = NULL; @@ -1491,10 +1491,13 @@ static int parallels_inactivate(BlockDriverState *bs) return ret; } -static void parallels_close(BlockDriverState *bs) +static void GRAPH_UNLOCKED parallels_close(BlockDriverState *bs) { BDRVParallelsState *s = bs->opaque; + GLOBAL_STATE_CODE(); + GRAPH_RDLOCK_GUARD_MAINLOOP(); + if ((bs->open_flags & BDRV_O_RDWR) && !(bs->open_flags & BDRV_O_INACTIVE)) { parallels_inactivate(bs); } -- 2.34.1