diff mbox

RomFS MTD and NAND Flash with ECC (EUCLEAN).

Message ID BLU0-SMTP394611D4685CA5AE953006B8060@phx.gbl
State New, archived
Headers show

Commit Message

Bill Pringlemeir Sept. 16, 2011, 8:46 p.m. UTC
The macro ROMFS_MTD_READ seems to be passing on 'EUCLEAN' to the main
RomFs code which doesn't deal with this error code.  I think that the
'EUCLEAN' means that my 'mxc_nand' flash driver has performed error
correction.  I also see that most of the mtd tests change this error
code to mean zero.  So I think the RomFs MTD code needs something like
attached.  A large file allows md5sum, cp, etc with this patch.
Without, strace shows 'cp' getting an 'EIO' error and giving up.

Signed-off-by: Bill Pringlemeir <bpringle@sympatico.ca>

Comments

Artem Bityutskiy Sept. 19, 2011, 5:05 a.m. UTC | #1
On Fri, 2011-09-16 at 16:46 -0400, Bill Pringlemeir wrote:
>  #ifdef CONFIG_ROMFS_ON_MTD
> -#define ROMFS_MTD_READ(sb, ...) ((sb)->s_mtd->read((sb)->s_mtd, ##__VA_ARGS__))
> -
> +#define ROMFS_MTD_READ(sb, ...)                                        \
> +    ({ int res;                                                        \
> +        res = ((sb)->s_mtd->read((sb)->s_mtd, ##__VA_ARGS__)) == -EUCLEAN ? \
> +            0 : res; })                                                         

I do not think this is the most elegant way to handle this, but yes,
EUCLEAN is used nowadays to report about bit-flips, which are actually
not an error, more like an info that this eraseblock needs some
attention.

I am not sure MTD is the right subsystem for this patch, could you try
to send it to fs-devel / Al Viro instead?
Bill Pringlemeir Sept. 19, 2011, 8:19 p.m. UTC | #2
On 19 Sep 2011, dedekind1@gmail.com wrote:

On Fri, 2011-09-16 at 16:46 -0400, Bill Pringlemeir wrote:
>>  #ifdef CONFIG_ROMFS_ON_MTD
>> -#define ROMFS_MTD_READ(sb, ...) ((sb)->s_mtd->read((sb)->s_mtd, ##__VA_ARGS__))
>> -
>> +#define ROMFS_MTD_READ(sb, ...)                                        \
>> +    ({ int res;                                                        \
>> +        res = ((sb)->s_mtd->read((sb)->s_mtd, ##__VA_ARGS__)) == -EUCLEAN ? \
>> +            0 : res; })                                                         

> I do not think this is the most elegant way to handle this, but yes,
> EUCLEAN is used nowadays to report about bit-flips, which are actually
> not an error, more like an info that this eraseblock needs some
> attention.

Good.  Neither do I.  Sometimes code is better at describing a problem.

> I am not sure MTD is the right subsystem for this patch, could you try
> to send it to fs-devel / Al Viro instead?

I kind of thought it was not a good patch.  I will try to rework it.
Now, I am sure of 'EUCLEAN's meaning.  I also observe that my romfs
works fine with a NAND flash if the BLOCK device is used.

Currently the romfs code is making a decision based on...

   int romfs_dev_read(struct super_block *sb, unsigned long pos,
   ...
       if (sb->s_mtd)
          return romfs_mtd_read(sb, pos, buf, buflen);

The NAND flash will not map directly to a CPU memory space like a NOR
flash.  I *think* the main benefit of this MTD is for the non-MMU in
directly mapping files?  What is the benefit of using the MTD versus the
block device for NAND flash?  [I think that is not a fs-devel
question...].

Can we look at sb->s_mtd->type for 'MTD_NANDFLASH' (etc) and bind a vptr
in romfs_get_sb(), so that 'romfs_dev_*()' would actually be function
pointers.  Then NAND and NOR mtd's could both have a RomFS on the same
system.  Err that only makes sense if I can get an answer to the last
question.

Also, it is not the place of RomFs to be writing flash.  However, if
there is an EUCLEAN return code, is it worth a printk?

tia,
Bill Pringlemeir.
Artem Bityutskiy Sept. 20, 2011, 7:41 a.m. UTC | #3
On Mon, 2011-09-19 at 16:19 -0400, Bill Pringlemeir wrote:
> On 19 Sep 2011, dedekind1@gmail.com wrote:
> 
> On Fri, 2011-09-16 at 16:46 -0400, Bill Pringlemeir wrote:
> >>  #ifdef CONFIG_ROMFS_ON_MTD
> >> -#define ROMFS_MTD_READ(sb, ...) ((sb)->s_mtd->read((sb)->s_mtd, ##__VA_ARGS__))
> >> -
> >> +#define ROMFS_MTD_READ(sb, ...)                                        \
> >> +    ({ int res;                                                        \
> >> +        res = ((sb)->s_mtd->read((sb)->s_mtd, ##__VA_ARGS__)) == -EUCLEAN ? \
> >> +            0 : res; })                                                         
> 
> > I do not think this is the most elegant way to handle this, but yes,
> > EUCLEAN is used nowadays to report about bit-flips, which are actually
> > not an error, more like an info that this eraseblock needs some
> > attention.
> 
> Good.  Neither do I.  Sometimes code is better at describing a problem.
> 
> > I am not sure MTD is the right subsystem for this patch, could you try
> > to send it to fs-devel / Al Viro instead?
> 
> I kind of thought it was not a good patch. 

|I did not mean this patch is bad, on the opposite - it looks to be of
"similar style" as ROMFS. I just meant that this patch is for a
file-system, so most probably should go in via Al Viro. Feel free to put
me to CC when re-sending.

>  I will try to rework it.
> Now, I am sure of 'EUCLEAN's meaning.  I also observe that my romfs
> works fine with a NAND flash if the BLOCK device is used.
> 
> Currently the romfs code is making a decision based on...
> 
>    int romfs_dev_read(struct super_block *sb, unsigned long pos,
>    ...
>        if (sb->s_mtd)
>           return romfs_mtd_read(sb, pos, buf, buflen);
> 
> The NAND flash will not map directly to a CPU memory space like a NOR
> flash.  I *think* the main benefit of this MTD is for the non-MMU in
> directly mapping files?  What is the benefit of using the MTD versus the
> block device for NAND flash?  [I think that is not a fs-devel
> question...].

For R/O FS there is probably not much benefits, except of less layers ->
a bit faster.

> Also, it is not the place of RomFs to be writing flash.  However, if
> there is an EUCLEAN return code, is it worth a printk?

On the one hand, bit-flips happen very often in modern flashes, so if
you print a message on every bit-flip, you may have a lot of messages.

On the other hand, if you use RomFS on a modern flash, you are probably
doing wrong thing because it is unable to handle bit-flips. You should
rather use it on top of UBI. So printing messages is good, because it
would make the user to start thinking about an issue.

So I'd say, overall I think printing a warning is a good idea.
diff mbox

Patch

From 349cf90c20c7eabb6a9b215d68ea9c064e55460e Mon Sep 17 00:00:00 2001
From: Bill Pringlemeir <bpringle@sympatico.ca>
Date: Fri, 16 Sep 2011 16:29:41 -0400
Subject: [PATCH] Fix romfs when using an NAND flash MTD.

The code '-EUCLEAN' is returned when an NAND mtd has used ECC to
correct data.  This is fine for the reader of the RomFs and their
data is correct.
---
 fs/romfs/storage.c |    6 ++++--
 1 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/fs/romfs/storage.c b/fs/romfs/storage.c
index 71e2b4d..4105d1c 100644
--- a/fs/romfs/storage.c
+++ b/fs/romfs/storage.c
@@ -19,8 +19,10 @@ 
 #endif
 
 #ifdef CONFIG_ROMFS_ON_MTD
-#define ROMFS_MTD_READ(sb, ...) ((sb)->s_mtd->read((sb)->s_mtd, ##__VA_ARGS__))
-
+#define ROMFS_MTD_READ(sb, ...)                                        \
+    ({ int res;                                                        \
+        res = ((sb)->s_mtd->read((sb)->s_mtd, ##__VA_ARGS__)) == -EUCLEAN ? \
+            0 : res; })                                                         
 /*
  * read data from an romfs image on an MTD device
  */
-- 
1.7.0.4