]> www.infradead.org Git - mtd-utils.git/commitdiff
nandwrite: add --skipbad to write bad blocks
authorMike Frysinger <vapier@gentoo.org>
Thu, 23 Sep 2010 20:04:15 +0000 (16:04 -0400)
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
Fri, 24 Sep 2010 08:50:51 +0000 (11:50 +0300)
Sometimes dumping bad blocks is useful, like when the block isn't actually
bad but the OOB layout isn't what the kernel is expecting or is otherwise
screwed up.  The --skipbad option allows just that.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
nandwrite.c

index 1b4ca3dd31acd44be18604fb4278b596b338fcec..8fe8875c95633512d2c5174c5f5d47442496562b 100644 (file)
@@ -79,6 +79,7 @@ static void display_help (void)
 "                          device\n"
 "  -m, --markbad           Mark blocks bad if write fails\n"
 "  -n, --noecc             Write without ecc\n"
+"  -N, --noskipbad         Write without bad block skipping\n"
 "  -o, --oob               Image contains oob data\n"
 "  -r, --raw               Image contains the raw oob data dumped by nanddump\n"
 "  -s addr, --start=addr   Set start address (default is 0)\n"
@@ -118,6 +119,7 @@ static bool         forcejffs2 = false;
 static bool            forceyaffs = false;
 static bool            forcelegacy = false;
 static bool            noecc = false;
+static bool            noskipbad = false;
 static bool            pad = false;
 static int             blockalign = 1; /*default to using 16K block size */
 
@@ -127,7 +129,7 @@ static void process_options (int argc, char * const argv[])
 
        for (;;) {
                int option_index = 0;
-               static const char *short_options = "ab:fjmnopqrs:y";
+               static const char *short_options = "ab:fjmnNopqrs:y";
                static const struct option long_options[] = {
                        {"help", no_argument, 0, 0},
                        {"version", no_argument, 0, 0},
@@ -137,6 +139,7 @@ static void process_options (int argc, char * const argv[])
                        {"jffs2", no_argument, 0, 'j'},
                        {"markbad", no_argument, 0, 'm'},
                        {"noecc", no_argument, 0, 'n'},
+                       {"noskipbad", no_argument, 0, 'N'},
                        {"oob", no_argument, 0, 'o'},
                        {"pad", no_argument, 0, 'p'},
                        {"quiet", no_argument, 0, 'q'},
@@ -181,6 +184,9 @@ static void process_options (int argc, char * const argv[])
                        case 'n':
                                noecc = true;
                                break;
+                       case 'N':
+                               noskipbad = true;
+                               break;
                        case 'm':
                                markbad = true;
                                break;
@@ -487,6 +493,8 @@ int main(int argc, char * const argv[])
                                                 blockstart / meminfo.erasesize, blockstart);
 
                        /* Check all the blocks in an erase block for bad blocks */
+                       if (noskipbad)
+                               continue;
                        do {
                                if ((ret = ioctl(fd, MEMGETBADBLOCK, &offs)) < 0) {
                                        perror("ioctl(MEMGETBADBLOCK)");