From patchwork Thu Dec 2 13:23:51 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: UBIFS partition on NOR flash not mountable after power cut test X-Patchwork-Submitter: Anatolij Gustschin X-Patchwork-Id: 73966 Message-Id: <20101202142351.197abbde@wker> To: dedekind1@gmail.com Cc: linux-mtd@lists.infradead.org, Detlev Zundel Date: Thu, 2 Dec 2010 14:23:51 +0100 From: Anatolij Gustschin List-Id: Linux MTD discussion mailing list On Thu, 02 Dec 2010 14:18:45 +0200 Artem Bityutskiy wrote: > On Thu, 2010-12-02 at 10:57 +0100, Anatolij Gustschin wrote: > > UBIFS DBG (pid 1290): no_more_nodes: unexpected bad common header at 37:157472 > > UBIFS error (pid 1290): ubifs_recover_leb: bad node > > UBIFS error (pid 1290): ubifs_scanned_corruption: corruption at LEB 37:157472 > > UBIFS error (pid 1290): ubifs_scanned_corruption: first 8192 bytes from LEB 37:157472 > > 00000000: 31181006 270758c8 0c331500 00000000 ffffffff ffffffff ff4fffff f3428020 1...'.X..3...............O...B. > > But this looks exactly like you have 64-bit write-buffer, but UBIFS > c->min_io_unit is not 64, but it should be 64. Or you need a NOR hack to > force 8-bytes write-buffer. This looks exactly like I have a 16 byte write buffer. The first 16 bytes of the common header node have been written correctly but the remaining 8 bytes of the common header and then the 8 bytes of the data are corrupt. > > Are you sure you did not miss your NOR write-buffer hacks? I'm sure that the kernel running this test uses the modification in the CFI code as follows: bigger buffer. I'll check the actual size used in the CFI driver at runtime. Thanks, Anatolij diff --git a/drivers/mtd/chips/cfi_probe.c b/drivers/mtd/chips/cfi_probe.c index e63e674..9eb47b8 100644 --- a/drivers/mtd/chips/cfi_probe.c +++ b/drivers/mtd/chips/cfi_probe.c @@ -213,6 +213,12 @@ static int __xipram cfi_chip_setup(struct map_info *map, cfi->cfiq->InterfaceDesc = le16_to_cpu(cfi->cfiq->InterfaceDesc); cfi->cfiq->MaxBufWriteSize = le16_to_cpu(cfi->cfiq->MaxBufWriteSize); + /*printk("NOTE: change CFI MaxBufWriteSize from 2^%d to 2^%d\n",*/ + /*cfi->cfiq->MaxBufWriteSize, 3);*/ + if (cfi->cfiq->MaxBufWriteSize) { + cfi->cfiq->MaxBufWriteSize = 3; + } + But I'm not sure whether the CFI driver is really using 8 byte write buffer since the error pattern indicates the usage of a