Lines Matching defs:ffe_ctl
3504 * Return 0 means we have found a location and set ffe_ctl->found_offset.
3507 struct find_free_extent_ctl *ffe_ctl,
3511 struct btrfs_free_cluster *last_ptr = ffe_ctl->last_ptr;
3516 cluster_bg = btrfs_lock_cluster(bg, last_ptr, ffe_ctl->delalloc);
3520 !block_group_bits(cluster_bg, ffe_ctl->flags)))
3524 ffe_ctl->num_bytes, cluster_bg->start,
3525 &ffe_ctl->max_extent_size);
3529 trace_btrfs_reserve_extent_cluster(cluster_bg, ffe_ctl);
3531 ffe_ctl->found_offset = offset;
3548 if (ffe_ctl->loop >= LOOP_NO_EMPTY_SIZE && cluster_bg != bg) {
3550 btrfs_release_block_group(cluster_bg, ffe_ctl->delalloc);
3558 btrfs_release_block_group(cluster_bg, ffe_ctl->delalloc);
3561 if (ffe_ctl->loop >= LOOP_NO_EMPTY_SIZE) {
3567 ffe_ctl->empty_cluster + ffe_ctl->empty_size,
3569 ret = btrfs_find_space_cluster(bg, last_ptr, ffe_ctl->search_start,
3570 ffe_ctl->num_bytes, aligned_cluster);
3574 ffe_ctl->num_bytes, ffe_ctl->search_start,
3575 &ffe_ctl->max_extent_size);
3579 ffe_ctl->found_offset = offset;
3580 trace_btrfs_reserve_extent_cluster(bg, ffe_ctl);
3599 struct find_free_extent_ctl *ffe_ctl)
3601 struct btrfs_free_cluster *last_ptr = ffe_ctl->last_ptr;
3614 if (ffe_ctl->cached) {
3620 ffe_ctl->num_bytes + ffe_ctl->empty_cluster +
3621 ffe_ctl->empty_size) {
3622 ffe_ctl->total_free_space = max_t(u64,
3623 ffe_ctl->total_free_space,
3631 offset = btrfs_find_space_for_alloc(bg, ffe_ctl->search_start,
3632 ffe_ctl->num_bytes, ffe_ctl->empty_size,
3633 &ffe_ctl->max_extent_size);
3636 ffe_ctl->found_offset = offset;
3641 struct find_free_extent_ctl *ffe_ctl,
3647 if (ffe_ctl->last_ptr && ffe_ctl->use_cluster) {
3648 ret = find_free_extent_clustered(block_group, ffe_ctl, bg_ret);
3654 return find_free_extent_unclustered(block_group, ffe_ctl);
3679 struct find_free_extent_ctl *ffe_ctl,
3686 u64 num_bytes = ffe_ctl->num_bytes;
3702 if (log_bytenr && ((ffe_ctl->for_treelog && bytenr != log_bytenr) ||
3703 (!ffe_ctl->for_treelog && bytenr == log_bytenr)))
3716 ((ffe_ctl->for_data_reloc && bytenr != data_reloc_bytenr) ||
3717 (!ffe_ctl->for_data_reloc && bytenr == data_reloc_bytenr)))
3752 ASSERT(!ffe_ctl->for_treelog ||
3755 ASSERT(!ffe_ctl->for_data_reloc ||
3760 (!ffe_ctl->for_data_reloc &&
3770 if (ffe_ctl->for_treelog && !fs_info->treelog_bg &&
3780 if (ffe_ctl->for_data_reloc && !fs_info->data_reloc_bg &&
3789 if (ffe_ctl->max_extent_size < avail) {
3794 ffe_ctl->max_extent_size = avail;
3795 ffe_ctl->total_free_space = avail;
3801 if (ffe_ctl->for_treelog && !fs_info->treelog_bg)
3804 if (ffe_ctl->for_data_reloc) {
3825 ffe_ctl->found_offset = start + block_group->alloc_offset;
3836 ffe_ctl->search_start = ffe_ctl->found_offset;
3839 if (ret && ffe_ctl->for_treelog)
3841 if (ret && ffe_ctl->for_data_reloc)
3851 struct find_free_extent_ctl *ffe_ctl,
3854 switch (ffe_ctl->policy) {
3856 return do_allocation_clustered(block_group, ffe_ctl, bg_ret);
3858 return do_allocation_zoned(block_group, ffe_ctl, bg_ret);
3865 struct find_free_extent_ctl *ffe_ctl,
3868 switch (ffe_ctl->policy) {
3870 ffe_ctl->retry_uncached = false;
3880 ffe_ctl->index);
3884 static void found_extent_clustered(struct find_free_extent_ctl *ffe_ctl,
3887 struct btrfs_free_cluster *last_ptr = ffe_ctl->last_ptr;
3889 if (!ffe_ctl->use_cluster && last_ptr) {
3896 static void found_extent(struct find_free_extent_ctl *ffe_ctl,
3899 switch (ffe_ctl->policy) {
3901 found_extent_clustered(ffe_ctl, ins);
3912 struct find_free_extent_ctl *ffe_ctl)
3915 if (!(ffe_ctl->flags & BTRFS_BLOCK_GROUP_DATA))
3919 if (btrfs_can_activate_zone(fs_info->fs_devices, ffe_ctl->flags))
3929 if (ffe_ctl->flags & BTRFS_BLOCK_GROUP_DATA) {
3943 if (ffe_ctl->max_extent_size >= ffe_ctl->min_alloc_size)
3953 if (ffe_ctl->flags & BTRFS_BLOCK_GROUP_DATA)
3965 struct find_free_extent_ctl *ffe_ctl)
3967 switch (ffe_ctl->policy) {
3971 return can_allocate_chunk_zoned(fs_info, ffe_ctl);
3984 struct find_free_extent_ctl *ffe_ctl,
3990 if ((ffe_ctl->loop == LOOP_CACHING_NOWAIT) &&
3991 ffe_ctl->have_caching_bg && !ffe_ctl->orig_have_caching_bg)
3992 ffe_ctl->orig_have_caching_bg = true;
3995 found_extent(ffe_ctl, ins);
3999 if (ffe_ctl->loop >= LOOP_CACHING_WAIT && ffe_ctl->have_caching_bg)
4002 ffe_ctl->index++;
4003 if (ffe_ctl->index < BTRFS_NR_RAID_TYPES)
4007 if (ffe_ctl->loop < LOOP_NO_EMPTY_SIZE) {
4008 ffe_ctl->index = 0;
4014 if (ffe_ctl->loop == LOOP_CACHING_NOWAIT &&
4015 (!ffe_ctl->orig_have_caching_bg && full_search))
4016 ffe_ctl->loop++;
4017 ffe_ctl->loop++;
4019 if (ffe_ctl->loop == LOOP_ALLOC_CHUNK) {
4024 ret = can_allocate_chunk(fs_info, ffe_ctl);
4039 ret = btrfs_chunk_alloc(trans, ffe_ctl->flags,
4045 ffe_ctl->loop++;
4057 if (ffe_ctl->loop == LOOP_NO_EMPTY_SIZE) {
4058 if (ffe_ctl->policy != BTRFS_EXTENT_ALLOC_CLUSTERED)
4065 if (ffe_ctl->empty_size == 0 &&
4066 ffe_ctl->empty_cluster == 0)
4068 ffe_ctl->empty_size = 0;
4069 ffe_ctl->empty_cluster = 0;
4076 static bool find_free_extent_check_size_class(struct find_free_extent_ctl *ffe_ctl,
4079 if (ffe_ctl->policy == BTRFS_EXTENT_ALLOC_ZONED)
4083 if (ffe_ctl->loop >= LOOP_WRONG_SIZE_CLASS)
4085 if (ffe_ctl->loop >= LOOP_UNSET_SIZE_CLASS &&
4088 return ffe_ctl->size_class == bg->size_class;
4092 struct find_free_extent_ctl *ffe_ctl,
4109 ffe_ctl->num_bytes > space_info->max_extent_size) {
4114 ffe_ctl->use_cluster = false;
4119 ffe_ctl->last_ptr = fetch_cluster_info(fs_info, space_info,
4120 &ffe_ctl->empty_cluster);
4121 if (ffe_ctl->last_ptr) {
4122 struct btrfs_free_cluster *last_ptr = ffe_ctl->last_ptr;
4126 ffe_ctl->hint_byte = last_ptr->window_start;
4133 ffe_ctl->hint_byte = last_ptr->window_start;
4134 ffe_ctl->use_cluster = false;
4143 struct find_free_extent_ctl *ffe_ctl)
4145 if (ffe_ctl->for_treelog) {
4148 ffe_ctl->hint_byte = fs_info->treelog_bg;
4150 } else if (ffe_ctl->for_data_reloc) {
4153 ffe_ctl->hint_byte = fs_info->data_reloc_bg;
4155 } else if (ffe_ctl->flags & BTRFS_BLOCK_GROUP_DATA) {
4166 if (block_group_bits(block_group, ffe_ctl->flags) &&
4167 avail >= ffe_ctl->num_bytes) {
4168 ffe_ctl->hint_byte = block_group->start;
4179 struct find_free_extent_ctl *ffe_ctl,
4183 switch (ffe_ctl->policy) {
4185 return prepare_allocation_clustered(fs_info, ffe_ctl,
4188 return prepare_allocation_zoned(fs_info, ffe_ctl);
4221 struct find_free_extent_ctl *ffe_ctl)
4230 WARN_ON(ffe_ctl->num_bytes < fs_info->sectorsize);
4232 ffe_ctl->search_start = 0;
4234 ffe_ctl->empty_cluster = 0;
4235 ffe_ctl->last_ptr = NULL;
4236 ffe_ctl->use_cluster = true;
4237 ffe_ctl->have_caching_bg = false;
4238 ffe_ctl->orig_have_caching_bg = false;
4239 ffe_ctl->index = btrfs_bg_flags_to_raid_index(ffe_ctl->flags);
4240 ffe_ctl->loop = 0;
4241 ffe_ctl->retry_uncached = false;
4242 ffe_ctl->cached = 0;
4243 ffe_ctl->max_extent_size = 0;
4244 ffe_ctl->total_free_space = 0;
4245 ffe_ctl->found_offset = 0;
4246 ffe_ctl->policy = BTRFS_EXTENT_ALLOC_CLUSTERED;
4247 ffe_ctl->size_class = btrfs_calc_block_group_size_class(ffe_ctl->num_bytes);
4250 ffe_ctl->policy = BTRFS_EXTENT_ALLOC_ZONED;
4256 trace_find_free_extent(root, ffe_ctl);
4258 space_info = btrfs_find_space_info(fs_info, ffe_ctl->flags);
4260 btrfs_err(fs_info, "No space info for %llu", ffe_ctl->flags);
4264 ret = prepare_allocation(fs_info, ffe_ctl, space_info, ins);
4268 ffe_ctl->search_start = max(ffe_ctl->search_start,
4270 ffe_ctl->search_start = max(ffe_ctl->search_start, ffe_ctl->hint_byte);
4271 if (ffe_ctl->search_start == ffe_ctl->hint_byte) {
4273 ffe_ctl->search_start);
4281 if (block_group && block_group_bits(block_group, ffe_ctl->flags) &&
4295 ffe_ctl->index = btrfs_bg_flags_to_raid_index(
4298 ffe_ctl->delalloc);
4299 ffe_ctl->hinted = true;
4307 trace_find_free_extent_search_loop(root, ffe_ctl);
4308 ffe_ctl->have_caching_bg = false;
4309 if (ffe_ctl->index == btrfs_bg_flags_to_raid_index(ffe_ctl->flags) ||
4310 ffe_ctl->index == 0)
4314 &space_info->block_groups[ffe_ctl->index], list) {
4317 ffe_ctl->hinted = false;
4320 if (ffe_ctl->for_treelog)
4322 if (ffe_ctl->for_data_reloc)
4327 btrfs_grab_block_group(block_group, ffe_ctl->delalloc);
4328 ffe_ctl->search_start = block_group->start;
4335 if (!block_group_bits(block_group, ffe_ctl->flags)) {
4346 if ((ffe_ctl->flags & extra) && !(block_group->flags & extra))
4354 btrfs_release_block_group(block_group, ffe_ctl->delalloc);
4359 trace_find_free_extent_have_block_group(root, ffe_ctl, block_group);
4360 ffe_ctl->cached = btrfs_block_group_done(block_group);
4361 if (unlikely(!ffe_ctl->cached)) {
4362 ffe_ctl->have_caching_bg = true;
4387 if (!find_free_extent_check_size_class(ffe_ctl, block_group))
4391 ret = do_allocation(block_group, ffe_ctl, &bg_ret);
4396 btrfs_release_block_group(block_group, ffe_ctl->delalloc);
4401 ffe_ctl->search_start = round_up(ffe_ctl->found_offset,
4405 if (ffe_ctl->search_start + ffe_ctl->num_bytes >
4408 ffe_ctl->found_offset,
4409 ffe_ctl->num_bytes);
4413 if (ffe_ctl->found_offset < ffe_ctl->search_start)
4415 ffe_ctl->found_offset,
4416 ffe_ctl->search_start - ffe_ctl->found_offset);
4418 ret = btrfs_add_reserved_bytes(block_group, ffe_ctl->ram_bytes,
4419 ffe_ctl->num_bytes,
4420 ffe_ctl->delalloc,
4421 ffe_ctl->loop >= LOOP_WRONG_SIZE_CLASS);
4424 ffe_ctl->found_offset,
4425 ffe_ctl->num_bytes);
4431 ins->objectid = ffe_ctl->search_start;
4432 ins->offset = ffe_ctl->num_bytes;
4434 trace_btrfs_reserve_extent(block_group, ffe_ctl);
4435 btrfs_release_block_group(block_group, ffe_ctl->delalloc);
4438 if (!ffe_ctl->cached && ffe_ctl->loop > LOOP_CACHING_NOWAIT &&
4439 !ffe_ctl->retry_uncached) {
4440 ffe_ctl->retry_uncached = true;
4442 ffe_ctl->num_bytes +
4443 ffe_ctl->empty_cluster +
4444 ffe_ctl->empty_size);
4447 release_block_group(block_group, ffe_ctl, ffe_ctl->delalloc);
4452 ret = find_free_extent_update_loop(fs_info, ins, ffe_ctl, full_search);
4458 * Use ffe_ctl->total_free_space as fallback if we can't find
4461 if (!ffe_ctl->max_extent_size)
4462 ffe_ctl->max_extent_size = ffe_ctl->total_free_space;
4464 space_info->max_extent_size = ffe_ctl->max_extent_size;
4466 ins->offset = ffe_ctl->max_extent_size;
4524 struct find_free_extent_ctl ffe_ctl = {};
4535 ffe_ctl.ram_bytes = ram_bytes;
4536 ffe_ctl.num_bytes = num_bytes;
4537 ffe_ctl.min_alloc_size = min_alloc_size;
4538 ffe_ctl.empty_size = empty_size;
4539 ffe_ctl.flags = flags;
4540 ffe_ctl.delalloc = delalloc;
4541 ffe_ctl.hint_byte = hint_byte;
4542 ffe_ctl.for_treelog = for_treelog;
4543 ffe_ctl.for_data_reloc = for_data_reloc;
4545 ret = find_free_extent(root, ins, &ffe_ctl);