diff options
author | Alexander Nyberg <alexn@dsv.su.se> | 2005-06-23 03:09:13 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-23 12:45:20 -0400 |
commit | df164db5fd16888ddbe2a63a47b2f6dda9a428b5 (patch) | |
tree | cc9aaf42f93761083e58e1d9d8d22261e0ff3686 /kernel/exit.c | |
parent | 5f45f1a78fbac3cc859ec10c5366e97d20d40fa2 (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/exit.c')
-rw-r--r-- | kernel/exit.c | 11 |
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 | /* |