Logfs: Allow NULL block_isbad() methods
Joern Engel [Fri, 5 Aug 2011 09:09:55 +0000 (11:09 +0200)]
Not all mtd drivers define block_isbad().  Let's assume no bad blocks
instead of refusing to mount.

Signed-off-by: Joern Engel <joern@logfs.org>

fs/logfs/dev_mtd.c

index 339e17e..d054d7e 100644 (file)
@@ -150,14 +150,13 @@ static struct page *mtd_find_first_sb(struct super_block *sb, u64 *ofs)
        filler_t *filler = mtd_readpage;
        struct mtd_info *mtd = super->s_mtd;
 
-       if (!mtd->block_isbad)
-               return NULL;
-
        *ofs = 0;
-       while (mtd->block_isbad(mtd, *ofs)) {
-               *ofs += mtd->erasesize;
-               if (*ofs >= mtd->size)
-                       return NULL;
+       if (mtd->block_isbad) {
+               while (mtd->block_isbad(mtd, *ofs)) {
+                       *ofs += mtd->erasesize;
+                       if (*ofs >= mtd->size)
+                               return NULL;
+               }
        }
        BUG_ON(*ofs & ~PAGE_MASK);
        return read_cache_page(mapping, *ofs >> PAGE_SHIFT, filler, sb);
@@ -170,14 +169,13 @@ static struct page *mtd_find_last_sb(struct super_block *sb, u64 *ofs)
        filler_t *filler = mtd_readpage;
        struct mtd_info *mtd = super->s_mtd;
 
-       if (!mtd->block_isbad)
-               return NULL;
-
        *ofs = mtd->size - mtd->erasesize;
-       while (mtd->block_isbad(mtd, *ofs)) {
-               *ofs -= mtd->erasesize;
-               if (*ofs <= 0)
-                       return NULL;
+       if (mtd->block_isbad) {
+               while (mtd->block_isbad(mtd, *ofs)) {
+                       *ofs -= mtd->erasesize;
+                       if (*ofs <= 0)
+                               return NULL;
+               }
        }
        *ofs = *ofs + mtd->erasesize - 0x1000;
        BUG_ON(*ofs & ~PAGE_MASK);