]> Pileus Git - ~andy/linux/blobdiff - fs/pstore/ram.c
Merge tag 'please-pull-pstore' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl...
[~andy/linux] / fs / pstore / ram.c
index 82e74dd50b6c642b0d3dd6cf3eb1458cc2448bfa..1376e5a8f0d6c6cfa430f87ed31d36cc9af5e007 100644 (file)
@@ -83,7 +83,7 @@ struct ramoops_context {
        size_t console_size;
        size_t ftrace_size;
        int dump_oops;
-       int ecc_size;
+       struct persistent_ram_ecc_info ecc_info;
        unsigned int max_dump_cnt;
        unsigned int dump_write_cnt;
        unsigned int dump_read_cnt;
@@ -136,6 +136,7 @@ static ssize_t ramoops_pstore_read(u64 *id, enum pstore_type_id *type,
                                   char **buf, struct pstore_info *psi)
 {
        ssize_t size;
+       ssize_t ecc_notice_size;
        struct ramoops_context *cxt = psi->data;
        struct persistent_ram_zone *prz;
 
@@ -156,11 +157,18 @@ static ssize_t ramoops_pstore_read(u64 *id, enum pstore_type_id *type,
        time->tv_nsec = 0;
 
        size = persistent_ram_old_size(prz);
-       *buf = kmemdup(persistent_ram_old(prz), size, GFP_KERNEL);
+
+       /* ECC correction notice */
+       ecc_notice_size = persistent_ram_ecc_string(prz, NULL, 0);
+
+       *buf = kmalloc(size + ecc_notice_size + 1, GFP_KERNEL);
        if (*buf == NULL)
                return -ENOMEM;
 
-       return size;
+       memcpy(*buf, persistent_ram_old(prz), size);
+       persistent_ram_ecc_string(prz, *buf + size, ecc_notice_size + 1);
+
+       return size + ecc_notice_size;
 }
 
 static size_t ramoops_write_kmsg_hdr(struct persistent_ram_zone *prz)
@@ -322,7 +330,8 @@ static int ramoops_init_przs(struct device *dev, struct ramoops_context *cxt,
        for (i = 0; i < cxt->max_dump_cnt; i++) {
                size_t sz = cxt->record_size;
 
-               cxt->przs[i] = persistent_ram_new(*paddr, sz, 0, cxt->ecc_size);
+               cxt->przs[i] = persistent_ram_new(*paddr, sz, 0,
+                                                 &cxt->ecc_info);
                if (IS_ERR(cxt->przs[i])) {
                        err = PTR_ERR(cxt->przs[i]);
                        dev_err(dev, "failed to request mem region (0x%zx@0x%llx): %d\n",
@@ -352,7 +361,7 @@ static int ramoops_init_prz(struct device *dev, struct ramoops_context *cxt,
                return -ENOMEM;
        }
 
-       *prz = persistent_ram_new(*paddr, sz, sig, cxt->ecc_size);
+       *prz = persistent_ram_new(*paddr, sz, sig, &cxt->ecc_info);
        if (IS_ERR(*prz)) {
                int err = PTR_ERR(*prz);
 
@@ -406,7 +415,7 @@ static int ramoops_probe(struct platform_device *pdev)
        cxt->console_size = pdata->console_size;
        cxt->ftrace_size = pdata->ftrace_size;
        cxt->dump_oops = pdata->dump_oops;
-       cxt->ecc_size = pdata->ecc_size;
+       cxt->ecc_info = pdata->ecc_info;
 
        paddr = cxt->phys_addr;
 
@@ -466,9 +475,9 @@ static int ramoops_probe(struct platform_device *pdev)
        record_size = pdata->record_size;
        dump_oops = pdata->dump_oops;
 
-       pr_info("attached 0x%lx@0x%llx, ecc: %d\n",
+       pr_info("attached 0x%lx@0x%llx, ecc: %d/%d\n",
                cxt->size, (unsigned long long)cxt->phys_addr,
-               cxt->ecc_size);
+               cxt->ecc_info.ecc_size, cxt->ecc_info.block_size);
 
        return 0;
 
@@ -540,7 +549,7 @@ static void ramoops_register_dummy(void)
         * For backwards compatibility ramoops.ecc=1 means 16 bytes ECC
         * (using 1 byte for ECC isn't much of use anyway).
         */
-       dummy_data->ecc_size = ramoops_ecc == 1 ? 16 : ramoops_ecc;
+       dummy_data->ecc_info.ecc_size = ramoops_ecc == 1 ? 16 : ramoops_ecc;
 
        dummy = platform_device_register_data(NULL, "ramoops", -1,
                        dummy_data, sizeof(struct ramoops_platform_data));