Lines Matching refs:block_group

72 					  struct btrfs_block_group *block_group)
74 return &discard_ctl->discard_list[block_group->discard_index];
78 struct btrfs_block_group *block_group)
83 if (list_empty(&block_group->discard_list) ||
84 block_group->discard_index == BTRFS_DISCARD_INDEX_UNUSED) {
85 if (block_group->discard_index == BTRFS_DISCARD_INDEX_UNUSED)
86 block_group->discard_index = BTRFS_DISCARD_INDEX_START;
87 block_group->discard_eligible_time = (ktime_get_ns() +
89 block_group->discard_state = BTRFS_DISCARD_RESET_CURSOR;
92 list_move_tail(&block_group->discard_list,
93 get_discard_list(discard_ctl, block_group));
97 struct btrfs_block_group *block_group)
99 if (!btrfs_is_block_group_data_only(block_group))
103 __add_to_discard_list(discard_ctl, block_group);
108 struct btrfs_block_group *block_group)
117 list_del_init(&block_group->discard_list);
119 block_group->discard_index = BTRFS_DISCARD_INDEX_UNUSED;
120 block_group->discard_eligible_time = (ktime_get_ns() +
122 block_group->discard_state = BTRFS_DISCARD_RESET_CURSOR;
123 list_add_tail(&block_group->discard_list,
130 struct btrfs_block_group *block_group)
136 if (block_group == discard_ctl->block_group) {
138 discard_ctl->block_group = NULL;
141 block_group->discard_eligible_time = 0;
142 list_del_init(&block_group->discard_list);
150 * find_next_block_group - find block_group that's up next for discarding
154 * Iterate over the discard lists to find the next block_group up for
155 * discarding checking the discard_eligible_time of block_group.
161 struct btrfs_block_group *ret_block_group = NULL, *block_group;
168 block_group = list_first_entry(discard_list,
173 ret_block_group = block_group;
179 block_group->discard_eligible_time)
180 ret_block_group = block_group;
190 * @discard_state: the discard_state of the block_group after state management
191 * @discard_index: the discard_index of the block_group after state management
193 * This wraps find_next_block_group() and sets the block_group to be in use.
204 struct btrfs_block_group *block_group;
208 block_group = find_next_block_group(discard_ctl, now);
210 if (block_group && now >= block_group->discard_eligible_time) {
211 if (block_group->discard_index == BTRFS_DISCARD_INDEX_UNUSED &&
212 block_group->used != 0) {
213 if (btrfs_is_block_group_data_only(block_group))
214 __add_to_discard_list(discard_ctl, block_group);
216 list_del_init(&block_group->discard_list);
219 if (block_group->discard_state == BTRFS_DISCARD_RESET_CURSOR) {
220 block_group->discard_cursor = block_group->start;
221 block_group->discard_state = BTRFS_DISCARD_EXTENTS;
223 discard_ctl->block_group = block_group;
225 if (block_group) {
226 *discard_state = block_group->discard_state;
227 *discard_index = block_group->discard_index;
231 return block_group;
236 * @block_group: block group of interest
242 * by moving @block_group to the proper filter.
244 void btrfs_discard_check_filter(struct btrfs_block_group *block_group,
249 if (!block_group ||
250 !btrfs_test_opt(block_group->fs_info, DISCARD_ASYNC))
253 discard_ctl = &block_group->fs_info->discard_ctl;
255 if (block_group->discard_index > BTRFS_DISCARD_INDEX_START &&
256 bytes >= discard_minlen[block_group->discard_index - 1]) {
259 remove_from_discard_list(discard_ctl, block_group);
264 block_group->discard_index = i;
265 add_to_discard_list(discard_ctl, block_group);
275 * @block_group: block_group of interest
277 * Increment @block_group's discard_index. If it falls of the list, let it be.
281 struct btrfs_block_group *block_group)
283 block_group->discard_index++;
284 if (block_group->discard_index == BTRFS_NR_DISCARD_LISTS) {
285 block_group->discard_index = 1;
289 add_to_discard_list(discard_ctl, block_group);
293 * btrfs_discard_cancel_work - remove a block_group from the discard lists
295 * @block_group: block_group of interest
297 * This removes @block_group from the discard lists. If necessary, it waits on
301 struct btrfs_block_group *block_group)
303 if (remove_from_discard_list(discard_ctl, block_group)) {
312 * @block_group: block_group of interest
317 struct btrfs_block_group *block_group)
319 if (!block_group || !btrfs_test_opt(block_group->fs_info, DISCARD_ASYNC))
322 if (block_group->used == 0)
323 add_to_discard_unused_list(discard_ctl, block_group);
325 add_to_discard_list(discard_ctl, block_group);
334 struct btrfs_block_group *block_group;
341 block_group = find_next_block_group(discard_ctl, now);
342 if (block_group) {
363 if (now < block_group->discard_eligible_time) {
364 u64 bg_timeout = block_group->discard_eligible_time - now;
394 * btrfs_finish_discard_pass - determine next step of a block_group
396 * @block_group: block_group of interest
404 struct btrfs_block_group *block_group)
406 remove_from_discard_list(discard_ctl, block_group);
408 if (block_group->used == 0) {
409 if (btrfs_is_free_space_trimmed(block_group))
410 btrfs_mark_bg_unused(block_group);
412 add_to_discard_unused_list(discard_ctl, block_group);
414 btrfs_update_discard_index(discard_ctl, block_group);
422 * This finds the next block_group to start discarding and then discards a
429 struct btrfs_block_group *block_group;
438 block_group = peek_discard_list(discard_ctl, &discard_state,
440 if (!block_group || !btrfs_run_discard_work(discard_ctl))
442 if (now < block_group->discard_eligible_time) {
462 btrfs_trim_block_group_bitmaps(block_group, &trimmed,
463 block_group->discard_cursor,
464 btrfs_block_group_end(block_group),
468 btrfs_trim_block_group_extents(block_group, &trimmed,
469 block_group->discard_cursor,
470 btrfs_block_group_end(block_group),
477 /* Determine next steps for a block_group */
478 if (block_group->discard_cursor >= btrfs_block_group_end(block_group)) {
480 btrfs_finish_discard_pass(discard_ctl, block_group);
482 block_group->discard_cursor = block_group->start;
484 if (block_group->discard_state !=
486 block_group->discard_state =
493 discard_ctl->block_group = NULL;
571 * @block_group: block_group of interest
572 * @ctl: free_space_ctl of @block_group
578 void btrfs_discard_update_discardable(struct btrfs_block_group *block_group,
585 if (!block_group ||
586 !btrfs_test_opt(block_group->fs_info, DISCARD_ASYNC) ||
587 !btrfs_is_block_group_data_only(block_group))
590 discard_ctl = &block_group->fs_info->discard_ctl;
621 struct btrfs_block_group *block_group, *next;
625 list_for_each_entry_safe(block_group, next, &fs_info->unused_bgs,
627 list_del_init(&block_group->bg_list);
628 btrfs_put_block_group(block_group);
629 btrfs_discard_queue_work(&fs_info->discard_ctl, block_group);
646 struct btrfs_block_group *block_group, *next;
651 list_for_each_entry_safe(block_group, next,
654 list_del_init(&block_group->discard_list);
656 if (block_group->used == 0)
657 btrfs_mark_bg_unused(block_group);