mirror of https://github.com/xemu-project/xemu.git
block: Lock AioContext for drain_end in blockdev-reopen
bdrv_subtree_drained_end() requires the caller to hold the AioContext
lock for the drained node. Not doing this for nodes outside of the main
AioContext leads to crashes when AIO_WAIT_WHILE() needs to wait and
tries to temporarily release the lock.
Fixes: 3908b7a899
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2046659
Reported-by: Qing Wang <qinwang@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Message-Id: <20220203140534.36522-2-kwolf@redhat.com>
Reviewed-by: Hanna Reitz <hreitz@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
0a301624c2
commit
aba8205be0
11
blockdev.c
11
blockdev.c
|
@ -3530,6 +3530,7 @@ void qmp_blockdev_reopen(BlockdevOptionsList *reopen_list, Error **errp)
|
||||||
{
|
{
|
||||||
BlockReopenQueue *queue = NULL;
|
BlockReopenQueue *queue = NULL;
|
||||||
GSList *drained = NULL;
|
GSList *drained = NULL;
|
||||||
|
GSList *p;
|
||||||
|
|
||||||
/* Add each one of the BDS that we want to reopen to the queue */
|
/* Add each one of the BDS that we want to reopen to the queue */
|
||||||
for (; reopen_list != NULL; reopen_list = reopen_list->next) {
|
for (; reopen_list != NULL; reopen_list = reopen_list->next) {
|
||||||
|
@ -3579,7 +3580,15 @@ void qmp_blockdev_reopen(BlockdevOptionsList *reopen_list, Error **errp)
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
bdrv_reopen_queue_free(queue);
|
bdrv_reopen_queue_free(queue);
|
||||||
g_slist_free_full(drained, (GDestroyNotify) bdrv_subtree_drained_end);
|
for (p = drained; p; p = p->next) {
|
||||||
|
BlockDriverState *bs = p->data;
|
||||||
|
AioContext *ctx = bdrv_get_aio_context(bs);
|
||||||
|
|
||||||
|
aio_context_acquire(ctx);
|
||||||
|
bdrv_subtree_drained_end(bs);
|
||||||
|
aio_context_release(ctx);
|
||||||
|
}
|
||||||
|
g_slist_free(drained);
|
||||||
}
|
}
|
||||||
|
|
||||||
void qmp_blockdev_del(const char *node_name, Error **errp)
|
void qmp_blockdev_del(const char *node_name, Error **errp)
|
||||||
|
|
Loading…
Reference in New Issue