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

Commit 92b8e897 authored by Mark Fasheh's avatar Mark Fasheh
Browse files

btrfs: Don't BUG_ON alloc_path errors in find_next_chunk



I also removed the BUG_ON from error return of find_next_chunk in
init_first_rw_device(). It turns out that the only caller of
init_first_rw_device() also BUGS on any nonzero return so no actual behavior
change has occurred here.

do_chunk_alloc() also needed an update since it calls btrfs_alloc_chunk()
which can now return -ENOMEM. Instead of setting space_info->full on any
error from btrfs_alloc_chunk() I catch and return every error value _except_
-ENOSPC. Thanks goes to Tsutomu Itoh for pointing that issue out.

Signed-off-by: default avatarMark Fasheh <mfasheh@suse.com>
parent 17e9f796
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -3277,6 +3277,9 @@ static int do_chunk_alloc(struct btrfs_trans_handle *trans,
	}

	ret = btrfs_alloc_chunk(trans, extent_root, flags);
	if (ret < 0 && ret != -ENOSPC)
		goto out;

	spin_lock(&space_info->lock);
	if (ret)
		space_info->full = 1;
@@ -3286,6 +3289,7 @@ static int do_chunk_alloc(struct btrfs_trans_handle *trans,
	space_info->force_alloc = CHUNK_ALLOC_NO_FORCE;
	space_info->chunk_alloc = 0;
	spin_unlock(&space_info->lock);
out:
	mutex_unlock(&extent_root->fs_info->chunk_mutex);
	return ret;
}
+4 −2
Original line number Diff line number Diff line
@@ -1037,7 +1037,8 @@ static noinline int find_next_chunk(struct btrfs_root *root,
	struct btrfs_key found_key;

	path = btrfs_alloc_path();
	BUG_ON(!path);
	if (!path)
		return -ENOMEM;

	key.objectid = objectid;
	key.offset = (u64)-1;
@@ -2663,7 +2664,8 @@ static noinline int init_first_rw_device(struct btrfs_trans_handle *trans,

	ret = find_next_chunk(fs_info->chunk_root,
			      BTRFS_FIRST_CHUNK_TREE_OBJECTID, &chunk_offset);
	BUG_ON(ret);
	if (ret)
		return ret;

	alloc_profile = BTRFS_BLOCK_GROUP_METADATA |
			(fs_info->metadata_alloc_profile &