diff options
Diffstat (limited to 'arch/sparc/kernel/signal32.c')
-rw-r--r-- | arch/sparc/kernel/signal32.c | 21 |
1 files changed, 7 insertions, 14 deletions
diff --git a/arch/sparc/kernel/signal32.c b/arch/sparc/kernel/signal32.c index 1ba95aff5d59..2caa556db86d 100644 --- a/arch/sparc/kernel/signal32.c +++ b/arch/sparc/kernel/signal32.c | |||
@@ -273,10 +273,7 @@ void do_sigreturn32(struct pt_regs *regs) | |||
273 | case 1: set.sig[0] = seta[0] + (((long)seta[1]) << 32); | 273 | case 1: set.sig[0] = seta[0] + (((long)seta[1]) << 32); |
274 | } | 274 | } |
275 | sigdelsetmask(&set, ~_BLOCKABLE); | 275 | sigdelsetmask(&set, ~_BLOCKABLE); |
276 | spin_lock_irq(¤t->sighand->siglock); | 276 | set_current_blocked(&set); |
277 | current->blocked = set; | ||
278 | recalc_sigpending(); | ||
279 | spin_unlock_irq(¤t->sighand->siglock); | ||
280 | return; | 277 | return; |
281 | 278 | ||
282 | segv: | 279 | segv: |
@@ -377,10 +374,7 @@ asmlinkage void do_rt_sigreturn32(struct pt_regs *regs) | |||
377 | case 1: set.sig[0] = seta.sig[0] + (((long)seta.sig[1]) << 32); | 374 | case 1: set.sig[0] = seta.sig[0] + (((long)seta.sig[1]) << 32); |
378 | } | 375 | } |
379 | sigdelsetmask(&set, ~_BLOCKABLE); | 376 | sigdelsetmask(&set, ~_BLOCKABLE); |
380 | spin_lock_irq(¤t->sighand->siglock); | 377 | set_current_blocked(&set); |
381 | current->blocked = set; | ||
382 | recalc_sigpending(); | ||
383 | spin_unlock_irq(¤t->sighand->siglock); | ||
384 | return; | 378 | return; |
385 | segv: | 379 | segv: |
386 | force_sig(SIGSEGV, current); | 380 | force_sig(SIGSEGV, current); |
@@ -782,6 +776,7 @@ static inline int handle_signal32(unsigned long signr, struct k_sigaction *ka, | |||
782 | siginfo_t *info, | 776 | siginfo_t *info, |
783 | sigset_t *oldset, struct pt_regs *regs) | 777 | sigset_t *oldset, struct pt_regs *regs) |
784 | { | 778 | { |
779 | sigset_t blocked; | ||
785 | int err; | 780 | int err; |
786 | 781 | ||
787 | if (ka->sa.sa_flags & SA_SIGINFO) | 782 | if (ka->sa.sa_flags & SA_SIGINFO) |
@@ -792,12 +787,10 @@ static inline int handle_signal32(unsigned long signr, struct k_sigaction *ka, | |||
792 | if (err) | 787 | if (err) |
793 | return err; | 788 | return err; |
794 | 789 | ||
795 | spin_lock_irq(¤t->sighand->siglock); | 790 | sigorsets(&blocked, ¤t->blocked, &ka->sa.sa_mask); |
796 | sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); | ||
797 | if (!(ka->sa.sa_flags & SA_NOMASK)) | 791 | if (!(ka->sa.sa_flags & SA_NOMASK)) |
798 | sigaddset(¤t->blocked,signr); | 792 | sigaddset(&blocked, signr); |
799 | recalc_sigpending(); | 793 | set_current_blocked(&blocked); |
800 | spin_unlock_irq(¤t->sighand->siglock); | ||
801 | 794 | ||
802 | tracehook_signal_handler(signr, info, ka, regs, 0); | 795 | tracehook_signal_handler(signr, info, ka, regs, 0); |
803 | 796 | ||
@@ -881,7 +874,7 @@ void do_signal32(sigset_t *oldset, struct pt_regs * regs, | |||
881 | */ | 874 | */ |
882 | if (current_thread_info()->status & TS_RESTORE_SIGMASK) { | 875 | if (current_thread_info()->status & TS_RESTORE_SIGMASK) { |
883 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; | 876 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; |
884 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); | 877 | set_current_blocked(¤t->saved_sigmask); |
885 | } | 878 | } |
886 | } | 879 | } |
887 | 880 | ||