From: Kees Trommel <ctrommel@aimvalley.nl>
To: linux-mtd@lists.infradead.org
Subject: Add --skip-all-ffs option to mtd-utils nandwrite
Date: Mon, 5 Dec 2016 17:14:02 +0100 [thread overview]
Message-ID: <82cbfdbc-c79b-01b0-bc64-a4259d7a150e@aimvalley.nl> (raw)
[-- Attachment #1: Type: text/plain, Size: 881 bytes --]
All,
Would it be possible to add an option --skip-all-ffs option to mtd-utils
nandwrite?
With this option pages that contain only 0xFF bytes will be skipped and
not written to flash.
This option is useful when you want to write using nandwrite an UBI
image to NAND devices with a HW ECC. Without this option the OOB of a
page that is written with all 0xFFs is no longer erased because the HW
adds an non 0xFFs ECC to the OOB. If the data of the page contains only
0xFFs then UBI/UBIFS assumes that the page is erased and writes to it
without erasing the page first. This causes that a read of this page
fails with unrecoverable ECC errors and a subsequent corruption of the
UBIFS.
Attached is a patch file that adds the --skip-all-ffs option. A
nandwrite of UBI image with this option will be successful while it
fails without this option.
Regards,
Kees Trommel
[-- Attachment #2: 0001-skip-all-ff-pages-option.patch --]
[-- Type: text/x-patch, Size: 3222 bytes --]
>From f5dd8f13b45a37f0375f01a05a3ed41b39b50beb Mon Sep 17 00:00:00 2001
From: Kees Trommel <ctrommel@linvm302.aimsys.nl>
Date: Mon, 5 Dec 2016 16:37:11 +0100
Subject: [PATCH] skip-all-ff-pages-option
Signed-off-by: Kees Trommel <ctrommel@linvm302.aimsys.nl>
---
nandwrite.c | 41 ++++++++++++++++++++++++++++++++---------
1 file changed, 32 insertions(+), 9 deletions(-)
diff --git a/nandwrite.c b/nandwrite.c
index 9c3fe8f..722b1bd 100644
--- a/nandwrite.c
+++ b/nandwrite.c
@@ -49,6 +49,7 @@ static void display_help(int status)
"Writes to the specified MTD device.\n"
"\n"
" -a, --autoplace Use auto OOB layout\n"
+" -k, --skip-all-ffs Skip pages that contain only ff bytes\n"
" -m, --markbad Mark blocks bad if write fails\n"
" -n, --noecc Write without ecc\n"
" -N, --noskipbad Write without bad block skipping\n"
@@ -93,6 +94,7 @@ static bool onlyoob = false;
static bool markbad = false;
static bool noecc = false;
static bool autoplace = false;
+static bool skipallffs = false;
static bool noskipbad = false;
static bool pad = false;
static int blockalign = 1; /* default to using actual block size */
@@ -103,7 +105,7 @@ static void process_options(int argc, char * const argv[])
for (;;) {
int option_index = 0;
- static const char short_options[] = "hb:mnNoOpqs:a";
+ static const char short_options[] = "hb:mnNoOpqs:ak";
static const struct option long_options[] = {
/* Order of these args with val==0 matters; see option_index. */
{"version", no_argument, 0, 0},
@@ -120,6 +122,7 @@ static void process_options(int argc, char * const argv[])
{"quiet", no_argument, 0, 'q'},
{"start", required_argument, 0, 's'},
{"autoplace", no_argument, 0, 'a'},
+ {"skip-all-ffs", no_argument, 0, 'k'},
{0, 0, 0, 0},
};
@@ -173,6 +176,9 @@ static void process_options(int argc, char * const argv[])
case 'a':
autoplace = true;
break;
+ case 'k':
+ skipallffs = true;
+ break;
case 'h':
display_help(EXIT_SUCCESS);
break;
@@ -231,6 +237,8 @@ static void erase_buffer(void *buffer, size_t size)
*/
int main(int argc, char * const argv[])
{
+ int allffs;
+ int ii;
int fd = -1;
int ifd = -1;
int pagelen;
@@ -516,14 +524,29 @@ int main(int argc, char * const argv[])
}
}
- /* Write out data */
- ret = mtd_write(mtd_desc, &mtd, fd, mtdoffset / mtd.eb_size,
- mtdoffset % mtd.eb_size,
- onlyoob ? NULL : writebuf,
- onlyoob ? 0 : mtd.min_io_size,
- writeoob ? oobbuf : NULL,
- writeoob ? mtd.oob_size : 0,
- write_mode);
+ allffs = 0;
+ if (skipallffs)
+ {
+ for (ii = 0; ii < mtd.min_io_size; ii += sizeof(uint32_t))
+ {
+ if (*(uint32_t*)(writebuf + ii) != 0xffffffff)
+ break;
+ }
+ if (ii == mtd.min_io_size)
+ allffs = 1;
+ }
+ if (!allffs) {
+ /* Write out data */
+ ret = mtd_write(mtd_desc, &mtd, fd, mtdoffset / mtd.eb_size,
+ mtdoffset % mtd.eb_size,
+ onlyoob ? NULL : writebuf,
+ onlyoob ? 0 : mtd.min_io_size,
+ writeoob ? oobbuf : NULL,
+ writeoob ? mtd.oob_size : 0,
+ write_mode);
+ } else {
+ ret = 0;
+ }
if (ret) {
long long i;
if (errno != EIO) {
--
2.5.5
next reply other threads:[~2016-12-05 16:14 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-12-05 16:14 Kees Trommel [this message]
2016-12-05 19:13 ` Add --skip-all-ffs option to mtd-utils nandwrite David Oberhollenzer
2016-12-06 8:29 ` Kees Trommel
2016-12-06 13:19 ` David Oberhollenzer
2016-12-07 5:01 ` Marek Vasut
2016-12-07 8:21 ` David Oberhollenzer
2016-12-07 14:09 ` Marek Vasut
2016-12-07 16:07 ` Boris Brezillon
2016-12-07 16:31 ` Marek Vasut
2016-12-07 16:59 ` Boris Brezillon
2016-12-08 4:14 ` Marek Vasut
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=82cbfdbc-c79b-01b0-bc64-a4259d7a150e@aimvalley.nl \
--to=ctrommel@aimvalley.nl \
--cc=linux-mtd@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox