From: Ruoyu Wang <ruoyuw560@gmail.com>
To: Miquel Raynal <miquel.raynal@bootlin.com>,
Richard Weinberger <richard@nod.at>,
Vignesh Raghavendra <vigneshr@ti.com>
Cc: linux-mtd@lists.infradead.org, linux-kernel@vger.kernel.org,
Ruoyu Wang <ruoyuw560@gmail.com>
Subject: [PATCH v2 2/2] mtd: slram: simplify register_device() cleanup
Date: Tue, 9 Jun 2026 16:45:28 +0800 [thread overview]
Message-ID: <20260609084528.5-3-ruoyuw560@gmail.com> (raw)
In-Reply-To: <20260609084528.5-1-ruoyuw560@gmail.com>
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>
---
drivers/mtd/devices/slram.c | 86 ++++++++++++++++++-------------------
1 file changed, 42 insertions(+), 44 deletions(-)
diff --git a/drivers/mtd/devices/slram.c b/drivers/mtd/devices/slram.c
index 48c2bc6b65eec..aa38ecdffc975 100644
--- a/drivers/mtd/devices/slram.c
+++ b/drivers/mtd/devices/slram.c
@@ -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;
}
--
2.51.0
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
next prev parent reply other threads:[~2026-06-09 8:45 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-09 8:45 [PATCH v2 0/2] mtd: slram: fix failed registration cleanup Ruoyu Wang
2026-06-09 8:45 ` [PATCH v2 1/2] mtd: slram: remove failed entries from the device list Ruoyu Wang
2026-06-09 8:45 ` Ruoyu Wang [this message]
2026-06-11 7:21 ` [PATCH v2 0/2] mtd: slram: fix failed registration cleanup Miquel Raynal
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260609084528.5-3-ruoyuw560@gmail.com \
--to=ruoyuw560@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mtd@lists.infradead.org \
--cc=miquel.raynal@bootlin.com \
--cc=richard@nod.at \
--cc=vigneshr@ti.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox