diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2012-05-21 23:42:15 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-06-01 12:58:49 -0400 |
commit | a610d6e672d6d3723e8da257ad4a8a288a8f2f89 (patch) | |
tree | 2fac6ce7f72756771f4f87583205cc402589dcad /arch/sparc/kernel/signal_64.c | |
parent | 5754f412a3f107cbcd93ee125bef296f2a07539b (diff) |
pull clearing RESTORE_SIGMASK into block_sigmask()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'arch/sparc/kernel/signal_64.c')
-rw-r--r-- | arch/sparc/kernel/signal_64.c | 15 |
1 files changed, 3 insertions, 12 deletions
diff --git a/arch/sparc/kernel/signal_64.c b/arch/sparc/kernel/signal_64.c index 088a733f83f..febbc4b697b 100644 --- a/arch/sparc/kernel/signal_64.c +++ b/arch/sparc/kernel/signal_64.c | |||
@@ -466,7 +466,7 @@ sigsegv: | |||
466 | return -EFAULT; | 466 | return -EFAULT; |
467 | } | 467 | } |
468 | 468 | ||
469 | static inline int handle_signal(unsigned long signr, struct k_sigaction *ka, | 469 | static inline void handle_signal(unsigned long signr, struct k_sigaction *ka, |
470 | siginfo_t *info, | 470 | siginfo_t *info, |
471 | sigset_t *oldset, struct pt_regs *regs) | 471 | sigset_t *oldset, struct pt_regs *regs) |
472 | { | 472 | { |
@@ -475,12 +475,10 @@ static inline int handle_signal(unsigned long signr, struct k_sigaction *ka, | |||
475 | err = setup_rt_frame(ka, regs, signr, oldset, | 475 | err = setup_rt_frame(ka, regs, signr, oldset, |
476 | (ka->sa.sa_flags & SA_SIGINFO) ? info : NULL); | 476 | (ka->sa.sa_flags & SA_SIGINFO) ? info : NULL); |
477 | if (err) | 477 | if (err) |
478 | return err; | 478 | return; |
479 | 479 | ||
480 | block_sigmask(ka, signr); | 480 | block_sigmask(ka, signr); |
481 | tracehook_signal_handler(signr, info, ka, regs, 0); | 481 | tracehook_signal_handler(signr, info, ka, regs, 0); |
482 | |||
483 | return 0; | ||
484 | } | 482 | } |
485 | 483 | ||
486 | static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, | 484 | static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, |
@@ -558,14 +556,7 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | |||
558 | if (signr > 0) { | 556 | if (signr > 0) { |
559 | if (restart_syscall) | 557 | if (restart_syscall) |
560 | syscall_restart(orig_i0, regs, &ka.sa); | 558 | syscall_restart(orig_i0, regs, &ka.sa); |
561 | if (handle_signal(signr, &ka, &info, oldset, regs) == 0) { | 559 | handle_signal(signr, &ka, &info, oldset, regs); |
562 | /* A signal was successfully delivered; the saved | ||
563 | * sigmask will have been stored in the signal frame, | ||
564 | * and will be restored by sigreturn, so we can simply | ||
565 | * clear the TS_RESTORE_SIGMASK flag. | ||
566 | */ | ||
567 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; | ||
568 | } | ||
569 | return; | 560 | return; |
570 | } | 561 | } |
571 | if (restart_syscall && | 562 | if (restart_syscall && |