asmlinkage int do_sigsuspend(struct pt_regs *regs)
 {
        old_sigset_t mask = regs->er3;
-       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);
 
        regs->er0 = -EINTR;
        while (1) {
                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);
 
        regs->er0 = -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, &er0))
                goto badframe;
                goto badframe;
 
        sigdelsetmask(&set, ~_BLOCKABLE);
-       spin_unlock_irq(¤t->sighand->siglock);
-       current->blocked = set;
-       recalc_sigpending();
-       spin_lock_irq(¤t->sighand->siglock);
+       set_current_blocked(&set);
        
        if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &er0))
                goto badframe;
        else
                setup_frame(sig, ka, oldset, regs);
 
-       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);
+       block_sigmask(ka, sig);
 }
 
 /*