svn commit: r255675 - in head/sys: amd64/linux32 compat/linux conf i386/linux kern modules/linux sys
Roman Divacky
rdivacky at FreeBSD.org
Wed Sep 18 18:48:36 UTC 2013
Author: rdivacky
Date: Wed Sep 18 18:48:33 2013
New Revision: 255675
URL: http://svnweb.freebsd.org/changeset/base/255675
Log:
Revert r255672, it has some serious flaws, leaking file references etc.
Approved by: re (delphij)
Deleted:
head/sys/compat/linux/linux_epoll.c
head/sys/compat/linux/linux_epoll.h
Modified:
head/sys/amd64/linux32/linux32_dummy.c
head/sys/amd64/linux32/syscalls.master
head/sys/conf/files.amd64
head/sys/conf/files.i386
head/sys/conf/files.pc98
head/sys/i386/linux/linux_dummy.c
head/sys/i386/linux/syscalls.master
head/sys/kern/kern_event.c
head/sys/modules/linux/Makefile
head/sys/sys/event.h
head/sys/sys/file.h
head/sys/sys/syscallsubr.h
Modified: head/sys/amd64/linux32/linux32_dummy.c
==============================================================================
--- head/sys/amd64/linux32/linux32_dummy.c Wed Sep 18 18:02:01 2013 (r255674)
+++ head/sys/amd64/linux32/linux32_dummy.c Wed Sep 18 18:48:33 2013 (r255675)
@@ -70,6 +70,9 @@ DUMMY(pivot_root);
DUMMY(mincore);
DUMMY(ptrace);
DUMMY(lookup_dcookie);
+DUMMY(epoll_create);
+DUMMY(epoll_ctl);
+DUMMY(epoll_wait);
DUMMY(remap_file_pages);
DUMMY(timer_create);
DUMMY(timer_settime);
@@ -126,6 +129,7 @@ DUMMY(timerfd_gettime);
/* linux 2.6.27: */
DUMMY(signalfd4);
DUMMY(eventfd2);
+DUMMY(epoll_create1);
DUMMY(dup3);
DUMMY(inotify_init1);
/* linux 2.6.30: */
Modified: head/sys/amd64/linux32/syscalls.master
==============================================================================
--- head/sys/amd64/linux32/syscalls.master Wed Sep 18 18:02:01 2013 (r255674)
+++ head/sys/amd64/linux32/syscalls.master Wed Sep 18 18:48:33 2013 (r255675)
@@ -430,11 +430,9 @@
251 AUE_NULL UNIMPL
252 AUE_EXIT STD { int linux_exit_group(int error_code); }
253 AUE_NULL STD { int linux_lookup_dcookie(void); }
-254 AUE_NULL STD { int linux_epoll_create(l_int size); }
-255 AUE_NULL STD { int linux_epoll_ctl(l_int epfd, l_int op, l_int fd, \
- struct linux_epoll_event *event); }
-256 AUE_NULL STD { int linux_epoll_wait(l_int epfd, struct linux_epoll_event *events, \
- l_int maxevents, l_int timeout); }
+254 AUE_NULL STD { int linux_epoll_create(void); }
+255 AUE_NULL STD { int linux_epoll_ctl(void); }
+256 AUE_NULL STD { int linux_epoll_wait(void); }
257 AUE_NULL STD { int linux_remap_file_pages(void); }
258 AUE_NULL STD { int linux_set_tid_address(int *tidptr); }
259 AUE_NULL STD { int linux_timer_create(void); }
@@ -536,7 +534,7 @@
; linux 2.6.27:
327 AUE_NULL STD { int linux_signalfd4(void); }
328 AUE_NULL STD { int linux_eventfd2(void); }
-329 AUE_NULL STD { int linux_epoll_create1(l_int flags); }
+329 AUE_NULL STD { int linux_epoll_create1(void); }
330 AUE_NULL STD { int linux_dup3(void); }
331 AUE_NULL STD { int linux_pipe2(l_int *pipefds, l_int flags); }
332 AUE_NULL STD { int linux_inotify_init1(void); }
Modified: head/sys/conf/files.amd64
==============================================================================
--- head/sys/conf/files.amd64 Wed Sep 18 18:02:01 2013 (r255674)
+++ head/sys/conf/files.amd64 Wed Sep 18 18:48:33 2013 (r255675)
@@ -467,7 +467,6 @@ amd64/linux32/linux32_support.s optional
dependency "linux32_assym.h"
amd64/linux32/linux32_sysent.c optional compat_linux32
amd64/linux32/linux32_sysvec.c optional compat_linux32
-compat/linux/linux_epoll.c optional compat_linux32
compat/linux/linux_emul.c optional compat_linux32
compat/linux/linux_file.c optional compat_linux32
compat/linux/linux_fork.c optional compat_linux32
Modified: head/sys/conf/files.i386
==============================================================================
--- head/sys/conf/files.i386 Wed Sep 18 18:02:01 2013 (r255674)
+++ head/sys/conf/files.i386 Wed Sep 18 18:48:33 2013 (r255675)
@@ -80,7 +80,6 @@ hptrr_lib.o optional hptrr \
cddl/contrib/opensolaris/common/atomic/i386/opensolaris_atomic.S optional zfs compile-with "${ZFS_S}"
compat/linprocfs/linprocfs.c optional linprocfs
compat/linsysfs/linsysfs.c optional linsysfs
-compat/linux/linux_epoll.c optional compat_linux
compat/linux/linux_emul.c optional compat_linux
compat/linux/linux_file.c optional compat_linux
compat/linux/linux_fork.c optional compat_linux
Modified: head/sys/conf/files.pc98
==============================================================================
--- head/sys/conf/files.pc98 Wed Sep 18 18:02:01 2013 (r255674)
+++ head/sys/conf/files.pc98 Wed Sep 18 18:48:33 2013 (r255675)
@@ -41,7 +41,6 @@ ukbdmap.h optional ukbd_dflt_keymap \
cddl/contrib/opensolaris/common/atomic/i386/opensolaris_atomic.S optional zfs compile-with "${ZFS_S}"
compat/linprocfs/linprocfs.c optional linprocfs
compat/linsysfs/linsysfs.c optional linsysfs
-compat/linux/linux_epoll.c optional compat_linux
compat/linux/linux_emul.c optional compat_linux
compat/linux/linux_file.c optional compat_linux
compat/linux/linux_fork.c optional compat_linux
Modified: head/sys/i386/linux/linux_dummy.c
==============================================================================
--- head/sys/i386/linux/linux_dummy.c Wed Sep 18 18:02:01 2013 (r255674)
+++ head/sys/i386/linux/linux_dummy.c Wed Sep 18 18:48:33 2013 (r255675)
@@ -72,6 +72,9 @@ DUMMY(setfsgid);
DUMMY(pivot_root);
DUMMY(mincore);
DUMMY(lookup_dcookie);
+DUMMY(epoll_create);
+DUMMY(epoll_ctl);
+DUMMY(epoll_wait);
DUMMY(remap_file_pages);
DUMMY(fstatfs64);
DUMMY(mbind);
@@ -117,6 +120,7 @@ DUMMY(timerfd_gettime);
/* linux 2.6.27: */
DUMMY(signalfd4);
DUMMY(eventfd2);
+DUMMY(epoll_create1);
DUMMY(dup3);
DUMMY(inotify_init1);
/* linux 2.6.30: */
Modified: head/sys/i386/linux/syscalls.master
==============================================================================
--- head/sys/i386/linux/syscalls.master Wed Sep 18 18:02:01 2013 (r255674)
+++ head/sys/i386/linux/syscalls.master Wed Sep 18 18:48:33 2013 (r255675)
@@ -432,11 +432,9 @@
251 AUE_NULL UNIMPL
252 AUE_EXIT STD { int linux_exit_group(int error_code); }
253 AUE_NULL STD { int linux_lookup_dcookie(void); }
-254 AUE_NULL STD { int linux_epoll_create(l_int size); }
-255 AUE_NULL STD { int linux_epoll_ctl(l_int epfd, l_int op, l_int fd, \
- struct linux_epoll_event *event); }
-256 AUE_NULL STD { int linux_epoll_wait(l_int epfd, struct linux_epoll_event *events, \
- l_int maxevents, l_int timeout); }
+254 AUE_NULL STD { int linux_epoll_create(void); }
+255 AUE_NULL STD { int linux_epoll_ctl(void); }
+256 AUE_NULL STD { int linux_epoll_wait(void); }
257 AUE_NULL STD { int linux_remap_file_pages(void); }
258 AUE_NULL STD { int linux_set_tid_address(int *tidptr); }
259 AUE_NULL STD { int linux_timer_create(clockid_t clock_id, \
@@ -546,7 +544,7 @@
; linux 2.6.27:
327 AUE_NULL STD { int linux_signalfd4(void); }
328 AUE_NULL STD { int linux_eventfd2(void); }
-329 AUE_NULL STD { int linux_epoll_create1(l_int flags); }
+329 AUE_NULL STD { int linux_epoll_create1(void); }
330 AUE_NULL STD { int linux_dup3(void); }
331 AUE_NULL STD { int linux_pipe2(l_int *pipefds, l_int flags); }
332 AUE_NULL STD { int linux_inotify_init1(void); }
Modified: head/sys/kern/kern_event.c
==============================================================================
--- head/sys/kern/kern_event.c Wed Sep 18 18:02:01 2013 (r255674)
+++ head/sys/kern/kern_event.c Wed Sep 18 18:48:33 2013 (r255675)
@@ -107,7 +107,16 @@ static void kqueue_wakeup(struct kqueue
static struct filterops *kqueue_fo_find(int filt);
static void kqueue_fo_release(int filt);
-struct fileops kqueueops = {
+static fo_rdwr_t kqueue_read;
+static fo_rdwr_t kqueue_write;
+static fo_truncate_t kqueue_truncate;
+static fo_ioctl_t kqueue_ioctl;
+static fo_poll_t kqueue_poll;
+static fo_kqfilter_t kqueue_kqfilter;
+static fo_stat_t kqueue_stat;
+static fo_close_t kqueue_close;
+
+static struct fileops kqueueops = {
.fo_read = kqueue_read,
.fo_write = kqueue_write,
.fo_truncate = kqueue_truncate,
@@ -294,7 +303,7 @@ filt_fileattach(struct knote *kn)
}
/*ARGSUSED*/
-int
+static int
kqueue_kqfilter(struct file *fp, struct knote *kn)
{
struct kqueue *kq = kn->kn_fp->f_data;
@@ -679,7 +688,34 @@ filt_usertouch(struct knote *kn, struct
int
sys_kqueue(struct thread *td, struct kqueue_args *uap)
{
- return (kern_kqueue(td));
+ struct filedesc *fdp;
+ struct kqueue *kq;
+ struct file *fp;
+ int fd, error;
+
+ fdp = td->td_proc->p_fd;
+ error = falloc(td, &fp, &fd, 0);
+ if (error)
+ goto done2;
+
+ /* An extra reference on `fp' has been held for us by falloc(). */
+ kq = malloc(sizeof *kq, M_KQUEUE, M_WAITOK | M_ZERO);
+ mtx_init(&kq->kq_lock, "kqueue", NULL, MTX_DEF|MTX_DUPOK);
+ TAILQ_INIT(&kq->kq_head);
+ kq->kq_fdp = fdp;
+ knlist_init_mtx(&kq->kq_sel.si_note, &kq->kq_lock);
+ TASK_INIT(&kq->kq_task, 0, kqueue_task, kq);
+
+ FILEDESC_XLOCK(fdp);
+ TAILQ_INSERT_HEAD(&fdp->fd_kqlist, kq, kq_list);
+ FILEDESC_XUNLOCK(fdp);
+
+ finit(fp, FREAD | FWRITE, DTYPE_KQUEUE, kq, &kqueueops);
+ fdrop(fp, td);
+
+ td->td_retval[0] = fd;
+done2:
+ return (error);
}
#ifndef _SYS_SYSPROTO_H_
@@ -781,75 +817,19 @@ kevent_copyin(void *arg, struct kevent *
}
int
-kern_kqueue(struct thread *td)
-{
- struct file *fp;
- int error;
-
- error = kern_kqueue_locked(td, &fp);
-
- fdrop(fp, td);
- return (error);
-}
-
-int
-kern_kqueue_locked(struct thread *td, struct file **fpp)
-{
- struct filedesc *fdp;
- struct kqueue *kq;
- struct file *fp;
- int fd, error;
-
- fdp = td->td_proc->p_fd;
- error = falloc(td, &fp, &fd, 0);
- if (error)
- return (error);
-
- /* An extra reference on `fp' has been held for us by falloc(). */
- kq = malloc(sizeof *kq, M_KQUEUE, M_WAITOK | M_ZERO);
- mtx_init(&kq->kq_lock, "kqueue", NULL, MTX_DEF|MTX_DUPOK);
- TAILQ_INIT(&kq->kq_head);
- kq->kq_fdp = fdp;
- knlist_init_mtx(&kq->kq_sel.si_note, &kq->kq_lock);
- TASK_INIT(&kq->kq_task, 0, kqueue_task, kq);
-
- FILEDESC_XLOCK(fdp);
- TAILQ_INSERT_HEAD(&fdp->fd_kqlist, kq, kq_list);
- FILEDESC_XUNLOCK(fdp);
-
- finit(fp, FREAD | FWRITE, DTYPE_KQUEUE, kq, &kqueueops);
-
- td->td_retval[0] = fd;
- *fpp = fp;
- return (0);
-}
-
-int
kern_kevent(struct thread *td, int fd, int nchanges, int nevents,
struct kevent_copyops *k_ops, const struct timespec *timeout)
{
- struct file *fp;
- cap_rights_t rights;
- int error;
-
- if ((error = fget(td, fd, cap_rights_init(&rights, CAP_POST_EVENT), &fp)) != 0)
- return (error);
-
- error = kern_kevent_locked(td, fp, nchanges, nevents, k_ops, timeout);
-
- fdrop(fp, td);
- return (error);
-}
-
-int
-kern_kevent_locked(struct thread *td, struct file *fp, int nchanges, int nevents,
- struct kevent_copyops *k_ops, const struct timespec *timeout)
-{
struct kevent keva[KQ_NEVENTS];
struct kevent *kevp, *changes;
struct kqueue *kq;
+ struct file *fp;
+ cap_rights_t rights;
int i, n, nerrors, error;
+ error = fget(td, fd, cap_rights_init(&rights, CAP_POST_EVENT), &fp);
+ if (error != 0)
+ return (error);
if ((error = kqueue_acquire(fp, &kq)) != 0)
goto done_norel;
@@ -892,6 +872,7 @@ kern_kevent_locked(struct thread *td, st
done:
kqueue_release(kq, 0);
done_norel:
+ fdrop(fp, td);
return (error);
}
@@ -1545,7 +1526,7 @@ done_nl:
* This could be expanded to call kqueue_scan, if desired.
*/
/*ARGSUSED*/
-int
+static int
kqueue_read(struct file *fp, struct uio *uio, struct ucred *active_cred,
int flags, struct thread *td)
{
@@ -1553,7 +1534,7 @@ kqueue_read(struct file *fp, struct uio
}
/*ARGSUSED*/
-int
+static int
kqueue_write(struct file *fp, struct uio *uio, struct ucred *active_cred,
int flags, struct thread *td)
{
@@ -1561,7 +1542,7 @@ kqueue_write(struct file *fp, struct uio
}
/*ARGSUSED*/
-int
+static int
kqueue_truncate(struct file *fp, off_t length, struct ucred *active_cred,
struct thread *td)
{
@@ -1570,7 +1551,7 @@ kqueue_truncate(struct file *fp, off_t l
}
/*ARGSUSED*/
-int
+static int
kqueue_ioctl(struct file *fp, u_long cmd, void *data,
struct ucred *active_cred, struct thread *td)
{
@@ -1618,7 +1599,7 @@ kqueue_ioctl(struct file *fp, u_long cmd
}
/*ARGSUSED*/
-int
+static int
kqueue_poll(struct file *fp, int events, struct ucred *active_cred,
struct thread *td)
{
@@ -1645,7 +1626,7 @@ kqueue_poll(struct file *fp, int events,
}
/*ARGSUSED*/
-int
+static int
kqueue_stat(struct file *fp, struct stat *st, struct ucred *active_cred,
struct thread *td)
{
@@ -1663,7 +1644,7 @@ kqueue_stat(struct file *fp, struct stat
}
/*ARGSUSED*/
-int
+static int
kqueue_close(struct file *fp, struct thread *td)
{
struct kqueue *kq = fp->f_data;
Modified: head/sys/modules/linux/Makefile
==============================================================================
--- head/sys/modules/linux/Makefile Wed Sep 18 18:02:01 2013 (r255674)
+++ head/sys/modules/linux/Makefile Wed Sep 18 18:48:33 2013 (r255675)
@@ -9,7 +9,7 @@ CFLAGS+=-DCOMPAT_FREEBSD32 -DCOMPAT_LINU
KMOD= linux
SRCS= linux_fork.c linux${SFX}_dummy.c linux_emul.c linux_file.c \
- linux_futex.c linux_getcwd.c linux_ioctl.c linux_ipc.c linux_epoll.c \
+ linux_futex.c linux_getcwd.c linux_ioctl.c linux_ipc.c \
linux${SFX}_machdep.c linux_mib.c linux_misc.c linux_signal.c \
linux_socket.c linux_stats.c linux_sysctl.c linux${SFX}_sysent.c \
linux${SFX}_sysvec.c linux_uid16.c linux_util.c linux_time.c \
Modified: head/sys/sys/event.h
==============================================================================
--- head/sys/sys/event.h Wed Sep 18 18:02:01 2013 (r255674)
+++ head/sys/sys/event.h Wed Sep 18 18:48:33 2013 (r255675)
@@ -236,9 +236,6 @@ struct proc;
struct knlist;
struct mtx;
struct rwlock;
-struct uio;
-struct stat;
-struct ucred;
extern void knote(struct knlist *list, long hint, int lockflags);
extern void knote_fork(struct knlist *list, int pid);
@@ -264,21 +261,6 @@ extern int kqfd_register(int fd, struct
extern int kqueue_add_filteropts(int filt, struct filterops *filtops);
extern int kqueue_del_filteropts(int filt);
-int kqueue_read(struct file *fp, struct uio *uio, struct ucred *active_cred,
- int flags, struct thread *td);
-int kqueue_write(struct file *fp, struct uio *uio, struct ucred *active_cred,
- int flags, struct thread *td);
-int kqueue_truncate(struct file *fp, off_t length, struct ucred *active_cred,
- struct thread *td);
-int kqueue_ioctl(struct file *fp, u_long cmd, void *data,
- struct ucred *active_cred, struct thread *td);
-int kqueue_poll(struct file *fp, int events, struct ucred *active_cred,
- struct thread *td);
-int kqueue_kqfilter(struct file *fp, struct knote *kn);
-int kqueue_stat(struct file *fp, struct stat *st, struct ucred *active_cred,
- struct thread *td);
-int kqueue_close(struct file *fp, struct thread *td);
-
#else /* !_KERNEL */
#include <sys/cdefs.h>
Modified: head/sys/sys/file.h
==============================================================================
--- head/sys/sys/file.h Wed Sep 18 18:02:01 2013 (r255674)
+++ head/sys/sys/file.h Wed Sep 18 18:48:33 2013 (r255675)
@@ -169,8 +169,6 @@ struct file {
union {
struct cdev_privdata *fvn_cdevpriv;
/* (d) Private data for the cdev. */
- void *fvn_epollpriv;
- /* (d) Private data for the epoll. */
struct fadvise_info *fvn_advice;
} f_vnun;
/*
Modified: head/sys/sys/syscallsubr.h
==============================================================================
--- head/sys/sys/syscallsubr.h Wed Sep 18 18:02:01 2013 (r255674)
+++ head/sys/sys/syscallsubr.h Wed Sep 18 18:48:33 2013 (r255675)
@@ -121,13 +121,8 @@ int kern_ioctl(struct thread *td, int fd
int kern_jail(struct thread *td, struct jail *j);
int kern_jail_get(struct thread *td, struct uio *options, int flags);
int kern_jail_set(struct thread *td, struct uio *options, int flags);
-int kern_kqueue(struct thread *td);
-int kern_kqueue_locked(struct thread *td, struct file **fpp);
int kern_kevent(struct thread *td, int fd, int nchanges, int nevents,
struct kevent_copyops *k_ops, const struct timespec *timeout);
-int kern_kevent_locked(struct thread *td, struct file *fp, int nchanges,
- int nevents,
- struct kevent_copyops *k_ops, const struct timespec *timeout);
int kern_kldload(struct thread *td, const char *file, int *fileid);
int kern_kldstat(struct thread *td, int fileid, struct kld_file_stat *stat);
int kern_kldunload(struct thread *td, int fileid, int flags);
@@ -253,8 +248,6 @@ int kern_utimes(struct thread *td, char
struct timeval *tptr, enum uio_seg tptrseg);
int kern_utimesat(struct thread *td, int fd, char *path,
enum uio_seg pathseg, struct timeval *tptr, enum uio_seg tptrseg);
-int kern_utimensat(struct thread *td, int fd, char *path,
- enum uio_seg pathseg, struct timespec *tptr, enum uio_seg tptrseg);
int kern_wait(struct thread *td, pid_t pid, int *status, int options,
struct rusage *rup);
int kern_wait6(struct thread *td, enum idtype idtype, id_t id, int *status,
More information about the svn-src-all
mailing list