Its necessary to guarantee that pending AIO writes have reached stable storage when the flush request returns.
Also change fsync() to fdatasync(), since the modification time is not critical data. Signed-off-by: Marcelo Tosatti <[EMAIL PROTECTED]> Index: kvm-userspace.io/qemu/block-raw-posix.c =================================================================== --- kvm-userspace.io.orig/qemu/block-raw-posix.c +++ kvm-userspace.io/qemu/block-raw-posix.c @@ -557,10 +557,40 @@ static int raw_create(const char *filena return 0; } +static void raw_aio_flush_complete(void *opaque, int ret) +{ + if (ret) + printf("WARNING: aio_fsync failed (completion)\n"); +} + +static void raw_aio_flush(BlockDriverState *bs) +{ + RawAIOCB *acb; + + acb = raw_aio_setup(bs, 0, NULL, 0, raw_aio_flush_complete, NULL); + if (!acb) + return; + + if (aio_fsync(O_DSYNC, &acb->aiocb) < 0) { + qemu_aio_release(acb); + perror("aio_fsync"); + printf("WARNING: aio_fsync failed\n"); + return; + } +} + static void raw_flush(BlockDriverState *bs) { BDRVRawState *s = bs->opaque; - fsync(s->fd); + raw_aio_flush(bs); + fdatasync(s->fd); + + /* We rely on the fact that no other AIO will be submitted + * in parallel, but this should be fixed by per-device + * AIO queues when allowing multiple CPU's to process IO + * in QEMU. + */ + qemu_aio_flush(); } BlockDriver bdrv_raw = { ------------------------------------------------------------------------- Check out the new SourceForge.net Marketplace. It's the best place to buy or sell services for just about anything Open Source. http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace _______________________________________________ kvm-devel mailing list kvm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-devel