diff options
| author | Stefan Hajnoczi <stefanha@linux.vnet.ibm.com> | 2011-11-30 12:23:43 +0000 |
|---|---|---|
| committer | Kevin Wolf <kwolf@redhat.com> | 2011-12-05 14:56:06 +0100 |
| commit | 922453bca6a927bb527068ae8679d587cfa45dbc (patch) | |
| tree | beb8fc3e9e180558f423e5b7ce97affed1ee8ca6 /block.c | |
| parent | 5f8b6491f20732e0a31e64bbf75b62def579e044 (diff) | |
| download | focaccia-qemu-922453bca6a927bb527068ae8679d587cfa45dbc.tar.gz focaccia-qemu-922453bca6a927bb527068ae8679d587cfa45dbc.zip | |
block: convert qemu_aio_flush() calls to bdrv_drain_all()
Many places in QEMU call qemu_aio_flush() to complete all pending asynchronous I/O. Most of these places actually want to drain all block requests but there is no block layer API to do so. This patch introduces the bdrv_drain_all() API to wait for requests across all BlockDriverStates to complete. As a bonus we perform checks after qemu_aio_wait() to ensure that requests really have finished. Signed-off-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'block.c')
| -rw-r--r-- | block.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/block.c b/block.c index 50ce2be48e..aa9d14245b 100644 --- a/block.c +++ b/block.c @@ -846,6 +846,25 @@ void bdrv_close_all(void) } } +/* + * Wait for pending requests to complete across all BlockDriverStates + * + * This function does not flush data to disk, use bdrv_flush_all() for that + * after calling this function. + */ +void bdrv_drain_all(void) +{ + BlockDriverState *bs; + + qemu_aio_flush(); + + /* If requests are still pending there is a bug somewhere */ + QTAILQ_FOREACH(bs, &bdrv_states, list) { + assert(QLIST_EMPTY(&bs->tracked_requests)); + assert(qemu_co_queue_empty(&bs->throttled_reqs)); + } +} + /* make a BlockDriverState anonymous by removing from bdrv_state list. Also, NULL terminate the device_name to prevent double remove */ void bdrv_make_anon(BlockDriverState *bs) |