Commit 50475cd5 authored by Naohiro Aota's avatar Naohiro Aota Committed by David Sterba

btrfs: add extent allocator hook to decide to allocate chunk or not

Introduce a new hook for an extent allocator policy. With the new
hook, a policy can decide to allocate a new block group or not. If
not, it will return -ENOSPC, so btrfs_reserve_extent() will cut the
allocation size in half and retry the allocation if min_alloc_size is
large enough.

The hook has a place holder and will be replaced with the real
implementation in the next patch.

CC: stable@vger.kernel.org # 5.16
Signed-off-by: default avatarNaohiro Aota <naohiro.aota@wdc.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 1ada69f6
...@@ -3974,6 +3974,19 @@ static void found_extent(struct find_free_extent_ctl *ffe_ctl, ...@@ -3974,6 +3974,19 @@ static void found_extent(struct find_free_extent_ctl *ffe_ctl,
} }
} }
static bool can_allocate_chunk(struct btrfs_fs_info *fs_info,
struct find_free_extent_ctl *ffe_ctl)
{
switch (ffe_ctl->policy) {
case BTRFS_EXTENT_ALLOC_CLUSTERED:
return true;
case BTRFS_EXTENT_ALLOC_ZONED:
return true;
default:
BUG();
}
}
static int chunk_allocation_failed(struct find_free_extent_ctl *ffe_ctl) static int chunk_allocation_failed(struct find_free_extent_ctl *ffe_ctl)
{ {
switch (ffe_ctl->policy) { switch (ffe_ctl->policy) {
...@@ -4061,6 +4074,10 @@ static int find_free_extent_update_loop(struct btrfs_fs_info *fs_info, ...@@ -4061,6 +4074,10 @@ static int find_free_extent_update_loop(struct btrfs_fs_info *fs_info,
struct btrfs_trans_handle *trans; struct btrfs_trans_handle *trans;
int exist = 0; int exist = 0;
/*Check if allocation policy allows to create a new chunk */
if (!can_allocate_chunk(fs_info, ffe_ctl))
return -ENOSPC;
trans = current->journal_info; trans = current->journal_info;
if (trans) if (trans)
exist = 1; exist = 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment