pstore: Avoid writing records with zero size
[sfrench/cifs-2.6.git] / fs / pstore / ram.c
index 96f7d32cd184a29889892320028e9b09b36b424e..b2471d430048a3f1ac4a1afecb6c3d509c90a13a 100644 (file)
@@ -110,7 +110,6 @@ struct ramoops_context {
 };
 
 static struct platform_device *dummy;
-static struct ramoops_platform_data *dummy_data;
 
 static int ramoops_pstore_open(struct pstore_info *psi)
 {
@@ -128,7 +127,6 @@ ramoops_get_next_prz(struct persistent_ram_zone *przs[], int id,
                     struct pstore_record *record)
 {
        struct persistent_ram_zone *prz;
-       bool update = (record->type == PSTORE_TYPE_DMESG);
 
        /* Give up if we never existed or have hit the end. */
        if (!przs)
@@ -139,7 +137,7 @@ ramoops_get_next_prz(struct persistent_ram_zone *przs[], int id,
                return NULL;
 
        /* Update old/shadowed buffer. */
-       if (update)
+       if (prz->type == PSTORE_TYPE_DMESG)
                persistent_ram_save_old(prz);
 
        if (!persistent_ram_old_size(prz))
@@ -354,8 +352,10 @@ static size_t ramoops_write_kmsg_hdr(struct persistent_ram_zone *prz,
                (time64_t)record->time.tv_sec,
                record->time.tv_nsec / 1000,
                record->compressed ? 'C' : 'D');
-       WARN_ON_ONCE(!hdr);
-       len = hdr ? strlen(hdr) : 0;
+       if (WARN_ON_ONCE(!hdr))
+               return 0;
+
+       len = strlen(hdr);
        persistent_ram_write(prz, hdr, len);
        kfree(hdr);
 
@@ -711,18 +711,15 @@ static int ramoops_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct ramoops_platform_data *pdata = dev->platform_data;
+       struct ramoops_platform_data pdata_local;
        struct ramoops_context *cxt = &oops_cxt;
        size_t dump_mem_sz;
        phys_addr_t paddr;
        int err = -EINVAL;
 
        if (dev_of_node(dev) && !pdata) {
-               pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
-               if (!pdata) {
-                       pr_err("cannot allocate platform data buffer\n");
-                       err = -ENOMEM;
-                       goto fail_out;
-               }
+               pdata = &pdata_local;
+               memset(pdata, 0, sizeof(*pdata));
 
                err = ramoops_parse_dt(pdev, pdata);
                if (err < 0)
@@ -896,13 +893,12 @@ static inline void ramoops_unregister_dummy(void)
 {
        platform_device_unregister(dummy);
        dummy = NULL;
-
-       kfree(dummy_data);
-       dummy_data = NULL;
 }
 
 static void __init ramoops_register_dummy(void)
 {
+       struct ramoops_platform_data pdata;
+
        /*
         * Prepare a dummy platform data structure to carry the module
         * parameters. If mem_size isn't set, then there are no module
@@ -913,30 +909,25 @@ static void __init ramoops_register_dummy(void)
 
        pr_info("using module parameters\n");
 
-       dummy_data = kzalloc(sizeof(*dummy_data), GFP_KERNEL);
-       if (!dummy_data) {
-               pr_info("could not allocate pdata\n");
-               return;
-       }
-
-       dummy_data->mem_size = mem_size;
-       dummy_data->mem_address = mem_address;
-       dummy_data->mem_type = mem_type;
-       dummy_data->record_size = record_size;
-       dummy_data->console_size = ramoops_console_size;
-       dummy_data->ftrace_size = ramoops_ftrace_size;
-       dummy_data->pmsg_size = ramoops_pmsg_size;
-       dummy_data->dump_oops = dump_oops;
-       dummy_data->flags = RAMOOPS_FLAG_FTRACE_PER_CPU;
+       memset(&pdata, 0, sizeof(pdata));
+       pdata.mem_size = mem_size;
+       pdata.mem_address = mem_address;
+       pdata.mem_type = mem_type;
+       pdata.record_size = record_size;
+       pdata.console_size = ramoops_console_size;
+       pdata.ftrace_size = ramoops_ftrace_size;
+       pdata.pmsg_size = ramoops_pmsg_size;
+       pdata.dump_oops = dump_oops;
+       pdata.flags = RAMOOPS_FLAG_FTRACE_PER_CPU;
 
        /*
         * For backwards compatibility ramoops.ecc=1 means 16 bytes ECC
         * (using 1 byte for ECC isn't much of use anyway).
         */
-       dummy_data->ecc_info.ecc_size = ramoops_ecc == 1 ? 16 : ramoops_ecc;
+       pdata.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));
+                       &pdata, sizeof(pdata));
        if (IS_ERR(dummy)) {
                pr_info("could not create platform device: %ld\n",
                        PTR_ERR(dummy));