From patchwork Thu Jun 10 09:09:54 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Stanley.Miao" X-Patchwork-Id: 55168 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 4D7011007D5 for ; Thu, 10 Jun 2010 19:00:19 +1000 (EST) Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.72 #1 (Red Hat Linux)) id 1OMdaq-0004lA-3C; Thu, 10 Jun 2010 08:58:32 +0000 Received: from mail.windriver.com ([147.11.1.11]) by bombadil.infradead.org with esmtps (Exim 4.72 #1 (Red Hat Linux)) id 1OMdal-0004Zq-MM for linux-mtd@lists.infradead.org; Thu, 10 Jun 2010 08:58:28 +0000 Received: from ALA-MAIL03.corp.ad.wrs.com (ala-mail03 [147.11.57.144]) by mail.windriver.com (8.14.3/8.14.3) with ESMTP id o5A8wN6C018629; Thu, 10 Jun 2010 01:58:25 -0700 (PDT) Received: from ala-mail06.corp.ad.wrs.com ([147.11.57.147]) by ALA-MAIL03.corp.ad.wrs.com with Microsoft SMTPSVC(6.0.3790.1830); Thu, 10 Jun 2010 01:58:08 -0700 Received: from localhost.localdomain ([128.224.163.169]) by ala-mail06.corp.ad.wrs.com with Microsoft SMTPSVC(6.0.3790.1830); Thu, 10 Jun 2010 01:58:08 -0700 From: "Stanley.Miao" To: Artem.Bityutskiy@nokia.com Subject: [PATCH 3/3] Place the cleanmarker in OOB area according to the mode MTD_OOB_AUTO Date: Thu, 10 Jun 2010 17:09:54 +0800 Message-Id: <1276160994-7599-4-git-send-email-stanley.miao@windriver.com> X-Mailer: git-send-email 1.5.6.3 In-Reply-To: <1276160994-7599-3-git-send-email-stanley.miao@windriver.com> References: <1276160994-7599-1-git-send-email-stanley.miao@windriver.com> <1276160994-7599-2-git-send-email-stanley.miao@windriver.com> <1276160994-7599-3-git-send-email-stanley.miao@windriver.com> X-OriginalArrivalTime: 10 Jun 2010 08:58:08.0398 (UTC) FILETIME=[0BE88AE0:01CB087B] X-CRM114-Version: 20090807-BlameThorstenAndJenny ( TRE 0.7.6 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20100610_045827_904907_3D5E6F81 X-CRM114-Status: GOOD ( 21.08 ) X-Spam-Score: -0.7 (/) X-Spam-Report: SpamAssassin version 3.3.1 on bombadil.infradead.org summary: Content analysis details: (-0.7 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.7 RCVD_IN_DNSWL_LOW RBL: Sender listed at http://www.dnswl.org/, low trust [147.11.1.11 listed in list.dnswl.org] -0.0 T_RP_MATCHES_RCVD Envelope sender domain matches handover relay domain Cc: linux-mtd@lists.infradead.org X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: linux-mtd-bounces@lists.infradead.org Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org In the current linux kernel, Jffs2 writes the cleanmarker according to the mode MTD_OOB_AUTO, so modify the layout of the cleanmarker from MTD_OOB_PLACE to MTD_OOB_AUTO in flash_eraseall. Signed-off-by: Stanley.Miao --- flash_eraseall.c | 40 ++++++++++++++++++++++------------------ 1 files changed, 22 insertions(+), 18 deletions(-) diff --git a/flash_eraseall.c b/flash_eraseall.c index 4e2108b..f0f0371 100644 --- a/flash_eraseall.c +++ b/flash_eraseall.c @@ -34,7 +34,7 @@ #include #include #include -#include +#include #include "crc32.h" #include @@ -75,9 +75,11 @@ static int get_linux_version(void) int main (int argc, char *argv[]) { mtd_info_t meminfo; - int fd, clmpos = 0, clmlen = 8; + int fd; erase_info_t erase; int isNAND, bbtest = 1; + unsigned char oobbuf[128]; + memset(oobbuf, 0xFF, 128); process_options(argc, argv); @@ -98,11 +100,18 @@ int main (int argc, char *argv[]) if (jffs2) { cleanmarker.magic = cpu_to_je16 (JFFS2_MAGIC_BITMASK); cleanmarker.nodetype = cpu_to_je16 (JFFS2_NODETYPE_CLEANMARKER); - if (!isNAND) + if (!isNAND) { cleanmarker.totlen = cpu_to_je32 (sizeof (struct jffs2_unknown_node)); - else { + cleanmarker.hdr_crc = cpu_to_je32(crc32(0, &cleanmarker, \ + sizeof(struct jffs2_unknown_node) - 4)); + } else { + int already_read, num, i, start; struct nand_ecclayout ecclayout; + cleanmarker.totlen = cpu_to_je32(8); + cleanmarker.hdr_crc = cpu_to_je32(crc32(0, &cleanmarker, \ + sizeof(struct jffs2_unknown_node) - 4)); + memset(&ecclayout, 0, sizeof(ecclayout)); if (get_linux_version() > LINUX_VERSION(2, 6, 17)) { if (ioctl(fd, ECCGETLAYOUT, &ecclayout) != 0) { @@ -122,19 +131,14 @@ int main (int argc, char *argv[]) memcpy(&ecclayout.oobfree, &oi.oobfree, sizeof(oi.oobfree)); ecclayout.eccbytes = oi.eccbytes; } - - /* Get the position of the free bytes */ - if (!ecclayout.oobfree[0].length) { - fprintf(stderr, " Eeep. Autoplacement selected and no empty space in oob\n"); - return 1; + already_read = 0; + for (i = 0; (already_read < 8) && ecclayout.oobfree[i].length; i++) { + num = MIN(8 - already_read, ecclayout.oobfree[i].length); + start = ecclayout.oobfree[i].offset; + memcpy(oobbuf + start, (unsigned char *)&cleanmarker + already_read, num); + already_read += num; } - clmpos = ecclayout.oobfree[0].offset; - clmlen = ecclayout.oobfree[0].length; - if (clmlen > 8) - clmlen = 8; - cleanmarker.totlen = cpu_to_je32(8); } - cleanmarker.hdr_crc = cpu_to_je32 (crc32 (0, &cleanmarker, sizeof (struct jffs2_unknown_node) - 4)); } for (erase.start = 0; erase.start < meminfo.size; erase.start += meminfo.erasesize) { @@ -174,9 +178,9 @@ int main (int argc, char *argv[]) /* write cleanmarker */ if (isNAND) { struct mtd_oob_buf oob; - oob.ptr = (unsigned char *) &cleanmarker; - oob.start = erase.start + clmpos; - oob.length = clmlen; + oob.ptr = oobbuf; + oob.start = erase.start; + oob.length = meminfo.oobsize; if (ioctl (fd, MEMWRITEOOB, &oob) != 0) { fprintf(stderr, "\n%s: %s: MTD writeoob failure: %s\n", exe_name, mtd_device, strerror(errno)); continue;