]> www.infradead.org Git - mtd-utils.git/commitdiff
nandwrite: warn about writing 0xff blocks
authorRafał Miłecki <rafal@milecki.pl>
Fri, 25 Mar 2022 12:00:25 +0000 (13:00 +0100)
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>
Mon, 28 Mar 2022 06:49:40 +0000 (08:49 +0200)
Such blocks may be incorrectly treated as empty (even though they may
have non-erase OOB). Warn about it so people may start useing
--skip-all-ffs .

Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
nand-utils/nandwrite.c

index e8a210c44c5e1deaf68187982b858af3b9ede1de..cd53a178375786f820c6fc0c0baacf00ef2cf139 100644 (file)
@@ -280,6 +280,7 @@ int main(int argc, char * const argv[])
        libmtd_t mtd_desc;
        int ebsize_aligned;
        uint8_t write_mode;
+       size_t all_ffs_cnt = 0;
 
        process_options(argc, argv);
 
@@ -417,6 +418,8 @@ int main(int argc, char * const argv[])
         */
        while ((imglen > 0 || writebuf < filebuf + filebuf_len)
                && mtdoffset < mtd.size) {
+               bool allffs;
+
                /*
                 * New eraseblock, check for bad block(s)
                 * Stay in the loop to be sure that, if mtdoffset changes because
@@ -555,7 +558,8 @@ int main(int argc, char * const argv[])
                }
 
                ret = 0;
-               if (!skipallffs || !buffer_check_pattern(writebuf, mtd.min_io_size, 0xff)) {
+               allffs = buffer_check_pattern(writebuf, mtd.min_io_size, 0xff);
+               if (!allffs || !skipallffs) {
                        /* Write out data */
                        ret = mtd_write(mtd_desc, &mtd, fd, mtdoffset / mtd.eb_size,
                                        mtdoffset % mtd.eb_size,
@@ -564,6 +568,8 @@ int main(int argc, char * const argv[])
                                        writeoob ? oobbuf : NULL,
                                        writeoob ? mtd.oob_size : 0,
                                        write_mode);
+                       if (!ret && allffs)
+                               all_ffs_cnt++;
                }
 
                if (ret) {
@@ -615,6 +621,11 @@ closeall:
                   || (writebuf < filebuf + filebuf_len))
                sys_errmsg_die("Data was only partially written due to error");
 
+       if (all_ffs_cnt) {
+               fprintf(stderr, "Written %zu blocks containing only 0xff bytes\n", all_ffs_cnt);
+               fprintf(stderr, "Those block may be incorrectly treated as empty!\n");
+       }
+
        /* Return happy */
        return EXIT_SUCCESS;
 }