aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/signal.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2012-05-21 21:42:32 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2012-05-21 23:52:30 -0400
commit68f3f16d9ad0f1e28ab3fd0001ab5798c41f15a3 (patch)
treefd023109413f5eb28b364663fdf4bf2eabca47d4 /kernel/signal.c
parentbf67f3a5c456a18f2e8d062f7e88506ef2cd9837 (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.c25
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
3240int 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