aboutsummaryrefslogtreecommitdiff
path: root/blockjob.c
diff options
context:
space:
mode:
authorAlberto Garcia <berto@igalia.com>2017-11-28 16:53:27 +0200
committerKevin Wolf <kwolf@redhat.com>2017-11-28 16:59:24 +0100
commit0a3e155f3f5ec9b6f12d00894c7701b3cbb66590 (patch)
treef1f14f5166780592295d1e3602ac5b4c91ed88bb /blockjob.c
parentc117bb14ff633848cc6b0ff77f081f583dfa8c5e (diff)
downloadqemu-0a3e155f3f5ec9b6f12d00894c7701b3cbb66590.zip
qemu-0a3e155f3f5ec9b6f12d00894c7701b3cbb66590.tar.gz
qemu-0a3e155f3f5ec9b6f12d00894c7701b3cbb66590.tar.bz2
blockjob: Remove the job from the list earlier in block_job_unref()
When destroying a block job in block_job_unref() we should remove it from the job list before calling block_job_remove_all_bdrv(). This is because removing the BDSs can trigger an aio_poll() and wake up other jobs that might attempt to use the block job list. If that happens the job we're currently destroying should not be in that list anymore. Signed-off-by: Alberto Garcia <berto@igalia.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'blockjob.c')
-rw-r--r--blockjob.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/blockjob.c b/blockjob.c
index ff9a614..2f0cc15 100644
--- a/blockjob.c
+++ b/blockjob.c
@@ -152,6 +152,7 @@ void block_job_unref(BlockJob *job)
{
if (--job->refcnt == 0) {
BlockDriverState *bs = blk_bs(job->blk);
+ QLIST_REMOVE(job, job_list);
bs->job = NULL;
block_job_remove_all_bdrv(job);
blk_remove_aio_context_notifier(job->blk,
@@ -160,7 +161,6 @@ void block_job_unref(BlockJob *job)
blk_unref(job->blk);
error_free(job->blocker);
g_free(job->id);
- QLIST_REMOVE(job, job_list);
g_free(job);
}
}