From 878f887244e64669764d142d52863c1b35c56bf1 Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Thu, 22 Oct 2009 17:54:40 +0200 Subject: [PATCH] posix-aio-compat: Honour AsyncContext Don't call callbacks that don't belong to the active AsyncContext. Signed-off-by: Kevin Wolf Signed-off-by: Anthony Liguori --- posix-aio-compat.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/posix-aio-compat.c b/posix-aio-compat.c index 4901539..ec58288 100644 --- a/posix-aio-compat.c +++ b/posix-aio-compat.c @@ -48,6 +48,8 @@ struct qemu_paiocb { ssize_t ret; int active; struct qemu_paiocb *next; + + int async_context_id; }; typedef struct PosixAioState { @@ -419,6 +421,7 @@ static int posix_aio_process_queue(void *opaque) struct qemu_paiocb *acb, **pacb; int ret; int result = 0; + int async_context_id = get_async_context_id(); for(;;) { pacb = &s->first_aio; @@ -426,6 +429,13 @@ static int posix_aio_process_queue(void *opaque) acb = *pacb; if (!acb) return result; + + /* we're only interested in requests in the right context */ + if (acb->async_context_id != async_context_id) { + pacb = &acb->next; + continue; + } + ret = qemu_paio_error(acb); if (ret == ECANCELED) { /* remove the request */ @@ -558,6 +568,8 @@ BlockDriverAIOCB *paio_submit(BlockDriverState *bs, void *aio_ctx, int fd, acb->aio_type = type; acb->aio_fildes = fd; acb->ev_signo = SIGUSR2; + acb->async_context_id = get_async_context_id(); + if (qiov) { acb->aio_iov = qiov->iov; acb->aio_niov = qiov->niov; -- 2.7.4