Il 10/09/2014 11:36, Fam Zheng ha scritto: >> > >> > This could call the callback before I/O is finished. I/O can then >> > complete and write to disk stuff that was not meant to be written. > I think the request is already completed when bdrv_aio_rw_vector returns this > blockacb. I shouldn't override the return code anyway, but perhaps a nop > bdrv_aio_cancel_em is better.
Note that the legacy bdrv_read/bdrv_write function calls actually are AIO-friendly (they run in a coroutine, and can yield). > > I think there is a pre-existing bug, which should be fixed with a "bool > > *done" member similar to BlockDriverAIOCBCoroutine's. But for the sake > > of conversion to async cancellation, you can just empty bdrv_aio_cancel_em. > > BTW, why is it "bool *done" instead of just "bool done"? Because, until your patches to add reference counting, this would have caused a dangling pointer in bdrv_aio_co_cancel_em: acb->done = true; qemu_bh_delete(acb->bh); qemu_aio_release(acb); instead, using "bool *done" works because bdrv_co_em_bh writes into the variable of bdrv_aio_co_cancel_em. This assumes that bdrv_aio_cancel is only called once (no reentrancy). Paolo