aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--block/linux-aio.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/block/linux-aio.c b/block/linux-aio.c
index d4e19d444c..1685ec29a3 100644
--- a/block/linux-aio.c
+++ b/block/linux-aio.c
@@ -94,9 +94,12 @@ static void qemu_laio_process_completion(struct qemu_laiocb *laiocb)
laiocb->ret = ret;
if (laiocb->co) {
- /* Jump and continue completion for foreign requests, don't do
- * anything for current request, it will be completed shortly. */
- if (laiocb->co != qemu_coroutine_self()) {
+ /* If the coroutine is already entered it must be in ioq_submit() and
+ * will notice laio->ret has been filled in when it eventually runs
+ * later. Coroutines cannot be entered recursively so avoid doing
+ * that!
+ */
+ if (!qemu_coroutine_entered(laiocb->co)) {
qemu_coroutine_enter(laiocb->co);
}
} else {