diff options
Diffstat (limited to 'arch/sh/kernel/signal_32.c')
-rw-r--r-- | arch/sh/kernel/signal_32.c | 36 |
1 files changed, 10 insertions, 26 deletions
diff --git a/arch/sh/kernel/signal_32.c b/arch/sh/kernel/signal_32.c index a7a55ed43a59..5901fba3176e 100644 --- a/arch/sh/kernel/signal_32.c +++ b/arch/sh/kernel/signal_32.c | |||
@@ -25,7 +25,6 @@ | |||
25 | #include <linux/freezer.h> | 25 | #include <linux/freezer.h> |
26 | #include <linux/io.h> | 26 | #include <linux/io.h> |
27 | #include <linux/tracehook.h> | 27 | #include <linux/tracehook.h> |
28 | #include <asm/system.h> | ||
29 | #include <asm/ucontext.h> | 28 | #include <asm/ucontext.h> |
30 | #include <asm/uaccess.h> | 29 | #include <asm/uaccess.h> |
31 | #include <asm/pgtable.h> | 30 | #include <asm/pgtable.h> |
@@ -58,12 +57,13 @@ sys_sigsuspend(old_sigset_t mask, | |||
58 | unsigned long r5, unsigned long r6, unsigned long r7, | 57 | unsigned long r5, unsigned long r6, unsigned long r7, |
59 | struct pt_regs __regs) | 58 | struct pt_regs __regs) |
60 | { | 59 | { |
61 | mask &= _BLOCKABLE; | 60 | sigset_t blocked; |
62 | spin_lock_irq(¤t->sighand->siglock); | 61 | |
63 | current->saved_sigmask = current->blocked; | 62 | current->saved_sigmask = current->blocked; |
64 | siginitset(¤t->blocked, mask); | 63 | |
65 | recalc_sigpending(); | 64 | mask &= _BLOCKABLE; |
66 | spin_unlock_irq(¤t->sighand->siglock); | 65 | siginitset(&blocked, mask); |
66 | set_current_blocked(&blocked); | ||
67 | 67 | ||
68 | current->state = TASK_INTERRUPTIBLE; | 68 | current->state = TASK_INTERRUPTIBLE; |
69 | schedule(); | 69 | schedule(); |
@@ -240,11 +240,7 @@ asmlinkage int sys_sigreturn(unsigned long r4, unsigned long r5, | |||
240 | goto badframe; | 240 | goto badframe; |
241 | 241 | ||
242 | sigdelsetmask(&set, ~_BLOCKABLE); | 242 | sigdelsetmask(&set, ~_BLOCKABLE); |
243 | 243 | set_current_blocked(&set); | |
244 | spin_lock_irq(¤t->sighand->siglock); | ||
245 | current->blocked = set; | ||
246 | recalc_sigpending(); | ||
247 | spin_unlock_irq(¤t->sighand->siglock); | ||
248 | 244 | ||
249 | if (restore_sigcontext(regs, &frame->sc, &r0)) | 245 | if (restore_sigcontext(regs, &frame->sc, &r0)) |
250 | goto badframe; | 246 | goto badframe; |
@@ -274,10 +270,7 @@ asmlinkage int sys_rt_sigreturn(unsigned long r4, unsigned long r5, | |||
274 | goto badframe; | 270 | goto badframe; |
275 | 271 | ||
276 | sigdelsetmask(&set, ~_BLOCKABLE); | 272 | sigdelsetmask(&set, ~_BLOCKABLE); |
277 | spin_lock_irq(¤t->sighand->siglock); | 273 | set_current_blocked(&set); |
278 | current->blocked = set; | ||
279 | recalc_sigpending(); | ||
280 | spin_unlock_irq(¤t->sighand->siglock); | ||
281 | 274 | ||
282 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &r0)) | 275 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &r0)) |
283 | goto badframe; | 276 | goto badframe; |
@@ -548,17 +541,8 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, | |||
548 | else | 541 | else |
549 | ret = setup_frame(sig, ka, oldset, regs); | 542 | ret = setup_frame(sig, ka, oldset, regs); |
550 | 543 | ||
551 | if (ka->sa.sa_flags & SA_ONESHOT) | 544 | if (ret == 0) |
552 | ka->sa.sa_handler = SIG_DFL; | 545 | block_sigmask(ka, sig); |
553 | |||
554 | if (ret == 0) { | ||
555 | spin_lock_irq(¤t->sighand->siglock); | ||
556 | sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); | ||
557 | if (!(ka->sa.sa_flags & SA_NODEFER)) | ||
558 | sigaddset(¤t->blocked,sig); | ||
559 | recalc_sigpending(); | ||
560 | spin_unlock_irq(¤t->sighand->siglock); | ||
561 | } | ||
562 | 546 | ||
563 | return ret; | 547 | return ret; |
564 | } | 548 | } |