diff options
author | Anton Altaparmakov <aia21@cantab.net> | 2006-02-24 09:06:36 +0000 |
---|---|---|
committer | Anton Altaparmakov <aia21@cantab.net> | 2006-02-24 09:06:36 +0000 |
commit | fab8d6ddf6dee2608869005d45fe97f70e4f5bdd (patch) | |
tree | fecf566e03a87b2a44c7f3363ddb5c0d4bebdca7 /kernel/ptrace.c | |
parent | 64419d93a5906600af5817ad0cae3c6ecf7fb389 (diff) | |
parent | f52ee1410d563cd409b08822492273a5bc235821 (diff) | |
download | blackbird-op-linux-fab8d6ddf6dee2608869005d45fe97f70e4f5bdd.tar.gz blackbird-op-linux-fab8d6ddf6dee2608869005d45fe97f70e4f5bdd.zip |
Merge branch 'master' of /home/src/linux-2.6/
Diffstat (limited to 'kernel/ptrace.c')
-rw-r--r-- | kernel/ptrace.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/kernel/ptrace.c b/kernel/ptrace.c index 5f33cdb6fff5..d95a72c9279d 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c @@ -72,8 +72,8 @@ void ptrace_untrace(task_t *child) */ void __ptrace_unlink(task_t *child) { - if (!child->ptrace) - BUG(); + BUG_ON(!child->ptrace); + child->ptrace = 0; if (!list_empty(&child->ptrace_list)) { list_del_init(&child->ptrace_list); @@ -184,22 +184,27 @@ bad: return retval; } +void __ptrace_detach(struct task_struct *child, unsigned int data) +{ + child->exit_code = data; + /* .. re-parent .. */ + __ptrace_unlink(child); + /* .. and wake it up. */ + if (child->exit_state != EXIT_ZOMBIE) + wake_up_process(child); +} + int ptrace_detach(struct task_struct *child, unsigned int data) { if (!valid_signal(data)) - return -EIO; + return -EIO; /* Architecture-specific hardware disable .. */ ptrace_disable(child); - /* .. re-parent .. */ - child->exit_code = data; - write_lock_irq(&tasklist_lock); - __ptrace_unlink(child); - /* .. and wake it up. */ - if (child->exit_state != EXIT_ZOMBIE) - wake_up_process(child); + if (child->ptrace) + __ptrace_detach(child, data); write_unlock_irq(&tasklist_lock); return 0; @@ -242,8 +247,7 @@ int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, in if (write) { copy_to_user_page(vma, page, addr, maddr + offset, buf, bytes); - if (!PageCompound(page)) - set_page_dirty_lock(page); + set_page_dirty_lock(page); } else { copy_from_user_page(vma, page, addr, buf, maddr + offset, bytes); |