Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9bb91873 authored by Josef Bacik's avatar Josef Bacik
Browse files

Btrfs: deal with bad mappings in btrfs_map_block



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: default avatarMartin Steigerwald <Martin@lichtvoll.de>
Signed-off-by: default avatarJosef Bacik <jbacik@fusionio.com>
parent d4c7ca86
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -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;