Lines Matching defs:ffe_ctl

3551  * Return 0 means we have found a location and set ffe_ctl->found_offset.
3554 struct find_free_extent_ctl *ffe_ctl,
3558 struct btrfs_free_cluster *last_ptr = ffe_ctl->last_ptr;
3563 cluster_bg = btrfs_lock_cluster(bg, last_ptr, ffe_ctl->delalloc);
3567 !block_group_bits(cluster_bg, ffe_ctl->flags)))
3571 ffe_ctl->num_bytes, cluster_bg->start,
3572 &ffe_ctl->max_extent_size);
3577 ffe_ctl->search_start, ffe_ctl->num_bytes);
3579 ffe_ctl->found_offset = offset;
3596 if (ffe_ctl->loop >= LOOP_NO_EMPTY_SIZE && cluster_bg != bg) {
3598 btrfs_release_block_group(cluster_bg, ffe_ctl->delalloc);
3606 btrfs_release_block_group(cluster_bg, ffe_ctl->delalloc);
3609 if (ffe_ctl->loop >= LOOP_NO_EMPTY_SIZE) {
3615 ffe_ctl->empty_cluster + ffe_ctl->empty_size,
3617 ret = btrfs_find_space_cluster(bg, last_ptr, ffe_ctl->search_start,
3618 ffe_ctl->num_bytes, aligned_cluster);
3622 ffe_ctl->num_bytes, ffe_ctl->search_start,
3623 &ffe_ctl->max_extent_size);
3628 ffe_ctl->search_start,
3629 ffe_ctl->num_bytes);
3630 ffe_ctl->found_offset = offset;
3633 } else if (!ffe_ctl->cached && ffe_ctl->loop > LOOP_CACHING_NOWAIT &&
3634 !ffe_ctl->retry_clustered) {
3637 ffe_ctl->retry_clustered = true;
3638 btrfs_wait_block_group_cache_progress(bg, ffe_ctl->num_bytes +
3639 ffe_ctl->empty_cluster + ffe_ctl->empty_size);
3658 struct find_free_extent_ctl *ffe_ctl)
3660 struct btrfs_free_cluster *last_ptr = ffe_ctl->last_ptr;
3673 if (ffe_ctl->cached) {
3679 ffe_ctl->num_bytes + ffe_ctl->empty_cluster +
3680 ffe_ctl->empty_size) {
3681 ffe_ctl->total_free_space = max_t(u64,
3682 ffe_ctl->total_free_space,
3690 offset = btrfs_find_space_for_alloc(bg, ffe_ctl->search_start,
3691 ffe_ctl->num_bytes, ffe_ctl->empty_size,
3692 &ffe_ctl->max_extent_size);
3703 if (!offset && !ffe_ctl->retry_unclustered && !ffe_ctl->cached &&
3704 ffe_ctl->loop > LOOP_CACHING_NOWAIT) {
3705 btrfs_wait_block_group_cache_progress(bg, ffe_ctl->num_bytes +
3706 ffe_ctl->empty_size);
3707 ffe_ctl->retry_unclustered = true;
3712 ffe_ctl->found_offset = offset;
3717 struct find_free_extent_ctl *ffe_ctl,
3723 if (ffe_ctl->last_ptr && ffe_ctl->use_cluster) {
3724 ret = find_free_extent_clustered(block_group, ffe_ctl, bg_ret);
3730 return find_free_extent_unclustered(block_group, ffe_ctl);
3734 struct find_free_extent_ctl *ffe_ctl,
3737 switch (ffe_ctl->policy) {
3739 return do_allocation_clustered(block_group, ffe_ctl, bg_ret);
3746 struct find_free_extent_ctl *ffe_ctl,
3749 switch (ffe_ctl->policy) {
3751 ffe_ctl->retry_clustered = false;
3752 ffe_ctl->retry_unclustered = false;
3759 ffe_ctl->index);
3763 static void found_extent_clustered(struct find_free_extent_ctl *ffe_ctl,
3766 struct btrfs_free_cluster *last_ptr = ffe_ctl->last_ptr;
3768 if (!ffe_ctl->use_cluster && last_ptr) {
3775 static void found_extent(struct find_free_extent_ctl *ffe_ctl,
3778 switch (ffe_ctl->policy) {
3780 found_extent_clustered(ffe_ctl, ins);
3787 static int chunk_allocation_failed(struct find_free_extent_ctl *ffe_ctl)
3789 switch (ffe_ctl->policy) {
3795 ffe_ctl->loop = LOOP_NO_EMPTY_SIZE;
3809 struct find_free_extent_ctl *ffe_ctl,
3815 if ((ffe_ctl->loop == LOOP_CACHING_NOWAIT) &&
3816 ffe_ctl->have_caching_bg && !ffe_ctl->orig_have_caching_bg)
3817 ffe_ctl->orig_have_caching_bg = true;
3819 if (!ins->objectid && ffe_ctl->loop >= LOOP_CACHING_WAIT &&
3820 ffe_ctl->have_caching_bg)
3823 if (!ins->objectid && ++(ffe_ctl->index) < BTRFS_NR_RAID_TYPES)
3827 found_extent(ffe_ctl, ins);
3839 if (ffe_ctl->loop < LOOP_NO_EMPTY_SIZE) {
3840 ffe_ctl->index = 0;
3841 if (ffe_ctl->loop == LOOP_CACHING_NOWAIT) {
3847 if (ffe_ctl->orig_have_caching_bg || !full_search)
3848 ffe_ctl->loop = LOOP_CACHING_WAIT;
3850 ffe_ctl->loop = LOOP_ALLOC_CHUNK;
3852 ffe_ctl->loop++;
3855 if (ffe_ctl->loop == LOOP_ALLOC_CHUNK) {
3870 ret = btrfs_chunk_alloc(trans, ffe_ctl->flags,
3875 ret = chunk_allocation_failed(ffe_ctl);
3886 if (ffe_ctl->loop == LOOP_NO_EMPTY_SIZE) {
3887 if (ffe_ctl->policy != BTRFS_EXTENT_ALLOC_CLUSTERED)
3894 if (ffe_ctl->empty_size == 0 &&
3895 ffe_ctl->empty_cluster == 0)
3897 ffe_ctl->empty_size = 0;
3898 ffe_ctl->empty_cluster = 0;
3906 struct find_free_extent_ctl *ffe_ctl,
3923 ffe_ctl->num_bytes > space_info->max_extent_size) {
3928 ffe_ctl->use_cluster = false;
3933 ffe_ctl->last_ptr = fetch_cluster_info(fs_info, space_info,
3934 &ffe_ctl->empty_cluster);
3935 if (ffe_ctl->last_ptr) {
3936 struct btrfs_free_cluster *last_ptr = ffe_ctl->last_ptr;
3940 ffe_ctl->hint_byte = last_ptr->window_start;
3947 ffe_ctl->hint_byte = last_ptr->window_start;
3948 ffe_ctl->use_cluster = false;
3957 struct find_free_extent_ctl *ffe_ctl,
3961 switch (ffe_ctl->policy) {
3963 return prepare_allocation_clustered(fs_info, ffe_ctl,
4004 struct find_free_extent_ctl ffe_ctl = {0};
4010 ffe_ctl.num_bytes = num_bytes;
4011 ffe_ctl.empty_size = empty_size;
4012 ffe_ctl.flags = flags;
4013 ffe_ctl.search_start = 0;
4014 ffe_ctl.delalloc = delalloc;
4015 ffe_ctl.index = btrfs_bg_flags_to_raid_index(flags);
4016 ffe_ctl.have_caching_bg = false;
4017 ffe_ctl.orig_have_caching_bg = false;
4018 ffe_ctl.found_offset = 0;
4019 ffe_ctl.hint_byte = hint_byte_orig;
4020 ffe_ctl.policy = BTRFS_EXTENT_ALLOC_CLUSTERED;
4023 ffe_ctl.retry_clustered = false;
4024 ffe_ctl.retry_unclustered = false;
4025 ffe_ctl.last_ptr = NULL;
4026 ffe_ctl.use_cluster = true;
4040 ret = prepare_allocation(fs_info, &ffe_ctl, space_info, ins);
4044 ffe_ctl.search_start = max(ffe_ctl.search_start,
4046 ffe_ctl.search_start = max(ffe_ctl.search_start, ffe_ctl.hint_byte);
4047 if (ffe_ctl.search_start == ffe_ctl.hint_byte) {
4049 ffe_ctl.search_start);
4071 ffe_ctl.index = btrfs_bg_flags_to_raid_index(
4081 ffe_ctl.have_caching_bg = false;
4082 if (ffe_ctl.index == btrfs_bg_flags_to_raid_index(flags) ||
4083 ffe_ctl.index == 0)
4087 &space_info->block_groups[ffe_ctl.index], list) {
4095 ffe_ctl.search_start = block_group->start;
4126 ffe_ctl.cached = btrfs_block_group_done(block_group);
4127 if (unlikely(!ffe_ctl.cached)) {
4128 ffe_ctl.have_caching_bg = true;
4154 ret = do_allocation(block_group, &ffe_ctl, &bg_ret);
4167 ffe_ctl.search_start = round_up(ffe_ctl.found_offset,
4171 if (ffe_ctl.search_start + num_bytes >
4173 btrfs_add_free_space(block_group, ffe_ctl.found_offset,
4178 if (ffe_ctl.found_offset < ffe_ctl.search_start)
4179 btrfs_add_free_space(block_group, ffe_ctl.found_offset,
4180 ffe_ctl.search_start - ffe_ctl.found_offset);
4185 btrfs_add_free_space(block_group, ffe_ctl.found_offset,
4192 ins->objectid = ffe_ctl.search_start;
4195 trace_btrfs_reserve_extent(block_group, ffe_ctl.search_start,
4200 release_block_group(block_group, &ffe_ctl, delalloc);
4205 ret = find_free_extent_update_loop(fs_info, ins, &ffe_ctl, full_search);
4211 * Use ffe_ctl->total_free_space as fallback if we can't find
4214 if (!ffe_ctl.max_extent_size)
4215 ffe_ctl.max_extent_size = ffe_ctl.total_free_space;
4217 space_info->max_extent_size = ffe_ctl.max_extent_size;
4219 ins->offset = ffe_ctl.max_extent_size;