|
@@ -120,12 +120,13 @@ SYSCALL_DEFINE5(rt_sigaction, int, sig, const struct sigaction __user *, act,
|
|
|
*/
|
|
|
SYSCALL_DEFINE1(sigsuspend, old_sigset_t, mask)
|
|
|
{
|
|
|
- mask &= _BLOCKABLE;
|
|
|
- spin_lock_irq(¤t->sighand->siglock);
|
|
|
+ sigset_t 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;
|
|
|
schedule();
|
|
@@ -238,10 +239,7 @@ do_sigreturn(struct sigcontext __user *sc, struct pt_regs *regs,
|
|
|
goto give_sigsegv;
|
|
|
|
|
|
sigdelsetmask(&set, ~_BLOCKABLE);
|
|
|
- spin_lock_irq(¤t->sighand->siglock);
|
|
|
- current->blocked = set;
|
|
|
- recalc_sigpending();
|
|
|
- spin_unlock_irq(¤t->sighand->siglock);
|
|
|
+ set_current_blocked(&set);
|
|
|
|
|
|
if (restore_sigcontext(sc, regs, sw))
|
|
|
goto give_sigsegv;
|
|
@@ -276,10 +274,7 @@ do_rt_sigreturn(struct rt_sigframe __user *frame, struct pt_regs *regs,
|
|
|
goto give_sigsegv;
|
|
|
|
|
|
sigdelsetmask(&set, ~_BLOCKABLE);
|
|
|
- spin_lock_irq(¤t->sighand->siglock);
|
|
|
- current->blocked = set;
|
|
|
- recalc_sigpending();
|
|
|
- spin_unlock_irq(¤t->sighand->siglock);
|
|
|
+ set_current_blocked(&set);
|
|
|
|
|
|
if (restore_sigcontext(&frame->uc.uc_mcontext, regs, sw))
|
|
|
goto give_sigsegv;
|
|
@@ -501,14 +496,8 @@ handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info,
|
|
|
else
|
|
|
ret = setup_frame(sig, ka, oldset, regs, sw);
|
|
|
|
|
|
- if (ret == 0) {
|
|
|
- spin_lock_irq(¤t->sighand->siglock);
|
|
|
- sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
|
|
|
- if (!(ka->sa.sa_flags & SA_NODEFER))
|
|
|
- sigaddset(¤t->blocked,sig);
|
|
|
- recalc_sigpending();
|
|
|
- spin_unlock_irq(¤t->sighand->siglock);
|
|
|
- }
|
|
|
+ if (ret == 0)
|
|
|
+ block_sigmask(ka, sig);
|
|
|
|
|
|
return ret;
|
|
|
}
|