From patchwork Fri Oct 17 15:19:13 2008 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [JFFS2] Write buffer offset adjustment for NOR-ECC (Sibley) flash Date: Fri, 17 Oct 2008 05:19:13 -0000 From: Alexander Belyakov X-Patchwork-Id: 4879 Message-Id: To: David Woodhouse , =?windows-1251?Q?linux-mtd=40lists.infradead.org?= Cc: Alexander Belyakov 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 --- diff -uNrp a/fs/jffs2/nodemgmt.c b/fs/jffs2/nodemgmt.c --- a/fs/jffs2/nodemgmt.c 2008-08-20 22:11:37.000000000 +0400 +++ b/fs/jffs2/nodemgmt.c 2008-10-17 12:46:53.000000000 +0400 @@ -261,6 +261,10 @@ static int jffs2_find_nextblock(struct j 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 -uNrp a/fs/jffs2/wbuf.c b/fs/jffs2/wbuf.c --- a/fs/jffs2/wbuf.c 2008-08-20 22:11:37.000000000 +0400 +++ b/fs/jffs2/wbuf.c 2008-10-17 12:35:45.000000000 +0400 @@ -679,10 +679,7 @@ static int __jffs2_flush_wbuf(struct jff 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; }