On Thu, Oct 11, 2007 at 10:58:11PM +0100, Ben Dooks wrote:
> On Thu, Oct 11, 2007 at 08:44:14PM +0100, Ben Dooks wrote:
> > On Thu, Oct 11, 2007 at 10:35:55AM -0400, Ian McDonnell wrote:
> > > Ben,
> > >
> > > On Thursday 11 October 2007 07:25, Ben Dooks wrote:
> > > > I'm working on upgrading a client's kernel from 2.6.10 to
> > > > 2.6.22. They are using yaffs to store their configuration
> > > > data.
> > > >
> > > > When I start the 2.6.22 kernel, I get a number of the
> > > > following: **>> yaffs chunk 32 was not erased
> > > >
> > > > If I run 2.6.10 after writing the files from 2.6.22 I get
> > > > blocks with ECC errors in them, and the files get corrupted.
> > >
> > > The problem is with a change to MTD -- MTD's NAND interface had
> > > an overhaul between 2.6.17 and mid-late 2.6.18. MTD's default
> > > layout of oob data in the NAND page's spare area changed. This
> > > means that yaffs' tag metadata gets scrambled when you jump
> > > between versions of MTD. There are ways to fix this, you can
> > > supply MTD with your own layout policy. Rumage through the mail
> > > archive to find some discussion on the topic.
> > > http://aleph1.co.uk/lurker/list/yaffs.en.html
> >
> > I didn't find anything relevant to this. I have found one problem,
> > if CONFIG_YAFFS_DOES_ECC is set, and the mtd driver has an ECC
> > method, then it seems to be using the mtd hardware ECC code during
> > reads. The Kconfig help text seems to imply this should override
> > anything NAND is up to?
> >
> > Even with the hardware ECC disabled, nipping between the two
> > kernels is still giving:
> >
> > yaffs_ECCCorrect: READ ff,ff,bf WANT ff,ff,ff, DIFF 00,00,40
> >
> > The diff value is _always_ 00,00,40 whatever the ECC being read.
>
> With the diff always being this, I belive the mtd oob layout is now
> synchronised between the two kernel versions... both kernels can see
> the file in question, but the ecc correction causes the file to end
> up being 'corrected' when it does not need it.
>
> I will continue running debug on this, becuase before the debugging
> the two ecc genrators where exactly the same file.
I've run output from both 2.6.10 and 2.6.22 showing the data in the
OOB:
writing file on 2.6.10:
nandmtd_WriteChunkToNAND: writing chunk 32 oob00,00,10,00 ff,ff,05,01
nandmtd_WriteChunkToNAND: writing chunk 33 oob01,00,10,80 ff,ff,05,01
nandmtd_WriteChunkToNAND: writing chunk 34 oob02,00,10,80 ff,ff,05,01
nandmtd_WriteChunkToNAND: writing chunk 35 oob03,00,10,80 ff,ff,05,01
nandmtd_WriteChunkToNAND: writing chunk 36 oob04,00,10,80 ff,ff,05,01
on 2.6.22 on mount:
==> chunk 0: OOB read00,00,10,00 05,01,04,40
==> chunk 32: OOB read00,00,10,00 00,ff,05,01
==> chunk 64: OOB read20,00,10,80 ff,ff,05,01
It seems to be reading the same data from chunk 32, but it is now
ignorning the file on the filesystem. Chunk 0 is on the first block
which now seems to be worn out from the repeated erase/program cycles
of testing.
--
Ben
Q: What's a light-year?
A: One-third less calories than a regular year.