unsigned long r5, unsigned long r6, unsigned long r7,
               struct pt_regs __regs)
 {
-       mask &= _BLOCKABLE;
-       spin_lock_irq(¤t->sighand->siglock);
+       sigset_t blocked;
+
        current->saved_sigmask = current->blocked;
-       siginitset(¤t->blocked, mask);
-       recalc_sigpending();
-       spin_unlock_irq(¤t->sighand->siglock);
+
+       mask &= _BLOCKABLE;
+       siginitset(&blocked, mask);
+       set_current_blocked(&blocked);
 
        current->state = TASK_INTERRUPTIBLE;
        schedule();
                goto badframe;
 
        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 (restore_sigcontext(regs, &frame->sc, &r0))
                goto badframe;
                goto badframe;
 
        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 (restore_sigcontext(regs, &frame->uc.uc_mcontext, &r0))
                goto badframe;
        else
                ret = setup_frame(sig, ka, oldset, regs);
 
-       if (ret == 0) {
-               spin_lock_irq(¤t->sighand->siglock);
-               sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
-               if (!(ka->sa.sa_flags & SA_NODEFER))
-                       sigaddset(¤t->blocked,sig);
-               recalc_sigpending();
-               spin_unlock_irq(¤t->sighand->siglock);
-       }
+       if (ret == 0)
+               block_sigmask(ka, sig);
 
        return ret;
 }
 
               unsigned long r6, unsigned long r7,
               struct pt_regs * regs)
 {
-       sigset_t saveset;
+       sigset_t saveset, blocked;
 
-       mask &= _BLOCKABLE;
-       spin_lock_irq(¤t->sighand->siglock);
        saveset = current->blocked;
-       siginitset(¤t->blocked, mask);
-       recalc_sigpending();
-       spin_unlock_irq(¤t->sighand->siglock);
+
+       mask &= _BLOCKABLE;
+       siginitset(&blocked, mask);
+       set_current_blocked(&blocked);
 
        REF_REG_RET = -EINTR;
        while (1) {
        if (copy_from_user(&newset, unewset, sizeof(newset)))
                return -EFAULT;
        sigdelsetmask(&newset, ~_BLOCKABLE);
-       spin_lock_irq(¤t->sighand->siglock);
        saveset = current->blocked;
-       current->blocked = newset;
-       recalc_sigpending();
-       spin_unlock_irq(¤t->sighand->siglock);
+       set_current_blocked(&newset);
 
        REF_REG_RET = -EINTR;
        while (1) {
                goto badframe;
 
        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 (restore_sigcontext(regs, &frame->sc, &ret))
                goto badframe;
                goto badframe;
 
        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 (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ret))
                goto badframe;
        else
                ret = setup_frame(sig, ka, oldset, regs);
 
-       if (ret == 0) {
-               spin_lock_irq(¤t->sighand->siglock);
-               sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
-               if (!(ka->sa.sa_flags & SA_NODEFER))
-                       sigaddset(¤t->blocked,sig);
-               recalc_sigpending();
-               spin_unlock_irq(¤t->sighand->siglock);
-       }
+       if (ret == 0)
+               block_sigmask(ka, sig);
 
        return ret;
 }