diff options
author | Ulrich Drepper <drepper@redhat.com> | 2008-07-24 00:29:27 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-07-24 13:47:28 -0400 |
commit | a0998b50c3f0b8fdd265c63e0032f86ebe377dbf (patch) | |
tree | 9132ecb7ef925374edabcaeea44e0287eb5043f4 /fs | |
parent | 11fcb6c14676023d0bd437841f5dcd670e7990a0 (diff) |
flag parameters: epoll_create
This patch adds the new epoll_create2 syscall. It extends the old epoll_create
syscall by one parameter which is meant to hold a flag value. In this
patch the only flag support is EPOLL_CLOEXEC which causes the close-on-exec
flag for the returned file descriptor to be set.
A new name EPOLL_CLOEXEC is introduced which in this implementation must
have the same value as O_CLOEXEC.
The following test must be adjusted for architectures other than x86 and
x86-64 and in case the syscall numbers changed.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <fcntl.h>
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <sys/syscall.h>
#ifndef __NR_epoll_create2
# ifdef __x86_64__
# define __NR_epoll_create2 291
# elif defined __i386__
# define __NR_epoll_create2 329
# else
# error "need __NR_epoll_create2"
# endif
#endif
#define EPOLL_CLOEXEC O_CLOEXEC
int
main (void)
{
int fd = syscall (__NR_epoll_create2, 1, 0);
if (fd == -1)
{
puts ("epoll_create2(0) failed");
return 1;
}
int coe = fcntl (fd, F_GETFD);
if (coe == -1)
{
puts ("fcntl failed");
return 1;
}
if (coe & FD_CLOEXEC)
{
puts ("epoll_create2(0) set close-on-exec flag");
return 1;
}
close (fd);
fd = syscall (__NR_epoll_create2, 1, EPOLL_CLOEXEC);
if (fd == -1)
{
puts ("epoll_create2(EPOLL_CLOEXEC) failed");
return 1;
}
coe = fcntl (fd, F_GETFD);
if (coe == -1)
{
puts ("fcntl failed");
return 1;
}
if ((coe & FD_CLOEXEC) == 0)
{
puts ("epoll_create2(EPOLL_CLOEXEC) set close-on-exec flag");
return 1;
}
close (fd);
puts ("OK");
return 0;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Signed-off-by: Ulrich Drepper <drepper@redhat.com>
Acked-by: Davide Libenzi <davidel@xmailserver.org>
Cc: Michael Kerrisk <mtk.manpages@googlemail.com>
Cc: <linux-arch@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/eventpoll.c | 13 |
1 files changed, 11 insertions, 2 deletions
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 |