diff options
Diffstat (limited to 'arch/sparc/kernel/signal_32.c')
-rw-r--r-- | arch/sparc/kernel/signal_32.c | 32 |
1 files changed, 13 insertions, 19 deletions
diff --git a/arch/sparc/kernel/signal_32.c b/arch/sparc/kernel/signal_32.c index 04ede8f04add..8ce247ac04cc 100644 --- a/arch/sparc/kernel/signal_32.c +++ b/arch/sparc/kernel/signal_32.c | |||
@@ -62,12 +62,13 @@ struct rt_signal_frame { | |||
62 | 62 | ||
63 | static int _sigpause_common(old_sigset_t set) | 63 | static int _sigpause_common(old_sigset_t set) |
64 | { | 64 | { |
65 | set &= _BLOCKABLE; | 65 | sigset_t blocked; |
66 | spin_lock_irq(¤t->sighand->siglock); | 66 | |
67 | current->saved_sigmask = current->blocked; | 67 | current->saved_sigmask = current->blocked; |
68 | siginitset(¤t->blocked, set); | 68 | |
69 | recalc_sigpending(); | 69 | set &= _BLOCKABLE; |
70 | spin_unlock_irq(¤t->sighand->siglock); | 70 | siginitset(&blocked, set); |
71 | set_current_blocked(&blocked); | ||
71 | 72 | ||
72 | current->state = TASK_INTERRUPTIBLE; | 73 | current->state = TASK_INTERRUPTIBLE; |
73 | schedule(); | 74 | schedule(); |
@@ -139,10 +140,7 @@ asmlinkage void do_sigreturn(struct pt_regs *regs) | |||
139 | goto segv_and_exit; | 140 | goto segv_and_exit; |
140 | 141 | ||
141 | sigdelsetmask(&set, ~_BLOCKABLE); | 142 | sigdelsetmask(&set, ~_BLOCKABLE); |
142 | spin_lock_irq(¤t->sighand->siglock); | 143 | set_current_blocked(&set); |
143 | current->blocked = set; | ||
144 | recalc_sigpending(); | ||
145 | spin_unlock_irq(¤t->sighand->siglock); | ||
146 | return; | 144 | return; |
147 | 145 | ||
148 | segv_and_exit: | 146 | segv_and_exit: |
@@ -209,10 +207,7 @@ asmlinkage void do_rt_sigreturn(struct pt_regs *regs) | |||
209 | } | 207 | } |
210 | 208 | ||
211 | sigdelsetmask(&set, ~_BLOCKABLE); | 209 | sigdelsetmask(&set, ~_BLOCKABLE); |
212 | spin_lock_irq(¤t->sighand->siglock); | 210 | set_current_blocked(&set); |
213 | current->blocked = set; | ||
214 | recalc_sigpending(); | ||
215 | spin_unlock_irq(¤t->sighand->siglock); | ||
216 | return; | 211 | return; |
217 | segv: | 212 | segv: |
218 | force_sig(SIGSEGV, current); | 213 | force_sig(SIGSEGV, current); |
@@ -470,6 +465,7 @@ static inline int | |||
470 | handle_signal(unsigned long signr, struct k_sigaction *ka, | 465 | handle_signal(unsigned long signr, struct k_sigaction *ka, |
471 | siginfo_t *info, sigset_t *oldset, struct pt_regs *regs) | 466 | siginfo_t *info, sigset_t *oldset, struct pt_regs *regs) |
472 | { | 467 | { |
468 | sigset_t blocked; | ||
473 | int err; | 469 | int err; |
474 | 470 | ||
475 | if (ka->sa.sa_flags & SA_SIGINFO) | 471 | if (ka->sa.sa_flags & SA_SIGINFO) |
@@ -480,12 +476,10 @@ handle_signal(unsigned long signr, struct k_sigaction *ka, | |||
480 | if (err) | 476 | if (err) |
481 | return err; | 477 | return err; |
482 | 478 | ||
483 | spin_lock_irq(¤t->sighand->siglock); | 479 | sigorsets(&blocked, ¤t->blocked, &ka->sa.sa_mask); |
484 | sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); | ||
485 | if (!(ka->sa.sa_flags & SA_NOMASK)) | 480 | if (!(ka->sa.sa_flags & SA_NOMASK)) |
486 | sigaddset(¤t->blocked, signr); | 481 | sigaddset(&blocked, signr); |
487 | recalc_sigpending(); | 482 | set_current_blocked(&blocked); |
488 | spin_unlock_irq(¤t->sighand->siglock); | ||
489 | 483 | ||
490 | tracehook_signal_handler(signr, info, ka, regs, 0); | 484 | tracehook_signal_handler(signr, info, ka, regs, 0); |
491 | 485 | ||
@@ -581,7 +575,7 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | |||
581 | */ | 575 | */ |
582 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) { | 576 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) { |
583 | clear_thread_flag(TIF_RESTORE_SIGMASK); | 577 | clear_thread_flag(TIF_RESTORE_SIGMASK); |
584 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); | 578 | set_current_blocked(¤t->saved_sigmask); |
585 | } | 579 | } |
586 | } | 580 | } |
587 | 581 | ||