aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2013-02-24 14:52:17 -0500
committerAl Viro <viro@zeniv.linux.org.uk>2013-03-03 22:58:49 -0500
commit35280bd4a3fa841897e2638437607fdec6c34f31 (patch)
tree03c7cb65bcb2cc94c1613944798f780645e64edd
parent19f4fc3aee180000fe45952691bbe69dde1d9e95 (diff)
switch epoll_pwait to COMPAT_SYSCALL_DEFINE
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--arch/s390/kernel/compat_wrapper.S10
-rw-r--r--arch/s390/kernel/syscalls.S2
-rw-r--r--fs/compat.c49
-rw-r--r--fs/eventpoll.c47
-rw-r--r--include/linux/compat.h5
5 files changed, 50 insertions, 63 deletions
diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S
index a1dda9c67efe..52bea71d93e6 100644
--- a/arch/s390/kernel/compat_wrapper.S
+++ b/arch/s390/kernel/compat_wrapper.S
@@ -1270,16 +1270,6 @@ ENTRY(sys_getcpu_wrapper)
1270 llgtr %r4,%r4 # struct getcpu_cache * 1270 llgtr %r4,%r4 # struct getcpu_cache *
1271 jg sys_getcpu 1271 jg sys_getcpu
1272 1272
1273ENTRY(compat_sys_epoll_pwait_wrapper)
1274 lgfr %r2,%r2 # int
1275 llgtr %r3,%r3 # struct compat_epoll_event *
1276 lgfr %r4,%r4 # int
1277 lgfr %r5,%r5 # int
1278 llgtr %r6,%r6 # compat_sigset_t *
1279 llgf %r0,164(%r15) # compat_size_t
1280 stg %r0,160(%r15)
1281 jg compat_sys_epoll_pwait
1282
1283ENTRY(compat_sys_utimes_wrapper) 1273ENTRY(compat_sys_utimes_wrapper)
1284 llgtr %r2,%r2 # char * 1274 llgtr %r2,%r2 # char *
1285 llgtr %r3,%r3 # struct compat_timeval * 1275 llgtr %r3,%r3 # struct compat_timeval *
diff --git a/arch/s390/kernel/syscalls.S b/arch/s390/kernel/syscalls.S
index 5f3f7fbc5465..63d6b4343193 100644
--- a/arch/s390/kernel/syscalls.S
+++ b/arch/s390/kernel/syscalls.S
@@ -320,7 +320,7 @@ SYSCALL(sys_tee,sys_tee,sys_tee_wrapper)
320SYSCALL(sys_vmsplice,sys_vmsplice,compat_sys_vmsplice_wrapper) 320SYSCALL(sys_vmsplice,sys_vmsplice,compat_sys_vmsplice_wrapper)
321NI_SYSCALL /* 310 sys_move_pages */ 321NI_SYSCALL /* 310 sys_move_pages */
322SYSCALL(sys_getcpu,sys_getcpu,sys_getcpu_wrapper) 322SYSCALL(sys_getcpu,sys_getcpu,sys_getcpu_wrapper)
323SYSCALL(sys_epoll_pwait,sys_epoll_pwait,compat_sys_epoll_pwait_wrapper) 323SYSCALL(sys_epoll_pwait,sys_epoll_pwait,compat_sys_epoll_pwait)
324SYSCALL(sys_utimes,sys_utimes,compat_sys_utimes_wrapper) 324SYSCALL(sys_utimes,sys_utimes,compat_sys_utimes_wrapper)
325SYSCALL(sys_s390_fallocate,sys_fallocate,sys_fallocate_wrapper) 325SYSCALL(sys_s390_fallocate,sys_fallocate,sys_fallocate_wrapper)
326SYSCALL(sys_utimensat,sys_utimensat,compat_sys_utimensat_wrapper) /* 315 */ 326SYSCALL(sys_utimensat,sys_utimensat,compat_sys_utimensat_wrapper) /* 315 */
diff --git a/fs/compat.c b/fs/compat.c
index 2ae2a98891cd..45137a3832f3 100644
--- a/fs/compat.c
+++ b/fs/compat.c
@@ -44,7 +44,6 @@
44#include <linux/signal.h> 44#include <linux/signal.h>
45#include <linux/poll.h> 45#include <linux/poll.h>
46#include <linux/mm.h> 46#include <linux/mm.h>
47#include <linux/eventpoll.h>
48#include <linux/fs_struct.h> 47#include <linux/fs_struct.h>
49#include <linux/slab.h> 48#include <linux/slab.h>
50#include <linux/pagemap.h> 49#include <linux/pagemap.h>
@@ -1659,54 +1658,6 @@ asmlinkage long compat_sys_ppoll(struct pollfd __user *ufds,
1659 return ret; 1658 return ret;
1660} 1659}
1661 1660
1662#ifdef CONFIG_EPOLL
1663
1664asmlinkage long compat_sys_epoll_pwait(int epfd,
1665 struct compat_epoll_event __user *events,
1666 int maxevents, int timeout,
1667 const compat_sigset_t __user *sigmask,
1668 compat_size_t sigsetsize)
1669{
1670 long err;
1671 compat_sigset_t csigmask;
1672 sigset_t ksigmask, sigsaved;
1673
1674 /*
1675 * If the caller wants a certain signal mask to be set during the wait,
1676 * we apply it here.
1677 */
1678 if (sigmask) {
1679 if (sigsetsize != sizeof(compat_sigset_t))
1680 return -EINVAL;
1681 if (copy_from_user(&csigmask, sigmask, sizeof(csigmask)))
1682 return -EFAULT;
1683 sigset_from_compat(&ksigmask, &csigmask);
1684 sigdelsetmask(&ksigmask, sigmask(SIGKILL) | sigmask(SIGSTOP));
1685 sigprocmask(SIG_SETMASK, &ksigmask, &sigsaved);
1686 }
1687
1688 err = sys_epoll_wait(epfd, events, maxevents, timeout);
1689
1690 /*
1691 * If we changed the signal mask, we need to restore the original one.
1692 * In case we've got a signal while waiting, we do not restore the
1693 * signal mask yet, and we allow do_signal() to deliver the signal on
1694 * the way back to userspace, before the signal mask is restored.
1695 */
1696 if (sigmask) {
1697 if (err == -EINTR) {
1698 memcpy(&current->saved_sigmask, &sigsaved,
1699 sizeof(sigsaved));
1700 set_restore_sigmask();
1701 } else
1702 sigprocmask(SIG_SETMASK, &sigsaved, NULL);
1703 }
1704
1705 return err;
1706}
1707
1708#endif /* CONFIG_EPOLL */
1709
1710#ifdef CONFIG_FHANDLE 1661#ifdef CONFIG_FHANDLE
1711/* 1662/*
1712 * Exactly like fs/open.c:sys_open_by_handle_at(), except that it 1663 * Exactly like fs/open.c:sys_open_by_handle_at(), except that it
diff --git a/fs/eventpoll.c b/fs/eventpoll.c
index 9fec1836057a..495d15558f42 100644
--- a/fs/eventpoll.c
+++ b/fs/eventpoll.c
@@ -40,6 +40,7 @@
40#include <linux/atomic.h> 40#include <linux/atomic.h>
41#include <linux/proc_fs.h> 41#include <linux/proc_fs.h>
42#include <linux/seq_file.h> 42#include <linux/seq_file.h>
43#include <linux/compat.h>
43 44
44/* 45/*
45 * LOCKING: 46 * LOCKING:
@@ -1940,6 +1941,52 @@ SYSCALL_DEFINE6(epoll_pwait, int, epfd, struct epoll_event __user *, events,
1940 return error; 1941 return error;
1941} 1942}
1942 1943
1944#ifdef CONFIG_COMPAT
1945COMPAT_SYSCALL_DEFINE6(epoll_pwait, int, epfd,
1946 struct epoll_event __user *, events,
1947 int, maxevents, int, timeout,
1948 const compat_sigset_t __user *, sigmask,
1949 compat_size_t, sigsetsize)
1950{
1951 long err;
1952 compat_sigset_t csigmask;
1953 sigset_t ksigmask, sigsaved;
1954
1955 /*
1956 * If the caller wants a certain signal mask to be set during the wait,
1957 * we apply it here.
1958 */
1959 if (sigmask) {
1960 if (sigsetsize != sizeof(compat_sigset_t))
1961 return -EINVAL;
1962 if (copy_from_user(&csigmask, sigmask, sizeof(csigmask)))
1963 return -EFAULT;
1964 sigset_from_compat(&ksigmask, &csigmask);
1965 sigdelsetmask(&ksigmask, sigmask(SIGKILL) | sigmask(SIGSTOP));
1966 sigprocmask(SIG_SETMASK, &ksigmask, &sigsaved);
1967 }
1968
1969 err = sys_epoll_wait(epfd, events, maxevents, timeout);
1970
1971 /*
1972 * If we changed the signal mask, we need to restore the original one.
1973 * In case we've got a signal while waiting, we do not restore the
1974 * signal mask yet, and we allow do_signal() to deliver the signal on
1975 * the way back to userspace, before the signal mask is restored.
1976 */
1977 if (sigmask) {
1978 if (err == -EINTR) {
1979 memcpy(&current->saved_sigmask, &sigsaved,
1980 sizeof(sigsaved));
1981 set_restore_sigmask();
1982 } else
1983 sigprocmask(SIG_SETMASK, &sigsaved, NULL);
1984 }
1985
1986 return err;
1987}
1988#endif
1989
1943static int __init eventpoll_init(void) 1990static int __init eventpoll_init(void)
1944{ 1991{
1945 struct sysinfo si; 1992 struct sysinfo si;
diff --git a/include/linux/compat.h b/include/linux/compat.h
index ad299afcd488..cdec8f2e9e21 100644
--- a/include/linux/compat.h
+++ b/include/linux/compat.h
@@ -432,10 +432,9 @@ asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid,
432/* 432/*
433 * epoll (fs/eventpoll.c) compat bits follow ... 433 * epoll (fs/eventpoll.c) compat bits follow ...
434 */ 434 */
435struct epoll_event; 435struct epoll_event; /* fortunately, this one is fixed-layout */
436#define compat_epoll_event epoll_event
437asmlinkage long compat_sys_epoll_pwait(int epfd, 436asmlinkage long compat_sys_epoll_pwait(int epfd,
438 struct compat_epoll_event __user *events, 437 struct epoll_event __user *events,
439 int maxevents, int timeout, 438 int maxevents, int timeout,
440 const compat_sigset_t __user *sigmask, 439 const compat_sigset_t __user *sigmask,
441 compat_size_t sigsetsize); 440 compat_size_t sigsetsize);