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 Original line Diff line number Diff line
@@ -1111,20 +1111,9 @@ check_pending:
	btrfs_release_path(root, path);
	btrfs_release_path(root, path);
	BUG_ON(ins->objectid < search_start);
	BUG_ON(ins->objectid < search_start);


	if (ins->objectid + num_blocks >= search_end) {
	if (ins->objectid + num_blocks >= search_end)
		if (full_scan) {
		goto enospc;
			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;
	}
	for (test_block = ins->objectid;
	for (test_block = ins->objectid;
	     test_block < ins->objectid + num_blocks; test_block++) {
	     test_block < ins->objectid + num_blocks; test_block++) {
		if (test_radix_bit(&info->pinned_radix, test_block) ||
		if (test_radix_bit(&info->pinned_radix, test_block) ||
@@ -1149,6 +1138,7 @@ check_pending:


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