Hmm. Looks like this helper buys nothing but complicates the reading, move the code into ptrace_detach_task().
Also s/ret/err/ and s/child/tracee/. --- kernel/ptrace.c | 57 +++++++++++++++++++++++--------------------------------- 1 file changed, 24 insertions(+), 33 deletions(-) --- PU/kernel/ptrace.c~76_KILL_DETACH_SIGNAL 2009-10-09 17:14:30.000000000 +0200 +++ PU/kernel/ptrace.c 2009-10-09 18:51:56.000000000 +0200 @@ -87,46 +87,37 @@ static struct utrace_engine *ptrace_look &ptrace_utrace_ops, NULL); } -static enum utrace_resume_action -detach_signal(struct task_struct *tracee, - struct ptrace_context *context, int sig) -{ - enum utrace_resume_action action = UTRACE_DETACH; - - switch (get_stop_event(context)) { - case PTRACE_EVENT_SYSCALL_ENTRY: - case PTRACE_EVENT_SYSCALL_EXIT: - if (valid_signal(sig)) - send_sig_info(sig, SEND_SIG_PRIV, tracee); - break; - - case PTRACE_EVENT_SIGNAL: - if (valid_signal(sig)) - context->signr = sig; - context->stop_code = 0; - context->resume = UTRACE_DETACH; - action = UTRACE_RESUME; - break; - } - - return action; -} - -static void ptrace_detach_task(struct task_struct *child, int sig) +static void ptrace_detach_task(struct task_struct *tracee, int sig) { - struct utrace_engine *engine = ptrace_lookup_engine(child); + struct utrace_engine *engine = ptrace_lookup_engine(tracee); + struct ptrace_context *context = ptrace_context(engine); enum utrace_resume_action action = UTRACE_DETACH; - int ret; + int err; if (unlikely(IS_ERR(engine))) return; - if (sig) - action = detach_signal(child, ptrace_context(engine), sig); + if (sig) { + switch (get_stop_event(context)) { + case PTRACE_EVENT_SYSCALL_ENTRY: + case PTRACE_EVENT_SYSCALL_EXIT: + if (valid_signal(sig)) + send_sig_info(sig, SEND_SIG_PRIV, tracee); + break; - ret = utrace_control(child, engine, action); - WARN_ON(ret && ret != -EINPROGRESS && - ret != -ESRCH && ret != -EALREADY); + case PTRACE_EVENT_SIGNAL: + if (valid_signal(sig)) + context->signr = sig; + context->stop_code = 0; + context->resume = UTRACE_DETACH; + action = UTRACE_RESUME; + break; + } + } + + err = utrace_control(tracee, engine, action); + WARN_ON(err && err != -EINPROGRESS && + err != -ESRCH && err != -EALREADY); utrace_engine_put(engine); }