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
+++