Btrfs: deal with bad mappings in btrfs_map_block
authorJosef Bacik <jbacik@fusionio.com>
Sat, 20 Apr 2013 03:45:33 +0000 (23:45 -0400)
committerJosef Bacik <jbacik@fusionio.com>
Mon, 6 May 2013 19:55:02 +0000 (15:55 -0400)
Martin Steigerwald reported a BUG_ON() in btrfs_map_block where we didn't find
a chunk for a particular block we were trying to map.  This happened because the
block was bogus.  We shouldn't be BUG_ON()'ing in this case, just print a
message and return an error.  This came from reada_add_block and it appears to
deal with an error fine so we should be good there.  Thanks,

Reported-by: Martin Steigerwald <Martin@lichtvoll.de>
Signed-off-by: Josef Bacik <jbacik@fusionio.com>
fs/btrfs/volumes.c

index 76ded9eb77a7ba7ae467ca3911ddbc9d5e1857a8..c8a315d4b86ff9725e92b8f3bcc4d14dd7578657 100644 (file)
@@ -4406,10 +4406,16 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw,
                btrfs_crit(fs_info, "unable to find logical %llu len %llu",
                        (unsigned long long)logical,
                        (unsigned long long)*length);
-               BUG();
+               return -EINVAL;
+       }
+
+       if (em->start > logical || em->start + em->len < logical) {
+               btrfs_crit(fs_info, "found a bad mapping, wanted %Lu, "
+                          "found %Lu-%Lu\n", logical, em->start,
+                          em->start + em->len);
+               return -EINVAL;
        }
 
-       BUG_ON(em->start > logical || em->start + em->len < logical);
        map = (struct map_lookup *)em->bdev;
        offset = logical - em->start;