]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mtd: slram: simplify register_device() cleanup
authorRuoyu Wang <ruoyuw560@gmail.com>
Tue, 9 Jun 2026 08:45:28 +0000 (16:45 +0800)
committerMiquel Raynal <miquel.raynal@bootlin.com>
Thu, 11 Jun 2026 07:20:39 +0000 (09:20 +0200)
Use local variables for the list entry, mtd_info, and private data while
initializing a new device. This keeps the initialization path easier to
read and publishes the new list entry only after mtd_device_register()
has succeeded.

Signed-off-by: Ruoyu Wang <ruoyuw560@gmail.com>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
drivers/mtd/devices/slram.c

index 48c2bc6b65eec3a91047d10677a5a7d7b4292566..aa38ecdffc975e722bfa18d70b372aebf0f277a6 100644 (file)
@@ -129,6 +129,9 @@ static int slram_write(struct mtd_info *mtd, loff_t to, size_t len,
 static int register_device(char *name, unsigned long start, unsigned long length)
 {
        slram_mtd_list_t **curmtd;
+       slram_mtd_list_t *new_mtd;
+       struct mtd_info *mtdinfo;
+       slram_priv_t *priv;
        int ret = -ENOMEM;
 
        curmtd = &slram_mtdlist;
@@ -136,73 +139,68 @@ static int register_device(char *name, unsigned long start, unsigned long length
                curmtd = &(*curmtd)->next;
        }
 
-       *curmtd = kmalloc_obj(slram_mtd_list_t);
-       if (!(*curmtd)) {
+       new_mtd = kmalloc_obj(slram_mtd_list_t);
+       if (!new_mtd) {
                E("slram: Cannot allocate new MTD device.\n");
                return(-ENOMEM);
        }
-       (*curmtd)->mtdinfo = kzalloc_obj(struct mtd_info);
-       (*curmtd)->next = NULL;
-
-       if ((*curmtd)->mtdinfo) {
-               (*curmtd)->mtdinfo->priv =
-                       kzalloc_obj(slram_priv_t);
+       new_mtd->next = NULL;
 
-               if (!(*curmtd)->mtdinfo->priv) {
-                       kfree((*curmtd)->mtdinfo);
-                       (*curmtd)->mtdinfo = NULL;
-               }
+       mtdinfo = kzalloc_obj(struct mtd_info);
+       if (!mtdinfo) {
+               E("slram: Cannot allocate new MTD device.\n");
+               goto err_free_list;
        }
+       new_mtd->mtdinfo = mtdinfo;
 
-       if (!(*curmtd)->mtdinfo) {
+       priv = kzalloc_obj(slram_priv_t);
+       if (!priv) {
                E("slram: Cannot allocate new MTD device.\n");
-               goto err_free_list;
+               goto err_free_mtdinfo;
        }
+       mtdinfo->priv = priv;
 
-       if (!(((slram_priv_t *)(*curmtd)->mtdinfo->priv)->start =
-               memremap(start, length,
-                        MEMREMAP_WB | MEMREMAP_WT | MEMREMAP_WC))) {
+       priv->start = memremap(start, length,
+                              MEMREMAP_WB | MEMREMAP_WT | MEMREMAP_WC);
+       if (!priv->start) {
                E("slram: memremap failed\n");
                ret = -EIO;
                goto err_free_priv;
        }
-       ((slram_priv_t *)(*curmtd)->mtdinfo->priv)->end =
-               ((slram_priv_t *)(*curmtd)->mtdinfo->priv)->start + length;
-
-
-       (*curmtd)->mtdinfo->name = name;
-       (*curmtd)->mtdinfo->size = length;
-       (*curmtd)->mtdinfo->flags = MTD_CAP_RAM;
-       (*curmtd)->mtdinfo->_erase = slram_erase;
-       (*curmtd)->mtdinfo->_point = slram_point;
-       (*curmtd)->mtdinfo->_unpoint = slram_unpoint;
-       (*curmtd)->mtdinfo->_read = slram_read;
-       (*curmtd)->mtdinfo->_write = slram_write;
-       (*curmtd)->mtdinfo->owner = THIS_MODULE;
-       (*curmtd)->mtdinfo->type = MTD_RAM;
-       (*curmtd)->mtdinfo->erasesize = SLRAM_BLK_SZ;
-       (*curmtd)->mtdinfo->writesize = 1;
-
-       if (mtd_device_register((*curmtd)->mtdinfo, NULL, 0))   {
+       priv->end = priv->start + length;
+
+       mtdinfo->name = name;
+       mtdinfo->size = length;
+       mtdinfo->flags = MTD_CAP_RAM;
+       mtdinfo->_erase = slram_erase;
+       mtdinfo->_point = slram_point;
+       mtdinfo->_unpoint = slram_unpoint;
+       mtdinfo->_read = slram_read;
+       mtdinfo->_write = slram_write;
+       mtdinfo->owner = THIS_MODULE;
+       mtdinfo->type = MTD_RAM;
+       mtdinfo->erasesize = SLRAM_BLK_SZ;
+       mtdinfo->writesize = 1;
+
+       if (mtd_device_register(mtdinfo, NULL, 0)) {
                E("slram: Failed to register new device\n");
                ret = -EAGAIN;
                goto err_unmap;
        }
+       *curmtd = new_mtd;
        T("slram: Registered device %s from %luKiB to %luKiB\n", name,
                        (start / 1024), ((start + length) / 1024));
-       T("slram: Mapped from 0x%p to 0x%p\n",
-                       ((slram_priv_t *)(*curmtd)->mtdinfo->priv)->start,
-                       ((slram_priv_t *)(*curmtd)->mtdinfo->priv)->end);
-       return(0);
+       T("slram: Mapped from 0x%p to 0x%p\n", priv->start, priv->end);
+       return 0;
 
 err_unmap:
-       memunmap(((slram_priv_t *)(*curmtd)->mtdinfo->priv)->start);
+       memunmap(priv->start);
 err_free_priv:
-       kfree((*curmtd)->mtdinfo->priv);
+       kfree(priv);
+err_free_mtdinfo:
+       kfree(mtdinfo);
 err_free_list:
-       kfree((*curmtd)->mtdinfo);
-       kfree(*curmtd);
-       *curmtd = NULL;
+       kfree(new_mtd);
        return ret;
 }