Patchwork MPC5200b jffs2 memcpy alignment problem

login
register
mail settings
Submitter Albrecht Dreß
Date June 30, 2012, 8:09 p.m.
Message ID <1341086991.2252.0@antares>
Download mbox | patch
Permalink /patch/168331/
State New
Headers show

Comments

Albrecht Dreß - June 30, 2012, 8:09 p.m.
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.
Stephan Gatzka - July 1, 2012, 6:47 a.m.
Hi Albrecht,

 > 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:

Thanks for your answer and yes, this patch will definitely work. But I 
want to have a solution in the mainline kernel, that's why I'm asking 
how to deal best with this problem.

Regards,

Stephan
Anatolij Gustschin - July 2, 2012, 10:21 a.m.
Hi Stephan,

On Sun, 01 Jul 2012 08:47:01 +0200
Stephan Gatzka <stephan@gatzka.org> wrote:

> Hi Albrecht,
> 
>  > 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:
> 
> Thanks for your answer and yes, this patch will definitely work. But I 
> want to have a solution in the mainline kernel, that's why I'm asking 
> how to deal best with this problem.

This problem has been discussed several times [1], [2], but wasn't
resolved yet. The clean solution suggested was to implement a custom
mapping driver [3].

Thanks,
Anatolij

[1] http://thread.gmane.org/gmane.linux.drivers.mtd/21521
[2] http://thread.gmane.org/gmane.linux.ports.ppc.embedded/36324
[3] http://thread.gmane.org/gmane.linux.ports.ppc.embedded/36324/focus=36608
Stephan Gatzka - July 2, 2012, 4:41 p.m.
Hi!

> This problem has been discussed several times [1], [2], but wasn't
> resolved yet. The clean solution suggested was to implement a custom
> mapping driver [3].

Then I'll do that. It doesn't look terribly complicated.

It would be helpful if someone can test the first version if it's available.

Regards,

Stephan

Patch

--- 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);