diff --git a/block-qcow2.c b/block-qcow2.c index c4cd38d..151e688 100644 --- a/block-qcow2.c +++ b/block-qcow2.c @@ -1443,6 +1443,9 @@ static BlockDriverAIOCB *qcow_aio_readv(BlockDriverState *bs, return &acb->common; } +static int nb_writes; +static BlockDriverAIOCB *pending_writes[300]; + static void qcow_aio_write_cb(void *opaque, int ret) { QCowAIOCB *acb = opaque; @@ -1518,6 +1521,18 @@ done: qemu_vfree(acb->orig_buf); acb->common.cb(acb->common.opaque, ret); qemu_aio_release(acb); + + { + int i; + + for (i = 1; i < nb_writes; ++i) { + pending_writes[i - 1] = pending_writes[i]; + } + --nb_writes; + if (nb_writes) { + qcow_aio_write_cb(pending_writes[0], 0); + } + } } static BlockDriverAIOCB *qcow_aio_writev(BlockDriverState *bs, @@ -1535,7 +1550,12 @@ static BlockDriverAIOCB *qcow_aio_writev(BlockDriverState *bs, if (!acb) return NULL; - qcow_aio_write_cb(acb, 0); + pending_writes[nb_writes++] = acb; + + if (nb_writes == 1) { + qcow_aio_write_cb(acb, 0); + } + return &acb->common; }