diff options
author | Konstantin Belousov <kib@FreeBSD.org> | 2020-12-08 01:47:59 +0000 |
---|---|---|
committer | Konstantin Belousov <kib@FreeBSD.org> | 2020-12-08 01:47:59 +0000 |
commit | 0cb70c4bbc82c2bd9998a38025e92cf7145615c9 (patch) | |
tree | 6b62b7b80ac39e59841f80609f19382277c22449 /sys | |
parent | 3a7f72b2048040669a695a7906c3bf5685ca6032 (diff) | |
download | src-test2-0cb70c4bbc82c2bd9998a38025e92cf7145615c9.tar.gz src-test2-0cb70c4bbc82c2bd9998a38025e92cf7145615c9.zip |
MFC r368265:
lio_listio(2): send signal even if number of jobs is zero.
Notes
Notes:
svn path=/stable/12/; revision=368430
Diffstat (limited to 'sys')
-rw-r--r-- | sys/kern/vfs_aio.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/sys/kern/vfs_aio.c b/sys/kern/vfs_aio.c index 7cedc3d5db89..d68301d3d342 100644 --- a/sys/kern/vfs_aio.c +++ b/sys/kern/vfs_aio.c @@ -466,7 +466,7 @@ aio_init_aioinfo(struct proc *p) } static int -aio_sendsig(struct proc *p, struct sigevent *sigev, ksiginfo_t *ksi) +aio_sendsig(struct proc *p, struct sigevent *sigev, ksiginfo_t *ksi, bool ext) { struct thread *td; int error; @@ -477,7 +477,7 @@ aio_sendsig(struct proc *p, struct sigevent *sigev, ksiginfo_t *ksi) if (!KSI_ONQ(ksi)) { ksiginfo_set_sigev(ksi, sigev); ksi->ksi_code = SI_ASYNCIO; - ksi->ksi_flags |= KSI_EXT | KSI_INS; + ksi->ksi_flags |= ext ? (KSI_EXT | KSI_INS) : 0; tdsendsignal(p, td, ksi->ksi_signo, ksi); } PROC_UNLOCK(p); @@ -896,7 +896,7 @@ aio_bio_done_notify(struct proc *userp, struct kaiocb *job) if (job->uaiocb.aio_sigevent.sigev_notify == SIGEV_SIGNAL || job->uaiocb.aio_sigevent.sigev_notify == SIGEV_THREAD_ID) - aio_sendsig(userp, &job->uaiocb.aio_sigevent, &job->ksi); + aio_sendsig(userp, &job->uaiocb.aio_sigevent, &job->ksi, true); KNOTE_LOCKED(&job->klist, 1); @@ -909,7 +909,8 @@ aio_bio_done_notify(struct proc *userp, struct kaiocb *job) == LIOJ_SIGNAL && (lj->lioj_signal.sigev_notify == SIGEV_SIGNAL || lj->lioj_signal.sigev_notify == SIGEV_THREAD_ID)) { - aio_sendsig(userp, &lj->lioj_signal, &lj->lioj_ksi); + aio_sendsig(userp, &lj->lioj_signal, &lj->lioj_ksi, + true); lj->lioj_flags |= LIOJ_SIGNAL_POSTED; } } @@ -2232,7 +2233,8 @@ kern_lio_listio(struct thread *td, int mode, struct aiocb * const *uacb_list, LIOJ_SIGNAL_POSTED)) == LIOJ_SIGNAL && (lj->lioj_signal.sigev_notify == SIGEV_SIGNAL || lj->lioj_signal.sigev_notify == SIGEV_THREAD_ID)) { - aio_sendsig(p, &lj->lioj_signal, &lj->lioj_ksi); + aio_sendsig(p, &lj->lioj_signal, &lj->lioj_ksi, + lj->lioj_count != 1); lj->lioj_flags |= LIOJ_SIGNAL_POSTED; } } |