Page MenuHomeFreeBSD

D27421.id80148.diff
No OneTemporary

D27421.id80148.diff

Index: sys/kern/vfs_aio.c
===================================================================
--- sys/kern/vfs_aio.c
+++ sys/kern/vfs_aio.c
@@ -248,8 +248,8 @@
*/
struct aioliojob {
int lioj_flags; /* (a) listio flags */
- int lioj_count; /* (a) listio flags */
- int lioj_finished_count; /* (a) listio flags */
+ int lioj_count; /* (a) count of jobs */
+ int lioj_finished_count; /* (a) count of finished jobs */
struct sigevent lioj_signal; /* (a) signal on all I/O done */
TAILQ_ENTRY(aioliojob) lioj_list; /* (a) lio list */
struct knlist klist; /* (a) list of knotes */
@@ -466,7 +466,7 @@
}
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 @@
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 @@
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);
@@ -905,11 +905,12 @@
lj->lioj_flags |= LIOJ_KEVENT_POSTED;
KNOTE_LOCKED(&lj->klist, 1);
}
- if ((lj->lioj_flags & (LIOJ_SIGNAL|LIOJ_SIGNAL_POSTED))
- == 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);
+ if ((lj->lioj_flags & (LIOJ_SIGNAL | LIOJ_SIGNAL_POSTED))
+ == 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,
+ true);
lj->lioj_flags |= LIOJ_SIGNAL_POSTED;
}
}
@@ -2234,12 +2235,12 @@
lj->lioj_flags |= LIOJ_KEVENT_POSTED;
KNOTE_LOCKED(&lj->klist, 1);
}
- if ((lj->lioj_flags & (LIOJ_SIGNAL|LIOJ_SIGNAL_POSTED))
- == LIOJ_SIGNAL
- && (lj->lioj_signal.sigev_notify == SIGEV_SIGNAL ||
+ if ((lj->lioj_flags & (LIOJ_SIGNAL | 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;
}
}

File Metadata

Mime Type
text/plain
Expires
Sun, Apr 12, 12:52 PM (21 h, 59 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31349172
Default Alt Text
D27421.id80148.diff (2 KB)

Event Timeline