case 1: set.sig[0] = seta[0] + (((long)seta[1]) << 32);
        }
        sigdelsetmask(&set, ~_BLOCKABLE);
-       spin_lock_irq(¤t->sighand->siglock);
-       current->blocked = set;
-       recalc_sigpending();
-       spin_unlock_irq(¤t->sighand->siglock);
+       set_current_blocked(&set);
        return;
 
 segv:
                case 1: set.sig[0] = seta.sig[0] + (((long)seta.sig[1]) << 32);
        }
        sigdelsetmask(&set, ~_BLOCKABLE);
-       spin_lock_irq(¤t->sighand->siglock);
-       current->blocked = set;
-       recalc_sigpending();
-       spin_unlock_irq(¤t->sighand->siglock);
+       set_current_blocked(&set);
        return;
 segv:
        force_sig(SIGSEGV, current);
                                  siginfo_t *info,
                                  sigset_t *oldset, struct pt_regs *regs)
 {
+       sigset_t blocked;
        int err;
 
        if (ka->sa.sa_flags & SA_SIGINFO)
        if (err)
                return err;
 
-       spin_lock_irq(¤t->sighand->siglock);
-       sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
+       sigorsets(&blocked, ¤t->blocked, &ka->sa.sa_mask);
        if (!(ka->sa.sa_flags & SA_NOMASK))
-               sigaddset(¤t->blocked,signr);
-       recalc_sigpending();
-       spin_unlock_irq(¤t->sighand->siglock);
+               sigaddset(&blocked, signr);
+       set_current_blocked(&blocked);
 
        tracehook_signal_handler(signr, info, ka, regs, 0);
 
 
 
 static int _sigpause_common(old_sigset_t set)
 {
-       set &= _BLOCKABLE;
-       spin_lock_irq(¤t->sighand->siglock);
+       sigset_t blocked;
+
        current->saved_sigmask = current->blocked;
-       siginitset(¤t->blocked, set);
-       recalc_sigpending();
-       spin_unlock_irq(¤t->sighand->siglock);
+
+       set &= _BLOCKABLE;
+       siginitset(&blocked, set);
+       set_current_blocked(&blocked);
 
        current->state = TASK_INTERRUPTIBLE;
        schedule();
                goto segv_and_exit;
 
        sigdelsetmask(&set, ~_BLOCKABLE);
-       spin_lock_irq(¤t->sighand->siglock);
-       current->blocked = set;
-       recalc_sigpending();
-       spin_unlock_irq(¤t->sighand->siglock);
+       set_current_blocked(&set);
        return;
 
 segv_and_exit:
        }
 
        sigdelsetmask(&set, ~_BLOCKABLE);
-       spin_lock_irq(¤t->sighand->siglock);
-       current->blocked = set;
-       recalc_sigpending();
-       spin_unlock_irq(¤t->sighand->siglock);
+       set_current_blocked(&set);
        return;
 segv:
        force_sig(SIGSEGV, current);
 handle_signal(unsigned long signr, struct k_sigaction *ka,
              siginfo_t *info, sigset_t *oldset, struct pt_regs *regs)
 {
+       sigset_t blocked;
        int err;
 
        if (ka->sa.sa_flags & SA_SIGINFO)
        if (err)
                return err;
 
-       spin_lock_irq(¤t->sighand->siglock);
-       sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
+       sigorsets(&blocked, ¤t->blocked, &ka->sa.sa_mask);
        if (!(ka->sa.sa_flags & SA_NOMASK))
-               sigaddset(¤t->blocked, signr);
-       recalc_sigpending();
-       spin_unlock_irq(¤t->sighand->siglock);
+               sigaddset(&blocked, signr);
+       set_current_blocked(&blocked);
 
        tracehook_signal_handler(signr, info, ka, regs, 0);
 
 
                                goto do_sigsegv;
                }
                sigdelsetmask(&set, ~_BLOCKABLE);
-               spin_lock_irq(¤t->sighand->siglock);
-               current->blocked = set;
-               recalc_sigpending();
-               spin_unlock_irq(¤t->sighand->siglock);
+               set_current_blocked(&set);
        }
        if (test_thread_flag(TIF_32BIT)) {
                pc &= 0xffffffff;
 
 static long _sigpause_common(old_sigset_t set)
 {
-       set &= _BLOCKABLE;
-       spin_lock_irq(¤t->sighand->siglock);
+       sigset_t blocked;
+
        current->saved_sigmask = current->blocked;
-       siginitset(¤t->blocked, set);
-       recalc_sigpending();
-       spin_unlock_irq(¤t->sighand->siglock);
+
+       set &= _BLOCKABLE;
+       siginitset(&blocked, set);
+       set_current_blocked(&blocked);
 
        current->state = TASK_INTERRUPTIBLE;
        schedule();
        pt_regs_clear_syscall(regs);
 
        sigdelsetmask(&set, ~_BLOCKABLE);
-       spin_lock_irq(¤t->sighand->siglock);
-       current->blocked = set;
-       recalc_sigpending();
-       spin_unlock_irq(¤t->sighand->siglock);
+       set_current_blocked(&set);
        return;
 segv:
        force_sig(SIGSEGV, current);
                                siginfo_t *info,
                                sigset_t *oldset, struct pt_regs *regs)
 {
+       sigset_t blocked;
        int err;
 
        err = setup_rt_frame(ka, regs, signr, oldset,
                             (ka->sa.sa_flags & SA_SIGINFO) ? info : NULL);
        if (err)
                return err;
-       spin_lock_irq(¤t->sighand->siglock);
-       sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
+       sigorsets(&blocked, ¤t->blocked, &ka->sa.sa_mask);
        if (!(ka->sa.sa_flags & SA_NOMASK))
-               sigaddset(¤t->blocked,signr);
-       recalc_sigpending();
-       spin_unlock_irq(¤t->sighand->siglock);
+               sigaddset(&blocked, signr);
+       set_current_blocked(&blocked);
 
        tracehook_signal_handler(signr, info, ka, regs, 0);