Date: Mon, 3 Mar 2008 23:15:03 GMT From: Roman Divacky <rdivacky@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 136771 for review Message-ID: <200803032315.m23NF3u6011181@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=136771 Change 136771 by rdivacky@rdivacky_witten on 2008/03/03 23:14:36 The copyout callback can also be called when there's an error during registration of a filter. Check this condition and store the error in event->data and pick the error up if we trigger such conditioin epoll_ctl(). Affected files ... .. //depot/projects/soc2007/rdivacky/linux_epoll/sys/compat/linux/linux_epoll.c#9 edit Differences ... ==== //depot/projects/soc2007/rdivacky/linux_epoll/sys/compat/linux/linux_epoll.c#9 (text+ko) ==== @@ -29,10 +29,12 @@ #include "opt_compat.h" +#include <sys/param.h> #include <sys/types.h> #include <sys/systm.h> #include <sys/errno.h> #include <sys/event.h> +#include <sys/proc.h> #include <sys/sysproto.h> #include <sys/syscallsubr.h> #include <sys/timespec.h> @@ -81,12 +83,16 @@ EV_SET(kevent, fd, filter, flags, 0, 0, 0); } -/* Structure converting function from kevent to epoll. */ +/* + * Structure converting function from kevent to epoll. In a case + * this is called on error in registration we store the error in + * event->data and pick it up later in linux_epoll_ctl(). + */ static void linux_kevent_to_epoll(struct kevent *kevent, struct linux_epoll_event *event) { if (kevent->flags & EV_ERROR) { - /* XXX: error handling */ + event->data = kevent->data; return; } switch (kevent->filter) { @@ -106,7 +112,8 @@ /* * Copyout callback used by kevent. This converts kevent * events to epoll events and copies them back to the - * userspace. + * userspace. This is also called on error on registering + * of the filter. */ static int linux_kev_copyout(void *arg, struct kevent *kevp, int count) @@ -194,7 +201,14 @@ } linux_epoll_to_kevent(args->fd, &le, &kev); - return (kern_kevent(td, args->epfd, 1, 0, &k_ops, NULL)); + error = kern_kevent(td, args->epfd, 1, 0, &k_ops, NULL); + /* Check if there was an error during registration. */ + if (error == 0 && td->td_retval[0] != 0) { + /* The copyout callback stored the error there. */ + error = le.data; + } + + return (error); } /*
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200803032315.m23NF3u6011181>