]> www.infradead.org Git - mtd-utils.git/commitdiff
nanddump: add --nobad to read bad blocks
authorMike Frysinger <vapier@gentoo.org>
Sun, 12 Sep 2010 03:50:27 +0000 (23:50 -0400)
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
Sun, 12 Sep 2010 08:10:55 +0000 (11:10 +0300)
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@gentoo.org>
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
nanddump.c

index 70b78f05e59dc7ea1dec10ffd550325a6d83ef34..8b3d4a15b89659da31f957cacfe98b8eb44454a3 100644 (file)
@@ -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)");