diff options
Diffstat (limited to 'block.c')
-rw-r--r-- | block.c | 22 |
1 files changed, 18 insertions, 4 deletions
@@ -1696,19 +1696,26 @@ static int bdrv_read_em(BlockDriverState *bs, int64_t sector_num, struct iovec iov; QEMUIOVector qiov; + async_context_push(); + async_ret = NOT_DONE; iov.iov_base = (void *)buf; iov.iov_len = nb_sectors * 512; qemu_iovec_init_external(&qiov, &iov, 1); acb = bdrv_aio_readv(bs, sector_num, &qiov, nb_sectors, bdrv_rw_em_cb, &async_ret); - if (acb == NULL) - return -1; + if (acb == NULL) { + async_ret = -1; + goto fail; + } while (async_ret == NOT_DONE) { qemu_aio_wait(); } + +fail: + async_context_pop(); return async_ret; } @@ -1720,17 +1727,24 @@ static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num, struct iovec iov; QEMUIOVector qiov; + async_context_push(); + async_ret = NOT_DONE; iov.iov_base = (void *)buf; iov.iov_len = nb_sectors * 512; qemu_iovec_init_external(&qiov, &iov, 1); acb = bdrv_aio_writev(bs, sector_num, &qiov, nb_sectors, bdrv_rw_em_cb, &async_ret); - if (acb == NULL) - return -1; + if (acb == NULL) { + async_ret = -1; + goto fail; + } while (async_ret == NOT_DONE) { qemu_aio_wait(); } + +fail: + async_context_pop(); return async_ret; } |