]> www.infradead.org Git - mtd-utils.git/commitdiff
nandwrite: fix error handling
authorJehan Bing <jehan@orb.com>
Mon, 8 Jun 2009 20:43:26 +0000 (13:43 -0700)
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
Tue, 9 Jun 2009 15:01:29 +0000 (18:01 +0300)
Artem Bityutskiy wrote:
> Yes, write and erase failure mean that the erasblock is bad. But I think
> marking a block as bad straight away is just dangerous. Who knows may be
> this is a small glitch in a bus, or a software bug, or some-one
> corrupted driver's memory, or whatever. This is why UBI is doing
> eraseblock torturing before marking it as bad. And it is very careful
> about error codes - only EIO code is considered as a reason to mark an
> eraseblock as bad.

Fixed broken behavior in case of write failure. More specifically:
- Only try to mark a block bad if the errors are EIO. Other errors
will abort the tool.
- Also abort the tool if the marking fails instead of ignoring it.

Signed-off-by: Jehan Bing <jehan@orb.com>
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
nandwrite.c

index d745ab018c5266849ed9a4a69f77122838516d19..1a9449b131d0185416ff228efc478eec9128b8eb 100644 (file)
@@ -586,6 +586,10 @@ int main(int argc, char * const argv[])
                        erase_info_t erase;
 
                        perror ("pwrite");
+                       if (errno != EIO) {
+                               goto closeall;
+                       }
+
                        /* Must rewind to blockstart if we can */
                        rewind_blocks = (mtdoffset - blockstart) / meminfo.writesize; /* Not including the one we just attempted */
                        rewind_bytes = (rewind_blocks * meminfo.writesize) + readlen;
@@ -602,7 +606,9 @@ int main(int argc, char * const argv[])
                                (long)erase.start, (long)erase.start+erase.length-1);
                        if (ioctl(fd, MEMERASE, &erase) != 0) {
                                perror("MEMERASE");
-                               goto closeall;
+                               if (errno != EIO) {
+                                       goto closeall;
+                               }
                        }
 
                        if (markbad) {
@@ -610,7 +616,7 @@ int main(int argc, char * const argv[])
                                fprintf(stderr, "Marking block at %08lx bad\n", (long)bad_addr);
                                if (ioctl(fd, MEMSETBADBLOCK, &bad_addr)) {
                                        perror("MEMSETBADBLOCK");
-                                       /* But continue anyway */
+                                       goto closeall;
                                }
                        }
                        mtdoffset = blockstart + meminfo.erasesize;