_aio_aqueue(): Change kevent registration to use its own struct file pointer.

Otherwise, aio_read() and aio_write() on sockets are broken if a kevent is
 registered.  (The code after kevent registration for handling sockets assumes
 that the struct file pointer "fp" still refers to the socket, not the kqueue.)
This commit is contained in:
Alan Cox 2000-10-29 21:38:28 +00:00
parent e726be510b
commit 39b2b25fa0
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=67907

View File

@ -1300,6 +1300,7 @@ _aio_aqueue(struct proc *p, struct aiocb *job, struct aio_liojob *lj, int type)
{
struct kevent kev, *kevp;
struct kqueue *kq;
struct file *kq_fp;
kevp = (struct kevent *)job->aio_lio_opcode;
if (kevp == NULL)
@ -1310,12 +1311,12 @@ _aio_aqueue(struct proc *p, struct aiocb *job, struct aio_liojob *lj, int type)
goto aqueue_fail;
if ((u_int)kev.ident >= fdp->fd_nfiles ||
(fp = fdp->fd_ofiles[kev.ident]) == NULL ||
(fp->f_type != DTYPE_KQUEUE)) {
(kq_fp = fdp->fd_ofiles[kev.ident]) == NULL ||
(kq_fp->f_type != DTYPE_KQUEUE)) {
error = EBADF;
goto aqueue_fail;
}
kq = (struct kqueue *)fp->f_data;
kq = (struct kqueue *)kq_fp->f_data;
kev.ident = (u_long)aiocbe;
kev.filter = EVFILT_AIO;
kev.flags = EV_ADD | EV_ENABLE | EV_FLAG1;