From mboxrd@z Thu Jan 1 00:00:00 1970 From: Marcelo Tosatti Subject: [PATCH] QEMU: fsync AIO writes on flush request Date: Fri, 28 Mar 2008 12:05:18 -0300 Message-ID: <20080328150517.GA18077@dmt> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Cc: kvm-devel , qemu-devel@nongnu.org To: Avi Kivity Return-path: Content-Disposition: inline List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: kvm-devel-bounces@lists.sourceforge.net Errors-To: kvm-devel-bounces@lists.sourceforge.net List-Id: kvm.vger.kernel.org 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 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