summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_event.c
diff options
context:
space:
mode:
authorjmg <jmg@FreeBSD.org>2006-09-24 04:47:47 +0000
committerjmg <jmg@FreeBSD.org>2006-09-24 04:47:47 +0000
commit28f00353ba5fc2f2baf2ccf2f0b9985f25059125 (patch)
tree87eb6e1d46cdd7b1acfa4bb3682b2e2722adc15e /sys/kern/kern_event.c
parent08d150cea64d52d18374d306967feb39d63c4e64 (diff)
downloadFreeBSD-src-28f00353ba5fc2f2baf2ccf2f0b9985f25059125.zip
FreeBSD-src-28f00353ba5fc2f2baf2ccf2f0b9985f25059125.tar.gz
hide kqueue_register from public view, and replace it w/ kqfd_register...
this eliminates a possible race in aio registering a kevent..
Diffstat (limited to 'sys/kern/kern_event.c')
-rw-r--r--sys/kern/kern_event.c32
1 files changed, 30 insertions, 2 deletions
diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c
index 8692808..a8c9638 100644
--- a/sys/kern/kern_event.c
+++ b/sys/kern/kern_event.c
@@ -88,6 +88,8 @@ TASKQUEUE_DEFINE_THREAD(kqueue);
static int kevent_copyout(void *arg, struct kevent *kevp, int count);
static int kevent_copyin(void *arg, struct kevent *kevp, int count);
+static int kqueue_register(struct kqueue *kq, struct kevent *kev,
+ struct thread *td, int waitok);
static int kqueue_aquire(struct file *fp, struct kqueue **kqp);
static void kqueue_release(struct kqueue *kq, int locked);
static int kqueue_expand(struct kqueue *kq, struct filterops *fops,
@@ -783,11 +785,11 @@ kqueue_fo_release(int filt)
}
/*
- * A ref to kq (obtained via kqueue_aquire) should be held. waitok will
+ * A ref to kq (obtained via kqueue_aquire) must be held. waitok will
* influence if memory allocation should wait. Make sure it is 0 if you
* hold any mutexes.
*/
-int
+static int
kqueue_register(struct kqueue *kq, struct kevent *kev, struct thread *td, int waitok)
{
struct filterops *fops;
@@ -1939,3 +1941,29 @@ knote_free(struct knote *kn)
if (kn != NULL)
uma_zfree(knote_zone, kn);
}
+
+/*
+ * Register the kev w/ the kq specified by fd.
+ */
+int
+kqfd_register(int fd, struct kevent *kev, struct thread *td, int waitok)
+{
+ struct kqueue *kq;
+ struct file *fp;
+ int error;
+
+ if ((error = fget(td, fd, &fp)) != 0)
+ return (error);
+ if ((error = kqueue_aquire(fp, &kq)) != 0)
+ goto noaquire;
+
+ error = kqueue_register(kq, kev, td, waitok);
+
+ kqueue_release(kq, 0);
+
+noaquire:
+ if (fp != NULL)
+ fdrop(fp, td);
+
+ return error;
+}
OpenPOWER on IntegriCloud