diff options
author | alc <alc@FreeBSD.org> | 2002-04-08 04:57:56 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2002-04-08 04:57:56 +0000 |
commit | 548fecffbc92e98cd0029bc03e0c90d7afe07264 (patch) | |
tree | 853e605fe2a16ae345d510ef3a0f8944d10775fb /sys/kern/vfs_aio.c | |
parent | 75d2443b7837a96530837f07564dc648e4b59e13 (diff) | |
download | FreeBSD-src-548fecffbc92e98cd0029bc03e0c90d7afe07264.zip FreeBSD-src-548fecffbc92e98cd0029bc03e0c90d7afe07264.tar.gz |
Restructure aio_return() to eliminate duplicated code and facilitate Giant
push down.
Diffstat (limited to 'sys/kern/vfs_aio.c')
-rw-r--r-- | sys/kern/vfs_aio.c | 36 |
1 files changed, 15 insertions, 21 deletions
diff --git a/sys/kern/vfs_aio.c b/sys/kern/vfs_aio.c index a272813..46d2805 100644 --- a/sys/kern/vfs_aio.c +++ b/sys/kern/vfs_aio.c @@ -1587,24 +1587,17 @@ aio_return(struct thread *td, struct aio_return_args *uap) struct aiocb *ujob; struct kaioinfo *ki; - ki = p->p_aioinfo; - if (ki == NULL) - return EINVAL; - ujob = uap->aiocbp; - jobref = fuword(&ujob->_aiocb_private.kernelinfo); if (jobref == -1 || jobref == 0) return EINVAL; + ki = p->p_aioinfo; + if (ki == NULL) + return EINVAL; TAILQ_FOREACH(cb, &ki->kaio_jobdone, plist) { if (((intptr_t) cb->uaiocb._aiocb_private.kernelinfo) == jobref) { - if (ujob == cb->uuaiocb) { - td->td_retval[0] = - cb->uaiocb._aiocb_private.status; - } else - td->td_retval[0] = EFAULT; if (cb->uaiocb.aio_lio_opcode == LIO_WRITE) { p->p_stats->p_ru.ru_oublock += cb->outputcharge; @@ -1613,8 +1606,7 @@ aio_return(struct thread *td, struct aio_return_args *uap) p->p_stats->p_ru.ru_inblock += cb->inputcharge; cb->inputcharge = 0; } - aio_free_entry(cb); - return 0; + goto done; } } s = splbio(); @@ -1622,18 +1614,20 @@ aio_return(struct thread *td, struct aio_return_args *uap) ncb = TAILQ_NEXT(cb, plist); if (((intptr_t) cb->uaiocb._aiocb_private.kernelinfo) == jobref) { - splx(s); - if (ujob == cb->uuaiocb) { - td->td_retval[0] = - cb->uaiocb._aiocb_private.status; - } else - td->td_retval[0] = EFAULT; - aio_free_entry(cb); - return 0; + break; } } splx(s); - + done: + if (cb != NULL) { + if (ujob == cb->uuaiocb) { + td->td_retval[0] = + cb->uaiocb._aiocb_private.status; + } else + td->td_retval[0] = EFAULT; + aio_free_entry(cb); + return (0); + } return (EINVAL); } |