]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
pstore: Map PSTORE_TYPE_* to strings
authorJoel Fernandes (Google) <joel@joelfernandes.org>
Sat, 3 Nov 2018 23:38:16 +0000 (16:38 -0700)
committerKees Cook <keescook@chromium.org>
Tue, 4 Dec 2018 00:52:35 +0000 (16:52 -0800)
In later patches we will need to map types to names, so create a
constant table for that which can also be used in different parts of
old and new code. This saves the type in the PRZ which will be useful
in later patches.

Instead of having an explicit PSTORE_TYPE_UNKNOWN, just use ..._MAX.

This includes removing the now redundant filename templates which can use
a single format string. Also, there's no reason to limit the "is it still
compressed?" test to only PSTORE_TYPE_DMESG when building the pstorefs
filename. Records are zero-initialized, so a backend would need to have
explicitly set compressed=1.

Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
Co-developed-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Kees Cook <keescook@chromium.org>
drivers/acpi/apei/erst.c
fs/pstore/inode.c
fs/pstore/platform.c
fs/pstore/ram.c
include/linux/pstore.h
include/linux/pstore_ram.h

index 3c5ea7cb693ef558829ab15b930d234cd51b9d67..a5e1d963208e7f172affb6a6af0e46201f0ac991 100644 (file)
@@ -1035,7 +1035,7 @@ static ssize_t erst_reader(struct pstore_record *record)
                             CPER_SECTION_TYPE_MCE) == 0)
                record->type = PSTORE_TYPE_MCE;
        else
-               record->type = PSTORE_TYPE_UNKNOWN;
+               record->type = PSTORE_TYPE_MAX;
 
        if (rcd->hdr.validation_bits & CPER_VALID_TIMESTAMP)
                record->time.tv_sec = rcd->hdr.timestamp;
index 8cf2218b46a759229b26025bd159ab83fe125cf5..c60ee46f3e39338bae635123af6fa122abc4c1ef 100644 (file)
@@ -335,53 +335,10 @@ int pstore_mkfile(struct dentry *root, struct pstore_record *record)
                goto fail_alloc;
        private->record = record;
 
-       switch (record->type) {
-       case PSTORE_TYPE_DMESG:
-               scnprintf(name, sizeof(name), "dmesg-%s-%llu%s",
-                         record->psi->name, record->id,
-                         record->compressed ? ".enc.z" : "");
-               break;
-       case PSTORE_TYPE_CONSOLE:
-               scnprintf(name, sizeof(name), "console-%s-%llu",
-                         record->psi->name, record->id);
-               break;
-       case PSTORE_TYPE_FTRACE:
-               scnprintf(name, sizeof(name), "ftrace-%s-%llu",
-                         record->psi->name, record->id);
-               break;
-       case PSTORE_TYPE_MCE:
-               scnprintf(name, sizeof(name), "mce-%s-%llu",
-                         record->psi->name, record->id);
-               break;
-       case PSTORE_TYPE_PPC_RTAS:
-               scnprintf(name, sizeof(name), "rtas-%s-%llu",
-                         record->psi->name, record->id);
-               break;
-       case PSTORE_TYPE_PPC_OF:
-               scnprintf(name, sizeof(name), "powerpc-ofw-%s-%llu",
-                         record->psi->name, record->id);
-               break;
-       case PSTORE_TYPE_PPC_COMMON:
-               scnprintf(name, sizeof(name), "powerpc-common-%s-%llu",
-                         record->psi->name, record->id);
-               break;
-       case PSTORE_TYPE_PMSG:
-               scnprintf(name, sizeof(name), "pmsg-%s-%llu",
-                         record->psi->name, record->id);
-               break;
-       case PSTORE_TYPE_PPC_OPAL:
-               scnprintf(name, sizeof(name), "powerpc-opal-%s-%llu",
-                         record->psi->name, record->id);
-               break;
-       case PSTORE_TYPE_UNKNOWN:
-               scnprintf(name, sizeof(name), "unknown-%s-%llu",
-                         record->psi->name, record->id);
-               break;
-       default:
-               scnprintf(name, sizeof(name), "type%d-%s-%llu",
-                         record->type, record->psi->name, record->id);
-               break;
-       }
+       scnprintf(name, sizeof(name), "%s-%s-%llu%s",
+                       pstore_type_to_name(record->type),
+                       record->psi->name, record->id,
+                       record->compressed ? ".enc.z" : "");
 
        dentry = d_alloc_name(root, name);
        if (!dentry)
index 32340e7dd6a50599b2b166aa2ad55411b55c3470..2387cb74f72998c239e73d293f3506be863602e5 100644 (file)
@@ -59,6 +59,19 @@ MODULE_PARM_DESC(update_ms, "milliseconds before pstore updates its content "
                 "enabling this option is not safe, it may lead to further "
                 "corruption on Oopses)");
 
