diff options
| author | Dave Jones <davej@tetrachloride.(none)> | 2003-07-03 16:44:04 +0100 |
|---|---|---|
| committer | Dave Jones <davej@tetrachloride.(none)> | 2003-07-03 16:44:04 +0100 |
| commit | e127a373fcc6a706c6f6485756167d326654db1c (patch) | |
| tree | 225c4512dca73b42ebfd7569f7c05619e3ce9362 /kernel | |
| parent | 5cfcc0cda8596f3b70a9cb36dd6f3c17b73d6d59 (diff) | |
| parent | b9d6ea3caf701a205b626016713f0fe3079afc09 (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.c | 12 | ||||
| -rw-r--r-- | kernel/fork.c | 2 | ||||
| -rw-r--r-- | kernel/ksyms.c | 1 |
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); |
