Skip to content

Commit

Permalink
mtd: rawnand: bbt: Skip bad blocks when searching for the BBT in NAND
Browse files Browse the repository at this point in the history
The blocks containing the bad block table can become bad as well. So
make sure to skip any blocks that are marked bad when searching for the
bad block table.

Otherwise in very rare cases where two BBT blocks wear out it might
happen that an obsolete BBT is used instead of a newer available
version.

Signed-off-by: Stefan Riedmueller <s.riedmueller@phytec.de>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Link: https://lore.kernel.org/linux-mtd/20210325102337.481172-1-s.riedmueller@phytec.de
  • Loading branch information
Stefan Riedmueller authored and Miquel Raynal committed Mar 28, 2021
1 parent 25fefc8 commit bd9c9fe
Showing 1 changed file with 5 additions and 0 deletions.
5 changes: 5 additions & 0 deletions drivers/mtd/nand/raw/nand_bbt.c
Original file line number Diff line number Diff line change
Expand Up @@ -525,6 +525,7 @@ static int search_bbt(struct nand_chip *this, uint8_t *buf,
{
u64 targetsize = nanddev_target_size(&this->base);
struct mtd_info *mtd = nand_to_mtd(this);
struct nand_bbt_descr *bd = this->badblock_pattern;
int i, chips;
int startblock, block, dir;
int scanlen = mtd->writesize + mtd->oobsize;
Expand Down Expand Up @@ -560,6 +561,10 @@ static int search_bbt(struct nand_chip *this, uint8_t *buf,
int actblock = startblock + dir * block;
loff_t offs = (loff_t)actblock << this->bbt_erase_shift;

/* Check if block is marked bad */
if (scan_block_fast(this, bd, offs, buf))
continue;

/* Read first page */
scan_read(this, buf, offs, mtd->writesize, td);
if (!check_pattern(buf, scanlen, mtd->writesize, td)) {
Expand Down

0 comments on commit bd9c9fe

Please sign in to comment.