summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorJosef Bacik <jbacik@fusionio.com>2013-04-24 22:38:50 +0200
committerJosef Bacik <jbacik@fusionio.com>2013-05-06 21:55:09 +0200
commit32b0253803bf8e384a37a70f2dfffb2056e7d087 (patch)
treeee17b31fdbb07bf94aea26a62d8099a396f5202a /fs
parentBtrfs: cleanup fs roots if we fail to mount (diff)
downloadlinux-32b0253803bf8e384a37a70f2dfffb2056e7d087.tar.xz
linux-32b0253803bf8e384a37a70f2dfffb2056e7d087.zip
Btrfs: don't panic if we're trying to drop too many refs
This is just obnoxious. Just print a message, abort the transaction, and return an error. Thanks, Signed-off-by: Josef Bacik <jbacik@fusionio.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/btrfs/extent-tree.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index 6526f1faf6c2..f8a5652b0c43 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -5596,7 +5596,13 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans,
}
refs = btrfs_extent_refs(leaf, ei);
- BUG_ON(refs < refs_to_drop);
+ if (refs < refs_to_drop) {
+ btrfs_err(info, "trying to drop %d refs but we only have %Lu "
+ "for bytenr %Lu\n", refs_to_drop, refs, bytenr);
+ ret = -EINVAL;
+ btrfs_abort_transaction(trans, extent_root, ret);
+ goto out;
+ }
refs -= refs_to_drop;
if (refs > 0) {