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

Commit cf67582b authored by Chris Mason's avatar Chris Mason
Browse files

Btrfs: Fix duplicate ENOSPC checks in find_free_extent



find_free_extent would fail to wrap around to the start of the drive because
it was doing the enospc case checking twice in some cases, causing it
to return -ENOSPC early.

Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
parent d3c2fdcf
Loading
Loading
Loading
Loading
+4 −14
Original line number Diff line number Diff line
@@ -1111,20 +1111,9 @@ static int find_free_extent(struct btrfs_trans_handle *trans, struct btrfs_root
	btrfs_release_path(root, path);
	BUG_ON(ins->objectid < search_start);

	if (ins->objectid + num_blocks >= search_end) {
		if (full_scan) {
			ret = -ENOSPC;
			goto error;
		}
		search_start = orig_search_start;
		if (wrapped) {
			if (!full_scan)
				total_needed -= empty_size;
			full_scan = 1;
		} else
			wrapped = 1;
		goto new_group;
	}
	if (ins->objectid + num_blocks >= search_end)
		goto enospc;

	for (test_block = ins->objectid;
	     test_block < ins->objectid + num_blocks; test_block++) {
		if (test_radix_bit(&info->pinned_radix, test_block) ||
@@ -1149,6 +1138,7 @@ static int find_free_extent(struct btrfs_trans_handle *trans, struct btrfs_root

new_group:
	if (search_start + num_blocks >= search_end) {
enospc:
		search_start = orig_search_start;
		if (full_scan) {
			ret = -ENOSPC;