>From 86bf3c9eb5ce43280224f9271a4ad016b0dd3fb1 Mon Sep 17 00:00:00 2001 From: Anthony Liguori Date: Fri, 29 Oct 2010 09:36:53 -0500 Subject: [PATCH 1/2] block: make bdrv_flush() fall back to bdrv_aio_flush Signed-off-by: Anthony Liguori diff --git a/block.c b/block.c index 985d0b7..fc8defd 100644 --- a/block.c +++ b/block.c @@ -1453,14 +1453,51 @@ const char *bdrv_get_device_name(BlockDriverState *bs) return bs->device_name; } +static void bdrv_flush_em_cb(void *opaque, int ret) +{ + int *pcomplete = opaque; + *pcomplete = 1; +} + +static void bdrv_flush_em(BlockDriverState *bs) +{ + int complete = 0; + BlockDriverAIOCB *acb; + + if (!bs->drv->bdrv_aio_flush) { + return; + } + + async_context_push(); + + acb = bs->drv->bdrv_aio_flush(bs, bdrv_flush_em_cb, &complete); + if (!acb) { + goto out; + } + + while (!complete) { + qemu_aio_wait(); + } + +out: + async_context_pop(); +} + void bdrv_flush(BlockDriverState *bs) { if (bs->open_flags & BDRV_O_NO_FLUSH) { return; } - if (bs->drv && bs->drv->bdrv_flush) + if (!bs->drv) { + return; + } + + if (bs->drv->bdrv_flush) { bs->drv->bdrv_flush(bs); + } else { + bdrv_flush_em(bs); + } } void bdrv_flush_all(void) -- 1.7.0.4