[PATCH 2/2] nanddump: add --nobad to read bad blocks
Mike Frysinger
vapier at gentoo.org
Sat Sep 11 23:50:27 EDT 2010
Sometimes dumping bad blocks is useful, like when the data isn't actually
bad but the OOB layout isn't what the kernel is expecting or is otherwise
screwed up. The --nobad option allows just that.
Signed-off-by: Mike Frysinger <vapier at gentoo.org>
---
nanddump.c | 12 ++++++++++--
1 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/nanddump.c b/nanddump.c
index 70b78f0..8b3d4a1 100644
--- a/nanddump.c
+++ b/nanddump.c
@@ -50,6 +50,7 @@ static void display_help (void)
"-f file --file=file Dump to file\n"
"-l length --length=length Length\n"
"-n --noecc Read without error correction\n"
+"-N --nobad Read without bad block skipping\n"
"-o --omitoob Omit oob data\n"
"-b --omitbad Omit bad blocks from the dump\n"
"-p --prettyprint Print nice (hexdump)\n"
@@ -76,6 +77,7 @@ static void display_version (void)
static bool pretty_print = false; // print nice
static bool noecc = false; // don't error correct
+static bool nobad = false; // don't skip bad blocks
static bool omitoob = false; // omit oob data
static unsigned long start_addr; // start address
static unsigned long length; // dump length
@@ -92,7 +94,7 @@ static void process_options (int argc, char * const argv[])
for (;;) {
int option_index = 0;
- static const char *short_options = "bs:f:l:opqnca";
+ static const char *short_options = "bs:f:l:opqnNca";
static const struct option long_options[] = {
{"help", no_argument, 0, 0},
{"version", no_argument, 0, 0},
@@ -105,6 +107,7 @@ static void process_options (int argc, char * const argv[])
{"startaddress", required_argument, 0, 's'},
{"length", required_argument, 0, 'l'},
{"noecc", no_argument, 0, 'n'},
+ {"nobad", no_argument, 0, 'N'},
{"quiet", no_argument, 0, 'q'},
{0, 0, 0, 0},
};
@@ -158,6 +161,9 @@ static void process_options (int argc, char * const argv[])
case 'n':
noecc = true;
break;
+ case 'N':
+ nobad = true;
+ break;
case '?':
error++;
break;
@@ -390,7 +396,9 @@ int main(int argc, char * const argv[])
for (ofs = start_addr; ofs < end_addr ; ofs+=bs) {
// new eraseblock , check for bad block
- if (blockstart != (ofs & (~meminfo.erasesize + 1))) {
+ if (nobad) {
+ badblock = 0;
+ } else if (blockstart != (ofs & (~meminfo.erasesize + 1))) {
blockstart = ofs & (~meminfo.erasesize + 1);
if ((badblock = ioctl(fd, MEMGETBADBLOCK, &blockstart)) < 0) {
perror("ioctl(MEMGETBADBLOCK)");
--
1.7.2
More information about the linux-mtd
mailing list