[PATCH 3/5] mtd: Stop assuming mtd_erase() is asynchronous

2018-02-12 Thread Boris Brezillon
None of the mtd->_erase() implementations work in an asynchronous manner,
so let's simplify MTD users that call mtd_erase(). All they need to do
is check the value returned by mtd_erase() and assume that != 0 means
failure.

Signed-off-by: Boris Brezillon 
---
 drivers/mtd/devices/bcm47xxsflash.c |  3 --
 drivers/mtd/ftl.c   | 51 
 drivers/mtd/inftlmount.c|  5 +-
 drivers/mtd/mtdblock.c  | 20 
 drivers/mtd/mtdchar.c   | 33 +
 drivers/mtd/mtdconcat.c | 48 ++-
 drivers/mtd/mtdcore.c   |  8 ++--
 drivers/mtd/mtdoops.c   | 19 
 drivers/mtd/mtdpart.c   |  2 -
 drivers/mtd/mtdswap.c   | 32 -
 drivers/mtd/nftlmount.c |  4 +-
 drivers/mtd/rfd_ftl.c   | 92 +++--
 drivers/mtd/sm_ftl.c| 18 
 drivers/mtd/sm_ftl.h|  4 --
 drivers/mtd/tests/mtd_test.c|  4 --
 drivers/mtd/tests/speedtest.c   |  6 ---
 drivers/mtd/ubi/io.c| 35 --
 fs/jffs2/erase.c| 36 ++-
 include/linux/mtd/mtd.h |  2 -
 19 files changed, 52 insertions(+), 370 deletions(-)

diff --git a/drivers/mtd/devices/bcm47xxsflash.c 
b/drivers/mtd/devices/bcm47xxsflash.c
index e2bd81817df4..6b84947cfbea 100644
--- a/drivers/mtd/devices/bcm47xxsflash.c
+++ b/drivers/mtd/devices/bcm47xxsflash.c
@@ -95,9 +95,6 @@ static int bcm47xxsflash_erase(struct mtd_info *mtd, struct 
erase_info *erase)
else
erase->state = MTD_ERASE_DONE;
 
-   if (erase->callback)
-   erase->callback(erase);
-
return err;
 }
 
diff --git a/drivers/mtd/ftl.c b/drivers/mtd/ftl.c
index 664d206a4cbe..fcf9907e7987 100644
--- a/drivers/mtd/ftl.c
+++ b/drivers/mtd/ftl.c
@@ -140,12 +140,6 @@ typedef struct partition_t {
 #define XFER_PREPARED  0x03
 #define XFER_FAILED0x04
 
-/**/
-
-
-static void ftl_erase_callback(struct erase_info *done);
-
-
 /*==
 
 Scan_header() checks to see if a memory region contains an FTL
@@ -349,17 +343,19 @@ static int erase_xfer(partition_t *part,
 return -ENOMEM;
 
 erase->mtd = part->mbd.mtd;
-erase->callback = ftl_erase_callback;
 erase->addr = xfer->Offset;
 erase->len = 1 << part->header.EraseUnitSize;
-erase->priv = (u_long)part;
 
 ret = mtd_erase(part->mbd.mtd, erase);
+if (!ret) {
+   xfer->state = XFER_ERASED;
+   xfer->EraseCount++;
+} else {
+   xfer->state = XFER_FAILED;
+   pr_notice("ftl_cs: erase failed: err = %d\n", ret);
+}
 
-if (!ret)
-   xfer->EraseCount++;
-else
-   kfree(erase);
+kfree(erase);
 
 return ret;
 } /* erase_xfer */
@@ -371,37 +367,6 @@ static int erase_xfer(partition_t *part,
 
 ==*/
 
-static void ftl_erase_callback(struct erase_info *erase)
-{
-partition_t *part;
-struct xfer_info_t *xfer;
-int i;
-
-/* Look up the transfer unit */
-part = (partition_t *)(erase->priv);
-
-for (i = 0; i < part->header.NumTransferUnits; i++)
-   if (part->XferInfo[i].Offset == erase->addr) break;
-
-if (i == part->header.NumTransferUnits) {
-   printk(KERN_NOTICE "ftl_cs: internal error: "
-  "erase lookup failed!\n");
-   return;
-}
-
-xfer = >XferInfo[i];
-if (erase->state == MTD_ERASE_DONE)
-   xfer->state = XFER_ERASED;
-else {
-   xfer->state = XFER_FAILED;
-   printk(KERN_NOTICE "ftl_cs: erase failed: state = %d\n",
-  erase->state);
-}
-
-kfree(erase);
-
-} /* ftl_erase_callback */
-
 static int prepare_xfer(partition_t *part, int i)
 {
 erase_unit_header_t header;
diff --git a/drivers/mtd/inftlmount.c b/drivers/mtd/inftlmount.c
index 8d6bb189ea8e..0f47be4834d8 100644
--- a/drivers/mtd/inftlmount.c
+++ b/drivers/mtd/inftlmount.c
@@ -393,9 +393,10 @@ int INFTL_formatblock(struct INFTLrecord *inftl, int block)
   mark only the failed block in the bbt. */
for (physblock = 0; physblock < inftl->EraseSize;
 physblock += instr->len, instr->addr += instr->len) {
-   mtd_erase(inftl->mbd.mtd, instr);
+   int ret;
 
-   if (instr->state == MTD_ERASE_FAILED) {
+   ret = mtd_erase(inftl->mbd.mtd, instr);
+   if (ret) {
printk(KERN_WARNING "INFTL: error while formatting 
block %d\n",
block);
goto fail;
diff --git a/drivers/mtd/mtdblock.c b/drivers/mtd/mtdblock.c
index bb4c14f83c75..7b2b7f651181 100644
--- a/drivers/mtd/mtdblock.c
+++ 

Re: [PATCH 3/5] mtd: Stop assuming mtd_erase() is asynchronous

2018-02-12 Thread Richard Weinberger
Am Montag, 12. Februar 2018, 22:03:09 CET schrieb Boris Brezillon:
> None of the mtd->_erase() implementations work in an asynchronous manner,
> so let's simplify MTD users that call mtd_erase(). All they need to do
> is check the value returned by mtd_erase() and assume that != 0 means
> failure.
> 
> Signed-off-by: Boris Brezillon 

Reviewed-by: Richard Weinberger 

Thanks,
//richard