]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - arch/powerpc/kernel/signal_32.c
Merge branch 'ux500/hickup' of git://git.kernel.org/pub/scm/linux/kernel/git/arm...
[karo-tx-linux.git] / arch / powerpc / kernel / signal_32.c
index 45eb998557f8c3fbd9f8de333f58b17a29c2c959..8b4c049aee20e8604fa83a9a017366213d0ab6d9 100644 (file)
@@ -204,10 +204,10 @@ static inline int get_old_sigaction(struct k_sigaction *new_ka,
 
        if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
                        __get_user(new_ka->sa.sa_handler, &act->sa_handler) ||
-                       __get_user(new_ka->sa.sa_restorer, &act->sa_restorer))
+                       __get_user(new_ka->sa.sa_restorer, &act->sa_restorer) ||
+                       __get_user(new_ka->sa.sa_flags, &act->sa_flags) ||
+                       __get_user(mask, &act->sa_mask))
                return -EFAULT;
-       __get_user(new_ka->sa.sa_flags, &act->sa_flags);
-       __get_user(mask, &act->sa_mask);
        siginitset(&new_ka->sa.sa_mask, mask);
        return 0;
 }
@@ -244,17 +244,8 @@ static inline int restore_general_regs(struct pt_regs *regs,
 long sys_sigsuspend(old_sigset_t mask)
 {
        sigset_t blocked;
-
-       current->saved_sigmask = current->blocked;
-
-       mask &= _BLOCKABLE;
        siginitset(&blocked, mask);
-       set_current_blocked(&blocked);
-
-       current->state = TASK_INTERRUPTIBLE;
-       schedule();
-       set_restore_sigmask();
-       return -ERESTARTNOHAND;
+       return sigsuspend(&blocked);
 }
 
 long sys_sigaction(int sig, struct old_sigaction __user *act,
@@ -928,7 +919,7 @@ static int do_setcontext(struct ucontext __user *ucp, struct pt_regs *regs, int
        if (!access_ok(VERIFY_READ, mcp, sizeof(*mcp)))
                return -EFAULT;
 #endif
-       restore_sigmask(&set);
+       set_current_blocked(&set);
        if (restore_user_regs(regs, mcp, sig))
                return -EFAULT;
 
@@ -1282,7 +1273,7 @@ long sys_sigreturn(int r3, int r4, int r5, int r6, int r7, int r8,
        set.sig[0] = sigctx.oldmask;
        set.sig[1] = sigctx._unused[3];
 #endif
-       restore_sigmask(&set);
+       set_current_blocked(&set);
 
        sr = (struct mcontext __user *)from_user_ptr(sigctx.regs);
        addr = sr;