[GIT PULL] logfs: bug fixes

Prasad Joshi prasadjoshi.linux at gmail.com
Wed Feb 1 12:26:55 EST 2012


On Wed, Feb 1, 2012 at 6:24 PM, Artem Bityutskiy
<artem.bityutskiy at linux.intel.com> wrote:
> From: Artem Bityutskiy <artem.bityutskiy at linux.intel.com>
> Date: Wed, 1 Feb 2012 11:50:07 +0200
> Subject: [PATCH] mtd: fix merge conflict resolution breakage
>
> This patch fixes merge conflict resolution breakage introduced by merge
> commit 'd3712b9dfcf44ca145cf87e7f4096fa2d923471a'.
>
> The commit changed 'mtd_can_have_bb()' function and made it always return
> zero, which is incorrect. Instead, we need it to return whether the
> underlying flash device can have bad eraseblocks or not. UBI needs this
> information because it affects how it handles the underlying flash.
> E.g., if the underlying flash is NOR, it cannot have bad blocks and any
> write or erase error is fatal, and all we can do is to switch to R/O
> mode. We do not need to reserve a pool of good eraseblocks for bad
> eraseblocks handling, and so on.
>
> This patch also removes 'mtd_can_have_bb()' invocations from Logfs
> to ensure correct Logfs behavior.
>
> I've tested that with this patch UBI works on top of NOR and NAND
> flashes emulated by mtdram and nandsim correspondingly.
>
> This patch is based on patch from Linus Torvalds.
>
> Signed-off-by: Artem Bityutskiy <artem.bityutskiy at linux.intel.com>


Acked-by: Prasad Joshi <prasadjoshi.linux at gmail.com>

> ---
>
> Linus, here is the emergency fix - basically your patch tested and
> and slightly modified. You should probably put yourself as the author.
>
> Also attached the patch for your convenience.
>
>  fs/logfs/dev_mtd.c      |    6 ------
>  include/linux/mtd/mtd.h |    2 +-
>  2 files changed, 1 insertions(+), 7 deletions(-)
>
> diff --git a/fs/logfs/dev_mtd.c b/fs/logfs/dev_mtd.c
> index e97404d..9c50144 100644
> --- a/fs/logfs/dev_mtd.c
> +++ b/fs/logfs/dev_mtd.c
> @@ -152,9 +152,6 @@ static struct page *logfs_mtd_find_first_sb(struct super_block *sb, u64 *ofs)
>        filler_t *filler = logfs_mtd_readpage;
>        struct mtd_info *mtd = super->s_mtd;
>
> -       if (!mtd_can_have_bb(mtd))
> -               return NULL;
> -
>        *ofs = 0;
>        while (mtd_block_isbad(mtd, *ofs)) {
>                *ofs += mtd->erasesize;
> @@ -172,9 +169,6 @@ static struct page *logfs_mtd_find_last_sb(struct super_block *sb, u64 *ofs)
>        filler_t *filler = logfs_mtd_readpage;
>        struct mtd_info *mtd = super->s_mtd;
>
> -       if (!mtd_can_have_bb(mtd))
> -               return NULL;
> -
>        *ofs = mtd->size - mtd->erasesize;
>        while (mtd_block_isbad(mtd, *ofs)) {
>                *ofs -= mtd->erasesize;
> diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h
> index c09020a..d43dc25 100644
> --- a/include/linux/mtd/mtd.h
> +++ b/include/linux/mtd/mtd.h
> @@ -487,7 +487,7 @@ static inline int mtd_has_oob(const struct mtd_info *mtd)
>
>  static inline int mtd_can_have_bb(const struct mtd_info *mtd)
>  {
> -       return 0;
> +       return !!mtd->block_isbad;
>  }
>
>        /* Kernel-side ioctl definitions */
> --
> 1.7.9



More information about the linux-mtd mailing list