From: Ruoyu Wang Date: Tue, 9 Jun 2026 08:45:28 +0000 (+0800) Subject: mtd: slram: simplify register_device() cleanup X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=4fe97a54daddb221009964161fb362b2b930d657;p=thirdparty%2Fkernel%2Flinux.git mtd: slram: simplify register_device() cleanup 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 Signed-off-by: Miquel Raynal --- diff --git a/drivers/mtd/devices/slram.c b/drivers/mtd/devices/slram.c index 48c2bc6b65ee..aa38ecdffc97 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; }