From: Linus Torvalds Date: Fri, 23 Nov 2007 20:13:43 +0000 (-0500) Subject: Import 2.1.48 X-Git-Tag: 2.1.48 X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=4486825c7d0e4ba0776fa531e108fae06b9461a5;p=history.git Import 2.1.48 --- diff --git a/arch/alpha/kernel/ptrace.c b/arch/alpha/kernel/ptrace.c index c388f0b5133d..84cde1b4f1f7 100644 --- a/arch/alpha/kernel/ptrace.c +++ b/arch/alpha/kernel/ptrace.c @@ -650,7 +650,7 @@ asmlinkage void syscall_trace(void) goto out; current->exit_code = SIGTRAP; current->state = TASK_STOPPED; - notify_parent(current); + notify_parent(current, SIGCHLD); schedule(); /* * this isn't the same as continuing with a signal, but it will do diff --git a/arch/alpha/kernel/signal.c b/arch/alpha/kernel/signal.c index 5c3eb79ef2cf..9f71e614602f 100644 --- a/arch/alpha/kernel/signal.c +++ b/arch/alpha/kernel/signal.c @@ -315,7 +315,7 @@ asmlinkage int do_signal(unsigned long oldmask, if ((current->flags & PF_PTRACED) && signr != SIGKILL) { current->exit_code = signr; current->state = TASK_STOPPED; - notify_parent(current); + notify_parent(current, SIGCHLD); schedule(); single_stepping |= ptrace_cancel_bpt(current); if (!(signr = current->exit_code)) @@ -354,7 +354,7 @@ asmlinkage int do_signal(unsigned long oldmask, current->exit_code = signr; if (!(current->p_pptr->sig->action[SIGCHLD-1].sa_flags & SA_NOCLDSTOP)) - notify_parent(current); + notify_parent(current, SIGCHLD); schedule(); single_stepping |= ptrace_cancel_bpt(current); continue; diff --git a/arch/i386/kernel/ptrace.c b/arch/i386/kernel/ptrace.c index 0dfffd672abc..c8a7f986eb30 100644 --- a/arch/i386/kernel/ptrace.c +++ b/arch/i386/kernel/ptrace.c @@ -577,7 +577,7 @@ asmlinkage void syscall_trace(void) return; current->exit_code = SIGTRAP; current->state = TASK_STOPPED; - notify_parent(current); + notify_parent(current, SIGCHLD); schedule(); /* * this isn't the same as continuing with a signal, but it will do diff --git a/arch/i386/kernel/signal.c b/arch/i386/kernel/signal.c index 3141c5318ca9..f5af47201fb4 100644 --- a/arch/i386/kernel/signal.c +++ b/arch/i386/kernel/signal.c @@ -346,7 +346,7 @@ asmlinkage int do_signal(unsigned long oldmask, struct pt_regs * regs) if ((current->flags & PF_PTRACED) && signr != SIGKILL) { current->exit_code = signr; current->state = TASK_STOPPED; - notify_parent(current); + notify_parent(current, SIGCHLD); schedule(); if (!(signr = current->exit_code)) continue; @@ -386,7 +386,7 @@ asmlinkage int do_signal(unsigned long oldmask, struct pt_regs * regs) current->exit_code = signr; if (!(current->p_pptr->sig->action[SIGCHLD-1].sa_flags & SA_NOCLDSTOP)) - notify_parent(current); + notify_parent(current, SIGCHLD); schedule(); continue; diff --git a/arch/ppc/ignore b/arch/ppc/ignore deleted file mode 100644 index 693fff61a8ac..000000000000 --- a/arch/ppc/ignore +++ /dev/null @@ -1,65 +0,0 @@ -.config -compile.h -.version -.objects -.blurb -*.cort -*.paul -*.old -.defines -version.h -find_name -checks -#* -.objects -.object_files -System.map -asm -.menuconfig* -CVS -ppc_defs.h -mk_defs -mkprep -*.s -.depend -.hdepend -*~ -*.o -znetboot -zvmlinux -vmlinux -zImage -hack-coff -coffboot -vmlinux.coff -.depend -.cvsignore -RCS -SCCS -CVS.adm -RCSLOG -cvslog.* -tags -TAGS -.make.state -.nse_depinfo -*~ -#* -.#* -,* -_$* -*$ -*.old -*.bak -*.BAK -*.orig -*.rej -*.a -*.olb -*.o -*.obj -*.so -*.exe -*.Z -*.elc -*.ln diff --git a/include/linux/sched.h b/include/linux/sched.h index ffca93266fdd..14c9e4fcb2db 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -444,7 +444,7 @@ extern void wake_up(struct wait_queue ** p); extern void wake_up_interruptible(struct wait_queue ** p); extern void wake_up_process(struct task_struct * tsk); -extern void notify_parent(struct task_struct * tsk); +extern void notify_parent(struct task_struct * tsk, int signal); extern void force_sig(unsigned long sig,struct task_struct * p); extern int send_sig(unsigned long sig,struct task_struct * p,int priv); extern int in_group_p(gid_t grp); diff --git a/kernel/exit.c b/kernel/exit.c index 8aa0bfc3787f..a9b9543b7844 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -119,12 +119,12 @@ int send_sig(unsigned long sig,struct task_struct * p,int priv) return 0; } -void notify_parent(struct task_struct * tsk) +void notify_parent(struct task_struct * tsk, int signal) { - if (tsk->p_pptr == task[smp_num_cpus]) /* Init */ - tsk->exit_signal = SIGCHLD; - send_sig(tsk->exit_signal, tsk->p_pptr, 1); - wake_up_interruptible(&tsk->p_pptr->wait_chldexit); + struct task_struct * parent = tsk->p_pptr; + + send_sig(signal, parent, 1); + wake_up_interruptible(&parent->wait_chldexit); } static void release(struct task_struct * p) @@ -346,11 +346,10 @@ static inline void forget_original_parent(struct task_struct * father) read_lock(&tasklist_lock); for_each_task(p) { - if (p->p_opptr == father) - if (task[smp_num_cpus]) /* init */ - p->p_opptr = task[smp_num_cpus]; - else - p->p_opptr = task[0]; + if (p->p_opptr == father) { + p->exit_signal = SIGCHLD; + p->p_opptr = task[smp_num_cpus] ? : task[0]; /* init */ + } } read_unlock(&tasklist_lock); } @@ -488,7 +487,7 @@ static void exit_notify(void) kill_pg(current->pgrp,SIGCONT,1); } /* Let father know we died */ - notify_parent(current); + notify_parent(current, current->exit_signal); /* * This loop does two things: @@ -502,15 +501,13 @@ static void exit_notify(void) current->p_cptr = p->p_osptr; p->p_ysptr = NULL; p->flags &= ~(PF_PTRACED|PF_TRACESYS); - if (task[smp_num_cpus] && task[smp_num_cpus] != current) /* init */ - p->p_pptr = task[smp_num_cpus]; - else - p->p_pptr = task[0]; + + p->p_pptr = p->p_opptr; p->p_osptr = p->p_pptr->p_cptr; p->p_osptr->p_ysptr = p; p->p_pptr->p_cptr = p; if (p->state == TASK_ZOMBIE) - notify_parent(p); + notify_parent(p, p->exit_signal); /* * process group orphan check * Case ii: Our child is in a different pgrp @@ -651,7 +648,7 @@ repeat: REMOVE_LINKS(p); p->p_pptr = p->p_opptr; SET_LINKS(p); - notify_parent(p); + notify_parent(p, SIGCHLD); } else release(p); #ifdef DEBUG_PROC_TREE