From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail.windriver.com ([147.11.1.11]) by bombadil.infradead.org with esmtps (Exim 4.72 #1 (Red Hat Linux)) id 1ON0TV-0004cd-T3 for linux-mtd@lists.infradead.org; Fri, 11 Jun 2010 09:24:30 +0000 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: Fri, 11 Jun 2010 17:36:15 +0800 Message-Id: <1276248975-1822-4-git-send-email-stanley.miao@windriver.com> In-Reply-To: <1276248975-1822-3-git-send-email-stanley.miao@windriver.com> References: <1276248975-1822-1-git-send-email-stanley.miao@windriver.com> <1276248975-1822-2-git-send-email-stanley.miao@windriver.com> <1276248975-1822-3-git-send-email-stanley.miao@windriver.com> Cc: linux-mtd@lists.infradead.org List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , 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; -- 1.5.4.3