From patchwork Sat Jun 30 20:09:43 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: MPC5200b jffs2 memcpy alignment problem Date: Sat, 30 Jun 2012 10:09:43 -0000 From: =?utf-8?q?Albrecht_Dre=C3=9F?= X-Patchwork-Id: 168331 Message-Id: <1341086991.2252.0@antares> To: stephan@gatzka.org Cc: linuxppc-dev@lists.ozlabs.org, linux-mtd@lists.infradead.org Hi Stephan: Am 30.06.12 21:16 schrieb(en) Stephan Gatzka: > I have a problem running jffs2 on an MPC5200b board. I run kernel 3.4, but older kernels like 3.1.5 are also affected. Every time I mount jffs2, previously written content gets garbled. > > The problem was nailed down to memcpy(&fd->name, rd->name, checkedlen); in jffs2_scan_dirent_node in fs/jffs2/scan.c. [snip] > 2. use memcpy_fromio in the jffs2 code. memcpy_fromio behaves exactly in the way I described above. This could be also a good solution because flash access via LocalPlus bus is clearly IO. I don't recall who proposed this patch, but exactly this solution is around for a longer time (mayby you search archives...). On my board, I have a flash chip attached to the LocalBus in 16-bit mode. Based on 3.2.16, the patch is: ---8<---------------------------------------------------------------------------- ---8<---------------------------------------------------------------------------- Works perfectly with it... Hope this helps, Albrecht. --- linux-3.2.16-orig/fs/jffs2/scan.c 2012-04-23 00:31:32.000000000 +0200 +++ linux-3.2.16/fs/jffs2/scan.c 2012-04-27 13:23:06.000000000 +0200 @@ -509,7 +509,11 @@ sumptr = kmalloc(sumlen, GFP_KERNEL); if (!sumptr) return -ENOMEM; +#ifdef CONFIG_PPC_MPC52xx + memcpy_fromio(sumptr + sumlen - buf_len, buf + buf_size - buf_len, buf_len); +#else memcpy(sumptr + sumlen - buf_len, buf + buf_size - buf_len, buf_len); +#endif } if (buf_len < sumlen) { /* Need to read more so that the entire summary node is present */ @@ -1039,7 +1043,11 @@ if (!fd) { return -ENOMEM; } +#ifdef CONFIG_PPC_MPC52xx + memcpy_fromio(&fd->name, rd->name, checkedlen); +#else memcpy(&fd->name, rd->name, checkedlen); +#endif fd->name[checkedlen] = 0; crc = crc32(0, fd->name, rd->nsize);