diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2013-02-24 14:52:17 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2013-03-03 22:58:49 -0500 |
commit | 35280bd4a3fa841897e2638437607fdec6c34f31 (patch) | |
tree | 03c7cb65bcb2cc94c1613944798f780645e64edd | |
parent | 19f4fc3aee180000fe45952691bbe69dde1d9e95 (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.S | 10 | ||||
-rw-r--r-- | arch/s390/kernel/syscalls.S | 2 | ||||
-rw-r--r-- | fs/compat.c | 49 | ||||
-rw-r--r-- | fs/eventpoll.c | 47 | ||||
-rw-r--r-- | include/linux/compat.h | 5 |
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 | ||
1273 | ENTRY(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 | |||
1283 | ENTRY(compat_sys_utimes_wrapper) | 1273 | ENTRY(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) | |||
320 | SYSCALL(sys_vmsplice,sys_vmsplice,compat_sys_vmsplice_wrapper) | 320 | SYSCALL(sys_vmsplice,sys_vmsplice,compat_sys_vmsplice_wrapper) |
321 | NI_SYSCALL /* 310 sys_move_pages */ | 321 | NI_SYSCALL /* 310 sys_move_pages */ |
322 | SYSCALL(sys_getcpu,sys_getcpu,sys_getcpu_wrapper) | 322 | SYSCALL(sys_getcpu,sys_getcpu,sys_getcpu_wrapper) |
323 | SYSCALL(sys_epoll_pwait,sys_epoll_pwait,compat_sys_epoll_pwait_wrapper) | 323 | SYSCALL(sys_epoll_pwait,sys_epoll_pwait,compat_sys_epoll_pwait) |
324 | SYSCALL(sys_utimes,sys_utimes,compat_sys_utimes_wrapper) | 324 | SYSCALL(sys_utimes,sys_utimes,compat_sys_utimes_wrapper) |
325 | SYSCALL(sys_s390_fallocate,sys_fallocate,sys_fallocate_wrapper) | 325 | SYSCALL(sys_s390_fallocate,sys_fallocate,sys_fallocate_wrapper) |
326 | SYSCALL(sys_utimensat,sys_utimensat,compat_sys_utimensat_wrapper) /* 315 */ | 326 | SYSCALL(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 | |||
1664 | asmlinkage 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(¤t->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 | ||
1945 | COMPAT_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(¤t->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 | |||
1943 | static int __init eventpoll_init(void) | 1990 | static 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 | */ |
435 | struct epoll_event; | 435 | struct epoll_event; /* fortunately, this one is fixed-layout */ |
436 | #define compat_epoll_event epoll_event | ||
437 | asmlinkage long compat_sys_epoll_pwait(int epfd, | 436 | asmlinkage 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); |