static BlockDriverAIOCB *qemu_gluster_aio_flush(BlockDriverState *bs, BlockDriverCompletionFunc *cb, void *opaque) { int ret; GlusterAIOCB *acb; BDRVGlusterState *s = bs->opaque; acb = qemu_aio_get(&gluster_aiocb_info, bs, cb, opaque); acb->size = 0; acb->ret = 0; acb->finished = NULL; ret = glfs_fsync_async(s->fd, &gluster_finish_aiocb, acb); if (ret < 0) { goto out; } return &acb->common; out: qemu_aio_release(acb); return NULL; }
static coroutine_fn int qemu_gluster_co_flush_to_disk(BlockDriverState *bs) { int ret; GlusterAIOCB *acb = g_slice_new(GlusterAIOCB); BDRVGlusterState *s = bs->opaque; acb->size = 0; acb->ret = 0; acb->coroutine = qemu_coroutine_self(); ret = glfs_fsync_async(s->fd, &gluster_finish_aiocb, acb); if (ret < 0) { ret = -errno; goto out; } qemu_coroutine_yield(); ret = acb->ret; out: g_slice_free(GlusterAIOCB, acb); return ret; }