Problem with clean markers/partial writes on Micron 4-bit ECC NAND

Ivan Djelic ivan.djelic at parrot.com
Fri Jun 17 17:00:14 EDT 2011


On Fri, Jun 17, 2011 at 06:52:24PM +0100, Peter Barada wrote:
(...)
> The problem I'm running into with JFFS2 is that empty flash is first 
> marked with a clean marker into the OOB, and then a 2nd write to the 
> main data area is done (w/o an intervening erase) to that page with data 
> which corrupts the ECCs that were first modified by writing the cleanmarker.
> 
(...)
> 
> I believe I've figured out a workaround:
> 
> 1) Modify the ecclayout to add the other 8 bytes of the OOB that are NOT 
> ECCd *after* the 16 bytes that are ECCd (so the ecc layout looks like):
> 
(...)
> 2) Then set ops.ooboffs to 16 in jffs2_write_nand_cleanmarker and 
> jffs2_check_nand_cleanmarker.
> 
> This "offsets" the read/writes by 16 bytes to move the cleanmarker into 
> OOB bytes that do not perturb the ECCs, and so far it looks to work.
> 

OK, so now the cleanmarker is in an unprotected area; did you also patch
jffs2_check_nand_cleanmarker() so that it does its pattern comparison in a
bitflip-robust way (instead of just doing a memcmp) ?
I think you may also need to modify jffs2_check_oob_empty() to take into
account the new offset of your cleanmarker.

> However I feel this is a hack as our product will use two different NAND 
> chips, the other being a more traditional SLC that can use 1-bit hamming 
> for ECC (which does not ECC any bytes in the OOB).
> 
> How can I best code this into the MTD layer such that JFFS2 (and other 
> NAND FSs that does partial writes including OOB bytes) can understand 
> that some OOB bytes perturb the data area ECC?
> 
> I think adding a "non_ecc_oob_offset" variable to the ecclayout could 
> capture this nuance of the OOB/ECC interaction for this chip and JFFS2 
> could set ops.ooboffs to non_ecc_oob_offset in 
> jffs2_write_nand_cleanmarker and jffs2_check_nand_cleanmarker.

I believe JFFS2 only uses oob for its cleanmarker; then, maybe you could just
omit the ecc-protected bytes from the .oobfree list, like this:

  ecclayout = {
         eccbytes = 32,
         eccpos = { 8, 9, 10, 11, 12, 13, 14, 15,
                 24, 25, 26, 27, 28, 19, 30, 31,
                 40, 41, 42, 43, 44, 45, 46, 47,
                 56, 57, 58, 59, 60, 61, 62, 63},
         .oobfree = {
                 { .offset = 2,
                   .length = 2},
                 { .offset = 18,
                   .length = 2},
                 { .offset = 24,
                   .length = 2},
                 { .offset = 42,
                   .length = 2},
         },
};

and only modify jffs2_check_nand_cleanmarker() and jffs2_check_oob_empty()
so that they are robust to bitflips in unprotected oob bytes ?
Or are you also using on the same mtd device another filesystem requiring
protected oob bytes, like YAFFS2 ?
Regards,

Ivan



More information about the linux-mtd mailing list