pstore: Introduce get_reason_str() to pstore
authorSeiji Aguchi <seiji.aguchi@hds.com>
Fri, 16 Mar 2012 22:36:59 +0000 (15:36 -0700)
committerTim Gardner <tim.gardner@canonical.com>
Mon, 9 Apr 2012 13:52:02 +0000 (07:52 -0600)
BugLink: http://bugs.launchpad.net/bugs/944772

Recently, there has been some changes in kmsg_dump() below and they have been applied to linus-tree.
 (1) kmsg_dump(KMSG_DUMP_KEXEC) was removed.
     http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=commitdiff;h=a3dd3323058d281abd584b15ad4c5b65064d7a61

 (2) The order of "enum kmsg_dump_reason" was modified.
     http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=commitdiff;h=c22ab332902333f83766017478c1ef6607ace681

Replace the fragile reason_str array with a more robust solution that
will not be broken by future re-arrangements of the enum values.

Signed-off-by: Seiji Aguchi <seiji.aguchi@hds.com>
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Acked-by: Don Zickus <dzickus@redhat.com>
Link: https://lkml.org/lkml/2012/3/16/417
Signed-off-by: Tony Luck <tony.luck@intel.com>
(cherry picked from commit 381b872cf7942ab8c95de156ce403bd906f3915d)
Acked-by: Colin King <colin.king@canonical.com>
Acked-by: Seth Forshee <seth.forshee@canonical.com>
Signed-off-by: Joseph Salisbury <joseph.salisbury@canonical.com>
Signed-off-by: Tim Gardner <tim.gardner@canonical.com>

fs/pstore/platform.c

index 57bbf90..fef8c4a 100644 (file)
@@ -68,9 +68,25 @@ 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"
-};
+static const char *get_reason_str(enum kmsg_dump_reason reason)
+{
+       switch (reason) {
+       case KMSG_DUMP_PANIC:
+               return "Panic";
+       case KMSG_DUMP_OOPS:
+               return "Oops";
+       case KMSG_DUMP_EMERG:
+               return "Emergency";
+       case KMSG_DUMP_RESTART:
+               return "Restart";
+       case KMSG_DUMP_HALT:
+               return "Halt";
+       case KMSG_DUMP_POWEROFF:
+               return "Poweroff";
+       default:
+               return "Unknown";
+       }
+}
 
 /*
  * callback from kmsg_dump. (s2,l2) has the most recently
@@ -85,17 +101,15 @@ 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, *why;
+       char            *dst;
+       const char      *why;
        u64             id;
        int             hsize, ret;
        unsigned int    part = 1;
        unsigned long   flags = 0;
        int             is_locked = 0;
 
-       if (reason < ARRAY_SIZE(reason_str))
-               why = reason_str[reason];
-       else
-               why = "Unknown";
+       why = get_reason_str(reason);
 
        if (in_nmi()) {
                is_locked = spin_trylock(&psinfo->buf_lock);