oobavail size calculation error in nand_base.c

Park Jinyoung parkjy at mtekvision.com
Fri May 15 02:23:09 EDT 2009


I didn't realize that problem was patched, sorry.
And thanks for your reply.

Jinyoung Park

-----Original Message-----
From: vimal singh [mailto:vimalsingh at ti.com] 
Sent: Friday, May 15, 2009 2:37 PM
To: Park Jinyoung
Cc: tglx at linutronix.de; linux-mtd at lists.infradead.org
Subject: Re: oobavail size calculation error in nand_base.c

This issue is already noticed by Snehaprabha Narnakaje. And a patch is
already
sent to fix this by David Brownell.

http://lists.infradead.org/pipermail/linux-mtd/2009-April/025205.html


Sorry, last time I replied on wrong subject line... :)

---
Vimal

On Thu, May 14, 2009 at 1:58 PM, Jinyoung Park <parkjy at mtekvision.com>
wrote:
> Hello.
>
> I found error in nand_base.c.
> In nand_scan_tail() function, oobavail size calculation result is
> wrong as follow circumstances.
>    - Define nand_ecclayout using full oobfree array like below.
>        .oobfree = { {2, 6}, {11, 2}, {16, 8}, {27, 2}, {32, 8}, {43,
2},{48,
> 8}, {59, 2} }
>    - Using ARM EABI cross compiler when kernel compile also enable
> "Use the ARM EABI to compile the kernl" feature in kernel menuconfig.
>      I using ARM EABI compiler that codesourcery release
arm-2008q3-51.
>
> In this case, right oobavail size is 38 but result is too much
> value(e.g. 2703572308...). It's random.
> I think sometimes happen that after beyond oobfree array(oobfree[8])
> is not 0 when ARM EABI compilation.
> Below codes are my modified code. Please check...
>
> Thanks.
>
> diff --git a/drivers/mtd/nand/nand_base.c
b/drivers/mtd/nand/nand_base.c
> index 3d7ed43..abb5998 100644
> --- a/drivers/mtd/nand/nand_base.c
> +++ b/drivers/mtd/nand/nand_base.c
> @@ -2756,9 +2756,12 @@ int nand_scan_tail(struct mtd_info *mtd)
>        * the out of band area
>        */
>        chip->ecc.layout->oobavail = 0;
> -       for (i = 0; chip->ecc.layout->oobfree[i].length; i++)
> +       for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES; i++) {
> +       if (chip->ecc.layout->oobfree[i].length == 0)
> +               break;
>        chip->ecc.layout->oobavail +=
>                chip->ecc.layout->oobfree[i].length;
> +       }
>        mtd->oobavail = chip->ecc.layout->oobavail;
>
> ______________________________________________________
> Linux MTD discussion mailing list
> http://lists.infradead.org/mailman/listinfo/linux-mtd/
>







More information about the linux-mtd mailing list