]> www.infradead.org Git - mtd-utils.git/commitdiff
mtd-utils: flash_erase: Fix output of offsets
authorBrian Norris <computersforpeace@gmail.com>
Sat, 16 Oct 2010 20:54:05 +0000 (13:54 -0700)
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
Sun, 17 Oct 2010 08:07:25 +0000 (11:07 +0300)
Need to use unsigned arithmetic and a 64-bit cast in order to
calculate and output the correct offset for eraseblocks at large
offsets. Signed integer arithmetic does not produce the correct
result "uint64_t" result, so for offsets over 2GB we get
messages like:

Erasing 512 Kibyte @ ffffffff83180000 -- 4308642136 % complete.

Note that this error was not affecting proper erasure; it just
produced incorrect status messages.

Also, we should not add an extra eraseblock for the final status
message; this gives misleading output when, for example, the
following statement is executed:

$ flash_erase /dev/mtd0 0 1
Erasing 512 Kibyte @ 80000 -- 100 % complete

We aren't erasing at offset 0x80000; it should display offset 0.

Signed-off-by: Brian Norris <computersforpeace@gmail.com>
Acked-by: Mike Frysinger <vapier@gentoo.org>
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
flash_erase.c

index 892905453a6d294557864015d3cc0ae65ac23cae..1a7b52ef15e260a15eb5a7c5492babfb1ad3666c 100644 (file)
@@ -93,7 +93,8 @@ int main(int argc, char *argv[])
 {
        libmtd_t mtd_desc;
        struct mtd_dev_info mtd;
-       int fd, clmpos = 0, clmlen = 8, eb, eb_start, eb_cnt;
+       int fd, clmpos = 0, clmlen = 8;
+       unsigned int eb, eb_start, eb_cnt;
        int isNAND;
        int error = 0;
        uint64_t offset = 0;
@@ -232,7 +233,7 @@ int main(int argc, char *argv[])
                eb_cnt = (mtd.size / mtd.eb_size) - eb_start;
 
        for (eb = eb_start; eb < eb_start + eb_cnt; eb++) {
-               offset = eb * mtd.eb_size;
+               offset = (uint64_t)eb * mtd.eb_size;
 
                if (!noskipbad) {
                        int ret = mtd_is_bad(&mtd, fd, eb);
@@ -285,7 +286,6 @@ int main(int argc, char *argv[])
                }
                verbose(!quiet, " Cleanmarker written at %"PRIx64, offset);
        }
-       offset += mtd.eb_size;
        show_progress(&mtd, offset, eb, eb_start, eb_cnt);
        bareverbose(!quiet, "\n");