public inbox for linux-mtd@lists.infradead.org
 help / color / mirror / Atom feed
From: Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>
To: Brian Norris <computersforpeace@gmail.com>
Cc: "Nori, Sekhar" <nsekhar@ti.com>,
	"Huang Shijie" <b32955@freescale.com>,
	linux-mtd <linux-mtd@lists.infradead.org>,
	"Gupta, Pekon" <pekon@ti.com>, "Quadros, Roger" <rogerq@ti.com>,
	"Lothar Waßmann" <LW@karo-electronics.de>
Subject: Re: [PATCH] mtd: nand: omap: save Bad-Block-Table (BBT) on device
Date: Thu, 24 Jul 2014 10:40:18 -0300	[thread overview]
Message-ID: <20140724134018.GA711@arch.cereza> (raw)
In-Reply-To: <20140724015438.GC3711@ld-irv-0074>

On 23 Jul 06:54 PM, Brian Norris wrote:
> > > 
> > > - Case-1: If there is un-allocated space (not allocated to any partition)
> 
> Partitioning has no effect on the BBT process. BBT is run only for the
> 'master' MTD, and it has no regard for previous data on the flash. Given
> that...
> 

Right.

> > >   at end of Flash device then it will be used. And there is no problem.
> > > 
> > 
> > Yes, so far, so good.
> 
> Agreed. It is especially safe because that area was not partitioned, and
> therefore should not contain important data.
> 
> > > - Case-2: If there is no free space towards the end of flash, then ...
> > > As per my understanding, the create_bbt() would try scanning whole
> > > NAND to find empty blocks and then it creates BBT wherever it finds
> > > empty blocks. And those blocks are marked as BAD with BBT signature
> > > to prevent getting erased or over-written by any user-data.
> > > 
> > 
> > OK, I just went through the BBT code, trying to see if I was missing
> > something. I can't see any place where the kernel scans the device
> > and searches for empty space for the BBT.
> 
> Right, on-flash BBT has no notion of "empty space", really; it just
> knows what region is reserved for its use (the last few blocks of the
> device).
> 

Right. And in fact, that's clear from the snippet I pasted below.

> > Instead, what create_bbt() seem to do is scan the whole device, searching
> > for bad blocks to fill an in-memory BBT. I presume that if I have some
> > blocks marked as bad in the OOB region, they are identified as bad
> > and the BBT is filled.
> > 
> > I think that write_bbt() is where the (previously created, in-memory) BBT
> > is written to flash. It goes like this:
> > 
> > write_bbt()
> > {
> > [..]
> >                 /*
> >                  * Automatic placement of the bad block table. Search direction
> >                  * top -> down?
> >                  */
> >                 if (td->options & NAND_BBT_LASTBLOCK) {
> >                         startblock = numblocks * (chip + 1) - 1;
> >                         dir = -1;
> >                 } else {
> >                         startblock = chip * numblocks;
> >                         dir = 1;
> >                 }
> > 
> >                 for (i = 0; i < td->maxblocks; i++) {
> >                         int block = startblock + dir * i;
> >                         /* Check, if the block is bad */
> >                         switch (bbt_get_entry(this, block)) {
> >                         case BBT_BLOCK_WORN:
> >                         case BBT_BLOCK_FACTORY_BAD:
> >                                 continue;
> >                         }
> >                         page = block <<
> >                                 (this->bbt_erase_shift - this->page_shift);
> >                         /* Check, if the block is used by the mirror table */
> >                         if (!md || md->pages[chip] != page)
> >                                 goto write;
> >                 }
> >                 pr_err("No space left to write bad block table\n");
> >                 return -ENOSPC;
> > 		[..]
> > }
> > 
> > which fails if there's no room left for the BBT. This will happen on every
> > boot, so it's not an ideal situation.
> 
> BTW, td->maxblocks==4 by default. There's no 'scanning the whole
> device'; it only scans the last 4 blocks. But you're correct that it's
> not ideal, since it will fail if there are 4 bad blocks at the end.
> 

Yeah, I was completely wrong. Thanks for the insight!

> > > Is my understanding correct?
> > > If yes, then this will not break backward compatibility, as on upgrading
> > > the kernel new BBT will be automatically written on first boot. And
> > > it will be used in subsequent boots.
> > > Need feedbacks ...
> > > 
> > 
> > In fact, you do have a simple way to solve this. Just support BBT through
> > the "nand-on-flash-bbt" devicetree property, so a user can tell if his flash
> > has a BBT or not. See pxa3xx-nand.c, which should be correct.
> 
> Yes, you can use the 'nand-on-flash-bbt' property, and that probably
> makes the most sense.
> 
> The only real backwards-compatibility concern you'd have for
> unconditionally enabling on-flash BBT (like in this patch) is if you had
> previous file system data in the last 4 blocks; nand_bbt will just
> clobber it, breaking your file system. For this reason, using DT is
> probably a good idea -- you're opting in, rather than being forced in by
> a kernel upgrade.
> 

FWIW, having the kernel wipe your precious data, is even worse than having
him fail; which means this represents a much more serious drawback.
This is why any modification to a NAND driver that involves a different
'view' of the flash, should be considered with a lot of care!

> Beyond the backwards-compatibility concern, you still have other
> concerns about on-flash BBT's robustness. Limiting yourself to a region
> of 4 blocks is one potential issue. There are others (e.g., lack of CRC
> protection), but none that have been real show-stoppers. I have a few
> generations of products running it here.
> 

Hm.. Can you guys mention what's the benefit of using a BBT, against keeping
the bad block mark in the OOB region? (Other than the fact that some ECC
strength may not leave any available OOB).
-- 
Ezequiel Garcia, VanguardiaSur
www.vanguardiasur.com.ar

  reply	other threads:[~2014-07-24 13:41 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-23 11:54 [PATCH] mtd: nand: omap: save Bad-Block-Table (BBT) on device Pekon Gupta
2014-07-23 12:05 ` Ezequiel Garcia
2014-07-23 16:26   ` Gupta, Pekon
2014-07-23 20:27     ` ezequiel
2014-07-24  1:54       ` Brian Norris
2014-07-24 13:40         ` Ezequiel Garcia [this message]
2014-07-24 19:11           ` Brian Norris
2014-07-24 17:56         ` Gupta, Pekon

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20140724134018.GA711@arch.cereza \
    --to=ezequiel@vanguardiasur.com.ar \
    --cc=LW@karo-electronics.de \
    --cc=b32955@freescale.com \
    --cc=computersforpeace@gmail.com \
    --cc=linux-mtd@lists.infradead.org \
    --cc=nsekhar@ti.com \
    --cc=pekon@ti.com \
    --cc=rogerq@ti.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox