[JFFS2] Write buffer offset adjustment for NOR-ECC (Sibley) flash

Linux-MTD Mailing List linux-mtd at lists.infradead.org
Sat Oct 18 07:59:02 EDT 2008


Gitweb:     http://git.infradead.org/?p=mtd-2.6.git;a=commit;h=5bf1723723487ddb0b9c9641b6559da96b27cc93
Commit:     5bf1723723487ddb0b9c9641b6559da96b27cc93
Parent:     43b5693d404127697d62962def8c1bfe3a89811a
Author:     Alexander Belyakov <abelyako at mail.ru>
AuthorDate: Fri Oct 17 19:19:13 2008 +0400
Committer:  David Woodhouse <David.Woodhouse at intel.com>
CommitDate: Sat Oct 18 11:54:09 2008 +0100

    [JFFS2] Write buffer offset adjustment for NOR-ECC (Sibley) flash
    
    After choosing new c->nextblock, don't leave the wbuf offset field
    occasionally pointing at the start of the next physical eraseblock.
    This was causing a BUG() on NOR-ECC (Sibley) flash, where we start
    writing after the cleanmarker.
    
    Among other this fix should cover write buffer offset adjustment
    after flushing the last page of an eraseblock.
    
    Signed-off-by: Alexander Belyakov <abelyako at googlemail.com>
    Signed-off-by: David Woodhouse <David.Woodhouse at intel.com>
---
 fs/jffs2/nodemgmt.c |    4 ++++
 fs/jffs2/wbuf.c     |    5 +----
 2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/fs/jffs2/nodemgmt.c b/fs/jffs2/nodemgmt.c
index a9bf960..0875b60 100644
--- a/fs/jffs2/nodemgmt.c
+++ b/fs/jffs2/nodemgmt.c
@@ -261,6 +261,10 @@ static int jffs2_find_nextblock(struct jffs2_sb_info *c)
 
 	jffs2_sum_reset_collected(c->summary); /* reset collected summary */
 
+	/* adjust write buffer offset, else we get a non contiguous write bug */
+	if (!(c->wbuf_ofs % c->sector_size) && !c->wbuf_len)
+		c->wbuf_ofs = 0xffffffff;
+
 	D1(printk(KERN_DEBUG "jffs2_find_nextblock(): new nextblock = 0x%08x\n", c->nextblock->offset));
 
 	return 0;
diff --git a/fs/jffs2/wbuf.c b/fs/jffs2/wbuf.c
index 0e78b00..d9a721e 100644
--- a/fs/jffs2/wbuf.c
+++ b/fs/jffs2/wbuf.c
@@ -679,10 +679,7 @@ static int __jffs2_flush_wbuf(struct jffs2_sb_info *c, int pad)
 
 	memset(c->wbuf,0xff,c->wbuf_pagesize);
 	/* adjust write buffer offset, else we get a non contiguous write bug */
-	if (SECTOR_ADDR(c->wbuf_ofs) == SECTOR_ADDR(c->wbuf_ofs+c->wbuf_pagesize))
-		c->wbuf_ofs += c->wbuf_pagesize;
-	else
-		c->wbuf_ofs = 0xffffffff;
+	c->wbuf_ofs += c->wbuf_pagesize;
 	c->wbuf_len = 0;
 	return 0;
 }



More information about the linux-mtd-cvs mailing list