[PATCH] Fix of broken state in CFI driver caused by FL_SHUTDOWN

Kevin Hao haokexin at gmail.com
Fri Apr 4 23:46:30 EDT 2008


Oh, my fault. Thanks for correction.

Thanks,
Kevin

On 4/4/08, Alexey Korolev <akorolev at infradead.org> wrote:
> Hi
>
>
>  CFI driver in 2.6.24 kernel is broken. Not so intensive read/write operations cause incomplete writes which lead to kernel panics in JFFS2.
>  We investigated the issue - it is caused by bug in FL_SHUTDOWN parsing code. Sometimes chip returns -EIO as if it is in FL_SHUTDOWN state when it should wait in FL_PONT (error in order of conditions).
>
> The following patch fixes the bug in state parsing code of CFI.
> Also I've added comments to notify developers if they want to add new case in future.
> Please include it.
>
> Signed-off-by: Alexey Korolev <akorolev at infradead.org>
> Reviewed-By: Joern Engel <joern at logfs.org>
>
> diff -aurpp a/drivers/mtd/chips/cfi_cmdset_0001.c b/drivers/mtd/chips/cfi_cmdset_0001.c
> --- a/drivers/mtd/chips/cfi_cmdset_0001.c       2008-02-11 08:51:11.000000000 +0300
> +++ b/drivers/mtd/chips/cfi_cmdset_0001.c       2008-04-04 15:50:47.000000000 +0400
> @@ -669,7 +669,7 @@ static int chip_ready (struct map_info *
>                        /* Someone else might have been playing with it. */
>                        return -EAGAIN;
>                }
> -
> +               /* Fall through */
>        case FL_READY:
>        case FL_CFI_QUERY:
>        case FL_JEDEC_QUERY:
> @@ -729,14 +729,14 @@ static int chip_ready (struct map_info *
>                chip->state = FL_READY;
>                return 0;
>
> +       case FL_SHUTDOWN:
> +               /* The machine is rebooting now,so no one can get chip anymore */
> +               return -EIO;
>        case FL_POINT:
>                /* Only if there's no operation suspended... */
>                if (mode == FL_READY && chip->oldstate == FL_READY)
>                        return 0;
> -
> -       case FL_SHUTDOWN:
> -               /* The machine is rebooting now,so no one can get chip anymore */
> -               return -EIO;
> +               /* Fall through */
>        default:
>        sleep:
>                set_current_state(TASK_UNINTERRUPTIBLE);
> -------------
> Thanks,
> Alexey
>
>



More information about the linux-mtd mailing list