kmsg_dump: add kmsg_dump() calls to the reboot, halt, poweroff and emergency_restart...
authorSeiji Aguchi <seiji.aguchi@hds.com>
Thu, 13 Jan 2011 00:59:30 +0000 (16:59 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 13 Jan 2011 16:03:07 +0000 (08:03 -0800)
We need to know the reason why system rebooted in support service.
However, we can't inform our customers of the reason because final
messages are lost on current Linux kernel.

This patch improves the situation above because the final messages are
saved by adding kmsg_dump() to reboot, halt, poweroff and
emergency_restart path.

Signed-off-by: Seiji Aguchi <seiji.aguchi@hds.com>
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: Marco Stornelli <marco.stornelli@gmail.com>
Reviewed-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
Reviewed-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
include/linux/kmsg_dump.h
kernel/printk.c
kernel/sys.c

index 24b44145a886f75115ce0dc8b4c70d6a67aca163..2a0d7d651dc34f98daff0d111c5e458339006945 100644 (file)
@@ -18,6 +18,10 @@ enum kmsg_dump_reason {
        KMSG_DUMP_OOPS,
        KMSG_DUMP_PANIC,
        KMSG_DUMP_KEXEC,
+       KMSG_DUMP_RESTART,
+       KMSG_DUMP_HALT,
+       KMSG_DUMP_POWEROFF,
+       KMSG_DUMP_EMERG,
 };
 
 /**
index f64b8997fc768f401831ac7d8d5ebac7945f5a6d..0b0c9aa71e89a58ac4c60f61e5ea264c0a4dca3a 100644 (file)
@@ -1539,6 +1539,10 @@ static const char * const kmsg_reasons[] = {
        [KMSG_DUMP_OOPS]        = "oops",
        [KMSG_DUMP_PANIC]       = "panic",
        [KMSG_DUMP_KEXEC]       = "kexec",
+       [KMSG_DUMP_RESTART]     = "restart",
+       [KMSG_DUMP_HALT]        = "halt",
+       [KMSG_DUMP_POWEROFF]    = "poweroff",
+       [KMSG_DUMP_EMERG]       = "emergency_restart",
 };
 
 static const char *kmsg_to_str(enum kmsg_dump_reason reason)
index 2745dcdb6c6c5756a7bafd19e6497c31cc077d60..31b71a276b40eda1c64578666ac7e1fadb77642f 100644 (file)
@@ -43,6 +43,8 @@
 #include <linux/kprobes.h>
 #include <linux/user_namespace.h>
 
+#include <linux/kmsg_dump.h>
+
 #include <asm/uaccess.h>
 #include <asm/io.h>
 #include <asm/unistd.h>
@@ -285,6 +287,7 @@ out_unlock:
  */
 void emergency_restart(void)
 {
+       kmsg_dump(KMSG_DUMP_EMERG);
        machine_emergency_restart();
 }
 EXPORT_SYMBOL_GPL(emergency_restart);
@@ -312,6 +315,7 @@ void kernel_restart(char *cmd)
                printk(KERN_EMERG "Restarting system.\n");
        else
                printk(KERN_EMERG "Restarting system with command '%s'.\n", cmd);
+       kmsg_dump(KMSG_DUMP_RESTART);
        machine_restart(cmd);
 }
 EXPORT_SYMBOL_GPL(kernel_restart);
@@ -333,6 +337,7 @@ void kernel_halt(void)
        kernel_shutdown_prepare(SYSTEM_HALT);
        sysdev_shutdown();
        printk(KERN_EMERG "System halted.\n");
+       kmsg_dump(KMSG_DUMP_HALT);
        machine_halt();
 }
 
@@ -351,6 +356,7 @@ void kernel_power_off(void)
        disable_nonboot_cpus();
        sysdev_shutdown();
        printk(KERN_EMERG "Power down.\n");
+       kmsg_dump(KMSG_DUMP_POWEROFF);
        machine_power_off();
 }
 EXPORT_SYMBOL_GPL(kernel_power_off);