Commit c7d1d4ff authored by Filipe Manana's avatar Filipe Manana Committed by David Sterba
Browse files

btrfs: don't BUG() on unexpected delayed ref type in run_one_delayed_ref()



There is no need to BUG(), we can just return an error and log an error
message.

Reviewed-by: default avatarBoris Burkov <boris@bur.io>
Reviewed-by: default avatarQu Wenruo <wqu@suse.com>
Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 23d4f616
Loading
Loading
Loading
Loading
+12 −8
Original line number Diff line number Diff line
@@ -1761,32 +1761,36 @@ static int run_one_delayed_ref(struct btrfs_trans_handle *trans,
			       struct btrfs_delayed_extent_op *extent_op,
			       bool insert_reserved)
{
	struct btrfs_fs_info *fs_info = trans->fs_info;
	int ret = 0;

	if (TRANS_ABORTED(trans)) {
		if (insert_reserved) {
			btrfs_pin_extent(trans, node->bytenr, node->num_bytes);
			free_head_ref_squota_rsv(trans->fs_info, href);
			free_head_ref_squota_rsv(fs_info, href);
		}
		return 0;
	}

	if (node->type == BTRFS_TREE_BLOCK_REF_KEY ||
	    node->type == BTRFS_SHARED_BLOCK_REF_KEY)
	    node->type == BTRFS_SHARED_BLOCK_REF_KEY) {
		ret = run_delayed_tree_ref(trans, href, node, extent_op,
					   insert_reserved);
	else if (node->type == BTRFS_EXTENT_DATA_REF_KEY ||
		 node->type == BTRFS_SHARED_DATA_REF_KEY)
	} else if (node->type == BTRFS_EXTENT_DATA_REF_KEY ||
		   node->type == BTRFS_SHARED_DATA_REF_KEY) {
		ret = run_delayed_data_ref(trans, href, node, extent_op,
					   insert_reserved);
	else if (node->type == BTRFS_EXTENT_OWNER_REF_KEY)
	} else if (node->type == BTRFS_EXTENT_OWNER_REF_KEY) {
		ret = 0;
	else
		BUG();
	} else {
		ret = -EUCLEAN;
		btrfs_err(fs_info, "unexpected delayed ref node type: %u", node->type);
	}

	if (ret && insert_reserved)
		btrfs_pin_extent(trans, node->bytenr, node->num_bytes);
	if (ret < 0)
		btrfs_err(trans->fs_info,
		btrfs_err(fs_info,
"failed to run delayed ref for logical %llu num_bytes %llu type %u action %u ref_mod %d: %d",
			  node->bytenr, node->num_bytes, node->type,
			  node->action, node->ref_mod, ret);