diff options
author | Jeff Garzik <jeff@garzik.org> | 2007-12-01 16:18:56 -0500 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2007-12-01 16:18:56 -0500 |
commit | c99da91e7a12724127475a85cc7a38214b3504e2 (patch) | |
tree | de0eb3fe32ce58804457963fd133a53bb8fba5b8 /arch/m32r/kernel/signal.c | |
parent | a31e23e15cbb9734c5883a4a7f58d8712d303e0b (diff) | |
parent | 92d499d991ec4f5cbd00d6f33967eab9d3ee8d6c (diff) |
Merge branch 'master' into upstream-fixes
Diffstat (limited to 'arch/m32r/kernel/signal.c')
-rw-r--r-- | arch/m32r/kernel/signal.c | 17 |
1 files changed, 7 insertions, 10 deletions
diff --git a/arch/m32r/kernel/signal.c b/arch/m32r/kernel/signal.c index a753d79c4e8..18124542a6e 100644 --- a/arch/m32r/kernel/signal.c +++ b/arch/m32r/kernel/signal.c @@ -36,7 +36,7 @@ sys_rt_sigsuspend(sigset_t __user *unewset, size_t sigsetsize, unsigned long r2, unsigned long r3, unsigned long r4, unsigned long r5, unsigned long r6, struct pt_regs *regs) { - sigset_t saveset, newset; + sigset_t newset; /* XXX: Don't preclude handling different sized sigset_t's. */ if (sigsetsize != sizeof(sigset_t)) @@ -44,21 +44,18 @@ sys_rt_sigsuspend(sigset_t __user *unewset, size_t sigsetsize, if (copy_from_user(&newset, unewset, sizeof(newset))) return -EFAULT; - sigdelsetmask(&newset, ~_BLOCKABLE); + sigdelsetmask(&newset, sigmask(SIGKILL)|sigmask(SIGSTOP)); spin_lock_irq(¤t->sighand->siglock); - saveset = current->blocked; + current->saved_sigmask = current->blocked; current->blocked = newset; recalc_sigpending(); spin_unlock_irq(¤t->sighand->siglock); - regs->r0 = -EINTR; - while (1) { - current->state = TASK_INTERRUPTIBLE; - schedule(); - if (do_signal(regs, &saveset)) - return regs->r0; - } + current->state = TASK_INTERRUPTIBLE; + schedule(); + set_thread_flag(TIF_RESTORE_SIGMASK); + return -ERESTARTNOHAND; } asmlinkage int |