Lines Matching refs:block_group

71 					  struct btrfs_block_group *block_group)
73 return &discard_ctl->discard_list[block_group->discard_index];
94 struct btrfs_block_group *block_group)
100 if (list_empty(&block_group->discard_list) ||
101 block_group->discard_index == BTRFS_DISCARD_INDEX_UNUSED) {
102 if (block_group->discard_index == BTRFS_DISCARD_INDEX_UNUSED)
103 block_group->discard_index = BTRFS_DISCARD_INDEX_START;
104 block_group->discard_eligible_time = (ktime_get_ns() +
106 block_group->discard_state = BTRFS_DISCARD_RESET_CURSOR;
108 if (list_empty(&block_group->discard_list))
109 btrfs_get_block_group(block_group);
111 list_move_tail(&block_group->discard_list,
112 get_discard_list(discard_ctl, block_group));
116 struct btrfs_block_group *block_group)
118 if (!btrfs_is_block_group_data_only(block_group))
122 __add_to_discard_list(discard_ctl, block_group);
127 struct btrfs_block_group *block_group)
133 queued = !list_empty(&block_group->discard_list);
140 list_del_init(&block_group->discard_list);
142 block_group->discard_index = BTRFS_DISCARD_INDEX_UNUSED;
143 block_group->discard_eligible_time = (ktime_get_ns() +
145 block_group->discard_state = BTRFS_DISCARD_RESET_CURSOR;
147 btrfs_get_block_group(block_group);
148 list_add_tail(&block_group->discard_list,
155 struct btrfs_block_group *block_group)
162 if (block_group == discard_ctl->block_group) {
164 discard_ctl->block_group = NULL;
167 block_group->discard_eligible_time = 0;
168 queued = !list_empty(&block_group->discard_list);
169 list_del_init(&block_group->discard_list);
177 btrfs_put_block_group(block_group);
185 * Find block_group that's up next for discarding.
190 * Iterate over the discard lists to find the next block_group up for
191 * discarding checking the discard_eligible_time of block_group.
197 struct btrfs_block_group *ret_block_group = NULL, *block_group;
204 block_group = list_first_entry(discard_list,
209 ret_block_group = block_group;
215 block_group->discard_eligible_time)
216 ret_block_group = block_group;
227 * @discard_state: the discard_state of the block_group after state management
228 * @discard_index: the discard_index of the block_group after state management
231 * Wrap find_next_block_group() and set the block_group to be in use.
242 struct btrfs_block_group *block_group;
246 block_group = find_next_block_group(discard_ctl, now);
248 if (block_group && now >= block_group->discard_eligible_time) {
249 if (block_group->discard_index == BTRFS_DISCARD_INDEX_UNUSED &&
250 block_group->used != 0) {
251 if (btrfs_is_block_group_data_only(block_group)) {
252 __add_to_discard_list(discard_ctl, block_group);
254 list_del_init(&block_group->discard_list);
255 btrfs_put_block_group(block_group);
259 if (block_group->discard_state == BTRFS_DISCARD_RESET_CURSOR) {
260 block_group->discard_cursor = block_group->start;
261 block_group->discard_state = BTRFS_DISCARD_EXTENTS;
263 discard_ctl->block_group = block_group;
265 if (block_group) {
266 *discard_state = block_group->discard_state;
267 *discard_index = block_group->discard_index;
271 return block_group;
277 * @block_group: block group of interest
283 * by moving @block_group to the proper filter.
285 void btrfs_discard_check_filter(struct btrfs_block_group *block_group,
290 if (!block_group ||
291 !btrfs_test_opt(block_group->fs_info, DISCARD_ASYNC))
294 discard_ctl = &block_group->fs_info->discard_ctl;
296 if (block_group->discard_index > BTRFS_DISCARD_INDEX_START &&
297 bytes >= discard_minlen[block_group->discard_index - 1]) {
300 remove_from_discard_list(discard_ctl, block_group);
305 block_group->discard_index = i;
306 add_to_discard_list(discard_ctl, block_group);
317 * @block_group: block_group of interest
319 * Increment @block_group's discard_index. If it falls of the list, let it be.
323 struct btrfs_block_group *block_group)
325 block_group->discard_index++;
326 if (block_group->discard_index == BTRFS_NR_DISCARD_LISTS) {
327 block_group->discard_index = 1;
331 add_to_discard_list(discard_ctl, block_group);
335 * Remove a block_group from the discard lists.
338 * @block_group: block_group of interest
340 * Remove @block_group from the discard lists. If necessary, wait on the
344 struct btrfs_block_group *block_group)
346 if (remove_from_discard_list(discard_ctl, block_group)) {
356 * @block_group: block_group of interest
361 struct btrfs_block_group *block_group)
363 if (!block_group || !btrfs_test_opt(block_group->fs_info, DISCARD_ASYNC))
366 if (block_group->used == 0)
367 add_to_discard_unused_list(discard_ctl, block_group);
369 add_to_discard_list(discard_ctl, block_group);
378 struct btrfs_block_group *block_group;
385 block_group = find_next_block_group(discard_ctl, now);
386 if (block_group) {
407 if (now < block_group->discard_eligible_time) {
408 u64 bg_timeout = block_group->discard_eligible_time - now;
448 * Determine next step of a block_group.
451 * @block_group: block_group of interest
459 struct btrfs_block_group *block_group)
461 remove_from_discard_list(discard_ctl, block_group);
463 if (block_group->used == 0) {
464 if (btrfs_is_free_space_trimmed(block_group))
465 btrfs_mark_bg_unused(block_group);
467 add_to_discard_unused_list(discard_ctl, block_group);
469 btrfs_update_discard_index(discard_ctl, block_group);
478 * Find the next block_group to start discarding and then discard a single
485 struct btrfs_block_group *block_group;
494 block_group = peek_discard_list(discard_ctl, &discard_state,
496 if (!block_group || !btrfs_run_discard_work(discard_ctl))
498 if (now < block_group->discard_eligible_time) {
518 btrfs_trim_block_group_bitmaps(block_group, &trimmed,
519 block_group->discard_cursor,
520 btrfs_block_group_end(block_group),
524 btrfs_trim_block_group_extents(block_group, &trimmed,
525 block_group->discard_cursor,
526 btrfs_block_group_end(block_group),
531 /* Determine next steps for a block_group */
532 if (block_group->discard_cursor >= btrfs_block_group_end(block_group)) {
534 btrfs_finish_discard_pass(discard_ctl, block_group);
536 block_group->discard_cursor = block_group->start;
538 if (block_group->discard_state !=
540 block_group->discard_state =
553 * still owned that reference. But we set the discard_ctl->block_group
555 * to deref the block_group.
557 if (discard_ctl->block_group == NULL)
558 btrfs_put_block_group(block_group);
559 discard_ctl->block_group = NULL;
630 * @block_group: block_group of interest
636 void btrfs_discard_update_discardable(struct btrfs_block_group *block_group)
643 if (!block_group ||
644 !btrfs_test_opt(block_group->fs_info, DISCARD_ASYNC) ||
645 !btrfs_is_block_group_data_only(block_group))
648 ctl = block_group->free_space_ctl;
649 discard_ctl = &block_group->fs_info->discard_ctl;
682 struct btrfs_block_group *block_group, *next;
686 list_for_each_entry_safe(block_group, next, &fs_info->unused_bgs,
688 list_del_init(&block_group->bg_list);
689 btrfs_discard_queue_work(&fs_info->discard_ctl, block_group);
694 btrfs_put_block_group(block_group);
712 struct btrfs_block_group *block_group, *next;
717 list_for_each_entry_safe(block_group, next,
720 list_del_init(&block_group->discard_list);
722 if (block_group->used == 0)
723 btrfs_mark_bg_unused(block_group);
725 btrfs_put_block_group(block_group);