Index: mtd/fs/jffs2/erase.c =================================================================== RCS file: /home/cvs/mtd/fs/jffs2/erase.c,v retrieving revision 1.85 diff -u -r1.85 erase.c --- mtd/fs/jffs2/erase.c 20 Sep 2005 14:53:15 -0000 1.85 +++ mtd/fs/jffs2/erase.c 20 Sep 2005 19:31:58 -0000 @@ -20,6 +20,9 @@ #include #include "nodelist.h" +/* max. erase failures before we mark a block bad */ +#define MAX_ERASE_FAILURES 2 + struct erase_priv_struct { struct jffs2_eraseblock *jeb; struct jffs2_sb_info *c; @@ -171,24 +174,24 @@ static void jffs2_erase_failed(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, uint32_t bad_offset) { - /* For NAND, if the failure did not occur at the device level for a - specific physical page, don't bother updating the bad block table. */ - if (jffs2_cleanmarker_oob(c) && (bad_offset != 0xffffffff)) { - /* We had a device-level failure to erase. Let's see if we've - failed too many times. */ - if (!jffs2_write_nand_badblock(c, jeb, bad_offset)) { - /* We'd like to give this block another try. */ - spin_lock(&c->erase_completion_lock); - list_del(&jeb->list); - list_add(&jeb->list, &c->erase_pending_list); - c->erasing_size -= c->sector_size; - c->dirty_size += c->sector_size; - jeb->dirty_size = c->sector_size; - spin_unlock(&c->erase_completion_lock); - return; - } + if (++jeb->bad_count < MAX_ERASE_FAILURES) { + /* We'd like to give this block another try. */ + printk(KERN_WARNING "Retrying erase at 0x%08x\n", jeb->offset); + spin_lock(&c->erase_completion_lock); + list_del(&jeb->list); + list_add(&jeb->list, &c->erase_pending_list); + c->erasing_size -= c->sector_size; + c->dirty_size += c->sector_size; + jeb->dirty_size = c->sector_size; + spin_unlock(&c->erase_completion_lock); + return; } + /* For NAND, if the failure did occur at the device level for a + specific physical page, update the bad block table. */ + if (jffs2_cleanmarker_oob(c) && (bad_offset != 0xffffffff)) + jffs2_write_nand_badblock(c, jeb, bad_offset); + spin_lock(&c->erase_completion_lock); c->erasing_size -= c->sector_size; c->bad_size += c->sector_size; @@ -337,6 +340,7 @@ if (*datum + 1) { *bad_offset += i; printk(KERN_WARNING "Newly-erased block contained word 0x%lx at offset 0x%08x\n", *datum, *bad_offset); + ret = -EIO; goto fail; } } @@ -425,6 +429,8 @@ jeb->wasted_size = 0; } + jeb->bad_count = 0; + spin_lock(&c->erase_completion_lock); c->erasing_size -= c->sector_size; c->free_size += jeb->free_size; Index: mtd/fs/jffs2/wbuf.c =================================================================== RCS file: /home/cvs/mtd/fs/jffs2/wbuf.c,v retrieving revision 1.98 diff -u -r1.98 wbuf.c --- mtd/fs/jffs2/wbuf.c 7 Sep 2005 08:34:55 -0000 1.98 +++ mtd/fs/jffs2/wbuf.c 20 Sep 2005 19:31:59 -0000 @@ -28,9 +28,6 @@ static unsigned char *brokenbuf; #endif -/* max. erase failures before we mark a block bad */ -#define MAX_ERASE_FAILURES 2 - /* two seconds timeout for timed wbuf-flushing */ #define WBUF_FLUSH_TIMEOUT 2 * HZ @@ -1099,10 +1096,6 @@ { int ret; - /* if the count is < max, we try to write the counter to the 2nd page oob area */ - if( ++jeb->bad_count < MAX_ERASE_FAILURES) - return 0; - if (!c->mtd->block_markbad) return 1; // What else can we do?