summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--block-raw.c11
-rw-r--r--vl.c6
-rw-r--r--vl.h1
3 files changed, 18 insertions, 0 deletions
diff --git a/block-raw.c b/block-raw.c
index 3ed4b32de0..3a2843c5d6 100644
--- a/block-raw.c
+++ b/block-raw.c
@@ -247,6 +247,17 @@ void qemu_aio_poll(void)
the_end: ;
}
+/* Wait for all IO requests to complete. */
+void qemu_aio_flush(void)
+{
+ qemu_aio_wait_start();
+ qemu_aio_poll();
+ while (first_aio) {
+ qemu_aio_wait();
+ }
+ qemu_aio_wait_end();
+}
+
/* wait until at least one AIO was handled */
static sigset_t wait_oset;
diff --git a/vl.c b/vl.c
index 7719030993..32c994366c 100644
--- a/vl.c
+++ b/vl.c
@@ -4551,6 +4551,9 @@ void do_savevm(const char *name)
return;
}
+ /* ??? Should this occur after vm_stop? */
+ qemu_aio_flush();
+
saved_vm_running = vm_running;
vm_stop(0);
@@ -4641,6 +4644,9 @@ void do_loadvm(const char *name)
return;
}
+ /* Flush all IO requests so they don't interfere with the new state. */
+ qemu_aio_flush();
+
saved_vm_running = vm_running;
vm_stop(0);
diff --git a/vl.h b/vl.h
index bd1e6673f4..14116fa750 100644
--- a/vl.h
+++ b/vl.h
@@ -580,6 +580,7 @@ void bdrv_aio_cancel(BlockDriverAIOCB *acb);
void qemu_aio_init(void);
void qemu_aio_poll(void);
+void qemu_aio_flush(void);
void qemu_aio_wait_start(void);
void qemu_aio_wait(void);
void qemu_aio_wait_end(void);