summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorDave Jones <davej@tetrachloride.(none)>2003-07-03 16:44:04 +0100
committerDave Jones <davej@tetrachloride.(none)>2003-07-03 16:44:04 +0100
commite127a373fcc6a706c6f6485756167d326654db1c (patch)
tree225c4512dca73b42ebfd7569f7c05619e3ce9362 /kernel
parent5cfcc0cda8596f3b70a9cb36dd6f3c17b73d6d59 (diff)
parentb9d6ea3caf701a205b626016713f0fe3079afc09 (diff)
Merge tetrachloride.(none):/mnt/raid/src/kernel/2.5/bk-linus
into tetrachloride.(none):/mnt/raid/src/kernel/2.5/cpufreq
Diffstat (limited to 'kernel')
-rw-r--r--kernel/exit.c12
-rw-r--r--kernel/fork.c2
-rw-r--r--kernel/ksyms.c1
3 files changed, 11 insertions, 4 deletions
diff --git a/kernel/exit.c b/kernel/exit.c
index 367854d246ef..2f090213e481 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -651,6 +651,8 @@ static void exit_notify(struct task_struct *tsk)
if (tsk->exit_signal != -1) {
int signal = tsk->parent == tsk->real_parent ? tsk->exit_signal : SIGCHLD;
do_notify_parent(tsk, signal);
+ } else if (tsk->ptrace) {
+ do_notify_parent(tsk, SIGCHLD);
}
tsk->state = TASK_ZOMBIE;
@@ -715,7 +717,7 @@ NORET_TYPE void do_exit(long code)
tsk->exit_code = code;
exit_notify(tsk);
- if (tsk->exit_signal == -1)
+ if (tsk->exit_signal == -1 && tsk->ptrace == 0)
release_task(tsk);
schedule();
@@ -859,7 +861,7 @@ static int wait_task_zombie(task_t *p, unsigned int *stat_addr, struct rusage *r
BUG_ON(state != TASK_DEAD);
return 0;
}
- if (unlikely(p->exit_signal == -1))
+ if (unlikely(p->exit_signal == -1 && p->ptrace == 0))
/*
* This can only happen in a race with a ptraced thread
* dying on another processor.
@@ -889,8 +891,12 @@ static int wait_task_zombie(task_t *p, unsigned int *stat_addr, struct rusage *r
/* Double-check with lock held. */
if (p->real_parent != p->parent) {
__ptrace_unlink(p);
- do_notify_parent(p, p->exit_signal);
p->state = TASK_ZOMBIE;
+ /* If this is a detached thread, this is where it goes away. */
+ if (p->exit_signal == -1)
+ release_task (p);
+ else
+ do_notify_parent(p, p->exit_signal);
p = NULL;
}
write_unlock_irq(&tasklist_lock);
diff --git a/kernel/fork.c b/kernel/fork.c
index 2abbc9c2da23..c17e05614c88 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -286,7 +286,7 @@ static inline int dup_mmap(struct mm_struct * mm, struct mm_struct * oldmm)
continue;
if (mpnt->vm_flags & VM_ACCOUNT) {
unsigned int len = (mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT;
- if (!vm_enough_memory(len))
+ if (security_vm_enough_memory(len))
goto fail_nomem;
charge += len;
}
diff --git a/kernel/ksyms.c b/kernel/ksyms.c
index 8544287c9045..816627adc50a 100644
--- a/kernel/ksyms.c
+++ b/kernel/ksyms.c
@@ -462,6 +462,7 @@ EXPORT_SYMBOL(preempt_schedule);
#endif
EXPORT_SYMBOL(schedule_timeout);
EXPORT_SYMBOL(yield);
+EXPORT_SYMBOL(io_schedule);
EXPORT_SYMBOL(__cond_resched);
EXPORT_SYMBOL(set_user_nice);
EXPORT_SYMBOL(task_nice);