diff options
-rw-r--r-- | arch/x86/ia32/ia32entry.S | 1 | ||||
-rw-r--r-- | arch/x86/kernel/syscall_table_32.S | 1 | ||||
-rw-r--r-- | fs/eventpoll.c | 13 | ||||
-rw-r--r-- | include/asm-x86/unistd_32.h | 1 | ||||
-rw-r--r-- | include/asm-x86/unistd_64.h | 2 | ||||
-rw-r--r-- | include/linux/eventpoll.h | 4 | ||||
-rw-r--r-- | include/linux/syscalls.h | 1 |
7 files changed, 21 insertions, 2 deletions
diff --git a/arch/x86/ia32/ia32entry.S b/arch/x86/ia32/ia32entry.S index cf0eb31745ca..04366f08f424 100644 --- a/arch/x86/ia32/ia32entry.S +++ b/arch/x86/ia32/ia32entry.S | |||
@@ -828,4 +828,5 @@ ia32_sys_call_table: | |||
828 | .quad compat_sys_timerfd_gettime | 828 | .quad compat_sys_timerfd_gettime |
829 | .quad compat_sys_signalfd4 | 829 | .quad compat_sys_signalfd4 |
830 | .quad sys_eventfd2 | 830 | .quad sys_eventfd2 |
831 | .quad sys_epoll_create2 | ||
831 | ia32_syscall_end: | 832 | ia32_syscall_end: |
diff --git a/arch/x86/kernel/syscall_table_32.S b/arch/x86/kernel/syscall_table_32.S index cf112cb11c37..4d7007ca263d 100644 --- a/arch/x86/kernel/syscall_table_32.S +++ b/arch/x86/kernel/syscall_table_32.S | |||
@@ -328,3 +328,4 @@ ENTRY(sys_call_table) | |||
328 | .long sys_timerfd_gettime | 328 | .long sys_timerfd_gettime |
329 | .long sys_signalfd4 | 329 | .long sys_signalfd4 |
330 | .long sys_eventfd2 | 330 | .long sys_eventfd2 |
331 | .long sys_epoll_create2 | ||
diff --git a/fs/eventpoll.c b/fs/eventpoll.c index 9392dd968125..3fd4014f3c5a 100644 --- a/fs/eventpoll.c +++ b/fs/eventpoll.c | |||
@@ -1046,11 +1046,14 @@ retry: | |||
1046 | * RB tree. With the current implementation, the "size" parameter is ignored | 1046 | * RB tree. With the current implementation, the "size" parameter is ignored |
1047 | * (besides sanity checks). | 1047 | * (besides sanity checks). |
1048 | */ | 1048 | */ |
1049 | asmlinkage long sys_epoll_create(int size) | 1049 | asmlinkage long sys_epoll_create2(int size, int flags) |
1050 | { | 1050 | { |
1051 | int error, fd = -1; | 1051 | int error, fd = -1; |
1052 | struct eventpoll *ep; | 1052 | struct eventpoll *ep; |
1053 | 1053 | ||
1054 | if (flags & ~EPOLL_CLOEXEC) | ||
1055 | return -EINVAL; | ||
1056 | |||
1054 | DNPRINTK(3, (KERN_INFO "[%p] eventpoll: sys_epoll_create(%d)\n", | 1057 | DNPRINTK(3, (KERN_INFO "[%p] eventpoll: sys_epoll_create(%d)\n", |
1055 | current, size)); | 1058 | current, size)); |
1056 | 1059 | ||
@@ -1068,7 +1071,8 @@ asmlinkage long sys_epoll_create(int size) | |||
1068 | * Creates all the items needed to setup an eventpoll file. That is, | 1071 | * Creates all the items needed to setup an eventpoll file. That is, |
1069 | * a file structure and a free file descriptor. | 1072 | * a file structure and a free file descriptor. |
1070 | */ | 1073 | */ |
1071 | fd = anon_inode_getfd("[eventpoll]", &eventpoll_fops, ep, 0); | 1074 | fd = anon_inode_getfd("[eventpoll]", &eventpoll_fops, ep, |
1075 | flags & O_CLOEXEC); | ||
1072 | if (fd < 0) | 1076 | if (fd < 0) |
1073 | ep_free(ep); | 1077 | ep_free(ep); |
1074 | 1078 | ||
@@ -1079,6 +1083,11 @@ error_return: | |||
1079 | return fd; | 1083 | return fd; |
1080 | } | 1084 | } |
1081 | 1085 | ||
1086 | asmlinkage long sys_epoll_create(int size) | ||
1087 | { | ||
1088 | return sys_epoll_create2(size, 0); | ||
1089 | } | ||
1090 | |||
1082 | /* | 1091 | /* |
1083 | * The following function implements the controller interface for | 1092 | * The following function implements the controller interface for |
1084 | * the eventpoll file that enables the insertion/removal/change of | 1093 | * the eventpoll file that enables the insertion/removal/change of |
diff --git a/include/asm-x86/unistd_32.h b/include/asm-x86/unistd_32.h index edbd8723c939..a37d6b0c4e1e 100644 --- a/include/asm-x86/unistd_32.h +++ b/include/asm-x86/unistd_32.h | |||
@@ -334,6 +334,7 @@ | |||
334 | #define __NR_timerfd_gettime 326 | 334 | #define __NR_timerfd_gettime 326 |
335 | #define __NR_signalfd4 327 | 335 | #define __NR_signalfd4 327 |
336 | #define __NR_eventfd2 328 | 336 | #define __NR_eventfd2 328 |
337 | #define __NR_epoll_create2 329 | ||
337 | 338 | ||
338 | #ifdef __KERNEL__ | 339 | #ifdef __KERNEL__ |
339 | 340 | ||
diff --git a/include/asm-x86/unistd_64.h b/include/asm-x86/unistd_64.h index fb059a6feeb1..a1a4a5b6e5ee 100644 --- a/include/asm-x86/unistd_64.h +++ b/include/asm-x86/unistd_64.h | |||
@@ -645,6 +645,8 @@ __SYSCALL(__NR_paccept, sys_paccept) | |||
645 | __SYSCALL(__NR_signalfd4, sys_signalfd4) | 645 | __SYSCALL(__NR_signalfd4, sys_signalfd4) |
646 | #define __NR_eventfd2 290 | 646 | #define __NR_eventfd2 290 |
647 | __SYSCALL(__NR_eventfd2, sys_eventfd2) | 647 | __SYSCALL(__NR_eventfd2, sys_eventfd2) |
648 | #define __NR_epoll_create2 291 | ||
649 | __SYSCALL(__NR_epoll_create2, sys_epoll_create2) | ||
648 | 650 | ||
649 | 651 | ||
650 | #ifndef __NO_STUBS | 652 | #ifndef __NO_STUBS |
diff --git a/include/linux/eventpoll.h b/include/linux/eventpoll.h index cf79853967ff..1cfaa40059c8 100644 --- a/include/linux/eventpoll.h +++ b/include/linux/eventpoll.h | |||
@@ -14,8 +14,12 @@ | |||
14 | #ifndef _LINUX_EVENTPOLL_H | 14 | #ifndef _LINUX_EVENTPOLL_H |
15 | #define _LINUX_EVENTPOLL_H | 15 | #define _LINUX_EVENTPOLL_H |
16 | 16 | ||
17 | /* For O_CLOEXEC */ | ||
18 | #include <linux/fcntl.h> | ||
17 | #include <linux/types.h> | 19 | #include <linux/types.h> |
18 | 20 | ||
21 | /* Flags for epoll_create2. */ | ||
22 | #define EPOLL_CLOEXEC O_CLOEXEC | ||
19 | 23 | ||
20 | /* Valid opcodes to issue to sys_epoll_ctl() */ | 24 | /* Valid opcodes to issue to sys_epoll_ctl() */ |
21 | #define EPOLL_CTL_ADD 1 | 25 | #define EPOLL_CTL_ADD 1 |
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index 9ab09926a7f2..85953240f28c 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h | |||
@@ -430,6 +430,7 @@ asmlinkage long sys_poll(struct pollfd __user *ufds, unsigned int nfds, | |||
430 | asmlinkage long sys_select(int n, fd_set __user *inp, fd_set __user *outp, | 430 | asmlinkage long sys_select(int n, fd_set __user *inp, fd_set __user *outp, |
431 | fd_set __user *exp, struct timeval __user *tvp); | 431 | fd_set __user *exp, struct timeval __user *tvp); |
432 | asmlinkage long sys_epoll_create(int size); | 432 | asmlinkage long sys_epoll_create(int size); |
433 | asmlinkage long sys_epoll_create2(int size, int flags); | ||
433 | asmlinkage long sys_epoll_ctl(int epfd, int op, int fd, | 434 | asmlinkage long sys_epoll_ctl(int epfd, int op, int fd, |
434 | struct epoll_event __user *event); | 435 | struct epoll_event __user *event); |
435 | asmlinkage long sys_epoll_wait(int epfd, struct epoll_event __user *events, | 436 | asmlinkage long sys_epoll_wait(int epfd, struct epoll_event __user *events, |