Skip to content

Commit

Permalink
fix qemu_aio_flush
Browse files Browse the repository at this point in the history
qemu_aio_wait by invoking the bh or one of the aio completion
callbacks, could end up submitting new pending aio, breaking the
invariant that qemu_aio_flush returns only when no pending aio is
outstanding (possibly a problem for migration as such).

Signed-off-by: Andrea Arcangeli <[email protected]>
Signed-off-by: Christoph Hellwig <[email protected]>
Acked-by: Kevin Wolf <[email protected]>
  • Loading branch information
aagit authored and Christoph Hellwig committed Jun 15, 2009
1 parent e19252d commit 986c28d
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 5 deletions.
8 changes: 6 additions & 2 deletions aio.c
Original file line number Diff line number Diff line change
Expand Up @@ -103,11 +103,15 @@ void qemu_aio_flush(void)
do {
ret = 0;

/*
* If there are pending emulated aio start them now so flush
* will be able to return 1.
*/
qemu_aio_wait();

LIST_FOREACH(node, &aio_handlers, node) {
ret |= node->io_flush(node->opaque);
}

qemu_aio_wait();
} while (ret > 0);
}

Expand Down
7 changes: 4 additions & 3 deletions qemu-aio.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,10 @@ typedef int (AioFlushHandler)(void *opaque);
* outstanding AIO operations have been completed or cancelled. */
void qemu_aio_flush(void);

/* Wait for a single AIO completion to occur. This function will until a
* single AIO opeartion has completed. It is intended to be used as a looping
* primative when simulating synchronous IO based on asynchronous IO. */
/* Wait for a single AIO completion to occur. This function will wait
* until a single AIO event has completed and it will ensure something
* has moved before returning. This can issue new pending aio as
* result of executing I/O completion or bh callbacks. */
void qemu_aio_wait(void);

/* Register a file descriptor and associated callbacks. Behaves very similarly
Expand Down

0 comments on commit 986c28d

Please sign in to comment.