diff options
Diffstat (limited to 'kernel/exit.c')
| -rw-r--r-- | kernel/exit.c | 12 | 
1 files changed, 8 insertions, 4 deletions
diff --git a/kernel/exit.c b/kernel/exit.c index bcbd59888e67..2833ffb0c211 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -517,10 +517,6 @@ static struct task_struct *find_child_reaper(struct task_struct *father,  	}  	write_unlock_irq(&tasklist_lock); -	if (unlikely(pid_ns == &init_pid_ns)) { -		panic("Attempted to kill init! exitcode=0x%08x\n", -			father->signal->group_exit_code ?: father->exit_code); -	}  	list_for_each_entry_safe(p, n, dead, ptrace_entry) {  		list_del_init(&p->ptrace_entry); @@ -766,6 +762,14 @@ void __noreturn do_exit(long code)  	acct_update_integrals(tsk);  	group_dead = atomic_dec_and_test(&tsk->signal->live);  	if (group_dead) { +		/* +		 * If the last thread of global init has exited, panic +		 * immediately to get a useable coredump. +		 */ +		if (unlikely(is_global_init(tsk))) +			panic("Attempted to kill init! exitcode=0x%08x\n", +				tsk->signal->group_exit_code ?: (int)code); +  #ifdef CONFIG_POSIX_TIMERS  		hrtimer_cancel(&tsk->signal->real_timer);  		exit_itimers(tsk->signal);  | 
