git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'for_paulus' of master.kernel.org:/pub/scm/linux/kernel/git/galak/powerpc
[pandora-kernel.git]
/
kernel
/
ptrace.c
diff --git
a/kernel/ptrace.c
b/kernel/ptrace.c
index
5f33cdb
..
4e0f0ec
100644
(file)
--- a/
kernel/ptrace.c
+++ b/
kernel/ptrace.c
@@
-30,14
+30,13
@@
*/
void __ptrace_link(task_t *child, task_t *new_parent)
{
*/
void __ptrace_link(task_t *child, task_t *new_parent)
{
- if (!list_empty(&child->ptrace_list))
- BUG();
+ BUG_ON(!list_empty(&child->ptrace_list));
if (child->parent == new_parent)
return;
list_add(&child->ptrace_list, &child->parent->ptrace_children);
if (child->parent == new_parent)
return;
list_add(&child->ptrace_list, &child->parent->ptrace_children);
-
REMOVE_LINKS
(child);
+
remove_parent
(child);
child->parent = new_parent;
child->parent = new_parent;
-
SET_LINKS
(child);
+
add_parent
(child);
}
/*
}
/*
@@
-57,10
+56,6
@@
void ptrace_untrace(task_t *child)
signal_wake_up(child, 1);
}
}
signal_wake_up(child, 1);
}
}
- if (child->signal->flags & SIGNAL_GROUP_EXIT) {
- sigaddset(&child->pending.signal, SIGKILL);
- signal_wake_up(child, 1);
- }
spin_unlock(&child->sighand->siglock);
}
spin_unlock(&child->sighand->siglock);
}
@@
-72,17
+67,18
@@
void ptrace_untrace(task_t *child)
*/
void __ptrace_unlink(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);
child->ptrace = 0;
if (!list_empty(&child->ptrace_list)) {
list_del_init(&child->ptrace_list);
-
REMOVE_LINKS
(child);
+
remove_parent
(child);
child->parent = child->real_parent;
child->parent = child->real_parent;
-
SET_LINKS
(child);
+
add_parent
(child);
}
}
- ptrace_untrace(child);
+ if (child->state == TASK_TRACED)
+ ptrace_untrace(child);
}
/*
}
/*
@@
-184,22
+180,27
@@
bad:
return retval;
}
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))
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);
/* Architecture-specific hardware disable .. */
ptrace_disable(child);
- /* .. re-parent .. */
- child->exit_code = data;
-
write_lock_irq(&tasklist_lock);
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;
write_unlock_irq(&tasklist_lock);
return 0;
@@
-242,8
+243,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 (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);
} else {
copy_from_user_page(vma, page, addr,
buf, maddr + offset, bytes);