Ross Younger wrote: > Yeasah Pell wrote:
>> > Bad blocks are actually managed at the MTD level, not the filesystem;
>> > the exact method used to store the bad block table varies depending on
>> > the exact NAND configuration, but often the NAND pages themselves have a
>> > marker in the header which indicates "badness".
>>
>
> Every chip has its own concept of factory-bad block markers. Many (most?)
> chip spec sheets then recommend that the driver reads this information and
> uses it to populate a Bad Block Table on the device. You can find the code
> which does this in a recent kernel source tree, in
> drivers/mtd/nand/nand_bbt.c. (Take care - there's a general implementation,
> which some chips deviate from. You might want to read its chip detection
> logic too.)
>
> If your chip has a BBT, then you're probably better off erasing just the
> blocks comprising that table than you are erasing the device completely.
> (That may yet require hacking the driver.) The net result would be to forget
> all the blocks that the driver believes have gone bad in use - which I've
> found can happen during development if you mess up your drivers.
>
>
> Ross
>
It's an excellent point, some drivers do enable an on-flash BBT. This
isn't determined by the NAND chip in use though, it's determined by the
NAND *controller* in use. The option which enables this
(NAND_USE_FLASH_BBT) is easily grepped for and gives the following list
of drivers:
autcpu12: SmartMediaCard on autronix autcpu12 board
cs553x_nand: NAND support for CS5535/CS5536 (AMD Geode companion chip)
cafe_nand: NAND support for OLPC CAFÉ chip
diskonchip: DiskOnChip 2000, Millennium and Millennium Plus (NAND
reimplementation) (EXPERIMENTAL)
fsl_elbc_nand: NAND support for Freescale eLBC controllers
rtc_from4: Renesas Flash ROM 4-slot interface board (FROM_BOARD4)
nand_pasemi: NAND support for PA Semi PWRficient
I'm not sure how many of those controllers are widely used (the OLPC one
must see significant use at least), but I've never used any of these
controllers myself. But if you do use one of these controllers, it would
indeed be best to just try to erase the on-flash table. Of course MTD
protects these blocks from conventional erasure too (otherwise
flash_eraseall would clear the bbt), so you'd have to disable that
protection. Temporarily changing the third parameter of the call to
nand_erase_nand in nand_base.c to 1 seems like it would trivially
accomplish this. As long as the bbt isn't rewritten from memory before
you can reboot, I think that should work fine.
One other thing that occurred to me the first time I encountered this
(this is specific to drivers which do not use an on-chip bad block
table) is that there is probably some forensically identifiable
difference between the OOB in a factory marked bad block versus the OOB
in a MTD marked bad block, especially for chips where the marker
specification diverges somewhat from the MTD code (which seems to be
most of them). I never pursued this very far, as I always had a log of
the original factory bad block list that I could manually restore from.