mtd: rawnand: nandsim: Fix the two ns_alloc_device() error paths
authorMiquel Raynal <miquel.raynal@bootlin.com>
Mon, 25 May 2020 08:58:41 +0000 (10:58 +0200)
committerMiquel Raynal <miquel.raynal@bootlin.com>
Sun, 31 May 2020 08:53:38 +0000 (10:53 +0200)
The ns_alloc_device() helper has actually two distinct path. Handle
errors in both of them.

Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Link: https://lore.kernel.org/linux-mtd/20200525085851.17682-8-miquel.raynal@bootlin.com
drivers/mtd/nand/raw/nandsim.c

index a439949..da6d919 100644 (file)
@@ -543,12 +543,12 @@ static int __init ns_alloc_device(struct nandsim *ns)
                if (!(cfile->f_mode & FMODE_CAN_READ)) {
                        NS_ERR("alloc_device: cache file not readable\n");
                        err = -EINVAL;
-                       goto err_close;
+                       goto err_close_filp;
                }
                if (!(cfile->f_mode & FMODE_CAN_WRITE)) {
                        NS_ERR("alloc_device: cache file not writeable\n");
                        err = -EINVAL;
-                       goto err_close;
+                       goto err_close_filp;
                }
                ns->pages_written =
                        vzalloc(array_size(sizeof(unsigned long),
@@ -556,16 +556,24 @@ static int __init ns_alloc_device(struct nandsim *ns)
                if (!ns->pages_written) {
                        NS_ERR("alloc_device: unable to allocate pages written array\n");
                        err = -ENOMEM;
-                       goto err_close;
+                       goto err_close_filp;
                }
                ns->file_buf = kmalloc(ns->geom.pgszoob, GFP_KERNEL);
                if (!ns->file_buf) {
                        NS_ERR("alloc_device: unable to allocate file buf\n");
                        err = -ENOMEM;
-                       goto err_free;
+                       goto err_free_pw;
                }
                ns->cfile = cfile;
+
                return 0;
+
+err_free_pw:
+               vfree(ns->pages_written);
+err_close_filp:
+               filp_close(cfile, NULL);
+
+               return err;
        }
 
        ns->pages = vmalloc(array_size(sizeof(union ns_mem), ns->geom.pgnum));
@@ -580,15 +588,15 @@ static int __init ns_alloc_device(struct nandsim *ns)
                                                ns->geom.pgszoob, 0, 0, NULL);
        if (!ns->nand_pages_slab) {
                NS_ERR("cache_create: unable to create kmem_cache\n");
-               return -ENOMEM;
+               err = -ENOMEM;
+               goto err_free_pg;
        }
 
        return 0;
 
-err_free:
-       vfree(ns->pages_written);
-err_close:
-       filp_close(cfile, NULL);
+err_free_pg:
+       vfree(ns->pages);
+
        return err;
 }