Change ptrace_wake_up() to clear context->stop_code, this simplifies
the callers and looks right in any case.

Now ptrace_detach_task() becomes really trivial. If we create the
self-detaching engine we simply do:

        if (valid_signal(sig))
                context->signr = sig;
        context->resume = UTRACE_DETACH;

and nothing more.

Also, change the prototype to match that of utrace_control/etc.

---

 kernel/ptrace.c |   15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)

--- PU/kernel/ptrace.c~89_WAKEUP_CLEAR_STOP_CODE        2009-10-13 
19:20:24.000000000 +0200
+++ PU/kernel/ptrace.c  2009-10-13 19:55:25.000000000 +0200
@@ -80,8 +80,8 @@ void __ptrace_link(struct task_struct *c
 static const struct utrace_engine_ops ptrace_utrace_ops; /* forward decl */
 static int ptrace_attach_task(struct task_struct *tracee, int options);
 static void ptrace_abort_attach(struct task_struct *tracee);
-static void ptrace_wake_up(struct utrace_engine *engine,
-                               struct task_struct *tracee,
+static void ptrace_wake_up(struct task_struct *tracee,
+                               struct utrace_engine *engine,
                                enum utrace_resume_action action);
 
 static struct utrace_engine *ptrace_lookup_engine(struct task_struct *tracee)
@@ -111,14 +111,13 @@ static void ptrace_detach_task(struct ta
                case PTRACE_EVENT_SIGNAL:
                        if (valid_signal(sig))
                                context->signr = sig;
-                       context->stop_code = 0;
                        context->resume = UTRACE_DETACH;
                        action = UTRACE_RESUME;
                        break;
                }
        }
 
-       ptrace_wake_up(engine, tracee, action);
+       ptrace_wake_up(tracee, engine, action);
        utrace_engine_put(engine);
 }
 
@@ -943,8 +942,8 @@ void ptrace_notify_stop(struct task_stru
        utrace_engine_put(engine);
 }
 
-static void ptrace_wake_up(struct utrace_engine *engine,
-                               struct task_struct *tracee,
+static void ptrace_wake_up( struct task_struct *tracee,
+                               struct utrace_engine *engine,
                                enum utrace_resume_action action)
 {
        unsigned long flags;
@@ -958,6 +957,7 @@ static void ptrace_wake_up(struct utrace
        // XXX: FIXME!!! racy.
        tracee->exit_code = 0;
 
+       ptrace_context(engine)->stop_code = 0;
        utrace_control(tracee, engine, action);
 }
 
@@ -1011,9 +1011,8 @@ static void do_ptrace_resume(struct utra
                }
        }
 
-       context->stop_code = 0;
        context->resume = action;
-       ptrace_wake_up(engine, tracee, action);
+       ptrace_wake_up(tracee, engine, action);
 }
 
 static int ptrace_resume(struct utrace_engine *engine,

Reply via email to