summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2006-06-12 21:46:23 +0000
committerjhb <jhb@FreeBSD.org>2006-06-12 21:46:23 +0000
commitefa082aa7447f58c4152d9dbe6a4fb84462423ae (patch)
tree8c187fce939c15e3bb6a4b1b9fae624aec0d2ba2 /sys
parent9e60ac43b5ce3518ef71ac90c67969eec3282762 (diff)
downloadFreeBSD-src-efa082aa7447f58c4152d9dbe6a4fb84462423ae.zip
FreeBSD-src-efa082aa7447f58c4152d9dbe6a4fb84462423ae.tar.gz
Use fget() in kqueue_register() instead of doing all the work by hand.
Diffstat (limited to 'sys')
-rw-r--r--sys/kern/kern_event.c20
1 files changed, 3 insertions, 17 deletions
diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c
index ed10fc9..c3b37f5 100644
--- a/sys/kern/kern_event.c
+++ b/sys/kern/kern_event.c
@@ -754,15 +754,12 @@ kqueue_fo_release(int filt)
int
kqueue_register(struct kqueue *kq, struct kevent *kev, struct thread *td, int waitok)
{
- struct filedesc *fdp;
struct filterops *fops;
struct file *fp;
struct knote *kn, *tkn;
int error, filt, event;
int haskqglobal;
- int fd;
- fdp = NULL;
fp = NULL;
kn = NULL;
error = 0;
@@ -778,22 +775,13 @@ kqueue_register(struct kqueue *kq, struct kevent *kev, struct thread *td, int wa
findkn:
if (fops->f_isfd) {
KASSERT(td != NULL, ("td is NULL"));
- fdp = td->td_proc->p_fd;
- FILEDESC_LOCK(fdp);
- /* validate descriptor */
- fd = kev->ident;
- if (fd < 0 || fd >= fdp->fd_nfiles ||
- (fp = fdp->fd_ofiles[fd]) == NULL) {
- FILEDESC_UNLOCK(fdp);
- error = EBADF;
+ error = fget(td, kev->ident, &fp);
+ if (error)
goto done;
- }
- fhold(fp);
if ((kev->flags & EV_ADD) == EV_ADD && kqueue_expand(kq, fops,
kev->ident, 0) != 0) {
- /* unlock and try again */
- FILEDESC_UNLOCK(fdp);
+ /* try again */
fdrop(fp, td);
fp = NULL;
error = kqueue_expand(kq, fops, kev->ident, waitok);
@@ -811,7 +799,6 @@ findkn:
* they are the same thing.
*/
if (fp->f_data == kq) {
- FILEDESC_UNLOCK(fdp);
error = EINVAL;
goto done;
}
@@ -819,7 +806,6 @@ findkn:
KQ_GLOBAL_LOCK(&kq_global, haskqglobal);
}
- FILEDESC_UNLOCK(fdp);
KQ_LOCK(kq);
if (kev->ident < kq->kq_knlistsize) {
SLIST_FOREACH(kn, &kq->kq_knlist[kev->ident], kn_link)
OpenPOWER on IntegriCloud