aboutsummaryrefslogtreecommitdiffstats
path: root/arch/m32r/kernel
diff options
context:
space:
mode:
authorHirokazu Takata <takata@linux-m32r.org>2007-09-12 04:51:35 -0400
committerHirokazu Takata <takata@linux-m32r.org>2007-11-27 11:24:04 -0500
commitc37a33035720a0faf1f609dc7c2c07080ed83629 (patch)
treea8a97b94f548f18f3bcbed6458c87cdf57e19ef0 /arch/m32r/kernel
parent52fda4870e74b43fa5ef5171cc89ac40e5b53ed1 (diff)
m32r: Update sys_rt_sigsuspend
Update sys_rt_sigsuspend() of arch/m32r/signal.c. This modification is derived from generic one of kernel/signal.c. Signed-off-by: Hirokazu Takata <takata@linux-m32r.org>
Diffstat (limited to 'arch/m32r/kernel')
-rw-r--r--arch/m32r/kernel/signal.c17
1 files changed, 7 insertions, 10 deletions
diff --git a/arch/m32r/kernel/signal.c b/arch/m32r/kernel/signal.c
index a753d79c4e89..18124542a6eb 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,
36 unsigned long r2, unsigned long r3, unsigned long r4, 36 unsigned long r2, unsigned long r3, unsigned long r4,
37 unsigned long r5, unsigned long r6, struct pt_regs *regs) 37 unsigned long r5, unsigned long r6, struct pt_regs *regs)
38{ 38{
39 sigset_t saveset, newset; 39 sigset_t newset;
40 40
41 /* XXX: Don't preclude handling different sized sigset_t's. */ 41 /* XXX: Don't preclude handling different sized sigset_t's. */
42 if (sigsetsize != sizeof(sigset_t)) 42 if (sigsetsize != sizeof(sigset_t))
@@ -44,21 +44,18 @@ sys_rt_sigsuspend(sigset_t __user *unewset, size_t sigsetsize,
44 44
45 if (copy_from_user(&newset, unewset, sizeof(newset))) 45 if (copy_from_user(&newset, unewset, sizeof(newset)))
46 return -EFAULT; 46 return -EFAULT;
47 sigdelsetmask(&newset, ~_BLOCKABLE); 47 sigdelsetmask(&newset, sigmask(SIGKILL)|sigmask(SIGSTOP));
48 48
49 spin_lock_irq(&current->sighand->siglock); 49 spin_lock_irq(&current->sighand->siglock);
50 saveset = current->blocked; 50 current->saved_sigmask = current->blocked;
51 current->blocked = newset; 51 current->blocked = newset;
52 recalc_sigpending(); 52 recalc_sigpending();
53 spin_unlock_irq(&current->sighand->siglock); 53 spin_unlock_irq(&current->sighand->siglock);
54 54
55 regs->r0 = -EINTR; 55 current->state = TASK_INTERRUPTIBLE;
56 while (1) { 56 schedule();
57 current->state = TASK_INTERRUPTIBLE; 57 set_thread_flag(TIF_RESTORE_SIGMASK);
58 schedule(); 58 return -ERESTARTNOHAND;
59 if (do_signal(regs, &saveset))
60 return regs->r0;
61 }
62} 59}
63 60
64asmlinkage int 61asmlinkage int