Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 24 May 2006 18:07:29 -0400
From:      John Baldwin <jhb@freebsd.org>
To:        current@freebsd.org
Subject:   [PATCH] Change kqueue_register() to use fget()
Message-ID:  <200605241807.29163.jhb@freebsd.org>

next in thread | raw e-mail | index | archive | help
This small patch fixes up a part of kevent to use fget() instead of mangling
the filedesc struct directly.  I haven't had time yet to sit down and test
kevent apps with it so would appreciate it if anyone has some idle cycles to
do that.

--- //depot/vendor/freebsd/src/sys/kern/kern_event.c	2006/04/14 14:33:55
+++ //depot/projects/smpng/sys/kern/kern_event.c	2006/04/25 19:47:56
@@ -754,15 +754,12 @@
 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 @@
 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 @@
 			 * they are the same thing.
 			 */
 			if (fp->f_data == kq) {
-				FILEDESC_UNLOCK(fdp);
 				error = EINVAL;
 				goto done_noglobal;
 			}
@@ -819,7 +806,6 @@
 			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)

-- 
John Baldwin



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200605241807.29163.jhb>