+/* Names should be in the same order as the enum pstore_type_id */
+static const char * const pstore_type_names[] = {
+       "dmesg",
+       "mce",
+       "console",
+       "ftrace",
+       "rtas",
+       "powerpc-ofw",
+       "powerpc-common",
+       "pmsg",
+       "powerpc-opal",
+};
+
 static int pstore_new_entry;
 
 static void pstore_timefunc(struct timer_list *);
@@ -104,6 +117,30 @@ void pstore_set_kmsg_bytes(int bytes)
 /* Tag each group of saved records with a sequence number */
 static int     oopscount;
 
+const char *pstore_type_to_name(enum pstore_type_id type)
+{
+       BUILD_BUG_ON(ARRAY_SIZE(pstore_type_names) != PSTORE_TYPE_MAX);
+
+       if (WARN_ON_ONCE(type >= PSTORE_TYPE_MAX))
+               return "unknown";
+
+       return pstore_type_names[type];
+}
+EXPORT_SYMBOL_GPL(pstore_type_to_name);
+
+enum pstore_type_id pstore_name_to_type(const char *name)
+{
+       int i;
+
+       for (i = 0; i < PSTORE_TYPE_MAX; i++) {
+               if (!strcmp(pstore_type_names[i], name))
+                       return i;
+       }
+
+       return PSTORE_TYPE_MAX;
+}
+EXPORT_SYMBOL_GPL(pstore_name_to_type);
+
 static const char *get_reason_str(enum kmsg_dump_reason reason)
 {
        switch (reason) {
index 10ac4d23c42310c5e845a73ffc20ae7d7ef00396..b174d0fc009f7fd94f182a530818fe653576ac41 100644 (file)
@@ -611,6 +611,7 @@ static int ramoops_init_przs(const char *name,
                        goto fail;
                }
                *paddr += zone_sz;
+               prz_ar[i]->type = pstore_name_to_type(name);
        }
 
        *przs = prz_ar;
@@ -650,6 +651,7 @@ static int ramoops_init_prz(const char *name,
        }
 
        *paddr += sz;
+       (*prz)->type = pstore_name_to_type(name);
 
        return 0;
 }
@@ -785,7 +787,7 @@ static int ramoops_probe(struct platform_device *pdev)
 
        dump_mem_sz = cxt->size - cxt->console_size - cxt->ftrace_size
                        - cxt->pmsg_size;
-       err = ramoops_init_przs("dump", dev, cxt, &cxt->dprzs, &paddr,
+       err = ramoops_init_przs("dmesg", dev, cxt, &cxt->dprzs, &paddr,
                                dump_mem_sz, cxt->record_size,
                                &cxt->max_dump_cnt, 0, 0);
        if (err)
index f46e5df76b583adf83d123cd39945a5c933e7d2f..a9ec285d85d1c98d856cf8b37e75d123195db3bb 100644 (file)
 
 struct module;
 
-/* pstore record types (see fs/pstore/inode.c for filename templates) */
+/*
+ * pstore record types (see fs/pstore/platform.c for pstore_type_names[])
+ * These values may be written to storage (see EFI vars backend), so
+ * they are kind of an ABI. Be careful changing the mappings.
+ */
 enum pstore_type_id {
+       /* Frontend storage types */
        PSTORE_TYPE_DMESG       = 0,
        PSTORE_TYPE_MCE         = 1,
        PSTORE_TYPE_CONSOLE     = 2,
        PSTORE_TYPE_FTRACE      = 3,
-       /* PPC64 partition types */
+
+       /* PPC64-specific partition types */
        PSTORE_TYPE_PPC_RTAS    = 4,
        PSTORE_TYPE_PPC_OF      = 5,
        PSTORE_TYPE_PPC_COMMON  = 6,
        PSTORE_TYPE_PMSG        = 7,
        PSTORE_TYPE_PPC_OPAL    = 8,
-       PSTORE_TYPE_UNKNOWN     = 255
+
+       /* End of the list */
+       PSTORE_TYPE_MAX
 };
 
+const char *pstore_type_to_name(enum pstore_type_id type);
+enum pstore_type_id pstore_name_to_type(const char *name);
+
 struct pstore_info;
 /**
  * struct pstore_record - details of a pstore record entry
index 5d10ad51c1c43e514206313055c6678e20245bb4..337971c419802f6d5042f6c7fa58d2d047d43b83 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/init.h>
 #include <linux/kernel.h>
 #include <linux/list.h>
+#include <linux/pstore.h>
 #include <linux/types.h>
 
 /*
@@ -54,6 +55,7 @@ struct persistent_ram_ecc_info {
  * @paddr:     physical address of the mapped RAM area
  * @size:      size of mapping
  * @label:     unique name of this PRZ
+ * @type:      frontend type for this PRZ
  * @flags:     holds PRZ_FLAGS_* bits
  *
  * @buffer_lock:
@@ -88,6 +90,7 @@ struct persistent_ram_zone {
        size_t size;
        void *vaddr;
        char *label;
+       enum pstore_type_id type;
        u32 flags;
 
        raw_spinlock_t buffer_lock;