diff options
author | Kevin Wolf <kwolf@redhat.com> | 2009-10-22 17:54:40 +0200 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2009-10-27 12:28:59 -0500 |
commit | e5f37649c670fdb212e83f376ed13d7f11804b17 (patch) | |
tree | 5830f95c2973bc13b3a1cbd38d061768e772bcd6 /posix-aio-compat.c | |
parent | 65d6b3d885146346741e167aca25b9b219e85c88 (diff) | |
download | qemu-e5f37649c670fdb212e83f376ed13d7f11804b17.tar.gz qemu-e5f37649c670fdb212e83f376ed13d7f11804b17.tar.bz2 qemu-e5f37649c670fdb212e83f376ed13d7f11804b17.zip |
posix-aio-compat: Honour AsyncContext
Don't call callbacks that don't belong to the active AsyncContext.
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'posix-aio-compat.c')
-rw-r--r-- | posix-aio-compat.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/posix-aio-compat.c b/posix-aio-compat.c index 4901539b92..ec58288dc8 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; |