No changes in ptrace.o, change ptrace_resume() to not return from inside switch().
--- kernel/ptrace.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) --- PU/kernel/ptrace.c~49_PTRACE_REQUEST_ENGINE 2009-09-17 20:35:09.000000000 +0200 +++ PU/kernel/ptrace.c 2009-09-17 20:46:55.000000000 +0200 @@ -1021,16 +1021,18 @@ static int ptrace_resume(struct task_str int ptrace_request(struct task_struct *child, long request, long addr, long data) { - int ret = -EIO; siginfo_t siginfo; + int ret; switch (request) { case PTRACE_PEEKTEXT: case PTRACE_PEEKDATA: - return generic_ptrace_peekdata(child, addr, data); + ret = generic_ptrace_peekdata(child, addr, data); + break; case PTRACE_POKETEXT: case PTRACE_POKEDATA: - return generic_ptrace_pokedata(child, addr, data); + ret = generic_ptrace_pokedata(child, addr, data); + break; #ifdef PTRACE_OLDSETOPTIONS case PTRACE_OLDSETOPTIONS: @@ -1073,14 +1075,17 @@ int ptrace_request(struct task_struct *c #endif case PTRACE_SYSCALL: case PTRACE_CONT: - return ptrace_resume(child, request, data); + ret = ptrace_resume(child, request, data); + break; case PTRACE_KILL: - if (child->exit_state) /* already dead */ - return 0; - return ptrace_resume(child, request, SIGKILL); + ret = 0; + if (!child->exit_state) /* already dead */ + ret = ptrace_resume(child, request, SIGKILL); + break; default: + ret = -EIO; break; }