summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_aio.c
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2001-03-07 03:37:06 +0000
committerjhb <jhb@FreeBSD.org>2001-03-07 03:37:06 +0000
commit9cd254601baefc2dc9c953abe9747717374ff8b1 (patch)
treeac4298224e8af28e8b2f904a43a2925c21dfc798 /sys/kern/vfs_aio.c
parentace71d59bf35fa6d911520ec855d0100773422a8 (diff)
downloadFreeBSD-src-9cd254601baefc2dc9c953abe9747717374ff8b1.zip
FreeBSD-src-9cd254601baefc2dc9c953abe9747717374ff8b1.tar.gz
Grab the process lock while calling psignal and before calling psignal.
Diffstat (limited to 'sys/kern/vfs_aio.c')
-rw-r--r--sys/kern/vfs_aio.c35
1 files changed, 26 insertions, 9 deletions
diff --git a/sys/kern/vfs_aio.c b/sys/kern/vfs_aio.c
index f9d93a5..c8c2da8 100644
--- a/sys/kern/vfs_aio.c
+++ b/sys/kern/vfs_aio.c
@@ -609,8 +609,11 @@ aio_process(struct aiocblist *aiocbe)
if ((error) && (auio.uio_resid != cnt)) {
if (error == ERESTART || error == EINTR || error == EWOULDBLOCK)
error = 0;
- if ((error == EPIPE) && (cb->aio_lio_opcode == LIO_WRITE))
+ if ((error == EPIPE) && (cb->aio_lio_opcode == LIO_WRITE)) {
+ PROC_LOCK(userp);
psignal(userp, SIGPIPE);
+ PROC_UNLOCK(userp);
+ }
}
cnt -= auio.uio_resid;
@@ -800,10 +803,11 @@ aio_daemon(void *uproc)
lj->lioj_queue_count) &&
(lj->lioj_buffer_finished_count ==
lj->lioj_buffer_count)) {
- psignal(userp,
- lj->lioj_signal.sigev_signo);
- lj->lioj_flags |=
- LIOJ_SIGNAL_POSTED;
+ PROC_LOCK(userp);
+ psignal(userp,
+ lj->lioj_signal.sigev_signo);
+ PROC_UNLOCK(userp);
+ lj->lioj_flags |= LIOJ_SIGNAL_POSTED;
}
}
splx(s);
@@ -834,7 +838,9 @@ aio_daemon(void *uproc)
}
if (cb->aio_sigevent.sigev_notify == SIGEV_SIGNAL) {
+ PROC_LOCK(userp);
psignal(userp, cb->aio_sigevent.sigev_signo);
+ PROC_UNLOCK(userp);
}
}
@@ -1695,8 +1701,11 @@ aio_cancel(struct proc *p, struct aio_cancel_args *uap)
cancelled++;
/* XXX cancelled, knote? */
if (cbe->uaiocb.aio_sigevent.sigev_notify ==
- SIGEV_SIGNAL)
+ SIGEV_SIGNAL) {
+ PROC_LOCK(cbe->userproc);
psignal(cbe->userproc, cbe->uaiocb.aio_sigevent.sigev_signo);
+ PROC_UNLOCK(cbe->userproc);
+ }
if (uap->aiocbp)
break;
}
@@ -1734,8 +1743,11 @@ aio_cancel(struct proc *p, struct aio_cancel_args *uap)
cbe->uaiocb._aiocb_private.error = ECANCELED;
/* XXX cancelled, knote? */
if (cbe->uaiocb.aio_sigevent.sigev_notify ==
- SIGEV_SIGNAL)
+ SIGEV_SIGNAL) {
+ PROC_LOCK(cbe->userproc);
psignal(cbe->userproc, cbe->uaiocb.aio_sigevent.sigev_signo);
+ PROC_UNLOCK(cbe->userproc);
+ }
} else {
notcancelled++;
}
@@ -2050,13 +2062,18 @@ process_signal(void *aioj)
struct aiocb *cb = &aiocbe->uaiocb;
if ((lj) && (lj->lioj_signal.sigev_notify == SIGEV_SIGNAL) &&
- (lj->lioj_queue_count == lj->lioj_queue_finished_count)) {
+ (lj->lioj_queue_count == lj->lioj_queue_finished_count)) {
+ PROC_LOCK(lj->lioj_ki->kaio_p);
psignal(lj->lioj_ki->kaio_p, lj->lioj_signal.sigev_signo);
+ PROC_UNLOCK(lj->lioj_ki->kaio_p);
lj->lioj_flags |= LIOJ_SIGNAL_POSTED;
}
- if (cb->aio_sigevent.sigev_notify == SIGEV_SIGNAL)
+ if (cb->aio_sigevent.sigev_notify == SIGEV_SIGNAL) {
+ PROC_LOCK(aiocbe->userproc);
psignal(aiocbe->userproc, cb->aio_sigevent.sigev_signo);
+ PROC_UNLOCK(aiocbe->userproc);
+ }
}
/*
OpenPOWER on IntegriCloud