From patchwork Tue Dec 6 08:29:24 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kees Trommel X-Patchwork-Id: 703057 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2001:1868:205::9]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3tXvwt4dwsz9sdn for ; Tue, 6 Dec 2016 19:31:26 +1100 (AEDT) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.85_2 #1 (Red Hat Linux)) id 1cEB8N-0005rX-TW; Tue, 06 Dec 2016 08:29:55 +0000 Received: from outbound01.mx-relay.com ([5.39.185.33] helo=outbound01-b.mx-relay.com) by bombadil.infradead.org with esmtps (Exim 4.85_2 #1 (Red Hat Linux)) id 1cEB8J-0005kf-C9 for linux-mtd@lists.infradead.org; Tue, 06 Dec 2016 08:29:53 +0000 X-ASG-Debug-ID: 1481012965-0b52e007e7bbda0001-6YE7NY Received: from [145.131.171.178] (rt171bb131-145-178.routit.net [145.131.171.178]) by outbound01-b.mx-relay.com with ESMTP id jIpWHPZIoKlGEGHF (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 06 Dec 2016 09:29:25 +0100 (CET) X-Barracuda-Envelope-From: ctrommel@aimvalley.nl X-Barracuda-Effective-Source-IP: rt171bb131-145-178.routit.net[145.131.171.178] X-Barracuda-Apparent-Source-IP: 145.131.171.178 Received: from localhost (localhost.localhost [127.0.0.1]) by router38.aimvalley.nl (Postfix) with ESMTP id 86F5F639F7; Tue, 6 Dec 2016 09:29:25 +0100 (CET) X-Virus-Scanned: by Endian Firewall X-Spam-Flag: NO X-Spam-Score: 0.5 X-Spam-Level: X-Spam-Status: No, score=0.5 tagged_above=-20 required=9 tests=[ALL_TRUSTED=-1, TOOMANYSPACES=1.5] autolearn=no X-Spam-CTCH-RefID: Received: from mail3.aimsys.nl (mail.aimsys.nl [10.10.0.114]) by router38.aimvalley.nl (Postfix) with ESMTPS id 6F9B1639F5; Tue, 6 Dec 2016 09:29:24 +0100 (CET) Received: from linvm302.aimsys.nl (linvm302.aimsys.nl [10.10.23.2]) by mail3.aimsys.nl (8.14.2/8.14.2) with ESMTP id uB68WNot023607; Tue, 6 Dec 2016 09:32:23 +0100 Subject: Re: Add --skip-all-ffs option to mtd-utils nandwrite To: David Oberhollenzer , linux-mtd@lists.infradead.org X-ASG-Orig-Subj: Re: Add --skip-all-ffs option to mtd-utils nandwrite References: <82cbfdbc-c79b-01b0-bc64-a4259d7a150e@aimvalley.nl> <16abefc9-61e8-3b0d-c44c-6d02764ec8e9@sigma-star.at> From: Kees Trommel Message-ID: <33437f45-d3e8-17ec-d5b0-0118d50ff6ec@aimvalley.nl> Date: Tue, 6 Dec 2016 09:29:24 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 MIME-Version: 1.0 In-Reply-To: <16abefc9-61e8-3b0d-c44c-6d02764ec8e9@sigma-star.at> X-Barracuda-Connect: rt171bb131-145-178.routit.net[145.131.171.178] X-Barracuda-Start-Time: 1481012965 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://172.16.1.143:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1496 X-Virus-Scanned: by bsmtpd at mx-relay.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using global scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=7.0 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.34966 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20161206_002951_809393_319778A7 X-CRM114-Status: GOOD ( 25.19 ) X-Spam-Score: -1.8 (-) X-Spam-Report: SpamAssassin version 3.4.0 on bombadil.infradead.org summary: Content analysis details: (-1.8 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.7 RCVD_IN_DNSWL_LOW RBL: Sender listed at http://www.dnswl.org/, low trust [5.39.185.33 listed in list.dnswl.org] -0.0 RCVD_IN_MSPIKE_H2 RBL: Average reputation (+2) [5.39.185.33 listed in wl.mailspike.net] 0.8 SPF_NEUTRAL SPF: sender does not match SPF record (neutral) -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org David, Attached a rebased patch file. Kees. On 12/05/16 20:13, David Oberhollenzer wrote: > Hi, > > > On 12/05/2016 05:14 PM, Kees Trommel wrote: >> 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. > Yes, that sounds reasonable. > >> 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. > Your patch looks good to me, however even after fixing the paths to nandwrite.c (the > source tree got restructured over a year ago, see commit 7d81790ced) it doesn't apply > to the current mtd-utils master branch. Could you please rebase your patch onto the > current mtd-utils master branch (git://git.infradead.org/mtd-utils.git) and resubmit it? > > > Thanks, > > David > > From 8bf3ad295aee71fdcee48fe462908503ac82ff95 Mon Sep 17 00:00:00 2001 From: Kees Trommel Date: Tue, 6 Dec 2016 09:21:19 +0100 Subject: [PATCH] skip-all-ff-pages-option Signed-off-by: Kees Trommel --- nand-utils/nandwrite.c | 41 ++++++++++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/nand-utils/nandwrite.c b/nand-utils/nandwrite.c index 1c00cdf..b376869 100644 --- a/nand-utils/nandwrite.c +++ b/nand-utils/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 0xff 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" @@ -92,6 +93,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 */ @@ -102,7 +104,7 @@ static void process_options(int argc, char * const argv[]) for (;;) { int option_index = 0; - static const char short_options[] = "hb:mnNoOpqs:aV"; + static const char short_options[] = "hb:mnNoOpqs:akV"; static const struct option long_options[] = { /* Order of these args with val==0 matters; see option_index. */ {"version", no_argument, 0, 'V'}, @@ -119,6 +121,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}, }; @@ -172,6 +175,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; @@ -230,6 +236,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; @@ -515,14 +523,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