All the difference is that the old .cancel doesn't call cb, but .cancel_async does.
Signed-off-by: Fam Zheng <f...@redhat.com> --- block.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/block.c b/block.c index 4aa1bd7..b7253af 100644 --- a/block.c +++ b/block.c @@ -4679,6 +4679,9 @@ static void bdrv_aio_cancel_em(BlockDriverAIOCB *blockacb) { BlockDriverAIOCBSync *acb = container_of(blockacb, BlockDriverAIOCBSync, common); + + acb->ret = -ECANCELED; + acb->common.cb(acb->common.opaque, acb->ret); qemu_bh_delete(acb->bh); acb->bh = NULL; qemu_aio_release(acb); @@ -4686,7 +4689,7 @@ static void bdrv_aio_cancel_em(BlockDriverAIOCB *blockacb) static const AIOCBInfo bdrv_em_aiocb_info = { .aiocb_size = sizeof(BlockDriverAIOCBSync), - .cancel = bdrv_aio_cancel_em, + .cancel_async = bdrv_aio_cancel_em, }; static void bdrv_aio_bh_cb(void *opaque) -- 2.1.0.27.g96db324