|
@@ -67,15 +67,8 @@ static int handle_signal(struct pt_regs *regs, unsigned long signr,
|
|
|
|
|
|
if (err)
|
|
|
force_sigsegv(signr, current);
|
|
|
- else {
|
|
|
- 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, signr);
|
|
|
- recalc_sigpending();
|
|
|
- spin_unlock_irq(¤t->sighand->siglock);
|
|
|
- }
|
|
|
+ else
|
|
|
+ block_sigmask(ka, signr);
|
|
|
|
|
|
return err;
|
|
|
}
|
|
@@ -158,12 +151,11 @@ int do_signal(void)
|
|
|
*/
|
|
|
long sys_sigsuspend(int history0, int history1, old_sigset_t mask)
|
|
|
{
|
|
|
+ sigset_t blocked;
|
|
|
+
|
|
|
mask &= _BLOCKABLE;
|
|
|
- spin_lock_irq(¤t->sighand->siglock);
|
|
|
- current->saved_sigmask = current->blocked;
|
|
|
- siginitset(¤t->blocked, mask);
|
|
|
- recalc_sigpending();
|
|
|
- spin_unlock_irq(¤t->sighand->siglock);
|
|
|
+ siginitset(&blocked, mask);
|
|
|
+ set_current_blocked(&blocked);
|
|
|
|
|
|
current->state = TASK_INTERRUPTIBLE;
|
|
|
schedule();
|