From: Jeff Dike This first patch lays some groundwork needed by the others. From: Bodo Stroesser - Change the interface to handle_signal so that it doesn't take the system call return value as an argument and eliminate its return value. kern_do_signal also now doesn't return immediately after determining that there is no signal to deliver. Signed-off-by: Jeff Dike Signed-off-by: Andrew Morton --- 25-akpm/arch/um/kernel/signal_kern.c | 39 ++++++++++++++++------------------- 1 files changed, 18 insertions(+), 21 deletions(-) diff -puN arch/um/kernel/signal_kern.c~uml-handle-signal-api arch/um/kernel/signal_kern.c --- 25/arch/um/kernel/signal_kern.c~uml-handle-signal-api 2004-11-04 21:34:59.974452992 -0800 +++ 25-akpm/arch/um/kernel/signal_kern.c 2004-11-04 21:43:53.201390176 -0800 @@ -38,16 +38,17 @@ EXPORT_SYMBOL(unblock_signals); /* * OK, we're invoking a handler */ -static int handle_signal(struct pt_regs *regs, unsigned long signr, - struct k_sigaction *ka, siginfo_t *info, - sigset_t *oldset, int error) +static void handle_signal(struct pt_regs *regs, unsigned long signr, + struct k_sigaction *ka, siginfo_t *info, + sigset_t *oldset) { __sighandler_t handler; void (*restorer)(void); unsigned long sp; sigset_t save; - int err, ret; + int error, err, ret; + error = PT_REGS_SYSCALL_RET(¤t->thread.regs); ret = 0; /* Always make any pending restarted system calls return -EINTR */ current_thread_info()->restart_block.fn = do_no_restart_syscall; @@ -109,31 +110,25 @@ static int handle_signal(struct pt_regs else err = setup_signal_stack_sc(sp, signr, (unsigned long) handler, restorer, regs, &save); - if(err) goto segv; - - return(0); - segv: - force_sigsegv(signr, current); - return(1); + if(err) + force_sigsegv(signr, current); } -static int kern_do_signal(struct pt_regs *regs, sigset_t *oldset, int error) +static int kern_do_signal(struct pt_regs *regs, sigset_t *oldset) { struct k_sigaction ka_copy; siginfo_t info; - int err, sig; + int sig; if (!oldset) oldset = ¤t->blocked; sig = get_signal_to_deliver(&info, &ka_copy, regs, NULL); - if(sig == 0) - return(0); - - /* Whee! Actually deliver the signal. */ - err = handle_signal(regs, sig, &ka_copy, &info, oldset, error); - if(!err) + if(sig > 0){ + /* Whee! Actually deliver the signal. */ + handle_signal(regs, sig, &ka_copy, &info, oldset); return(1); + } /* Did we come from a system call? */ if(PT_REGS_SYSCALL_NR(regs) >= 0){ @@ -165,7 +160,7 @@ static int kern_do_signal(struct pt_regs int do_signal(int error) { - return(kern_do_signal(¤t->thread.regs, NULL, error)); + return(kern_do_signal(¤t->thread.regs, NULL)); } /* @@ -182,10 +177,11 @@ int sys_sigsuspend(int history0, int his recalc_sigpending(); spin_unlock_irq(¤t->sighand->siglock); + PT_REGS_SYSCALL_RET(¤t->thread.regs) = -EINTR; while (1) { current->state = TASK_INTERRUPTIBLE; schedule(); - if(kern_do_signal(¤t->thread.regs, &saveset, -EINTR)) + if(kern_do_signal(¤t->thread.regs, &saveset)) return(-EINTR); } } @@ -208,10 +204,11 @@ int sys_rt_sigsuspend(sigset_t __user *u recalc_sigpending(); spin_unlock_irq(¤t->sighand->siglock); + PT_REGS_SYSCALL_RET(¤t->thread.regs) = -EINTR; while (1) { current->state = TASK_INTERRUPTIBLE; schedule(); - if (kern_do_signal(¤t->thread.regs, &saveset, -EINTR)) + if (kern_do_signal(¤t->thread.regs, &saveset)) return(-EINTR); } } _