|
@@ -66,12 +66,13 @@ const unsigned long syscall_restart_code[2] = {
|
|
*/
|
|
*/
|
|
asmlinkage int sys_sigsuspend(int restart, unsigned long oldmask, old_sigset_t mask)
|
|
asmlinkage int sys_sigsuspend(int restart, unsigned long oldmask, old_sigset_t mask)
|
|
{
|
|
{
|
|
- mask &= _BLOCKABLE;
|
|
|
|
- spin_lock_irq(¤t->sighand->siglock);
|
|
|
|
|
|
+ sigset_t blocked;
|
|
|
|
+
|
|
current->saved_sigmask = current->blocked;
|
|
current->saved_sigmask = current->blocked;
|
|
- siginitset(¤t->blocked, mask);
|
|
|
|
- recalc_sigpending();
|
|
|
|
- spin_unlock_irq(¤t->sighand->siglock);
|
|
|
|
|
|
+
|
|
|
|
+ mask &= _BLOCKABLE;
|
|
|
|
+ siginitset(&blocked, mask);
|
|
|
|
+ set_current_blocked(&blocked);
|
|
|
|
|
|
current->state = TASK_INTERRUPTIBLE;
|
|
current->state = TASK_INTERRUPTIBLE;
|
|
schedule();
|
|
schedule();
|
|
@@ -281,10 +282,7 @@ static int restore_sigframe(struct pt_regs *regs, struct sigframe __user *sf)
|
|
err = __copy_from_user(&set, &sf->uc.uc_sigmask, sizeof(set));
|
|
err = __copy_from_user(&set, &sf->uc.uc_sigmask, sizeof(set));
|
|
if (err == 0) {
|
|
if (err == 0) {
|
|
sigdelsetmask(&set, ~_BLOCKABLE);
|
|
sigdelsetmask(&set, ~_BLOCKABLE);
|
|
- spin_lock_irq(¤t->sighand->siglock);
|
|
|
|
- current->blocked = set;
|
|
|
|
- recalc_sigpending();
|
|
|
|
- spin_unlock_irq(¤t->sighand->siglock);
|
|
|
|
|
|
+ set_current_blocked(&set);
|
|
}
|
|
}
|
|
|
|
|
|
__get_user_error(regs->ARM_r0, &sf->uc.uc_mcontext.arm_r0, err);
|
|
__get_user_error(regs->ARM_r0, &sf->uc.uc_mcontext.arm_r0, err);
|
|
@@ -637,13 +635,7 @@ handle_signal(unsigned long sig, struct k_sigaction *ka,
|
|
/*
|
|
/*
|
|
* Block the signal if we were successful.
|
|
* Block the signal if we were successful.
|
|
*/
|
|
*/
|
|
- spin_lock_irq(&tsk->sighand->siglock);
|
|
|
|
- sigorsets(&tsk->blocked, &tsk->blocked,
|
|
|
|
- &ka->sa.sa_mask);
|
|
|
|
- if (!(ka->sa.sa_flags & SA_NODEFER))
|
|
|
|
- sigaddset(&tsk->blocked, sig);
|
|
|
|
- recalc_sigpending();
|
|
|
|
- spin_unlock_irq(&tsk->sighand->siglock);
|
|
|
|
|
|
+ block_sigmask(ka, sig);
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|