From b952596c60fb5713faa490efb75cbdceb1bab8a6 Mon Sep 17 00:00:00 2001 From: Adrian Hunter Date: Mon, 14 Apr 2008 09:39:39 +0300 Subject: [PATCH] --- yaml --- r: 93046 b: refs/heads/master c: 67e5a28b35254bbbcd5bfce61ef646709e059bbf h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/mtd/onenand/onenand_base.c | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index ddcb9383d8c6..fc628f9cf0e7 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: f1ebe4eba40e0ee862767893277d1b1a1e4cc85f +refs/heads/master: 67e5a28b35254bbbcd5bfce61ef646709e059bbf diff --git a/trunk/drivers/mtd/onenand/onenand_base.c b/trunk/drivers/mtd/onenand/onenand_base.c index 56255c85d97b..5d7965f7e9ce 100644 --- a/trunk/drivers/mtd/onenand/onenand_base.c +++ b/trunk/drivers/mtd/onenand/onenand_base.c @@ -329,6 +329,21 @@ static int onenand_wait(struct mtd_info *mtd, int state) printk(KERN_ERR "onenand_wait: controller error = 0x%04x\n", ctrl); if (ctrl & ONENAND_CTRL_LOCK) printk(KERN_ERR "onenand_wait: it's locked error.\n"); + if (state == FL_READING) { + /* + * A power loss while writing can result in a page + * becoming unreadable. When the device is mounted + * again, reading that page gives controller errors. + * Upper level software like JFFS2 treat -EIO as fatal, + * refusing to mount at all. That means it is necessary + * to treat the error as an ECC error to allow recovery. + * Note that typically in this case, the eraseblock can + * still be erased and rewritten i.e. it has not become + * a bad block. + */ + mtd->ecc_stats.failed++; + return -EBADMSG; + } return -EIO; }