diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2012-12-24 21:43:56 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2013-02-03 15:09:18 -0500 |
commit | ad4b65a434bdd2ff37d095ab1ccd836203e985ba (patch) | |
tree | 8e5582b9fe0e867b6ab8d317976b93d864f0bde1 /kernel | |
parent | eaca6eae3e0c41d41fcb9d1d70e00934988dff2e (diff) |
consolidate rt_sigsuspend()
* pull compat version alongside with the native one
* make little-endian compat variant just call the native
* don't bother with separate conditional for compat (both native and
compat are going to become unconditional very soon).
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/compat.c | 17 | ||||
-rw-r--r-- | kernel/signal.c | 24 |
2 files changed, 23 insertions, 18 deletions
diff --git a/kernel/compat.c b/kernel/compat.c index adf7646343da..0c07d435254f 100644 --- a/kernel/compat.c +++ b/kernel/compat.c | |||
@@ -1067,23 +1067,6 @@ asmlinkage long compat_sys_stime(compat_time_t __user *tptr) | |||
1067 | 1067 | ||
1068 | #endif /* __ARCH_WANT_COMPAT_SYS_TIME */ | 1068 | #endif /* __ARCH_WANT_COMPAT_SYS_TIME */ |
1069 | 1069 | ||
1070 | #ifdef __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND | ||
1071 | asmlinkage long compat_sys_rt_sigsuspend(compat_sigset_t __user *unewset, compat_size_t sigsetsize) | ||
1072 | { | ||
1073 | sigset_t newset; | ||
1074 | compat_sigset_t newset32; | ||
1075 | |||
1076 | /* XXX: Don't preclude handling different sized sigset_t's. */ | ||
1077 | if (sigsetsize != sizeof(sigset_t)) | ||
1078 | return -EINVAL; | ||
1079 | |||
1080 | if (copy_from_user(&newset32, unewset, sizeof(compat_sigset_t))) | ||
1081 | return -EFAULT; | ||
1082 | sigset_from_compat(&newset, &newset32); | ||
1083 | return sigsuspend(&newset); | ||
1084 | } | ||
1085 | #endif /* __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND */ | ||
1086 | |||
1087 | asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp) | 1070 | asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp) |
1088 | { | 1071 | { |
1089 | struct timex txc; | 1072 | struct timex txc; |
diff --git a/kernel/signal.c b/kernel/signal.c index 00cd1ce998be..4a0934e03d5c 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
@@ -3352,7 +3352,29 @@ SYSCALL_DEFINE2(rt_sigsuspend, sigset_t __user *, unewset, size_t, sigsetsize) | |||
3352 | return -EFAULT; | 3352 | return -EFAULT; |
3353 | return sigsuspend(&newset); | 3353 | return sigsuspend(&newset); |
3354 | } | 3354 | } |
3355 | #endif /* __ARCH_WANT_SYS_RT_SIGSUSPEND */ | 3355 | |
3356 | #ifdef CONFIG_COMPAT | ||
3357 | COMPAT_SYSCALL_DEFINE2(rt_sigsuspend, compat_sigset_t __user *, unewset, compat_size_t, sigsetsize) | ||
3358 | { | ||
3359 | #ifdef __BIG_ENDIAN | ||
3360 | sigset_t newset; | ||
3361 | compat_sigset_t newset32; | ||
3362 | |||
3363 | /* XXX: Don't preclude handling different sized sigset_t's. */ | ||
3364 | if (sigsetsize != sizeof(sigset_t)) | ||
3365 | return -EINVAL; | ||
3366 | |||
3367 | if (copy_from_user(&newset32, unewset, sizeof(compat_sigset_t))) | ||
3368 | return -EFAULT; | ||
3369 | sigset_from_compat(&newset, &newset32); | ||
3370 | return sigsuspend(&newset); | ||
3371 | #else | ||
3372 | /* on little-endian bitmaps don't care about granularity */ | ||
3373 | return sys_rt_sigsuspend((sigset_t __user *)unewset, sigsetsize); | ||
3374 | #endif | ||
3375 | } | ||
3376 | #endif | ||
3377 | #endif | ||
3356 | 3378 | ||
3357 | __attribute__((weak)) const char *arch_vma_name(struct vm_area_struct *vma) | 3379 | __attribute__((weak)) const char *arch_vma_name(struct vm_area_struct *vma) |
3358 | { | 3380 | { |