diff options
Diffstat (limited to 'arch/sh/kernel/signal_64.c')
-rw-r--r-- | arch/sh/kernel/signal_64.c | 37 |
1 files changed, 10 insertions, 27 deletions
diff --git a/arch/sh/kernel/signal_64.c b/arch/sh/kernel/signal_64.c index 7b9278d29102..3c9a6f7dcdce 100644 --- a/arch/sh/kernel/signal_64.c +++ b/arch/sh/kernel/signal_64.c | |||
@@ -159,14 +159,13 @@ sys_sigsuspend(old_sigset_t mask, | |||
159 | unsigned long r6, unsigned long r7, | 159 | unsigned long r6, unsigned long r7, |
160 | struct pt_regs * regs) | 160 | struct pt_regs * regs) |
161 | { | 161 | { |
162 | sigset_t saveset; | 162 | sigset_t saveset, blocked; |
163 | 163 | ||
164 | mask &= _BLOCKABLE; | ||
165 | spin_lock_irq(¤t->sighand->siglock); | ||
166 | saveset = current->blocked; | 164 | saveset = current->blocked; |
167 | siginitset(¤t->blocked, mask); | 165 | |
168 | recalc_sigpending(); | 166 | mask &= _BLOCKABLE; |
169 | spin_unlock_irq(¤t->sighand->siglock); | 167 | siginitset(&blocked, mask); |
168 | set_current_blocked(&blocked); | ||
170 | 169 | ||
171 | REF_REG_RET = -EINTR; | 170 | REF_REG_RET = -EINTR; |
172 | while (1) { | 171 | while (1) { |
@@ -198,11 +197,8 @@ sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize, | |||
198 | if (copy_from_user(&newset, unewset, sizeof(newset))) | 197 | if (copy_from_user(&newset, unewset, sizeof(newset))) |
199 | return -EFAULT; | 198 | return -EFAULT; |
200 | sigdelsetmask(&newset, ~_BLOCKABLE); | 199 | sigdelsetmask(&newset, ~_BLOCKABLE); |
201 | spin_lock_irq(¤t->sighand->siglock); | ||
202 | saveset = current->blocked; | 200 | saveset = current->blocked; |
203 | current->blocked = newset; | 201 | set_current_blocked(&newset); |
204 | recalc_sigpending(); | ||
205 | spin_unlock_irq(¤t->sighand->siglock); | ||
206 | 202 | ||
207 | REF_REG_RET = -EINTR; | 203 | REF_REG_RET = -EINTR; |
208 | while (1) { | 204 | while (1) { |
@@ -408,11 +404,7 @@ asmlinkage int sys_sigreturn(unsigned long r2, unsigned long r3, | |||
408 | goto badframe; | 404 | goto badframe; |
409 | 405 | ||
410 | sigdelsetmask(&set, ~_BLOCKABLE); | 406 | sigdelsetmask(&set, ~_BLOCKABLE); |
411 | 407 | set_current_blocked(&set); | |
412 | spin_lock_irq(¤t->sighand->siglock); | ||
413 | current->blocked = set; | ||
414 | recalc_sigpending(); | ||
415 | spin_unlock_irq(¤t->sighand->siglock); | ||
416 | 408 | ||
417 | if (restore_sigcontext(regs, &frame->sc, &ret)) | 409 | if (restore_sigcontext(regs, &frame->sc, &ret)) |
418 | goto badframe; | 410 | goto badframe; |
@@ -445,10 +437,7 @@ asmlinkage int sys_rt_sigreturn(unsigned long r2, unsigned long r3, | |||
445 | goto badframe; | 437 | goto badframe; |
446 | 438 | ||
447 | sigdelsetmask(&set, ~_BLOCKABLE); | 439 | sigdelsetmask(&set, ~_BLOCKABLE); |
448 | spin_lock_irq(¤t->sighand->siglock); | 440 | set_current_blocked(&set); |
449 | current->blocked = set; | ||
450 | recalc_sigpending(); | ||
451 | spin_unlock_irq(¤t->sighand->siglock); | ||
452 | 441 | ||
453 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ret)) | 442 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ret)) |
454 | goto badframe; | 443 | goto badframe; |
@@ -734,14 +723,8 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | |||
734 | else | 723 | else |
735 | ret = setup_frame(sig, ka, oldset, regs); | 724 | ret = setup_frame(sig, ka, oldset, regs); |
736 | 725 | ||
737 | if (ret == 0) { | 726 | if (ret == 0) |
738 | spin_lock_irq(¤t->sighand->siglock); | 727 | block_sigmask(ka, sig); |
739 | sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); | ||
740 | if (!(ka->sa.sa_flags & SA_NODEFER)) | ||
741 | sigaddset(¤t->blocked,sig); | ||
742 | recalc_sigpending(); | ||
743 | spin_unlock_irq(¤t->sighand->siglock); | ||
744 | } | ||
745 | 728 | ||
746 | return ret; | 729 | return ret; |
747 | } | 730 | } |