pstore: cleanups to pstore_dump()
authorTony Luck <tony.luck@intel.com>
Tue, 22 Mar 2011 23:01:49 +0000 (16:01 -0700)
committerTony Luck <tony.luck@intel.com>
Tue, 22 Mar 2011 23:01:49 +0000 (16:01 -0700)
pstore_dump() can be called with many different "reason" codes. Save
the name of the code in the persistent store record.

Also - only worthwhile calling pstore_mkfile for KMSG_DUMP_OOPS - that
is the only one where the kernel will continue running.

Reviewed-by: Seiji Aguchi <seiji.aguchi@hds.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
fs/pstore/platform.c

index ce9ad84d5dd9fdbefcf03530396e88e29b6408aa..f835a25625ff5c7e74e5834cc9e6057697d02941 100644 (file)
@@ -48,6 +48,10 @@ void pstore_set_kmsg_bytes(int bytes)
 /* Tag each group of saved records with a sequence number */
 static int     oopscount;
 
+static char *reason_str[] = {
+       "Oops", "Panic", "Kexec", "Restart", "Halt", "Poweroff", "Emergency"
+};
+
 /*
  * callback from kmsg_dump. (s2,l2) has the most recently
  * written bytes, older bytes are in (s1,l1). Save as much
@@ -61,15 +65,20 @@ static void pstore_dump(struct kmsg_dumper *dumper,
        unsigned long   s1_start, s2_start;
        unsigned long   l1_cpy, l2_cpy;
        unsigned long   size, total = 0;
-       char            *dst;
+       char            *dst, *why;
        u64             id;
        int             hsize, part = 1;
 
+       if (reason < ARRAY_SIZE(reason_str))
+               why = reason_str[reason];
+       else
+               why = "Unknown";
+
        mutex_lock(&psinfo->buf_mutex);
        oopscount++;
        while (total < kmsg_bytes) {
                dst = psinfo->buf;
-               hsize = sprintf(dst, "Oops#%d Part%d\n", oopscount, part++);
+               hsize = sprintf(dst, "%s#%d Part%d\n", why, oopscount, part++);
                size = psinfo->bufsize - hsize;
                dst += hsize;
 
@@ -86,7 +95,7 @@ static void pstore_dump(struct kmsg_dumper *dumper,
                memcpy(dst + l1_cpy, s2 + s2_start, l2_cpy);
 
                id = psinfo->write(PSTORE_TYPE_DMESG, hsize + l1_cpy + l2_cpy);
-               if (pstore_is_mounted())
+               if (reason == KMSG_DUMP_OOPS && pstore_is_mounted())
                        pstore_mkfile(PSTORE_TYPE_DMESG, psinfo->name, id,
                                      psinfo->buf, hsize + l1_cpy + l2_cpy,
                                      CURRENT_TIME, psinfo->erase);