blockdev: acquire AioContext in blockdev_mark_auto_del()
When an emulated storage controller is unrealized it will call blockdev_mark_auto_del(). This will cancel any running block job (and that eventually releases its reference to the BDS so it can be freed). Since the block job may be executing in another AioContext we must acquire/release to ensure thread safety. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com> Message-id: 1413889440-32577-4-git-send-email-stefanha@redhat.com
This commit is contained in:
parent
69691e7270
commit
91fddb0db6
@ -115,14 +115,21 @@ void blockdev_mark_auto_del(BlockBackend *blk)
|
||||
{
|
||||
DriveInfo *dinfo = blk_legacy_dinfo(blk);
|
||||
BlockDriverState *bs = blk_bs(blk);
|
||||
AioContext *aio_context;
|
||||
|
||||
if (!dinfo) {
|
||||
return;
|
||||
}
|
||||
|
||||
aio_context = bdrv_get_aio_context(bs);
|
||||
aio_context_acquire(aio_context);
|
||||
|
||||
if (bs->job) {
|
||||
block_job_cancel(bs->job);
|
||||
}
|
||||
|
||||
aio_context_release(aio_context);
|
||||
|
||||
dinfo->auto_del = 1;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user