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

Commit 2ed6d664 authored by Chris Mason's avatar Chris Mason
Browse files

Btrfs: Fix handling of space info full during allocations



When we fail to allocate a new block group, we should still do the
checks to make sure allocations try again with the minimum requested
allocation size.

This also fixes a deadlock that come from a missed down_read in
the chunk allocation failure handling.

Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
parent 6f3577bd
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -2301,9 +2301,9 @@ static int noinline find_free_extent(struct btrfs_trans_handle *trans,
				up_read(&space_info->groups_sem);
				ret = do_chunk_alloc(trans, root, num_bytes +
						     2 * 1024 * 1024, data, 1);
				if (ret < 0)
					break;
				down_read(&space_info->groups_sem);
				if (ret < 0)
					goto loop_check;
				head = &space_info->block_groups;
				/*
				 * we've allocated a new chunk, keep
@@ -2314,6 +2314,7 @@ static int noinline find_free_extent(struct btrfs_trans_handle *trans,
			} else if (!allowed_chunk_alloc) {
				space_info->force_alloc = 1;
			}
loop_check:
			if (keep_going) {
				cur = head->next;
				extra_loop = 0;