diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2012-05-21 21:42:32 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-05-21 23:52:30 -0400 |
commit | 68f3f16d9ad0f1e28ab3fd0001ab5798c41f15a3 (patch) | |
tree | fd023109413f5eb28b364663fdf4bf2eabca47d4 /kernel/signal.c | |
parent | bf67f3a5c456a18f2e8d062f7e88506ef2cd9837 (diff) |
new helper: sigsuspend()
guts of saved_sigmask-based sigsuspend/rt_sigsuspend. Takes
kernel sigset_t *.
Open-coded instances replaced with calling it.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'kernel/signal.c')
-rw-r--r-- | kernel/signal.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/kernel/signal.c b/kernel/signal.c index 17afcaf582d0..3ad220a81619 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
@@ -3236,6 +3236,21 @@ SYSCALL_DEFINE0(pause) | |||
3236 | 3236 | ||
3237 | #endif | 3237 | #endif |
3238 | 3238 | ||
3239 | #ifdef HAVE_SET_RESTORE_SIGMASK | ||
3240 | int sigsuspend(sigset_t *set) | ||
3241 | { | ||
3242 | sigdelsetmask(set, sigmask(SIGKILL)|sigmask(SIGSTOP)); | ||
3243 | |||
3244 | current->saved_sigmask = current->blocked; | ||
3245 | set_current_blocked(set); | ||
3246 | |||
3247 | current->state = TASK_INTERRUPTIBLE; | ||
3248 | schedule(); | ||
3249 | set_restore_sigmask(); | ||
3250 | return -ERESTARTNOHAND; | ||
3251 | } | ||
3252 | #endif | ||
3253 | |||
3239 | #ifdef __ARCH_WANT_SYS_RT_SIGSUSPEND | 3254 | #ifdef __ARCH_WANT_SYS_RT_SIGSUSPEND |
3240 | /** | 3255 | /** |
3241 | * sys_rt_sigsuspend - replace the signal mask for a value with the | 3256 | * sys_rt_sigsuspend - replace the signal mask for a value with the |
@@ -3253,15 +3268,7 @@ SYSCALL_DEFINE2(rt_sigsuspend, sigset_t __user *, unewset, size_t, sigsetsize) | |||
3253 | 3268 | ||
3254 | if (copy_from_user(&newset, unewset, sizeof(newset))) | 3269 | if (copy_from_user(&newset, unewset, sizeof(newset))) |
3255 | return -EFAULT; | 3270 | return -EFAULT; |
3256 | sigdelsetmask(&newset, sigmask(SIGKILL)|sigmask(SIGSTOP)); | 3271 | return sigsuspend(&newset); |
3257 | |||
3258 | current->saved_sigmask = current->blocked; | ||
3259 | set_current_blocked(&newset); | ||
3260 | |||
3261 | current->state = TASK_INTERRUPTIBLE; | ||
3262 | schedule(); | ||
3263 | set_restore_sigmask(); | ||
3264 | return -ERESTARTNOHAND; | ||
3265 | } | 3272 | } |
3266 | #endif /* __ARCH_WANT_SYS_RT_SIGSUSPEND */ | 3273 | #endif /* __ARCH_WANT_SYS_RT_SIGSUSPEND */ |
3267 | 3274 | ||