From: Sasha Levin Date: Tue, 23 Jun 2020 01:30:16 +0000 (-0400) Subject: Fixes for 4.14 X-Git-Tag: v5.7.6~33 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=38f3a27b074a5e874d60b2999025d39ec7c2e6f2;p=thirdparty%2Fkernel%2Fstable-queue.git Fixes for 4.14 Signed-off-by: Sasha Levin --- diff --git a/queue-4.14/block-nr_sects_write-disable-preemption-on-seqcount-.patch b/queue-4.14/block-nr_sects_write-disable-preemption-on-seqcount-.patch new file mode 100644 index 00000000000..37155b97dd7 --- /dev/null +++ b/queue-4.14/block-nr_sects_write-disable-preemption-on-seqcount-.patch @@ -0,0 +1,48 @@ +From 17f44208de54a7692b1a613305419125a36e977f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 3 Jun 2020 16:49:48 +0200 +Subject: block: nr_sects_write(): Disable preemption on seqcount write + +From: Ahmed S. Darwish + +[ Upstream commit 15b81ce5abdc4b502aa31dff2d415b79d2349d2f ] + +For optimized block readers not holding a mutex, the "number of sectors" +64-bit value is protected from tearing on 32-bit architectures by a +sequence counter. + +Disable preemption before entering that sequence counter's write side +critical section. Otherwise, the read side can preempt the write side +section and spin for the entire scheduler tick. If the reader belongs to +a real-time scheduling class, it can spin forever and the kernel will +livelock. + +Fixes: c83f6bf98dc1 ("block: add partition resize function to blkpg ioctl") +Cc: +Signed-off-by: Ahmed S. Darwish +Reviewed-by: Sebastian Andrzej Siewior +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + include/linux/genhd.h | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/include/linux/genhd.h b/include/linux/genhd.h +index 550fa358893ae..37f30d62f3a2e 100644 +--- a/include/linux/genhd.h ++++ b/include/linux/genhd.h +@@ -693,9 +693,11 @@ static inline sector_t part_nr_sects_read(struct hd_struct *part) + static inline void part_nr_sects_write(struct hd_struct *part, sector_t size) + { + #if BITS_PER_LONG==32 && defined(CONFIG_LBDAF) && defined(CONFIG_SMP) ++ preempt_disable(); + write_seqcount_begin(&part->nr_sects_seq); + part->nr_sects = size; + write_seqcount_end(&part->nr_sects_seq); ++ preempt_enable(); + #elif BITS_PER_LONG==32 && defined(CONFIG_LBDAF) && defined(CONFIG_PREEMPT) + preempt_disable(); + part->nr_sects = size; +-- +2.25.1 + diff --git a/queue-4.14/mtd-rawnand-diskonchip-fix-the-probe-error-path.patch b/queue-4.14/mtd-rawnand-diskonchip-fix-the-probe-error-path.patch new file mode 100644 index 00000000000..798d7dc6b2c --- /dev/null +++ b/queue-4.14/mtd-rawnand-diskonchip-fix-the-probe-error-path.patch @@ -0,0 +1,54 @@ +From d0b128a4955f85c4045d86d2ad207dfe6812ccf7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 May 2020 14:59:45 +0200 +Subject: mtd: rawnand: diskonchip: Fix the probe error path + +From: Miquel Raynal + +[ Upstream commit c5be12e45940f1aa1b5dfa04db5d15ad24f7c896 ] + +Not sure nand_cleanup() is the right function to call here but in any +case it is not nand_release(). Indeed, even a comment says that +calling nand_release() is a bit of a hack as there is no MTD device to +unregister. So switch to nand_cleanup() for now and drop this +comment. + +There is no Fixes tag applying here as the use of nand_release() +in this driver predates by far the introduction of nand_cleanup() in +commit d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") +which makes this change possible. However, pointing this commit as the +culprit for backporting purposes makes sense even if it did not intruce +any bug. + +Fixes: d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") +Signed-off-by: Miquel Raynal +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/linux-mtd/20200519130035.1883-13-miquel.raynal@bootlin.com +Signed-off-by: Sasha Levin +--- + drivers/mtd/nand/diskonchip.c | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +diff --git a/drivers/mtd/nand/diskonchip.c b/drivers/mtd/nand/diskonchip.c +index 12cac07f5cf22..4f48a9b4f9e3f 100644 +--- a/drivers/mtd/nand/diskonchip.c ++++ b/drivers/mtd/nand/diskonchip.c +@@ -1605,13 +1605,10 @@ static int __init doc_probe(unsigned long physadr) + numchips = doc2001_init(mtd); + + if ((ret = nand_scan(mtd, numchips)) || (ret = doc->late_init(mtd))) { +- /* DBB note: i believe nand_release is necessary here, as ++ /* DBB note: i believe nand_cleanup is necessary here, as + buffers may have been allocated in nand_base. Check with + Thomas. FIX ME! */ +- /* nand_release will call mtd_device_unregister, but we +- haven't yet added it. This is handled without incident by +- mtd_device_unregister, as far as I can tell. */ +- nand_release(nand); ++ nand_cleanup(nand); + kfree(nand); + goto fail; + } +-- +2.25.1 + diff --git a/queue-4.14/mtd-rawnand-mtk-fix-the-probe-error-path.patch b/queue-4.14/mtd-rawnand-mtk-fix-the-probe-error-path.patch new file mode 100644 index 00000000000..45333bc47c8 --- /dev/null +++ b/queue-4.14/mtd-rawnand-mtk-fix-the-probe-error-path.patch @@ -0,0 +1,44 @@ +From e9fea998581d53d3d4bdb25f9df9e491a8922ddd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 May 2020 15:00:00 +0200 +Subject: mtd: rawnand: mtk: Fix the probe error path + +From: Miquel Raynal + +[ Upstream commit 8a82bbcadec877f5f938c54026278dfc1f05a332 ] + +nand_release() is supposed be called after MTD device registration. +Here, only nand_scan() happened, so use nand_cleanup() instead. + +There is no real Fixes tag applying here as the use of nand_release() +in this driver predates the introduction of nand_cleanup() in +commit d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") +which makes this change possible. However, pointing this commit as the +culprit for backporting purposes makes sense even if this commit is not +introducing any bug. + +Fixes: d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") +Signed-off-by: Miquel Raynal +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/linux-mtd/20200519130035.1883-28-miquel.raynal@bootlin.com +Signed-off-by: Sasha Levin +--- + drivers/mtd/nand/mtk_nand.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/mtd/nand/mtk_nand.c b/drivers/mtd/nand/mtk_nand.c +index 27fcce71ad38c..ff314ce104e58 100644 +--- a/drivers/mtd/nand/mtk_nand.c ++++ b/drivers/mtd/nand/mtk_nand.c +@@ -1357,7 +1357,7 @@ static int mtk_nfc_nand_chip_init(struct device *dev, struct mtk_nfc *nfc, + ret = mtd_device_parse_register(mtd, NULL, NULL, NULL, 0); + if (ret) { + dev_err(dev, "mtd parse partition error\n"); +- nand_release(nand); ++ nand_cleanup(nand); + return ret; + } + +-- +2.25.1 + diff --git a/queue-4.14/mtd-rawnand-orion-fix-the-probe-error-path.patch b/queue-4.14/mtd-rawnand-orion-fix-the-probe-error-path.patch new file mode 100644 index 00000000000..f0d7331e676 --- /dev/null +++ b/queue-4.14/mtd-rawnand-orion-fix-the-probe-error-path.patch @@ -0,0 +1,44 @@ +From 0dff1339416d798a6f80fdadeeb2ab4971e5ea66 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 May 2020 15:00:06 +0200 +Subject: mtd: rawnand: orion: Fix the probe error path + +From: Miquel Raynal + +[ Upstream commit be238fbf78e4c7c586dac235ab967d3e565a4d1a ] + +nand_release() is supposed be called after MTD device registration. +Here, only nand_scan() happened, so use nand_cleanup() instead. + +There is no real Fixes tag applying here as the use of nand_release() +in this driver predates by far the introduction of nand_cleanup() in +commit d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") +which makes this change possible. However, pointing this commit as the +culprit for backporting purposes makes sense even if this commit is not +introducing any bug. + +Fixes: d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") +Signed-off-by: Miquel Raynal +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/linux-mtd/20200519130035.1883-34-miquel.raynal@bootlin.com +Signed-off-by: Sasha Levin +--- + drivers/mtd/nand/orion_nand.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/mtd/nand/orion_nand.c b/drivers/mtd/nand/orion_nand.c +index 2f21c678d6efd..df07f9b4cf03a 100644 +--- a/drivers/mtd/nand/orion_nand.c ++++ b/drivers/mtd/nand/orion_nand.c +@@ -186,7 +186,7 @@ static int __init orion_nand_probe(struct platform_device *pdev) + mtd->name = "orion_nand"; + ret = mtd_device_register(mtd, board->parts, board->nr_parts); + if (ret) { +- nand_release(nc); ++ nand_cleanup(nc); + goto no_dev; + } + +-- +2.25.1 + diff --git a/queue-4.14/mtd-rawnand-oxnas-add-of_node_put.patch b/queue-4.14/mtd-rawnand-oxnas-add-of_node_put.patch new file mode 100644 index 00000000000..fcd6ecc9708 --- /dev/null +++ b/queue-4.14/mtd-rawnand-oxnas-add-of_node_put.patch @@ -0,0 +1,62 @@ +From 3d53b72b8f77887837af9a5b3611010a6fadc66c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 9 Jul 2019 22:40:16 +0530 +Subject: mtd: rawnand: oxnas: Add of_node_put() + +From: Nishka Dasgupta + +[ Upstream commit c436f68beeb20f2f92937677db1d9069b0dd2a3d ] + +Each iteration of for_each_child_of_node puts the previous node, but in +the case of a goto from the middle of the loop, there is no put, thus +causing a memory leak. Hence add an of_node_put under a new goto to put +the node at a loop exit. +Issue found with Coccinelle. + +Signed-off-by: Nishka Dasgupta +Signed-off-by: Miquel Raynal +Signed-off-by: Sasha Levin +--- + drivers/mtd/nand/oxnas_nand.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/drivers/mtd/nand/oxnas_nand.c b/drivers/mtd/nand/oxnas_nand.c +index ff58999887388..7f0ba28f8a007 100644 +--- a/drivers/mtd/nand/oxnas_nand.c ++++ b/drivers/mtd/nand/oxnas_nand.c +@@ -123,7 +123,7 @@ static int oxnas_nand_probe(struct platform_device *pdev) + GFP_KERNEL); + if (!chip) { + err = -ENOMEM; +- goto err_clk_unprepare; ++ goto err_release_child; + } + + chip->controller = &oxnas->base; +@@ -144,12 +144,12 @@ static int oxnas_nand_probe(struct platform_device *pdev) + /* Scan to find existence of the device */ + err = nand_scan(mtd, 1); + if (err) +- goto err_clk_unprepare; ++ goto err_release_child; + + err = mtd_device_register(mtd, NULL, 0); + if (err) { + nand_release(chip); +- goto err_clk_unprepare; ++ goto err_release_child; + } + + oxnas->chips[nchips] = chip; +@@ -166,6 +166,8 @@ static int oxnas_nand_probe(struct platform_device *pdev) + + return 0; + ++err_release_child: ++ of_node_put(nand_np); + err_clk_unprepare: + clk_disable_unprepare(oxnas->clk); + return err; +-- +2.25.1 + diff --git a/queue-4.14/mtd-rawnand-oxnas-fix-the-probe-error-path.patch b/queue-4.14/mtd-rawnand-oxnas-fix-the-probe-error-path.patch new file mode 100644 index 00000000000..c51fb24ce11 --- /dev/null +++ b/queue-4.14/mtd-rawnand-oxnas-fix-the-probe-error-path.patch @@ -0,0 +1,53 @@ +From d785eb9c3306fb4b59e94da9a0ebc780f4c94ca5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 May 2020 15:00:09 +0200 +Subject: mtd: rawnand: oxnas: Fix the probe error path + +From: Miquel Raynal + +[ Upstream commit 154298e2a3f6c9ce1d76cdb48d89fd5b107ea1a3 ] + +nand_release() is supposed be called after MTD device registration. +Here, only nand_scan() happened, so use nand_cleanup() instead. + +While at it, be consistent and move the function call in the error +path thanks to a goto statement. + +Fixes: 668592492409 ("mtd: nand: Add OX820 NAND Support") +Signed-off-by: Miquel Raynal +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/linux-mtd/20200519130035.1883-37-miquel.raynal@bootlin.com +Signed-off-by: Sasha Levin +--- + drivers/mtd/nand/oxnas_nand.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/mtd/nand/oxnas_nand.c b/drivers/mtd/nand/oxnas_nand.c +index 7f0ba28f8a007..350d4226b436a 100644 +--- a/drivers/mtd/nand/oxnas_nand.c ++++ b/drivers/mtd/nand/oxnas_nand.c +@@ -147,10 +147,8 @@ static int oxnas_nand_probe(struct platform_device *pdev) + goto err_release_child; + + err = mtd_device_register(mtd, NULL, 0); +- if (err) { +- nand_release(chip); +- goto err_release_child; +- } ++ if (err) ++ goto err_cleanup_nand; + + oxnas->chips[nchips] = chip; + ++nchips; +@@ -166,6 +164,8 @@ static int oxnas_nand_probe(struct platform_device *pdev) + + return 0; + ++err_cleanup_nand: ++ nand_cleanup(chip); + err_release_child: + of_node_put(nand_np); + err_clk_unprepare: +-- +2.25.1 + diff --git a/queue-4.14/mtd-rawnand-pass-a-nand_chip-object-to-nand_release.patch b/queue-4.14/mtd-rawnand-pass-a-nand_chip-object-to-nand_release.patch new file mode 100644 index 00000000000..4a0dad1645f --- /dev/null +++ b/queue-4.14/mtd-rawnand-pass-a-nand_chip-object-to-nand_release.patch @@ -0,0 +1,868 @@ +From 71730a0fd9b903581172f4fec70bf2c6ee937429 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 6 Sep 2018 14:05:15 +0200 +Subject: mtd: rawnand: Pass a nand_chip object to nand_release() + +From: Boris Brezillon + +[ Upstream commit 59ac276f22270fb2094910f9a734c17f41c25e70 ] + +Let's make the raw NAND API consistent by patching all helpers to +take a nand_chip object instead of an mtd_info one. + +Now is nand_release()'s turn. + +Signed-off-by: Boris Brezillon +Signed-off-by: Miquel Raynal +Signed-off-by: Sasha Levin +--- + Documentation/driver-api/mtdnand.rst | 2 +- + drivers/mtd/nand/ams-delta.c | 2 +- + drivers/mtd/nand/au1550nd.c | 2 +- + drivers/mtd/nand/bcm47xxnflash/main.c | 2 +- + drivers/mtd/nand/brcmnand/brcmnand.c | 2 +- + drivers/mtd/nand/cafe_nand.c | 2 +- + drivers/mtd/nand/cmx270_nand.c | 2 +- + drivers/mtd/nand/cs553x_nand.c | 2 +- + drivers/mtd/nand/davinci_nand.c | 2 +- + drivers/mtd/nand/denali.c | 4 +--- + drivers/mtd/nand/diskonchip.c | 4 ++-- + drivers/mtd/nand/docg4.c | 4 ++-- + drivers/mtd/nand/fsl_elbc_nand.c | 2 +- + drivers/mtd/nand/fsl_ifc_nand.c | 2 +- + drivers/mtd/nand/fsl_upm.c | 2 +- + drivers/mtd/nand/fsmc_nand.c | 2 +- + drivers/mtd/nand/gpio.c | 2 +- + drivers/mtd/nand/gpmi-nand/gpmi-nand.c | 2 +- + drivers/mtd/nand/hisi504_nand.c | 5 ++--- + drivers/mtd/nand/jz4740_nand.c | 2 +- + drivers/mtd/nand/jz4780_nand.c | 4 ++-- + drivers/mtd/nand/lpc32xx_mlc.c | 3 +-- + drivers/mtd/nand/lpc32xx_slc.c | 3 +-- + drivers/mtd/nand/mpc5121_nfc.c | 2 +- + drivers/mtd/nand/mtk_nand.c | 4 ++-- + drivers/mtd/nand/mxc_nand.c | 2 +- + drivers/mtd/nand/nand_base.c | 8 ++++---- + drivers/mtd/nand/nandsim.c | 4 ++-- + drivers/mtd/nand/ndfc.c | 2 +- + drivers/mtd/nand/nuc900_nand.c | 2 +- + drivers/mtd/nand/omap2.c | 2 +- + drivers/mtd/nand/orion_nand.c | 5 ++--- + drivers/mtd/nand/oxnas_nand.c | 4 ++-- + drivers/mtd/nand/pasemi_nand.c | 2 +- + drivers/mtd/nand/plat_nand.c | 4 ++-- + drivers/mtd/nand/qcom_nandc.c | 2 +- + drivers/mtd/nand/r852.c | 4 ++-- + drivers/mtd/nand/s3c2410.c | 2 +- + drivers/mtd/nand/sh_flctl.c | 2 +- + drivers/mtd/nand/sharpsl.c | 4 ++-- + drivers/mtd/nand/socrates_nand.c | 5 ++--- + drivers/mtd/nand/sunxi_nand.c | 4 ++-- + drivers/mtd/nand/tango_nand.c | 2 +- + drivers/mtd/nand/tmio_nand.c | 4 ++-- + drivers/mtd/nand/txx9ndfmc.c | 2 +- + drivers/mtd/nand/vf610_nfc.c | 2 +- + drivers/mtd/nand/xway_nand.c | 4 ++-- + include/linux/mtd/rawnand.h | 6 ++---- + 48 files changed, 67 insertions(+), 76 deletions(-) + +diff --git a/Documentation/driver-api/mtdnand.rst b/Documentation/driver-api/mtdnand.rst +index 2a5191b6d4459..15449334b1242 100644 +--- a/Documentation/driver-api/mtdnand.rst ++++ b/Documentation/driver-api/mtdnand.rst +@@ -277,7 +277,7 @@ unregisters the partitions in the MTD layer. + static void __exit board_cleanup (void) + { + /* Release resources, unregister device */ +- nand_release (board_mtd); ++ nand_release (mtd_to_nand(board_mtd)); + + /* unmap physical address */ + iounmap(baseaddr); +diff --git a/drivers/mtd/nand/ams-delta.c b/drivers/mtd/nand/ams-delta.c +index dcec9cf4983f8..e22a9ffa9cb73 100644 +--- a/drivers/mtd/nand/ams-delta.c ++++ b/drivers/mtd/nand/ams-delta.c +@@ -263,7 +263,7 @@ static int ams_delta_cleanup(struct platform_device *pdev) + void __iomem *io_base = platform_get_drvdata(pdev); + + /* Release resources, unregister device */ +- nand_release(ams_delta_mtd); ++ nand_release(mtd_to_nand(ams_delta_mtd)); + + gpio_free_array(_mandatory_gpio, ARRAY_SIZE(_mandatory_gpio)); + gpio_free(AMS_DELTA_GPIO_PIN_NAND_RB); +diff --git a/drivers/mtd/nand/au1550nd.c b/drivers/mtd/nand/au1550nd.c +index 9d4a28fa6b73b..99c738be2545d 100644 +--- a/drivers/mtd/nand/au1550nd.c ++++ b/drivers/mtd/nand/au1550nd.c +@@ -496,7 +496,7 @@ static int au1550nd_remove(struct platform_device *pdev) + struct au1550nd_ctx *ctx = platform_get_drvdata(pdev); + struct resource *r = platform_get_resource(pdev, IORESOURCE_MEM, 0); + +- nand_release(nand_to_mtd(&ctx->chip)); ++ nand_release(&ctx->chip); + iounmap(ctx->base); + release_mem_region(r->start, 0x1000); + kfree(ctx); +diff --git a/drivers/mtd/nand/bcm47xxnflash/main.c b/drivers/mtd/nand/bcm47xxnflash/main.c +index fb31429b70a9a..d796941608457 100644 +--- a/drivers/mtd/nand/bcm47xxnflash/main.c ++++ b/drivers/mtd/nand/bcm47xxnflash/main.c +@@ -65,7 +65,7 @@ static int bcm47xxnflash_remove(struct platform_device *pdev) + { + struct bcm47xxnflash *nflash = platform_get_drvdata(pdev); + +- nand_release(nand_to_mtd(&nflash->nand_chip)); ++ nand_release(&nflash->nand_chip); + + return 0; + } +diff --git a/drivers/mtd/nand/brcmnand/brcmnand.c b/drivers/mtd/nand/brcmnand/brcmnand.c +index f8d793b15a7a9..2bb8e6faa5391 100644 +--- a/drivers/mtd/nand/brcmnand/brcmnand.c ++++ b/drivers/mtd/nand/brcmnand/brcmnand.c +@@ -2597,7 +2597,7 @@ int brcmnand_remove(struct platform_device *pdev) + struct brcmnand_host *host; + + list_for_each_entry(host, &ctrl->host_list, node) +- nand_release(nand_to_mtd(&host->chip)); ++ nand_release(&host->chip); + + clk_disable_unprepare(ctrl->clk); + +diff --git a/drivers/mtd/nand/cafe_nand.c b/drivers/mtd/nand/cafe_nand.c +index bc558c438a574..98c013094fa23 100644 +--- a/drivers/mtd/nand/cafe_nand.c ++++ b/drivers/mtd/nand/cafe_nand.c +@@ -826,7 +826,7 @@ static void cafe_nand_remove(struct pci_dev *pdev) + /* Disable NAND IRQ in global IRQ mask register */ + cafe_writel(cafe, ~1 & cafe_readl(cafe, GLOBAL_IRQ_MASK), GLOBAL_IRQ_MASK); + free_irq(pdev->irq, mtd); +- nand_release(mtd); ++ nand_release(chip); + free_rs(cafe->rs); + pci_iounmap(pdev, cafe->mmio); + dma_free_coherent(&cafe->pdev->dev, +diff --git a/drivers/mtd/nand/cmx270_nand.c b/drivers/mtd/nand/cmx270_nand.c +index 1fc435f994e1e..7b824ae88ab01 100644 +--- a/drivers/mtd/nand/cmx270_nand.c ++++ b/drivers/mtd/nand/cmx270_nand.c +@@ -230,7 +230,7 @@ module_init(cmx270_init); + static void __exit cmx270_cleanup(void) + { + /* Release resources, unregister device */ +- nand_release(cmx270_nand_mtd); ++ nand_release(mtd_to_nand(cmx270_nand_mtd)); + + gpio_free(GPIO_NAND_RB); + gpio_free(GPIO_NAND_CS); +diff --git a/drivers/mtd/nand/cs553x_nand.c b/drivers/mtd/nand/cs553x_nand.c +index d48877540f144..647d4ee693457 100644 +--- a/drivers/mtd/nand/cs553x_nand.c ++++ b/drivers/mtd/nand/cs553x_nand.c +@@ -338,7 +338,7 @@ static void __exit cs553x_cleanup(void) + mmio_base = this->IO_ADDR_R; + + /* Release resources, unregister device */ +- nand_release(mtd); ++ nand_release(this); + kfree(mtd->name); + cs553x_mtd[i] = NULL; + +diff --git a/drivers/mtd/nand/davinci_nand.c b/drivers/mtd/nand/davinci_nand.c +index ccc8c43abcff3..e66f1385b49e8 100644 +--- a/drivers/mtd/nand/davinci_nand.c ++++ b/drivers/mtd/nand/davinci_nand.c +@@ -854,7 +854,7 @@ static int nand_davinci_remove(struct platform_device *pdev) + ecc4_busy = false; + spin_unlock_irq(&davinci_nand_lock); + +- nand_release(nand_to_mtd(&info->chip)); ++ nand_release(&info->chip); + + clk_disable_unprepare(info->clk); + +diff --git a/drivers/mtd/nand/denali.c b/drivers/mtd/nand/denali.c +index 3087b0ba7b7f3..390a18ad68eea 100644 +--- a/drivers/mtd/nand/denali.c ++++ b/drivers/mtd/nand/denali.c +@@ -1444,9 +1444,7 @@ EXPORT_SYMBOL(denali_init); + /* driver exit point */ + void denali_remove(struct denali_nand_info *denali) + { +- struct mtd_info *mtd = nand_to_mtd(&denali->nand); +- +- nand_release(mtd); ++ nand_release(&denali->nand); + kfree(denali->buf); + denali_disable_irq(denali); + } +diff --git a/drivers/mtd/nand/diskonchip.c b/drivers/mtd/nand/diskonchip.c +index c3aa53caab5cf..12cac07f5cf22 100644 +--- a/drivers/mtd/nand/diskonchip.c ++++ b/drivers/mtd/nand/diskonchip.c +@@ -1611,7 +1611,7 @@ static int __init doc_probe(unsigned long physadr) + /* nand_release will call mtd_device_unregister, but we + haven't yet added it. This is handled without incident by + mtd_device_unregister, as far as I can tell. */ +- nand_release(mtd); ++ nand_release(nand); + kfree(nand); + goto fail; + } +@@ -1644,7 +1644,7 @@ static void release_nanddoc(void) + doc = nand_get_controller_data(nand); + + nextmtd = doc->nextdoc; +- nand_release(mtd); ++ nand_release(nand); + iounmap(doc->virtadr); + release_mem_region(doc->physadr, DOC_IOREMAP_LEN); + kfree(nand); +diff --git a/drivers/mtd/nand/docg4.c b/drivers/mtd/nand/docg4.c +index 2436cbc71662d..53fdf491d8c00 100644 +--- a/drivers/mtd/nand/docg4.c ++++ b/drivers/mtd/nand/docg4.c +@@ -1376,7 +1376,7 @@ static int __init probe_docg4(struct platform_device *pdev) + return 0; + + fail: +- nand_release(mtd); /* deletes partitions and mtd devices */ ++ nand_release(nand); /* deletes partitions and mtd devices */ + free_bch(doc->bch); + kfree(nand); + +@@ -1389,7 +1389,7 @@ static int __init probe_docg4(struct platform_device *pdev) + static int __exit cleanup_docg4(struct platform_device *pdev) + { + struct docg4_priv *doc = platform_get_drvdata(pdev); +- nand_release(doc->mtd); ++ nand_release(mtd_to_nand(doc->mtd)); + free_bch(doc->bch); + kfree(mtd_to_nand(doc->mtd)); + iounmap(doc->virtadr); +diff --git a/drivers/mtd/nand/fsl_elbc_nand.c b/drivers/mtd/nand/fsl_elbc_nand.c +index 17db2f90aa2c3..0f70bd961234e 100644 +--- a/drivers/mtd/nand/fsl_elbc_nand.c ++++ b/drivers/mtd/nand/fsl_elbc_nand.c +@@ -813,7 +813,7 @@ static int fsl_elbc_chip_remove(struct fsl_elbc_mtd *priv) + struct fsl_elbc_fcm_ctrl *elbc_fcm_ctrl = priv->ctrl->nand; + struct mtd_info *mtd = nand_to_mtd(&priv->chip); + +- nand_release(mtd); ++ nand_release(&priv->chip); + + kfree(mtd->name); + +diff --git a/drivers/mtd/nand/fsl_ifc_nand.c b/drivers/mtd/nand/fsl_ifc_nand.c +index 16deba1a23858..0d49281614397 100644 +--- a/drivers/mtd/nand/fsl_ifc_nand.c ++++ b/drivers/mtd/nand/fsl_ifc_nand.c +@@ -927,7 +927,7 @@ static int fsl_ifc_chip_remove(struct fsl_ifc_mtd *priv) + { + struct mtd_info *mtd = nand_to_mtd(&priv->chip); + +- nand_release(mtd); ++ nand_release(&priv->chip); + + kfree(mtd->name); + +diff --git a/drivers/mtd/nand/fsl_upm.c b/drivers/mtd/nand/fsl_upm.c +index a88e2cf66e0f6..009e96fb92ae2 100644 +--- a/drivers/mtd/nand/fsl_upm.c ++++ b/drivers/mtd/nand/fsl_upm.c +@@ -326,7 +326,7 @@ static int fun_remove(struct platform_device *ofdev) + struct mtd_info *mtd = nand_to_mtd(&fun->chip); + int i; + +- nand_release(mtd); ++ nand_release(&fun->chip); + kfree(mtd->name); + + for (i = 0; i < fun->mchip_count; i++) { +diff --git a/drivers/mtd/nand/fsmc_nand.c b/drivers/mtd/nand/fsmc_nand.c +index eac15d9bf49eb..3be80e15e4002 100644 +--- a/drivers/mtd/nand/fsmc_nand.c ++++ b/drivers/mtd/nand/fsmc_nand.c +@@ -1118,7 +1118,7 @@ static int fsmc_nand_remove(struct platform_device *pdev) + struct fsmc_nand_data *host = platform_get_drvdata(pdev); + + if (host) { +- nand_release(nand_to_mtd(&host->nand)); ++ nand_release(&host->nand); + + if (host->mode == USE_DMA_ACCESS) { + dma_release_channel(host->write_dma_chan); +diff --git a/drivers/mtd/nand/gpio.c b/drivers/mtd/nand/gpio.c +index fd3648952b5a7..81b02b81e9844 100644 +--- a/drivers/mtd/nand/gpio.c ++++ b/drivers/mtd/nand/gpio.c +@@ -199,7 +199,7 @@ static int gpio_nand_remove(struct platform_device *pdev) + { + struct gpiomtd *gpiomtd = platform_get_drvdata(pdev); + +- nand_release(nand_to_mtd(&gpiomtd->nand_chip)); ++ nand_release(&gpiomtd->nand_chip); + + if (gpio_is_valid(gpiomtd->plat.gpio_nwp)) + gpio_set_value(gpiomtd->plat.gpio_nwp, 0); +diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c +index d4d824ef64e9f..c7d0d2eed6c25 100644 +--- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c ++++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c +@@ -2135,7 +2135,7 @@ static int gpmi_nand_remove(struct platform_device *pdev) + { + struct gpmi_nand_data *this = platform_get_drvdata(pdev); + +- nand_release(nand_to_mtd(&this->nand)); ++ nand_release(&this->nand); + gpmi_free_dma_buffer(this); + release_resources(this); + return 0; +diff --git a/drivers/mtd/nand/hisi504_nand.c b/drivers/mtd/nand/hisi504_nand.c +index d9ee1a7e69563..1d1b541489f84 100644 +--- a/drivers/mtd/nand/hisi504_nand.c ++++ b/drivers/mtd/nand/hisi504_nand.c +@@ -823,7 +823,7 @@ static int hisi_nfc_probe(struct platform_device *pdev) + return 0; + + err_mtd: +- nand_release(mtd); ++ nand_release(chip); + err_res: + return ret; + } +@@ -831,9 +831,8 @@ static int hisi_nfc_probe(struct platform_device *pdev) + static int hisi_nfc_remove(struct platform_device *pdev) + { + struct hinfc_host *host = platform_get_drvdata(pdev); +- struct mtd_info *mtd = nand_to_mtd(&host->chip); + +- nand_release(mtd); ++ nand_release(&host->chip); + + return 0; + } +diff --git a/drivers/mtd/nand/jz4740_nand.c b/drivers/mtd/nand/jz4740_nand.c +index ad827d4af3e9b..2caf27bef13a4 100644 +--- a/drivers/mtd/nand/jz4740_nand.c ++++ b/drivers/mtd/nand/jz4740_nand.c +@@ -500,7 +500,7 @@ static int jz_nand_remove(struct platform_device *pdev) + struct jz_nand *nand = platform_get_drvdata(pdev); + size_t i; + +- nand_release(nand_to_mtd(&nand->chip)); ++ nand_release(&nand->chip); + + /* Deassert and disable all chips */ + writel(0, nand->base + JZ_REG_NAND_CTRL); +diff --git a/drivers/mtd/nand/jz4780_nand.c b/drivers/mtd/nand/jz4780_nand.c +index e69f6ae4c5395..86ff46eb79256 100644 +--- a/drivers/mtd/nand/jz4780_nand.c ++++ b/drivers/mtd/nand/jz4780_nand.c +@@ -293,7 +293,7 @@ static int jz4780_nand_init_chip(struct platform_device *pdev, + + ret = mtd_device_register(mtd, NULL, 0); + if (ret) { +- nand_release(mtd); ++ nand_release(chip); + return ret; + } + +@@ -308,7 +308,7 @@ static void jz4780_nand_cleanup_chips(struct jz4780_nand_controller *nfc) + + while (!list_empty(&nfc->chips)) { + chip = list_first_entry(&nfc->chips, struct jz4780_nand_chip, chip_list); +- nand_release(nand_to_mtd(&chip->chip)); ++ nand_release(&chip->chip); + list_del(&chip->chip_list); + } + } +diff --git a/drivers/mtd/nand/lpc32xx_mlc.c b/drivers/mtd/nand/lpc32xx_mlc.c +index 5796468db6534..34687c20409be 100644 +--- a/drivers/mtd/nand/lpc32xx_mlc.c ++++ b/drivers/mtd/nand/lpc32xx_mlc.c +@@ -829,9 +829,8 @@ static int lpc32xx_nand_probe(struct platform_device *pdev) + static int lpc32xx_nand_remove(struct platform_device *pdev) + { + struct lpc32xx_nand_host *host = platform_get_drvdata(pdev); +- struct mtd_info *mtd = nand_to_mtd(&host->nand_chip); + +- nand_release(mtd); ++ nand_release(&host->nand_chip); + free_irq(host->irq, host); + if (use_dma) + dma_release_channel(host->dma_chan); +diff --git a/drivers/mtd/nand/lpc32xx_slc.c b/drivers/mtd/nand/lpc32xx_slc.c +index b61f28a1554d3..408758c90a451 100644 +--- a/drivers/mtd/nand/lpc32xx_slc.c ++++ b/drivers/mtd/nand/lpc32xx_slc.c +@@ -954,9 +954,8 @@ static int lpc32xx_nand_remove(struct platform_device *pdev) + { + uint32_t tmp; + struct lpc32xx_nand_host *host = platform_get_drvdata(pdev); +- struct mtd_info *mtd = nand_to_mtd(&host->nand_chip); + +- nand_release(mtd); ++ nand_release(&host->nand_chip); + dma_release_channel(host->dma_chan); + + /* Force CE high */ +diff --git a/drivers/mtd/nand/mpc5121_nfc.c b/drivers/mtd/nand/mpc5121_nfc.c +index b6b97cc9fba69..b8a93b47a2901 100644 +--- a/drivers/mtd/nand/mpc5121_nfc.c ++++ b/drivers/mtd/nand/mpc5121_nfc.c +@@ -829,7 +829,7 @@ static int mpc5121_nfc_remove(struct platform_device *op) + struct device *dev = &op->dev; + struct mtd_info *mtd = dev_get_drvdata(dev); + +- nand_release(mtd); ++ nand_release(mtd_to_nand(mtd)); + mpc5121_nfc_free(dev, mtd); + + return 0; +diff --git a/drivers/mtd/nand/mtk_nand.c b/drivers/mtd/nand/mtk_nand.c +index e17f838b9b814..27fcce71ad38c 100644 +--- a/drivers/mtd/nand/mtk_nand.c ++++ b/drivers/mtd/nand/mtk_nand.c +@@ -1357,7 +1357,7 @@ static int mtk_nfc_nand_chip_init(struct device *dev, struct mtk_nfc *nfc, + ret = mtd_device_parse_register(mtd, NULL, NULL, NULL, 0); + if (ret) { + dev_err(dev, "mtd parse partition error\n"); +- nand_release(mtd); ++ nand_release(nand); + return ret; + } + +@@ -1514,7 +1514,7 @@ static int mtk_nfc_remove(struct platform_device *pdev) + while (!list_empty(&nfc->chips)) { + chip = list_first_entry(&nfc->chips, struct mtk_nfc_nand_chip, + node); +- nand_release(nand_to_mtd(&chip->nand)); ++ nand_release(&chip->nand); + list_del(&chip->node); + } + +diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c +index fcb575d55b89b..808d85bde9f22 100644 +--- a/drivers/mtd/nand/mxc_nand.c ++++ b/drivers/mtd/nand/mxc_nand.c +@@ -1834,7 +1834,7 @@ static int mxcnd_remove(struct platform_device *pdev) + { + struct mxc_nand_host *host = platform_get_drvdata(pdev); + +- nand_release(nand_to_mtd(&host->nand)); ++ nand_release(&host->nand); + if (host->clk_act) + clk_disable_unprepare(host->clk); + +diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c +index d410de3318542..e953eca67608a 100644 +--- a/drivers/mtd/nand/nand_base.c ++++ b/drivers/mtd/nand/nand_base.c +@@ -5046,12 +5046,12 @@ EXPORT_SYMBOL_GPL(nand_cleanup); + /** + * nand_release - [NAND Interface] Unregister the MTD device and free resources + * held by the NAND device +- * @mtd: MTD device structure ++ * @chip: NAND chip object + */ +-void nand_release(struct mtd_info *mtd) ++void nand_release(struct nand_chip *chip) + { +- mtd_device_unregister(mtd); +- nand_cleanup(mtd_to_nand(mtd)); ++ mtd_device_unregister(nand_to_mtd(chip)); ++ nand_cleanup(chip); + } + EXPORT_SYMBOL_GPL(nand_release); + +diff --git a/drivers/mtd/nand/nandsim.c b/drivers/mtd/nand/nandsim.c +index 44322a363ba54..dbb0e47f51975 100644 +--- a/drivers/mtd/nand/nandsim.c ++++ b/drivers/mtd/nand/nandsim.c +@@ -2356,7 +2356,7 @@ static int __init ns_init_module(void) + + err_exit: + free_nandsim(nand); +- nand_release(nsmtd); ++ nand_release(chip); + for (i = 0;i < ARRAY_SIZE(nand->partitions); ++i) + kfree(nand->partitions[i].name); + error: +@@ -2378,7 +2378,7 @@ static void __exit ns_cleanup_module(void) + int i; + + free_nandsim(ns); /* Free nandsim private resources */ +- nand_release(nsmtd); /* Unregister driver */ ++ nand_release(chip); /* Unregister driver */ + for (i = 0;i < ARRAY_SIZE(ns->partitions); ++i) + kfree(ns->partitions[i].name); + kfree(mtd_to_nand(nsmtd)); /* Free other structures */ +diff --git a/drivers/mtd/nand/ndfc.c b/drivers/mtd/nand/ndfc.c +index d8a8068949376..eb84328d9bded 100644 +--- a/drivers/mtd/nand/ndfc.c ++++ b/drivers/mtd/nand/ndfc.c +@@ -258,7 +258,7 @@ static int ndfc_remove(struct platform_device *ofdev) + struct ndfc_controller *ndfc = dev_get_drvdata(&ofdev->dev); + struct mtd_info *mtd = nand_to_mtd(&ndfc->chip); + +- nand_release(mtd); ++ nand_release(&ndfc->chip); + kfree(mtd->name); + + return 0; +diff --git a/drivers/mtd/nand/nuc900_nand.c b/drivers/mtd/nand/nuc900_nand.c +index 7bb4d2ea93421..a79f88c6d0102 100644 +--- a/drivers/mtd/nand/nuc900_nand.c ++++ b/drivers/mtd/nand/nuc900_nand.c +@@ -284,7 +284,7 @@ static int nuc900_nand_remove(struct platform_device *pdev) + { + struct nuc900_nand *nuc900_nand = platform_get_drvdata(pdev); + +- nand_release(nand_to_mtd(&nuc900_nand->chip)); ++ nand_release(&nuc900_nand->chip); + clk_disable(nuc900_nand->clk); + + return 0; +diff --git a/drivers/mtd/nand/omap2.c b/drivers/mtd/nand/omap2.c +index 9f98f74ff221a..110c0726c665e 100644 +--- a/drivers/mtd/nand/omap2.c ++++ b/drivers/mtd/nand/omap2.c +@@ -2306,7 +2306,7 @@ static int omap_nand_remove(struct platform_device *pdev) + } + if (info->dma) + dma_release_channel(info->dma); +- nand_release(mtd); ++ nand_release(nand_chip); + return 0; + } + +diff --git a/drivers/mtd/nand/orion_nand.c b/drivers/mtd/nand/orion_nand.c +index 5a5aa1f07d074..2f21c678d6efd 100644 +--- a/drivers/mtd/nand/orion_nand.c ++++ b/drivers/mtd/nand/orion_nand.c +@@ -186,7 +186,7 @@ static int __init orion_nand_probe(struct platform_device *pdev) + mtd->name = "orion_nand"; + ret = mtd_device_register(mtd, board->parts, board->nr_parts); + if (ret) { +- nand_release(mtd); ++ nand_release(nc); + goto no_dev; + } + +@@ -201,9 +201,8 @@ static int orion_nand_remove(struct platform_device *pdev) + { + struct orion_nand_info *info = platform_get_drvdata(pdev); + struct nand_chip *chip = &info->chip; +- struct mtd_info *mtd = nand_to_mtd(chip); + +- nand_release(mtd); ++ nand_release(chip); + + clk_disable_unprepare(info->clk); + +diff --git a/drivers/mtd/nand/oxnas_nand.c b/drivers/mtd/nand/oxnas_nand.c +index d649d5944826e..ff58999887388 100644 +--- a/drivers/mtd/nand/oxnas_nand.c ++++ b/drivers/mtd/nand/oxnas_nand.c +@@ -148,7 +148,7 @@ static int oxnas_nand_probe(struct platform_device *pdev) + + err = mtd_device_register(mtd, NULL, 0); + if (err) { +- nand_release(mtd); ++ nand_release(chip); + goto err_clk_unprepare; + } + +@@ -176,7 +176,7 @@ static int oxnas_nand_remove(struct platform_device *pdev) + struct oxnas_nand_ctrl *oxnas = platform_get_drvdata(pdev); + + if (oxnas->chips[0]) +- nand_release(nand_to_mtd(oxnas->chips[0])); ++ nand_release(oxnas->chips[0]); + + clk_disable_unprepare(oxnas->clk); + +diff --git a/drivers/mtd/nand/pasemi_nand.c b/drivers/mtd/nand/pasemi_nand.c +index d69e5bae541e2..f0f4ff9609655 100644 +--- a/drivers/mtd/nand/pasemi_nand.c ++++ b/drivers/mtd/nand/pasemi_nand.c +@@ -193,7 +193,7 @@ static int pasemi_nand_remove(struct platform_device *ofdev) + chip = mtd_to_nand(pasemi_nand_mtd); + + /* Release resources, unregister device */ +- nand_release(pasemi_nand_mtd); ++ nand_release(chip); + + release_region(lpcctl, 4); + +diff --git a/drivers/mtd/nand/plat_nand.c b/drivers/mtd/nand/plat_nand.c +index 925a1323604de..2906996d22620 100644 +--- a/drivers/mtd/nand/plat_nand.c ++++ b/drivers/mtd/nand/plat_nand.c +@@ -99,7 +99,7 @@ static int plat_nand_probe(struct platform_device *pdev) + if (!err) + return err; + +- nand_release(mtd); ++ nand_release(&data->chip); + out: + if (pdata->ctrl.remove) + pdata->ctrl.remove(pdev); +@@ -114,7 +114,7 @@ static int plat_nand_remove(struct platform_device *pdev) + struct plat_nand_data *data = platform_get_drvdata(pdev); + struct platform_nand_data *pdata = dev_get_platdata(&pdev->dev); + +- nand_release(nand_to_mtd(&data->chip)); ++ nand_release(&data->chip); + if (pdata->ctrl.remove) + pdata->ctrl.remove(pdev); + +diff --git a/drivers/mtd/nand/qcom_nandc.c b/drivers/mtd/nand/qcom_nandc.c +index 09d5f7df60237..65d1be2c30497 100644 +--- a/drivers/mtd/nand/qcom_nandc.c ++++ b/drivers/mtd/nand/qcom_nandc.c +@@ -2760,7 +2760,7 @@ static int qcom_nandc_remove(struct platform_device *pdev) + struct qcom_nand_host *host; + + list_for_each_entry(host, &nandc->host_list, node) +- nand_release(nand_to_mtd(&host->chip)); ++ nand_release(&host->chip); + + qcom_nandc_unalloc(nandc); + +diff --git a/drivers/mtd/nand/r852.c b/drivers/mtd/nand/r852.c +index fc9287af46140..2cfa549413952 100644 +--- a/drivers/mtd/nand/r852.c ++++ b/drivers/mtd/nand/r852.c +@@ -656,7 +656,7 @@ static int r852_register_nand_device(struct r852_device *dev) + dev->card_registred = 1; + return 0; + error3: +- nand_release(mtd); ++ nand_release(dev->chip); + error1: + /* Force card redetect */ + dev->card_detected = 0; +@@ -675,7 +675,7 @@ static void r852_unregister_nand_device(struct r852_device *dev) + return; + + device_remove_file(&mtd->dev, &dev_attr_media_type); +- nand_release(mtd); ++ nand_release(dev->chip); + r852_engine_disable(dev); + dev->card_registred = 0; + } +diff --git a/drivers/mtd/nand/s3c2410.c b/drivers/mtd/nand/s3c2410.c +index 4c383eeec6f6f..f60de68bfabcc 100644 +--- a/drivers/mtd/nand/s3c2410.c ++++ b/drivers/mtd/nand/s3c2410.c +@@ -784,7 +784,7 @@ static int s3c24xx_nand_remove(struct platform_device *pdev) + + for (mtdno = 0; mtdno < info->mtd_count; mtdno++, ptr++) { + pr_debug("releasing mtd %d (%p)\n", mtdno, ptr); +- nand_release(nand_to_mtd(&ptr->chip)); ++ nand_release(&ptr->chip); + } + } + +diff --git a/drivers/mtd/nand/sh_flctl.c b/drivers/mtd/nand/sh_flctl.c +index 43db80e5d994f..f2ed03ee30355 100644 +--- a/drivers/mtd/nand/sh_flctl.c ++++ b/drivers/mtd/nand/sh_flctl.c +@@ -1231,7 +1231,7 @@ static int flctl_remove(struct platform_device *pdev) + struct sh_flctl *flctl = platform_get_drvdata(pdev); + + flctl_release_dma(flctl); +- nand_release(nand_to_mtd(&flctl->chip)); ++ nand_release(&flctl->chip); + pm_runtime_disable(&pdev->dev); + + return 0; +diff --git a/drivers/mtd/nand/sharpsl.c b/drivers/mtd/nand/sharpsl.c +index f59c455d9f517..6cfff0c81153f 100644 +--- a/drivers/mtd/nand/sharpsl.c ++++ b/drivers/mtd/nand/sharpsl.c +@@ -192,7 +192,7 @@ static int sharpsl_nand_probe(struct platform_device *pdev) + return 0; + + err_add: +- nand_release(mtd); ++ nand_release(this); + + err_scan: + iounmap(sharpsl->io); +@@ -210,7 +210,7 @@ static int sharpsl_nand_remove(struct platform_device *pdev) + struct sharpsl_nand *sharpsl = platform_get_drvdata(pdev); + + /* Release resources, unregister device */ +- nand_release(nand_to_mtd(&sharpsl->chip)); ++ nand_release(&sharpsl->chip); + + iounmap(sharpsl->io); + +diff --git a/drivers/mtd/nand/socrates_nand.c b/drivers/mtd/nand/socrates_nand.c +index 575997d0ef8a0..f960f18ea3e24 100644 +--- a/drivers/mtd/nand/socrates_nand.c ++++ b/drivers/mtd/nand/socrates_nand.c +@@ -195,7 +195,7 @@ static int socrates_nand_probe(struct platform_device *ofdev) + if (!res) + return res; + +- nand_release(mtd); ++ nand_release(nand_chip); + + out: + iounmap(host->io_base); +@@ -208,9 +208,8 @@ static int socrates_nand_probe(struct platform_device *ofdev) + static int socrates_nand_remove(struct platform_device *ofdev) + { + struct socrates_nand_host *host = dev_get_drvdata(&ofdev->dev); +- struct mtd_info *mtd = nand_to_mtd(&host->nand_chip); + +- nand_release(mtd); ++ nand_release(&host->nand_chip); + + iounmap(host->io_base); + +diff --git a/drivers/mtd/nand/sunxi_nand.c b/drivers/mtd/nand/sunxi_nand.c +index 8e52314823976..d6e31e8a7b668 100644 +--- a/drivers/mtd/nand/sunxi_nand.c ++++ b/drivers/mtd/nand/sunxi_nand.c +@@ -2125,7 +2125,7 @@ static int sunxi_nand_chip_init(struct device *dev, struct sunxi_nfc *nfc, + ret = mtd_device_register(mtd, NULL, 0); + if (ret) { + dev_err(dev, "failed to register mtd device: %d\n", ret); +- nand_release(mtd); ++ nand_release(nand); + return ret; + } + +@@ -2164,7 +2164,7 @@ static void sunxi_nand_chips_cleanup(struct sunxi_nfc *nfc) + while (!list_empty(&nfc->chips)) { + chip = list_first_entry(&nfc->chips, struct sunxi_nand_chip, + node); +- nand_release(nand_to_mtd(&chip->nand)); ++ nand_release(&chip->nand); + sunxi_nand_ecc_cleanup(&chip->nand.ecc); + list_del(&chip->node); + } +diff --git a/drivers/mtd/nand/tango_nand.c b/drivers/mtd/nand/tango_nand.c +index ce366816a7efb..1ab16a90ea296 100644 +--- a/drivers/mtd/nand/tango_nand.c ++++ b/drivers/mtd/nand/tango_nand.c +@@ -619,7 +619,7 @@ static int tango_nand_remove(struct platform_device *pdev) + + for (cs = 0; cs < MAX_CS; ++cs) { + if (nfc->chips[cs]) +- nand_release(nand_to_mtd(&nfc->chips[cs]->nand_chip)); ++ nand_release(&nfc->chips[cs]->nand_chip); + } + + return 0; +diff --git a/drivers/mtd/nand/tmio_nand.c b/drivers/mtd/nand/tmio_nand.c +index 84dbf32332e12..5a082d9432f96 100644 +--- a/drivers/mtd/nand/tmio_nand.c ++++ b/drivers/mtd/nand/tmio_nand.c +@@ -448,7 +448,7 @@ static int tmio_probe(struct platform_device *dev) + if (!retval) + return retval; + +- nand_release(mtd); ++ nand_release(nand_chip); + + err_irq: + tmio_hw_stop(dev, tmio); +@@ -459,7 +459,7 @@ static int tmio_remove(struct platform_device *dev) + { + struct tmio_nand *tmio = platform_get_drvdata(dev); + +- nand_release(nand_to_mtd(&tmio->chip)); ++ nand_release(&tmio->chip); + tmio_hw_stop(dev, tmio); + return 0; + } +diff --git a/drivers/mtd/nand/txx9ndfmc.c b/drivers/mtd/nand/txx9ndfmc.c +index b567d212fe7de..236181b2985ad 100644 +--- a/drivers/mtd/nand/txx9ndfmc.c ++++ b/drivers/mtd/nand/txx9ndfmc.c +@@ -390,7 +390,7 @@ static int __exit txx9ndfmc_remove(struct platform_device *dev) + chip = mtd_to_nand(mtd); + txx9_priv = nand_get_controller_data(chip); + +- nand_release(mtd); ++ nand_release(chip); + kfree(txx9_priv->mtdname); + kfree(txx9_priv); + } +diff --git a/drivers/mtd/nand/vf610_nfc.c b/drivers/mtd/nand/vf610_nfc.c +index e2583a539b413..688393526b5aa 100644 +--- a/drivers/mtd/nand/vf610_nfc.c ++++ b/drivers/mtd/nand/vf610_nfc.c +@@ -794,7 +794,7 @@ static int vf610_nfc_remove(struct platform_device *pdev) + struct mtd_info *mtd = platform_get_drvdata(pdev); + struct vf610_nfc *nfc = mtd_to_nfc(mtd); + +- nand_release(mtd); ++ nand_release(mtd_to_nand(mtd)); + clk_disable_unprepare(nfc->clk); + return 0; + } +diff --git a/drivers/mtd/nand/xway_nand.c b/drivers/mtd/nand/xway_nand.c +index 9926b4e3d69d0..1988bb943d1bc 100644 +--- a/drivers/mtd/nand/xway_nand.c ++++ b/drivers/mtd/nand/xway_nand.c +@@ -211,7 +211,7 @@ static int xway_nand_probe(struct platform_device *pdev) + + err = mtd_device_register(mtd, NULL, 0); + if (err) +- nand_release(mtd); ++ nand_release(&data->chip); + + return err; + } +@@ -223,7 +223,7 @@ static int xway_nand_remove(struct platform_device *pdev) + { + struct xway_nand_data *data = platform_get_drvdata(pdev); + +- nand_release(nand_to_mtd(&data->chip)); ++ nand_release(&data->chip); + + return 0; + } +diff --git a/include/linux/mtd/rawnand.h b/include/linux/mtd/rawnand.h +index 2b05f4273babd..e9a791f46eb64 100644 +--- a/include/linux/mtd/rawnand.h ++++ b/include/linux/mtd/rawnand.h +@@ -22,6 +22,7 @@ + #include + #include + ++struct nand_chip; + struct mtd_info; + struct nand_flash_dev; + struct device_node; +@@ -37,7 +38,7 @@ int nand_scan_ident(struct mtd_info *mtd, int max_chips, + int nand_scan_tail(struct mtd_info *mtd); + + /* Unregister the MTD device and free resources held by the NAND device */ +-void nand_release(struct mtd_info *mtd); ++void nand_release(struct nand_chip *chip); + + /* Internal helper for board drivers which need to override command function */ + void nand_wait_ready(struct mtd_info *mtd); +@@ -227,9 +228,6 @@ enum nand_ecc_algo { + #define NAND_CI_CELLTYPE_MSK 0x0C + #define NAND_CI_CELLTYPE_SHIFT 2 + +-/* Keep gcc happy */ +-struct nand_chip; +- + /* ONFI features */ + #define ONFI_FEATURE_16_BIT_BUS (1 << 0) + #define ONFI_FEATURE_EXT_PARAM_PAGE (1 << 7) +-- +2.25.1 + diff --git a/queue-4.14/mtd-rawnand-plat_nand-fix-the-probe-error-path.patch b/queue-4.14/mtd-rawnand-plat_nand-fix-the-probe-error-path.patch new file mode 100644 index 00000000000..e8db63daf02 --- /dev/null +++ b/queue-4.14/mtd-rawnand-plat_nand-fix-the-probe-error-path.patch @@ -0,0 +1,44 @@ +From a3fa8476eca9d6ff3d3b9f6848346d1f279315f9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 May 2020 15:00:15 +0200 +Subject: mtd: rawnand: plat_nand: Fix the probe error path + +From: Miquel Raynal + +[ Upstream commit 5284024b4dac5e94f7f374ca905c7580dbc455e9 ] + +nand_release() is supposed be called after MTD device registration. +Here, only nand_scan() happened, so use nand_cleanup() instead. + +There is no real Fixes tag applying here as the use of nand_release() +in this driver predates by far the introduction of nand_cleanup() in +commit d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") +which makes this change possible, hence pointing it as the commit to +fix for backporting purposes, even if this commit is not introducing +any bug. + +Fixes: d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") +Signed-off-by: Miquel Raynal +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/linux-mtd/20200519130035.1883-43-miquel.raynal@bootlin.com +Signed-off-by: Sasha Levin +--- + drivers/mtd/nand/plat_nand.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/mtd/nand/plat_nand.c b/drivers/mtd/nand/plat_nand.c +index 2906996d22620..8c2d1c5c95691 100644 +--- a/drivers/mtd/nand/plat_nand.c ++++ b/drivers/mtd/nand/plat_nand.c +@@ -99,7 +99,7 @@ static int plat_nand_probe(struct platform_device *pdev) + if (!err) + return err; + +- nand_release(&data->chip); ++ nand_cleanup(&data->chip); + out: + if (pdata->ctrl.remove) + pdata->ctrl.remove(pdev); +-- +2.25.1 + diff --git a/queue-4.14/mtd-rawnand-sharpsl-fix-the-probe-error-path.patch b/queue-4.14/mtd-rawnand-sharpsl-fix-the-probe-error-path.patch new file mode 100644 index 00000000000..7ce81ee7f34 --- /dev/null +++ b/queue-4.14/mtd-rawnand-sharpsl-fix-the-probe-error-path.patch @@ -0,0 +1,43 @@ +From 6997386987e7ccc8c5d1b63f5999adf783d25114 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 May 2020 15:00:21 +0200 +Subject: mtd: rawnand: sharpsl: Fix the probe error path + +From: Miquel Raynal + +[ Upstream commit 0f44b3275b3798ccb97a2f51ac85871c30d6fbbc ] + +nand_release() is supposed be called after MTD device registration. +Here, only nand_scan() happened, so use nand_cleanup() instead. + +There is no Fixes tag applying here as the use of nand_release() +in this driver predates by far the introduction of nand_cleanup() in +commit d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") +which makes this change possible. However, pointing this commit as the +culprit for backporting purposes makes sense. + +Fixes: d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") +Signed-off-by: Miquel Raynal +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/linux-mtd/20200519130035.1883-49-miquel.raynal@bootlin.com +Signed-off-by: Sasha Levin +--- + drivers/mtd/nand/sharpsl.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/mtd/nand/sharpsl.c b/drivers/mtd/nand/sharpsl.c +index 6cfff0c81153f..c245d66609c1f 100644 +--- a/drivers/mtd/nand/sharpsl.c ++++ b/drivers/mtd/nand/sharpsl.c +@@ -192,7 +192,7 @@ static int sharpsl_nand_probe(struct platform_device *pdev) + return 0; + + err_add: +- nand_release(this); ++ nand_cleanup(this); + + err_scan: + iounmap(sharpsl->io); +-- +2.25.1 + diff --git a/queue-4.14/mtd-rawnand-socrates-fix-the-probe-error-path.patch b/queue-4.14/mtd-rawnand-socrates-fix-the-probe-error-path.patch new file mode 100644 index 00000000000..74301b4f903 --- /dev/null +++ b/queue-4.14/mtd-rawnand-socrates-fix-the-probe-error-path.patch @@ -0,0 +1,44 @@ +From 34a89d397ffc9d3eb4c3304db1e31a38fe1bf767 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 May 2020 15:00:23 +0200 +Subject: mtd: rawnand: socrates: Fix the probe error path + +From: Miquel Raynal + +[ Upstream commit 9c6c2e5cc77119ce0dacb4f9feedb73ce0354421 ] + +nand_release() is supposed be called after MTD device registration. +Here, only nand_scan() happened, so use nand_cleanup() instead. + +There is no real Fixes tag applying here as the use of nand_release() +in this driver predates by far the introduction of nand_cleanup() in +commit d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") +which makes this change possible. However, pointing this commit as the +culprit for backporting purposes makes sense even if this commit is not +introducing any bug. + +Fixes: d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") +Signed-off-by: Miquel Raynal +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/linux-mtd/20200519130035.1883-51-miquel.raynal@bootlin.com +Signed-off-by: Sasha Levin +--- + drivers/mtd/nand/socrates_nand.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/mtd/nand/socrates_nand.c b/drivers/mtd/nand/socrates_nand.c +index f960f18ea3e24..8d4f0cd7197d3 100644 +--- a/drivers/mtd/nand/socrates_nand.c ++++ b/drivers/mtd/nand/socrates_nand.c +@@ -195,7 +195,7 @@ static int socrates_nand_probe(struct platform_device *ofdev) + if (!res) + return res; + +- nand_release(nand_chip); ++ nand_cleanup(nand_chip); + + out: + iounmap(host->io_base); +-- +2.25.1 + diff --git a/queue-4.14/mtd-rawnand-tmio-fix-the-probe-error-path.patch b/queue-4.14/mtd-rawnand-tmio-fix-the-probe-error-path.patch new file mode 100644 index 00000000000..67470c4a302 --- /dev/null +++ b/queue-4.14/mtd-rawnand-tmio-fix-the-probe-error-path.patch @@ -0,0 +1,44 @@ +From d84806ed54bf4a1e7c2ec2f7be632eee52f90859 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 May 2020 15:00:29 +0200 +Subject: mtd: rawnand: tmio: Fix the probe error path + +From: Miquel Raynal + +[ Upstream commit 75e9a330a9bd48f97a55a08000236084fe3dae56 ] + +nand_release() is supposed be called after MTD device registration. +Here, only nand_scan() happened, so use nand_cleanup() instead. + +There is no real Fixes tag applying here as the use of nand_release() +in this driver predates by far the introduction of nand_cleanup() in +commit d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") +which makes this change possible. However, pointing this commit as the +culprit for backporting purposes makes sense even if this commit is not +introducing any bug. + +Fixes: d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") +Signed-off-by: Miquel Raynal +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/linux-mtd/20200519130035.1883-57-miquel.raynal@bootlin.com +Signed-off-by: Sasha Levin +--- + drivers/mtd/nand/tmio_nand.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/mtd/nand/tmio_nand.c b/drivers/mtd/nand/tmio_nand.c +index 5a082d9432f96..51f12b9f90ba1 100644 +--- a/drivers/mtd/nand/tmio_nand.c ++++ b/drivers/mtd/nand/tmio_nand.c +@@ -448,7 +448,7 @@ static int tmio_probe(struct platform_device *dev) + if (!retval) + return retval; + +- nand_release(nand_chip); ++ nand_cleanup(nand_chip); + + err_irq: + tmio_hw_stop(dev, tmio); +-- +2.25.1 + diff --git a/queue-4.14/mtd-rawnand-xway-fix-the-probe-error-path.patch b/queue-4.14/mtd-rawnand-xway-fix-the-probe-error-path.patch new file mode 100644 index 00000000000..d59c085e099 --- /dev/null +++ b/queue-4.14/mtd-rawnand-xway-fix-the-probe-error-path.patch @@ -0,0 +1,44 @@ +From a9c794bad539b62e4f63f38f7bbe74f6faf9ca13 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 May 2020 15:00:33 +0200 +Subject: mtd: rawnand: xway: Fix the probe error path + +From: Miquel Raynal + +[ Upstream commit 34531be5e804a8e1abf314a6c3a19fe342e4a154 ] + +nand_release() is supposed be called after MTD device registration. +Here, only nand_scan() happened, so use nand_cleanup() instead. + +There is no real Fixes tag applying here as the use of nand_release() +in this driver predates the introduction of nand_cleanup() in +commit d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") +which makes this change possible. However, pointing this commit as the +culprit for backporting purposes makes sense even if this commit is not +introducing any bug. + +Fixes: d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") +Signed-off-by: Miquel Raynal +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/linux-mtd/20200519130035.1883-61-miquel.raynal@bootlin.com +Signed-off-by: Sasha Levin +--- + drivers/mtd/nand/xway_nand.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/mtd/nand/xway_nand.c b/drivers/mtd/nand/xway_nand.c +index 1988bb943d1bc..176a94fa31d7f 100644 +--- a/drivers/mtd/nand/xway_nand.c ++++ b/drivers/mtd/nand/xway_nand.c +@@ -211,7 +211,7 @@ static int xway_nand_probe(struct platform_device *pdev) + + err = mtd_device_register(mtd, NULL, 0); + if (err) +- nand_release(&data->chip); ++ nand_cleanup(&data->chip); + + return err; + } +-- +2.25.1 + diff --git a/queue-4.14/series b/queue-4.14/series index 976d836c127..ccab6857e2c 100644 --- a/queue-4.14/series +++ b/queue-4.14/series @@ -113,3 +113,15 @@ selinux-fix-double-free.patch ext4-fix-partial-cluster-initialization-when-splitti.patch drm-dp_mst-increase-act-retry-timeout-to-3s.patch x86-boot-compressed-relax-sed-symbol-type-regex-for-.patch +block-nr_sects_write-disable-preemption-on-seqcount-.patch +mtd-rawnand-pass-a-nand_chip-object-to-nand_release.patch +mtd-rawnand-diskonchip-fix-the-probe-error-path.patch +mtd-rawnand-sharpsl-fix-the-probe-error-path.patch +mtd-rawnand-xway-fix-the-probe-error-path.patch +mtd-rawnand-orion-fix-the-probe-error-path.patch +mtd-rawnand-oxnas-add-of_node_put.patch +mtd-rawnand-oxnas-fix-the-probe-error-path.patch +mtd-rawnand-socrates-fix-the-probe-error-path.patch +mtd-rawnand-plat_nand-fix-the-probe-error-path.patch +mtd-rawnand-mtk-fix-the-probe-error-path.patch +mtd-rawnand-tmio-fix-the-probe-error-path.patch