mtd: nand: do not scan bad blocks with NAND_BBT_NO_OOB set

Linux-MTD Mailing List linux-mtd at
Mon Nov 7 11:59:35 EST 2011

Commit:     752ed6c5f8c0ee182219ff8682f5a98e47ee866f
Parent:     dadc17a3e34810ed411a62e6b4cafdf3e5e1d5c8
Author:     Brian Norris <computersforpeace at>
AuthorDate: Tue Sep 20 18:36:42 2011 -0700
Committer:  Artem Bityutskiy <artem.bityutskiy at>
CommitDate: Wed Sep 21 09:19:08 2011 +0300

    mtd: nand: do not scan bad blocks with NAND_BBT_NO_OOB set
    Updates to our default function for creating bad block patterns have
    broken the "no OOB" feature. The NAND_BBT_NO_OOB option should not be
    set while scanning for bad blocks, but we've been passing all BBT
    options from nand_chip.bbt_options to the bad block scan. This causes us
    to hit the:
    	BUG_ON(bd->options & NAND_BBT_NO_OOB);
    in create_bbt() when we scan the flash for bad blocks.
    Thus, while it can be legal to set NAND_BBT_NO_OOB in a custom badblock
    pattern descriptor (presumably with NAND_BBT_CREATE disabled?), we
    should not pass it through in our default function.
    Also, to help clarify and emphasize that the function creates bad block
    patterns only (not, for example, table descriptors for locating
    flash-based BBT), I renamed `nand_create_default_bbt_descr' to
    Signed-off-by: Brian Norris <computersforpeace at>
    Signed-off-by: Artem Bityutskiy <artem.bityutskiy at>
 drivers/mtd/nand/nand_bbt.c |   13 +++++++------
 1 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/drivers/mtd/nand/nand_bbt.c b/drivers/mtd/nand/nand_bbt.c
index e7976c7..783093d 100644
--- a/drivers/mtd/nand/nand_bbt.c
+++ b/drivers/mtd/nand/nand_bbt.c
@@ -1294,26 +1294,27 @@ static struct nand_bbt_descr bbt_mirror_no_bbt_descr = {
 	.pattern = mirror_pattern
- * nand_create_default_bbt_descr - [INTERN] Creates a BBT descriptor structure
+ * nand_create_badblock_pattern - [INTERN] Creates a BBT descriptor structure
  * @this: NAND chip to create descriptor for
  * This function allocates and initializes a nand_bbt_descr for BBM detection
- * based on the properties of "this". The new descriptor is stored in
+ * based on the properties of @this. The new descriptor is stored in
  * this->badblock_pattern. Thus, this->badblock_pattern should be NULL when
  * passed to this function.
-static int nand_create_default_bbt_descr(struct nand_chip *this)
+static int nand_create_badblock_pattern(struct nand_chip *this)
 	struct nand_bbt_descr *bd;
 	if (this->badblock_pattern) {
-		pr_warn("BBT descr already allocated; not replacing\n");
+		pr_warn("Bad block pattern already allocated; not replacing\n");
 		return -EINVAL;
 	bd = kzalloc(sizeof(*bd), GFP_KERNEL);
 	if (!bd)
 		return -ENOMEM;
-	bd->options = this->bbt_options;
+	bd->options = this->bbt_options & BADBLOCK_SCAN_MASK;
 	bd->offs = this->badblockpos;
 	bd->len = (this->options & NAND_BUSWIDTH_16) ? 2 : 1;
 	bd->pattern = scan_ff_pattern;
@@ -1367,7 +1368,7 @@ int nand_default_bbt(struct mtd_info *mtd)
 	if (!this->badblock_pattern)
-		nand_create_default_bbt_descr(this);
+		nand_create_badblock_pattern(this);
 	return nand_scan_bbt(mtd, this->badblock_pattern);

More information about the linux-mtd-cvs mailing list