aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorAlexander Nyberg <alexn@dsv.su.se>2005-06-23 03:09:13 -0400
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-06-23 12:45:20 -0400
commitdf164db5fd16888ddbe2a63a47b2f6dda9a428b5 (patch)
treecc9aaf42f93761083e58e1d9d8d22261e0ff3686 /kernel
parent5f45f1a78fbac3cc859ec10c5366e97d20d40fa2 (diff)
[PATCH] avoid resursive oopses
Prevent recursive faults in do_exit() by leaving the task alone and wait for reboot. This may allow a more graceful shutdown and possibly save the original oops. Signed-off-by: Alexander Nyberg <alexn@telia.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/exit.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/kernel/exit.c b/kernel/exit.c
index 2ef2ad540201..c2bdf6fb61a5 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -793,6 +793,17 @@ fastcall NORET_TYPE void do_exit(long code)
793 ptrace_notify((PTRACE_EVENT_EXIT << 8) | SIGTRAP); 793 ptrace_notify((PTRACE_EVENT_EXIT << 8) | SIGTRAP);
794 } 794 }
795 795
796 /*
797 * We're taking recursive faults here in do_exit. Safest is to just
798 * leave this task alone and wait for reboot.
799 */
800 if (unlikely(tsk->flags & PF_EXITING)) {
801 printk(KERN_ALERT
802 "Fixing recursive fault but reboot is needed!\n");
803 set_current_state(TASK_UNINTERRUPTIBLE);
804 schedule();
805 }
806
796 tsk->flags |= PF_EXITING; 807 tsk->flags |= PF_EXITING;
797 808
798 /* 809 /*