diff options
Diffstat (limited to 'arch/s390/kernel/signal.c')
| -rw-r--r-- | arch/s390/kernel/signal.c | 61 | 
1 files changed, 19 insertions, 42 deletions
diff --git a/arch/s390/kernel/signal.c b/arch/s390/kernel/signal.c index abbb3c3c7aa..9a40e1cc5ec 100644 --- a/arch/s390/kernel/signal.c +++ b/arch/s390/kernel/signal.c @@ -57,17 +57,15 @@ typedef struct   */  SYSCALL_DEFINE3(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); +	sigset_t blocked; +	current->saved_sigmask = current->blocked; +	mask &= _BLOCKABLE; +	siginitset(&blocked, mask); +	set_current_blocked(&blocked);  	set_current_state(TASK_INTERRUPTIBLE);  	schedule(); -	set_thread_flag(TIF_RESTORE_SIGMASK); - +	set_restore_sigmask();  	return -ERESTARTNOHAND;  } @@ -172,18 +170,11 @@ SYSCALL_DEFINE0(sigreturn)  		goto badframe;  	if (__copy_from_user(&set.sig, &frame->sc.oldmask, _SIGMASK_COPY_SIZE))  		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_sigregs(regs, &frame->sregs))  		goto badframe; -  	return regs->gprs[2]; -  badframe:  	force_sig(SIGSEGV, current);  	return 0; @@ -199,21 +190,14 @@ SYSCALL_DEFINE0(rt_sigreturn)  		goto badframe;  	if (__copy_from_user(&set.sig, &frame->uc.uc_sigmask, sizeof(set)))  		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_sigregs(regs, &frame->uc.uc_mcontext))  		goto badframe; -  	if (do_sigaltstack(&frame->uc.uc_stack, NULL,  			   regs->gprs[15]) == -EFAULT)  		goto badframe;  	return regs->gprs[2]; -  badframe:  	force_sig(SIGSEGV, current);  	return 0; @@ -385,14 +369,11 @@ give_sigsegv:  	return -EFAULT;  } -/* - * OK, we're invoking a handler - */	 - -static int -handle_signal(unsigned long sig, struct k_sigaction *ka, -	      siginfo_t *info, sigset_t *oldset, struct pt_regs * regs) +static int handle_signal(unsigned long sig, struct k_sigaction *ka, +			 siginfo_t *info, sigset_t *oldset, +			 struct pt_regs *regs)  { +	sigset_t blocked;  	int ret;  	/* Set up the stack frame */ @@ -400,17 +381,13 @@ handle_signal(unsigned long sig, struct k_sigaction *ka,  		ret = setup_rt_frame(sig, ka, info, oldset, regs);  	else  		ret = setup_frame(sig, ka, oldset, regs); - -	if (ret == 0) { -		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); -	} - -	return ret; +	if (ret) +		return ret; +	sigorsets(&blocked, ¤t->blocked, &ka->sa.sa_mask); +	if (!(ka->sa.sa_flags & SA_NODEFER)) +		sigaddset(&blocked, sig); +	set_current_blocked(&blocked); +	return 0;  }  /*  |