From 71e39d96af382ef19fe6cf1f9eced75e81ba978c Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Mon, 22 Jun 2020 21:30:17 -0400 Subject: [PATCH] Fixes for 4.9 Signed-off-by: Sasha Levin --- ...rite-disable-preemption-on-seqcount-.patch | 48 ++ ...-diskonchip-fix-the-probe-error-path.patch | 54 ++ ...nchip-fix-the-probe-error-path.patch-32722 | 47 + ...rawnand-mtk-fix-the-probe-error-path.patch | 44 + ...wnand-orion-fix-the-probe-error-path.patch | 44 + ...s-a-nand_chip-object-to-nand_release.patch | 815 ++++++++++++++++++ ...d-plat_nand-fix-the-probe-error-path.patch | 44 + ...and-sharpsl-fix-the-probe-error-path.patch | 43 + ...nd-socrates-fix-the-probe-error-path.patch | 44 + ...awnand-tmio-fix-the-probe-error-path.patch | 44 + ...awnand-xway-fix-the-probe-error-path.patch | 44 + queue-4.9/series | 11 + 12 files changed, 1282 insertions(+) create mode 100644 queue-4.9/block-nr_sects_write-disable-preemption-on-seqcount-.patch create mode 100644 queue-4.9/mtd-rawnand-diskonchip-fix-the-probe-error-path.patch create mode 100644 queue-4.9/mtd-rawnand-diskonchip-fix-the-probe-error-path.patch-32722 create mode 100644 queue-4.9/mtd-rawnand-mtk-fix-the-probe-error-path.patch create mode 100644 queue-4.9/mtd-rawnand-orion-fix-the-probe-error-path.patch create mode 100644 queue-4.9/mtd-rawnand-pass-a-nand_chip-object-to-nand_release.patch create mode 100644 queue-4.9/mtd-rawnand-plat_nand-fix-the-probe-error-path.patch create mode 100644 queue-4.9/mtd-rawnand-sharpsl-fix-the-probe-error-path.patch create mode 100644 queue-4.9/mtd-rawnand-socrates-fix-the-probe-error-path.patch create mode 100644 queue-4.9/mtd-rawnand-tmio-fix-the-probe-error-path.patch create mode 100644 queue-4.9/mtd-rawnand-xway-fix-the-probe-error-path.patch diff --git a/queue-4.9/block-nr_sects_write-disable-preemption-on-seqcount-.patch b/queue-4.9/block-nr_sects_write-disable-preemption-on-seqcount-.patch new file mode 100644 index 00000000000..70cb9e2a778 --- /dev/null +++ b/queue-4.9/block-nr_sects_write-disable-preemption-on-seqcount-.patch @@ -0,0 +1,48 @@ +From bc76636113644674effb4bb6cf4f27a5c84994b2 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 3c99fb6727cac..12a2f5ac51c97 100644 +--- a/include/linux/genhd.h ++++ b/include/linux/genhd.h +@@ -716,9 +716,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.9/mtd-rawnand-diskonchip-fix-the-probe-error-path.patch b/queue-4.9/mtd-rawnand-diskonchip-fix-the-probe-error-path.patch new file mode 100644 index 00000000000..d40f7c231a9 --- /dev/null +++ b/queue-4.9/mtd-rawnand-diskonchip-fix-the-probe-error-path.patch @@ -0,0 +1,54 @@ +From 96d93a4927a95989c4362d76a92b8267dc3772da 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 a023ab9e9cbf6..06a7bad611a94 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(mtd); ++ nand_cleanup(mtd); + kfree(nand); + goto fail; + } +-- +2.25.1 + diff --git a/queue-4.9/mtd-rawnand-diskonchip-fix-the-probe-error-path.patch-32722 b/queue-4.9/mtd-rawnand-diskonchip-fix-the-probe-error-path.patch-32722 new file mode 100644 index 00000000000..d8a0aaab6a2 --- /dev/null +++ b/queue-4.9/mtd-rawnand-diskonchip-fix-the-probe-error-path.patch-32722 @@ -0,0 +1,47 @@ +From 0662e19061712624e62bb9550dff03604da468f7 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 | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/mtd/nand/diskonchip.c b/drivers/mtd/nand/diskonchip.c +index 339df40898594..374b7a10ba517 100644 +--- a/drivers/mtd/nand/diskonchip.c ++++ b/drivers/mtd/nand/diskonchip.c +@@ -1608,7 +1608,7 @@ static int __init doc_probe(unsigned long physadr) + /* 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(nand); ++ nand_cleanup(nand); + kfree(nand); + goto fail; + } +-- +2.25.1 + diff --git a/queue-4.9/mtd-rawnand-mtk-fix-the-probe-error-path.patch b/queue-4.9/mtd-rawnand-mtk-fix-the-probe-error-path.patch new file mode 100644 index 00000000000..bcaf660bf9e --- /dev/null +++ b/queue-4.9/mtd-rawnand-mtk-fix-the-probe-error-path.patch @@ -0,0 +1,44 @@ +From 45e7b92c39a202a2b7c22572762f2f03b9b71a7c 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 fadc755e55f82..2375dce766eff 100644 +--- a/drivers/mtd/nand/mtk_nand.c ++++ b/drivers/mtd/nand/mtk_nand.c +@@ -1327,7 +1327,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.9/mtd-rawnand-orion-fix-the-probe-error-path.patch b/queue-4.9/mtd-rawnand-orion-fix-the-probe-error-path.patch new file mode 100644 index 00000000000..48358acd99a --- /dev/null +++ b/queue-4.9/mtd-rawnand-orion-fix-the-probe-error-path.patch @@ -0,0 +1,44 @@ +From 0ffeae0b263e279a386f4402b357e8297384c47c 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 cfd53f0ba6c31..0acfc0a7d8e08 100644 +--- a/drivers/mtd/nand/orion_nand.c ++++ b/drivers/mtd/nand/orion_nand.c +@@ -167,7 +167,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.9/mtd-rawnand-pass-a-nand_chip-object-to-nand_release.patch b/queue-4.9/mtd-rawnand-pass-a-nand_chip-object-to-nand_release.patch new file mode 100644 index 00000000000..6e27983c903 --- /dev/null +++ b/queue-4.9/mtd-rawnand-pass-a-nand_chip-object-to-nand_release.patch @@ -0,0 +1,815 @@ +From 8fb2dccd2de9eadc5c3d6bb74815022facd7655d 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 +--- + 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 | 2 +- + 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/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/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/nand.h | 6 ++---- + 45 files changed, 63 insertions(+), 70 deletions(-) + +diff --git a/drivers/mtd/nand/ams-delta.c b/drivers/mtd/nand/ams-delta.c +index 78e12cc8bac2f..02ec2d183607f 100644 +--- a/drivers/mtd/nand/ams-delta.c ++++ b/drivers/mtd/nand/ams-delta.c +@@ -264,7 +264,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 9bf6d9915694e..a0e7789131dfc 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 1291492a1cef1..fbee81909d38a 100644 +--- a/drivers/mtd/nand/brcmnand/brcmnand.c ++++ b/drivers/mtd/nand/brcmnand/brcmnand.c +@@ -2595,7 +2595,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 0b0c93702abbd..c16e740c01c38 100644 +--- a/drivers/mtd/nand/cafe_nand.c ++++ b/drivers/mtd/nand/cafe_nand.c +@@ -825,7 +825,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 49133783ca536..b9667204e711a 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 a65e4e0f57a1c..4779dfec3576f 100644 +--- a/drivers/mtd/nand/cs553x_nand.c ++++ b/drivers/mtd/nand/cs553x_nand.c +@@ -339,7 +339,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 27fa8b87cd5fc..c7f535676e49f 100644 +--- a/drivers/mtd/nand/davinci_nand.c ++++ b/drivers/mtd/nand/davinci_nand.c +@@ -840,7 +840,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 0476ae8776d93..982cbc7f412f4 100644 +--- a/drivers/mtd/nand/denali.c ++++ b/drivers/mtd/nand/denali.c +@@ -1655,7 +1655,7 @@ void denali_remove(struct denali_nand_info *denali) + */ + int bufsize = mtd->writesize + mtd->oobsize; + +- nand_release(mtd); ++ nand_release(&denali->nand); + denali_irq_cleanup(denali->irq, denali); + dma_unmap_single(denali->dev, denali->buf.dma_buf, bufsize, + DMA_BIDIRECTIONAL); +diff --git a/drivers/mtd/nand/diskonchip.c b/drivers/mtd/nand/diskonchip.c +index 06a7bad611a94..339df40898594 100644 +--- a/drivers/mtd/nand/diskonchip.c ++++ b/drivers/mtd/nand/diskonchip.c +@@ -1608,7 +1608,7 @@ static int __init doc_probe(unsigned long physadr) + /* DBB note: i believe nand_cleanup is necessary here, as + buffers may have been allocated in nand_base. Check with + Thomas. FIX ME! */ +- nand_cleanup(mtd); ++ nand_release(nand); + kfree(nand); + goto fail; + } +@@ -1641,7 +1641,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 7af2a3cd949ee..5798cd87f340b 100644 +--- a/drivers/mtd/nand/docg4.c ++++ b/drivers/mtd/nand/docg4.c +@@ -1374,7 +1374,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); + +@@ -1387,7 +1387,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 113f76e599372..2fc4f2ab89ff5 100644 +--- a/drivers/mtd/nand/fsl_elbc_nand.c ++++ b/drivers/mtd/nand/fsl_elbc_nand.c +@@ -811,7 +811,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 4c3b986dd74d1..cf0fccb5908e7 100644 +--- a/drivers/mtd/nand/fsl_ifc_nand.c ++++ b/drivers/mtd/nand/fsl_ifc_nand.c +@@ -918,7 +918,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 d85fa2555b683..0b4d2489cc716 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 d4f454a4b35e7..92737deb7845d 100644 +--- a/drivers/mtd/nand/fsmc_nand.c ++++ b/drivers/mtd/nand/fsmc_nand.c +@@ -1038,7 +1038,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 6317f6836022e..c7461ca1c1a69 100644 +--- a/drivers/mtd/nand/gpio.c ++++ b/drivers/mtd/nand/gpio.c +@@ -197,7 +197,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 d9dab42758590..f4a99e91c2500 100644 +--- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c ++++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c +@@ -1930,7 +1930,7 @@ static int gpmi_set_geometry(struct gpmi_nand_data *this) + + static void gpmi_nand_exit(struct gpmi_nand_data *this) + { +- nand_release(nand_to_mtd(&this->nand)); ++ nand_release(&this->nand); + gpmi_free_dma_buffer(this); + } + +diff --git a/drivers/mtd/nand/hisi504_nand.c b/drivers/mtd/nand/hisi504_nand.c +index 9432546f4cd47..6c96d9d29a310 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 5551c36adbdf1..e664b2a0eeae0 100644 +--- a/drivers/mtd/nand/jz4740_nand.c ++++ b/drivers/mtd/nand/jz4740_nand.c +@@ -520,7 +520,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 a39bb70175eea..e8aaf2543946c 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 bc6e49af063a2..90e7742992404 100644 +--- a/drivers/mtd/nand/lpc32xx_mlc.c ++++ b/drivers/mtd/nand/lpc32xx_mlc.c +@@ -828,9 +828,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 8d3edc34958e7..05cbef16d6b50 100644 +--- a/drivers/mtd/nand/lpc32xx_slc.c ++++ b/drivers/mtd/nand/lpc32xx_slc.c +@@ -959,9 +959,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 7eacb2f545f50..9662f8fe47137 100644 +--- a/drivers/mtd/nand/mpc5121_nfc.c ++++ b/drivers/mtd/nand/mpc5121_nfc.c +@@ -827,7 +827,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 ca95ae00215ec..fadc755e55f82 100644 +--- a/drivers/mtd/nand/mtk_nand.c ++++ b/drivers/mtd/nand/mtk_nand.c +@@ -1327,7 +1327,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; + } + +@@ -1450,7 +1450,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 5c44eb57885b9..deb3cbadbc519 100644 +--- a/drivers/mtd/nand/mxc_nand.c ++++ b/drivers/mtd/nand/mxc_nand.c +@@ -1838,7 +1838,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 5fb45161789ce..bdf40c090acdc 100644 +--- a/drivers/mtd/nand/nand_base.c ++++ b/drivers/mtd/nand/nand_base.c +@@ -4941,12 +4941,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 1eb934414eb58..fe593f2f1ec7d 100644 +--- a/drivers/mtd/nand/nandsim.c ++++ b/drivers/mtd/nand/nandsim.c +@@ -2394,7 +2394,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: +@@ -2417,7 +2417,7 @@ static void __exit ns_cleanup_module(void) + + nandsim_debugfs_remove(ns); + 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 28e6118362f7e..d03b47d2664b0 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 8f64011d32ef2..f7f54b46f246b 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 f3a516b3f108a..62c0ca437c91e 100644 +--- a/drivers/mtd/nand/omap2.c ++++ b/drivers/mtd/nand/omap2.c +@@ -2307,7 +2307,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 af2f09135fb0e..cfd53f0ba6c31 100644 +--- a/drivers/mtd/nand/orion_nand.c ++++ b/drivers/mtd/nand/orion_nand.c +@@ -167,7 +167,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; + } + +@@ -184,9 +184,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); + + if (!IS_ERR(info->clk)) + clk_disable_unprepare(info->clk); +diff --git a/drivers/mtd/nand/pasemi_nand.c b/drivers/mtd/nand/pasemi_nand.c +index 80c98eef44d90..3300e43e2cb9f 100644 +--- a/drivers/mtd/nand/pasemi_nand.c ++++ b/drivers/mtd/nand/pasemi_nand.c +@@ -194,7 +194,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 415a53a0deeb3..245efb0f83e26 100644 +--- a/drivers/mtd/nand/plat_nand.c ++++ b/drivers/mtd/nand/plat_nand.c +@@ -100,7 +100,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); +@@ -115,7 +115,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 9f6c9a34b9eb6..4d9a3c90ab13b 100644 +--- a/drivers/mtd/nand/qcom_nandc.c ++++ b/drivers/mtd/nand/qcom_nandc.c +@@ -2180,7 +2180,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 d459c19d78de3..be9c145b743c9 100644 +--- a/drivers/mtd/nand/s3c2410.c ++++ b/drivers/mtd/nand/s3c2410.c +@@ -768,7 +768,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 d6c013f93b8c0..31f98acdba073 100644 +--- a/drivers/mtd/nand/sh_flctl.c ++++ b/drivers/mtd/nand/sh_flctl.c +@@ -1229,7 +1229,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 064ca1757589a..70e28bfeb840f 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 888fd314c62a2..f633ff1ebc0ab 100644 +--- a/drivers/mtd/nand/socrates_nand.c ++++ b/drivers/mtd/nand/socrates_nand.c +@@ -203,7 +203,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); +@@ -216,9 +216,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 886355bfa7617..ddf3e24cc2898 100644 +--- a/drivers/mtd/nand/sunxi_nand.c ++++ b/drivers/mtd/nand/sunxi_nand.c +@@ -2108,7 +2108,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; + } + +@@ -2147,7 +2147,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/tmio_nand.c b/drivers/mtd/nand/tmio_nand.c +index 08b30549ec0a0..1deb5229db15d 100644 +--- a/drivers/mtd/nand/tmio_nand.c ++++ b/drivers/mtd/nand/tmio_nand.c +@@ -446,7 +446,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); +@@ -457,7 +457,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 0a14fda2e41bf..f2ba55b0a1e9d 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 ddc629e3f63a6..ec004e0a94a32 100644 +--- a/drivers/mtd/nand/vf610_nfc.c ++++ b/drivers/mtd/nand/vf610_nfc.c +@@ -795,7 +795,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 895101a5e6864..d374a0007960a 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/nand.h b/include/linux/mtd/nand.h +index d8905a229f348..573e744223a24 100644 +--- a/include/linux/mtd/nand.h ++++ b/include/linux/mtd/nand.h +@@ -24,6 +24,7 @@ + #include + #include + ++struct nand_chip; + struct mtd_info; + struct nand_flash_dev; + struct device_node; +@@ -39,7 +40,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); +@@ -219,9 +220,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.9/mtd-rawnand-plat_nand-fix-the-probe-error-path.patch b/queue-4.9/mtd-rawnand-plat_nand-fix-the-probe-error-path.patch new file mode 100644 index 00000000000..522a00d1d1d --- /dev/null +++ b/queue-4.9/mtd-rawnand-plat_nand-fix-the-probe-error-path.patch @@ -0,0 +1,44 @@ +From bdef4ab6b8ca3312b0312480fad2a0d31b800e9e 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 245efb0f83e26..ae2b3c0804cec 100644 +--- a/drivers/mtd/nand/plat_nand.c ++++ b/drivers/mtd/nand/plat_nand.c +@@ -100,7 +100,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.9/mtd-rawnand-sharpsl-fix-the-probe-error-path.patch b/queue-4.9/mtd-rawnand-sharpsl-fix-the-probe-error-path.patch new file mode 100644 index 00000000000..df324cc2e74 --- /dev/null +++ b/queue-4.9/mtd-rawnand-sharpsl-fix-the-probe-error-path.patch @@ -0,0 +1,43 @@ +From 5fc5389153aa5b79a3148e9b0d4d430e76487bef 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 70e28bfeb840f..661b4928e0fcf 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.9/mtd-rawnand-socrates-fix-the-probe-error-path.patch b/queue-4.9/mtd-rawnand-socrates-fix-the-probe-error-path.patch new file mode 100644 index 00000000000..b3cc119750d --- /dev/null +++ b/queue-4.9/mtd-rawnand-socrates-fix-the-probe-error-path.patch @@ -0,0 +1,44 @@ +From faac8006c03473af9f515fb26e9ec59d5028ecc5 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 f633ff1ebc0ab..957d9597c4847 100644 +--- a/drivers/mtd/nand/socrates_nand.c ++++ b/drivers/mtd/nand/socrates_nand.c +@@ -203,7 +203,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.9/mtd-rawnand-tmio-fix-the-probe-error-path.patch b/queue-4.9/mtd-rawnand-tmio-fix-the-probe-error-path.patch new file mode 100644 index 00000000000..f59b5ef80b3 --- /dev/null +++ b/queue-4.9/mtd-rawnand-tmio-fix-the-probe-error-path.patch @@ -0,0 +1,44 @@ +From c69d59f2561388cc090fd06ef01ab4bb8d014bd6 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 1deb5229db15d..d07c729f5b9b8 100644 +--- a/drivers/mtd/nand/tmio_nand.c ++++ b/drivers/mtd/nand/tmio_nand.c +@@ -446,7 +446,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.9/mtd-rawnand-xway-fix-the-probe-error-path.patch b/queue-4.9/mtd-rawnand-xway-fix-the-probe-error-path.patch new file mode 100644 index 00000000000..9b8b16a4658 --- /dev/null +++ b/queue-4.9/mtd-rawnand-xway-fix-the-probe-error-path.patch @@ -0,0 +1,44 @@ +From 9350cc5ddcfa3bc1623b02b01dda26a48daf1b55 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 d374a0007960a..3d51b8fc5aafe 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.9/series b/queue-4.9/series index 8523ba20a23..cad285eb47f 100644 --- a/queue-4.9/series +++ b/queue-4.9/series @@ -86,3 +86,14 @@ 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-diskonchip-fix-the-probe-error-path.patch +mtd-rawnand-pass-a-nand_chip-object-to-nand_release.patch +mtd-rawnand-diskonchip-fix-the-probe-error-path.patch-32722 +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-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 -- 2.47.3