]> err.no Git - linux-2.6/blobdiff - drivers/mtd/onenand/onenand_base.c
Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus
[linux-2.6] / drivers / mtd / onenand / onenand_base.c
index 56255c85d97bb344660616a0dd6d3b8a5e27f9db..5d7965f7e9ce6a3f8232a53cb2c0e2a243f13379 100644 (file)
@@ -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;
        }