summaryrefslogtreecommitdiffstats
path: root/blockdev.c
diff options
context:
space:
mode:
authorStefan Hajnoczi2014-10-21 13:03:51 +0200
committerStefan Hajnoczi2014-11-03 12:41:49 +0100
commit69691e72708603592b1618f1a68d2a3f07db853d (patch)
tree82c76077ae8726439c3f77f6a6a2f91ac8577cd8 /blockdev.c
parentblock: acquire AioContext in generic blockjob QMP commands (diff)
downloadqemu-69691e72708603592b1618f1a68d2a3f07db853d.tar.gz
qemu-69691e72708603592b1618f1a68d2a3f07db853d.tar.xz
qemu-69691e72708603592b1618f1a68d2a3f07db853d.zip
blockdev: acquire AioContext in do_qmp_query_block_jobs_one()
Make sure that query-block-jobs acquires the BlockDriverState AioContext so that the blockjob isn't running in another thread while we access its state. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com> Message-id: 1413889440-32577-3-git-send-email-stefanha@redhat.com
Diffstat (limited to 'blockdev.c')
-rw-r--r--blockdev.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/blockdev.c b/blockdev.c
index 501473da69..40fc5d624f 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -2628,12 +2628,18 @@ BlockJobInfoList *qmp_query_block_jobs(Error **errp)
BlockDriverState *bs;
for (bs = bdrv_next(NULL); bs; bs = bdrv_next(bs)) {
+ AioContext *aio_context = bdrv_get_aio_context(bs);
+
+ aio_context_acquire(aio_context);
+
if (bs->job) {
BlockJobInfoList *elem = g_new0(BlockJobInfoList, 1);
elem->value = block_job_query(bs->job);
*p_next = elem;
p_next = &elem->next;
}
+
+ aio_context_release(aio_context);
}
return head;