diff options
| -rw-r--r-- | arch/alpha/kernel/signal.c | 11 | ||||
| -rw-r--r-- | arch/arm/kernel/signal.c | 11 | ||||
| -rw-r--r-- | arch/cris/arch-v10/kernel/signal.c | 16 | ||||
| -rw-r--r-- | arch/cris/arch-v32/kernel/signal.c | 16 | ||||
| -rw-r--r-- | arch/frv/kernel/signal.c | 14 | ||||
| -rw-r--r-- | arch/m68k/kernel/signal.c | 15 | ||||
| -rw-r--r-- | arch/mips/kernel/signal.c | 20 | ||||
| -rw-r--r-- | arch/mips/kernel/signal32.c | 20 | ||||
| -rw-r--r-- | arch/mips/kernel/signal_n32.c | 10 | ||||
| -rw-r--r-- | arch/mn10300/kernel/signal.c | 14 | ||||
| -rw-r--r-- | arch/powerpc/kernel/signal_32.c | 11 | ||||
| -rw-r--r-- | arch/s390/kernel/signal.c | 9 | ||||
| -rw-r--r-- | arch/sh/kernel/signal_32.c | 12 | ||||
| -rw-r--r-- | arch/sparc/kernel/signal_32.c | 12 | ||||
| -rw-r--r-- | arch/sparc/kernel/signal_64.c | 13 | ||||
| -rw-r--r-- | arch/um/kernel/signal.c | 9 | ||||
| -rw-r--r-- | arch/x86/ia32/ia32_signal.c | 12 | ||||
| -rw-r--r-- | arch/x86/kernel/signal.c | 12 | ||||
| -rw-r--r-- | include/linux/signal.h | 1 | ||||
| -rw-r--r-- | kernel/compat.c | 10 | ||||
| -rw-r--r-- | kernel/signal.c | 25 | 
21 files changed, 50 insertions, 223 deletions
diff --git a/arch/alpha/kernel/signal.c b/arch/alpha/kernel/signal.c index 35f2ef44de1..74b05e6ed44 100644 --- a/arch/alpha/kernel/signal.c +++ b/arch/alpha/kernel/signal.c @@ -121,17 +121,8 @@ SYSCALL_DEFINE5(rt_sigaction, int, sig, const struct sigaction __user *, act,  SYSCALL_DEFINE1(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_thread_flag(TIF_RESTORE_SIGMASK); -	return -ERESTARTNOHAND; +	return sigsuspend(&blocked);  }  asmlinkage int diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index 73d9a420850..4e5fdd9bd9e 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c @@ -67,17 +67,8 @@ const unsigned long syscall_restart_code[2] = {  asmlinkage int sys_sigsuspend(int restart, unsigned long oldmask, 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);  }  asmlinkage int  diff --git a/arch/cris/arch-v10/kernel/signal.c b/arch/cris/arch-v10/kernel/signal.c index 289c584ba49..170f4970d59 100644 --- a/arch/cris/arch-v10/kernel/signal.c +++ b/arch/cris/arch-v10/kernel/signal.c @@ -48,19 +48,11 @@ void do_signal(int canrestart, struct pt_regs *regs);   * dummy arguments to be able to reach the regs argument.  (Note that this   * arrangement relies on old_sigset_t occupying one register.)   */ -int sys_sigsuspend(old_sigset_t mask, long r11, long r12, long r13, long mof, -	long srp, struct pt_regs *regs) +int sys_sigsuspend(old_sigset_t mask)  { -	mask &= _BLOCKABLE; -	spin_lock_irq(¤t->sighand->siglock); -	current->saved_sigmask = current->blocked; -	siginitset(¤t->blocked, mask); -	recalc_sigpending(); -	spin_unlock_irq(¤t->sighand->siglock); -	current->state = TASK_INTERRUPTIBLE; -	schedule(); -	set_thread_flag(TIF_RESTORE_SIGMASK); -	return -ERESTARTNOHAND; +	sigset_t blocked; +	siginitset(&blocked, mask); +	return sigsuspend(&blocked);  }  int sys_sigaction(int sig, const struct old_sigaction __user *act, diff --git a/arch/cris/arch-v32/kernel/signal.c b/arch/cris/arch-v32/kernel/signal.c index ce4ab1a5552..e09083208cb 100644 --- a/arch/cris/arch-v32/kernel/signal.c +++ b/arch/cris/arch-v32/kernel/signal.c @@ -59,19 +59,11 @@ void keep_debug_flags(unsigned long oldccs, unsigned long oldspc,   * dummy arguments to be able to reach the regs argument.   */  int -sys_sigsuspend(old_sigset_t mask, long r11, long r12, long r13, long mof, -	       long srp, struct pt_regs *regs) +sys_sigsuspend(old_sigset_t mask)  { -	mask &= _BLOCKABLE; -	spin_lock_irq(¤t->sighand->siglock); -	current->saved_sigmask = current->blocked; -	siginitset(¤t->blocked, mask); -	recalc_sigpending(); -	spin_unlock_irq(¤t->sighand->siglock); -	current->state = TASK_INTERRUPTIBLE; -	schedule(); -	set_thread_flag(TIF_RESTORE_SIGMASK); -	return -ERESTARTNOHAND; +	sigset_t blocked; +	siginitset(&blocked, mask); +	return sigsuspend(&blocked);  }  int diff --git a/arch/frv/kernel/signal.c b/arch/frv/kernel/signal.c index bab01298b58..df957c7ba38 100644 --- a/arch/frv/kernel/signal.c +++ b/arch/frv/kernel/signal.c @@ -40,17 +40,9 @@ struct fdpic_func_descriptor {   */  asmlinkage int sys_sigsuspend(int history0, int history1, old_sigset_t mask)  { -	mask &= _BLOCKABLE; -	spin_lock_irq(¤t->sighand->siglock); -	current->saved_sigmask = current->blocked; -	siginitset(¤t->blocked, mask); -	recalc_sigpending(); -	spin_unlock_irq(¤t->sighand->siglock); - -	current->state = TASK_INTERRUPTIBLE; -	schedule(); -	set_thread_flag(TIF_RESTORE_SIGMASK); -	return -ERESTARTNOHAND; +	sigset_t blocked; +	siginitset(&blocked, mask); +	return sigsuspend(&blocked);  }  asmlinkage int sys_sigaction(int sig, diff --git a/arch/m68k/kernel/signal.c b/arch/m68k/kernel/signal.c index 1747c7030a3..8186982fb32 100644 --- a/arch/m68k/kernel/signal.c +++ b/arch/m68k/kernel/signal.c @@ -230,18 +230,9 @@ static inline void push_cache(unsigned long vaddr)  asmlinkage int  sys_sigsuspend(int unused0, int unused1, old_sigset_t mask)  { -	mask &= _BLOCKABLE; -	spin_lock_irq(¤t->sighand->siglock); -	current->saved_sigmask = current->blocked; -	siginitset(¤t->blocked, mask); -	recalc_sigpending(); -	spin_unlock_irq(¤t->sighand->siglock); - -	current->state = TASK_INTERRUPTIBLE; -	schedule(); -	set_restore_sigmask(); - -	return -ERESTARTNOHAND; +	sigset_t blocked; +	siginitset(&blocked, mask); +	return sigsuspend(&blocked);  }  asmlinkage int diff --git a/arch/mips/kernel/signal.c b/arch/mips/kernel/signal.c index d5a338a1739..17f6ee30ad0 100644 --- a/arch/mips/kernel/signal.c +++ b/arch/mips/kernel/signal.c @@ -255,15 +255,7 @@ asmlinkage int sys_sigsuspend(nabi_no_regargs struct pt_regs regs)  	uset = (sigset_t __user *) regs.regs[4];  	if (copy_from_user(&newset, uset, sizeof(sigset_t)))  		return -EFAULT; -	sigdelsetmask(&newset, ~_BLOCKABLE); - -	current->saved_sigmask = current->blocked; -	set_current_blocked(&newset); - -	current->state = TASK_INTERRUPTIBLE; -	schedule(); -	set_thread_flag(TIF_RESTORE_SIGMASK); -	return -ERESTARTNOHAND; +	return sigsuspend(&newset);  }  #endif @@ -281,15 +273,7 @@ asmlinkage int sys_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)  	unewset = (sigset_t __user *) regs.regs[4];  	if (copy_from_user(&newset, unewset, sizeof(newset)))  		return -EFAULT; -	sigdelsetmask(&newset, ~_BLOCKABLE); - -	current->saved_sigmask = current->blocked; -	set_current_blocked(&newset); - -	current->state = TASK_INTERRUPTIBLE; -	schedule(); -	set_thread_flag(TIF_RESTORE_SIGMASK); -	return -ERESTARTNOHAND; +	return sigsuspend(&newset);  }  #ifdef CONFIG_TRAD_SIGNALS diff --git a/arch/mips/kernel/signal32.c b/arch/mips/kernel/signal32.c index ac3b8d89aae..b4fe2eacbd5 100644 --- a/arch/mips/kernel/signal32.c +++ b/arch/mips/kernel/signal32.c @@ -288,15 +288,7 @@ asmlinkage int sys32_sigsuspend(nabi_no_regargs struct pt_regs regs)  	uset = (compat_sigset_t __user *) regs.regs[4];  	if (get_sigset(&newset, uset))  		return -EFAULT; -	sigdelsetmask(&newset, ~_BLOCKABLE); - -	current->saved_sigmask = current->blocked; -	set_current_blocked(&newset); - -	current->state = TASK_INTERRUPTIBLE; -	schedule(); -	set_thread_flag(TIF_RESTORE_SIGMASK); -	return -ERESTARTNOHAND; +	return sigsuspend(&newset);  }  asmlinkage int sys32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs) @@ -313,15 +305,7 @@ asmlinkage int sys32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)  	uset = (compat_sigset_t __user *) regs.regs[4];  	if (get_sigset(&newset, uset))  		return -EFAULT; -	sigdelsetmask(&newset, ~_BLOCKABLE); - -	current->saved_sigmask = current->blocked; -	set_current_blocked(&newset); - -	current->state = TASK_INTERRUPTIBLE; -	schedule(); -	set_thread_flag(TIF_RESTORE_SIGMASK); -	return -ERESTARTNOHAND; +	return sigsuspend(&newset);  }  SYSCALL_DEFINE3(32_sigaction, long, sig, const struct sigaction32 __user *, act, diff --git a/arch/mips/kernel/signal_n32.c b/arch/mips/kernel/signal_n32.c index 86eb4b04631..63ffac9af7c 100644 --- a/arch/mips/kernel/signal_n32.c +++ b/arch/mips/kernel/signal_n32.c @@ -91,15 +91,7 @@ asmlinkage int sysn32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)  	if (copy_from_user(&uset, unewset, sizeof(uset)))  		return -EFAULT;  	sigset_from_compat(&newset, &uset); -	sigdelsetmask(&newset, ~_BLOCKABLE); - -	current->saved_sigmask = current->blocked; -	set_current_blocked(&newset); - -	current->state = TASK_INTERRUPTIBLE; -	schedule(); -	set_thread_flag(TIF_RESTORE_SIGMASK); -	return -ERESTARTNOHAND; +	return sigsuspend(&newset);  }  asmlinkage void sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) diff --git a/arch/mn10300/kernel/signal.c b/arch/mn10300/kernel/signal.c index 690f4e9507d..50eb94a0582 100644 --- a/arch/mn10300/kernel/signal.c +++ b/arch/mn10300/kernel/signal.c @@ -38,17 +38,9 @@   */  asmlinkage long sys_sigsuspend(int history0, int history1, old_sigset_t mask)  { -	mask &= _BLOCKABLE; -	spin_lock_irq(¤t->sighand->siglock); -	current->saved_sigmask = current->blocked; -	siginitset(¤t->blocked, mask); -	recalc_sigpending(); -	spin_unlock_irq(¤t->sighand->siglock); - -	current->state = TASK_INTERRUPTIBLE; -	schedule(); -	set_thread_flag(TIF_RESTORE_SIGMASK); -	return -ERESTARTNOHAND; +	sigset_t blocked; +	siginitset(&blocked, mask); +	return sigsuspend(&blocked);  }  /* diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c index 45eb998557f..ac1f96027bf 100644 --- a/arch/powerpc/kernel/signal_32.c +++ b/arch/powerpc/kernel/signal_32.c @@ -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, diff --git a/arch/s390/kernel/signal.c b/arch/s390/kernel/signal.c index 8a4e2b760d5..f626232e216 100644 --- a/arch/s390/kernel/signal.c +++ b/arch/s390/kernel/signal.c @@ -59,15 +59,8 @@ typedef struct  SYSCALL_DEFINE3(sigsuspend, int, history0, int, history1, old_sigset_t, mask)  {  	sigset_t blocked; - -	current->saved_sigmask = current->blocked; -	mask &= _BLOCKABLE;  	siginitset(&blocked, mask); -	set_current_blocked(&blocked); -	set_current_state(TASK_INTERRUPTIBLE); -	schedule(); -	set_restore_sigmask(); -	return -ERESTARTNOHAND; +	return sigsuspend(&blocked);  }  SYSCALL_DEFINE3(sigaction, int, sig, const struct old_sigaction __user *, act, diff --git a/arch/sh/kernel/signal_32.c b/arch/sh/kernel/signal_32.c index 5901fba3176..46c9f9b00b1 100644 --- a/arch/sh/kernel/signal_32.c +++ b/arch/sh/kernel/signal_32.c @@ -58,18 +58,8 @@ sys_sigsuspend(old_sigset_t mask,  	       struct pt_regs __regs)  {  	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);  }  asmlinkage int diff --git a/arch/sparc/kernel/signal_32.c b/arch/sparc/kernel/signal_32.c index ac8e66b50f0..2b7e849f7c6 100644 --- a/arch/sparc/kernel/signal_32.c +++ b/arch/sparc/kernel/signal_32.c @@ -64,18 +64,8 @@ struct rt_signal_frame {  static int _sigpause_common(old_sigset_t set)  {  	sigset_t blocked; - -	current->saved_sigmask = current->blocked; - -	set &= _BLOCKABLE;  	siginitset(&blocked, set); -	set_current_blocked(&blocked); - -	current->state = TASK_INTERRUPTIBLE; -	schedule(); -	set_thread_flag(TIF_RESTORE_SIGMASK); - -	return -ERESTARTNOHAND; +	return sigsuspend(&blocked);  }  asmlinkage int sys_sigsuspend(old_sigset_t set) diff --git a/arch/sparc/kernel/signal_64.c b/arch/sparc/kernel/signal_64.c index 48b0f57b65f..eafaab486b2 100644 --- a/arch/sparc/kernel/signal_64.c +++ b/arch/sparc/kernel/signal_64.c @@ -242,19 +242,8 @@ struct rt_signal_frame {  static long _sigpause_common(old_sigset_t set)  {  	sigset_t blocked; - -	current->saved_sigmask = current->blocked; - -	set &= _BLOCKABLE;  	siginitset(&blocked, set); -	set_current_blocked(&blocked); - -	current->state = TASK_INTERRUPTIBLE; -	schedule(); - -	set_restore_sigmask(); - -	return -ERESTARTNOHAND; +	return sigsuspend(&blocked);  }  asmlinkage long sys_sigpause(unsigned int set) diff --git a/arch/um/kernel/signal.c b/arch/um/kernel/signal.c index fb12f4c5e64..b9b75b3bd5c 100644 --- a/arch/um/kernel/signal.c +++ b/arch/um/kernel/signal.c @@ -152,15 +152,8 @@ int do_signal(void)  long sys_sigsuspend(int history0, int history1, old_sigset_t mask)  {  	sigset_t blocked; - -	mask &= _BLOCKABLE;  	siginitset(&blocked, mask); -	set_current_blocked(&blocked); - -	current->state = TASK_INTERRUPTIBLE; -	schedule(); -	set_thread_flag(TIF_RESTORE_SIGMASK); -	return -ERESTARTNOHAND; +	return sigsuspend(&blocked);  }  long sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss) diff --git a/arch/x86/ia32/ia32_signal.c b/arch/x86/ia32/ia32_signal.c index a69245ba27e..fa54410c666 100644 --- a/arch/x86/ia32/ia32_signal.c +++ b/arch/x86/ia32/ia32_signal.c @@ -127,18 +127,8 @@ int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)  asmlinkage long sys32_sigsuspend(int history0, int history1, 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);  }  asmlinkage long sys32_sigaltstack(const stack_ia32_t __user *uss_ptr, diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c index 115eac43148..b68ccadd2ff 100644 --- a/arch/x86/kernel/signal.c +++ b/arch/x86/kernel/signal.c @@ -478,18 +478,8 @@ asmlinkage int  sys_sigsuspend(int history0, int history1, 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);  }  asmlinkage int diff --git a/include/linux/signal.h b/include/linux/signal.h index 7987ce74874..17046cc484b 100644 --- a/include/linux/signal.h +++ b/include/linux/signal.h @@ -252,6 +252,7 @@ extern int do_sigtimedwait(const sigset_t *, siginfo_t *,  extern int sigprocmask(int, sigset_t *, sigset_t *);  extern void set_current_blocked(const sigset_t *);  extern int show_unhandled_signals; +extern int sigsuspend(sigset_t *);  extern int get_signal_to_deliver(siginfo_t *info, struct k_sigaction *return_ka, struct pt_regs *regs, void *cookie);  extern void block_sigmask(struct k_sigaction *ka, int signr); diff --git a/kernel/compat.c b/kernel/compat.c index d2c67aa49ae..c28a306ae05 100644 --- a/kernel/compat.c +++ b/kernel/compat.c @@ -1073,15 +1073,7 @@ asmlinkage long compat_sys_rt_sigsuspend(compat_sigset_t __user *unewset, compat  	if (copy_from_user(&newset32, unewset, sizeof(compat_sigset_t)))  		return -EFAULT;  	sigset_from_compat(&newset, &newset32); -	sigdelsetmask(&newset, sigmask(SIGKILL)|sigmask(SIGSTOP)); - -	current->saved_sigmask = current->blocked; -	set_current_blocked(&newset); - -	current->state = TASK_INTERRUPTIBLE; -	schedule(); -	set_restore_sigmask(); -	return -ERESTARTNOHAND; +	return sigsuspend(&newset);  }  #endif /* __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND */ diff --git a/kernel/signal.c b/kernel/signal.c index 17afcaf582d..3ad220a8161 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -3236,6 +3236,21 @@ SYSCALL_DEFINE0(pause)  #endif +#ifdef HAVE_SET_RESTORE_SIGMASK +int sigsuspend(sigset_t *set) +{ +	sigdelsetmask(set, sigmask(SIGKILL)|sigmask(SIGSTOP)); + +	current->saved_sigmask = current->blocked; +	set_current_blocked(set); + +	current->state = TASK_INTERRUPTIBLE; +	schedule(); +	set_restore_sigmask(); +	return -ERESTARTNOHAND; +} +#endif +  #ifdef __ARCH_WANT_SYS_RT_SIGSUSPEND  /**   *  sys_rt_sigsuspend - replace the signal mask for a value with the @@ -3253,15 +3268,7 @@ SYSCALL_DEFINE2(rt_sigsuspend, sigset_t __user *, unewset, size_t, sigsetsize)  	if (copy_from_user(&newset, unewset, sizeof(newset)))  		return -EFAULT; -	sigdelsetmask(&newset, sigmask(SIGKILL)|sigmask(SIGSTOP)); - -	current->saved_sigmask = current->blocked; -	set_current_blocked(&newset); - -	current->state = TASK_INTERRUPTIBLE; -	schedule(); -	set_restore_sigmask(); -	return -ERESTARTNOHAND; +	return sigsuspend(&newset);  }  #endif /* __ARCH_WANT_SYS_RT_SIGSUSPEND */  |