btrfs-progs: exit gracefully when device extent allocation fails

Another BUG_ON() during fuzz/003:

  ====== RUN MAYFAIL btrfs check --repair tests/fuzz-tests/images/bko-199833-reloc-recovery-crash.raw.restored
  [1/7] checking root items
  Fixed 0 roots.
  [2/7] checking extents
  ctree.c:1650: leaf_space_used: Warning: assertion `data_len < 0` failed, value 1
  bad key ordering 18 19
  bad block 29409280
  ERROR: errors found in extent allocation tree or chunk allocation
  WARNING: minor unaligned/mismatch device size detected
  WARNING: recommended to use 'btrfs rescue fix-device-size' to fix it
  [3/7] checking free space cache
  [4/7] checking fs roots
  ctree.c:1650: leaf_space_used: Warning: assertion `data_len < 0` failed, value 1
  bad key ordering 18 19
  root 18446744073709551608 missing its root dir, recreating
  Unable to find block group for 0
  Unable to find block group for 0
  Unable to find block group for 0
  volumes.c:564: btrfs_alloc_dev_extent: BUG_ON `ret` triggered, value -28
  failed (ignored, ret=134): btrfs check --repair tests/fuzz-tests/images/bko-199833-reloc-recovery-crash.raw.restored
  mayfail: returned code 134 (SIGABRT), not ignored
  test failed for case 003-multi-check-unmounted

However the culprit function btrfs_alloc_dev_extent() has proper error
handling label err:, just using that label would solve the problem easily.

Signed-off-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
master
Qu Wenruo 2018-08-03 13:50:21 +08:00 committed by David Sterba
parent b02b426a78
commit 40073c3ca9
1 changed files with 2 additions and 1 deletions

View File

@ -561,7 +561,8 @@ static int btrfs_alloc_dev_extent(struct btrfs_trans_handle *trans,
key.type = BTRFS_DEV_EXTENT_KEY;
ret = btrfs_insert_empty_item(trans, root, path, &key,
sizeof(*extent));
BUG_ON(ret);
if (ret < 0)
goto err;
leaf = path->nodes[0];
extent = btrfs_item_ptr(leaf, path->slots[0],