Lines Matching refs:space_info

181 	struct list_head *head = &info->space_info;  in btrfs_clear_space_info_full()
219 void btrfs_update_space_info_chunk_size(struct btrfs_space_info *space_info, in btrfs_update_space_info_chunk_size() argument
222 WRITE_ONCE(space_info->chunk_size, chunk_size); in btrfs_update_space_info_chunk_size()
228 struct btrfs_space_info *space_info; in create_space_info() local
232 space_info = kzalloc(sizeof(*space_info), GFP_NOFS); in create_space_info()
233 if (!space_info) in create_space_info()
237 INIT_LIST_HEAD(&space_info->block_groups[i]); in create_space_info()
238 init_rwsem(&space_info->groups_sem); in create_space_info()
239 spin_lock_init(&space_info->lock); in create_space_info()
240 space_info->flags = flags & BTRFS_BLOCK_GROUP_TYPE_MASK; in create_space_info()
241 space_info->force_alloc = CHUNK_ALLOC_NO_FORCE; in create_space_info()
242 INIT_LIST_HEAD(&space_info->ro_bgs); in create_space_info()
243 INIT_LIST_HEAD(&space_info->tickets); in create_space_info()
244 INIT_LIST_HEAD(&space_info->priority_tickets); in create_space_info()
245 space_info->clamp = 1; in create_space_info()
246 btrfs_update_space_info_chunk_size(space_info, calc_chunk_size(info, flags)); in create_space_info()
249 space_info->bg_reclaim_threshold = BTRFS_DEFAULT_ZONED_RECLAIM_THRESH; in create_space_info()
251 ret = btrfs_sysfs_add_space_info_type(info, space_info); in create_space_info()
255 list_add(&space_info->list, &info->space_info); in create_space_info()
257 info->data_sinfo = space_info; in create_space_info()
323 block_group->space_info = found; in btrfs_add_bg_to_space_info()
334 struct list_head *head = &info->space_info; in btrfs_find_space_info()
347 struct btrfs_space_info *space_info, in calc_available_free_space() argument
354 if (space_info->flags & BTRFS_BLOCK_GROUP_SYSTEM) in calc_available_free_space()
383 struct btrfs_space_info *space_info) in writable_total_bytes() argument
392 if (!btrfs_is_zoned(fs_info) || (space_info->flags & BTRFS_BLOCK_GROUP_DATA)) in writable_total_bytes()
393 return space_info->total_bytes; in writable_total_bytes()
395 return space_info->active_total_bytes; in writable_total_bytes()
399 struct btrfs_space_info *space_info, u64 bytes, in btrfs_can_overcommit() argument
406 if (space_info->flags & BTRFS_BLOCK_GROUP_DATA) in btrfs_can_overcommit()
409 used = btrfs_space_info_used(space_info, true); in btrfs_can_overcommit()
411 (space_info->flags & BTRFS_BLOCK_GROUP_METADATA)) in btrfs_can_overcommit()
414 avail = calc_available_free_space(fs_info, space_info, flush); in btrfs_can_overcommit()
416 if (used + bytes < writable_total_bytes(fs_info, space_info) + avail) in btrfs_can_overcommit()
421 static void remove_ticket(struct btrfs_space_info *space_info, in remove_ticket() argument
426 ASSERT(space_info->reclaim_size >= ticket->bytes); in remove_ticket()
427 space_info->reclaim_size -= ticket->bytes; in remove_ticket()
436 struct btrfs_space_info *space_info) in btrfs_try_granting_tickets() argument
441 lockdep_assert_held(&space_info->lock); in btrfs_try_granting_tickets()
443 head = &space_info->priority_tickets; in btrfs_try_granting_tickets()
447 u64 used = btrfs_space_info_used(space_info, true); in btrfs_try_granting_tickets()
452 if ((used + ticket->bytes <= writable_total_bytes(fs_info, space_info)) || in btrfs_try_granting_tickets()
453 btrfs_can_overcommit(fs_info, space_info, ticket->bytes, in btrfs_try_granting_tickets()
456 space_info, in btrfs_try_granting_tickets()
458 remove_ticket(space_info, ticket); in btrfs_try_granting_tickets()
460 space_info->tickets_id++; in btrfs_try_granting_tickets()
467 if (head == &space_info->priority_tickets) { in btrfs_try_granting_tickets()
468 head = &space_info->tickets; in btrfs_try_granting_tickets()
483 static const char *space_info_flag_to_str(const struct btrfs_space_info *space_info) in space_info_flag_to_str() argument
485 switch (space_info->flags) { in space_info_flag_to_str()
577 struct btrfs_space_info *space_info, in shrink_delalloc() argument
687 spin_lock(&space_info->lock); in shrink_delalloc()
688 if (list_empty(&space_info->tickets) && in shrink_delalloc()
689 list_empty(&space_info->priority_tickets)) { in shrink_delalloc()
690 spin_unlock(&space_info->lock); in shrink_delalloc()
693 spin_unlock(&space_info->lock); in shrink_delalloc()
708 struct btrfs_space_info *space_info, u64 num_bytes, in flush_space() argument
737 shrink_delalloc(fs_info, space_info, num_bytes, in flush_space()
762 ret = btrfs_zoned_activate_one_bg(fs_info, space_info, false); in flush_space()
774 btrfs_get_alloc_profile(fs_info, space_info->flags), in flush_space()
786 ret = btrfs_zoned_activate_one_bg(fs_info, space_info, true); in flush_space()
821 trace_btrfs_flush_space(fs_info, space_info->flags, num_bytes, state, in flush_space()
828 struct btrfs_space_info *space_info) in btrfs_calc_reclaim_metadata_size() argument
833 u64 to_reclaim = space_info->reclaim_size; in btrfs_calc_reclaim_metadata_size()
835 lockdep_assert_held(&space_info->lock); in btrfs_calc_reclaim_metadata_size()
837 avail = calc_available_free_space(fs_info, space_info, in btrfs_calc_reclaim_metadata_size()
839 used = btrfs_space_info_used(space_info, true); in btrfs_calc_reclaim_metadata_size()
847 total = writable_total_bytes(fs_info, space_info); in btrfs_calc_reclaim_metadata_size()
855 struct btrfs_space_info *space_info) in need_preemptive_reclaim() argument
859 u64 total = writable_total_bytes(fs_info, space_info); in need_preemptive_reclaim()
865 lockdep_assert_held(&space_info->lock); in need_preemptive_reclaim()
868 if ((space_info->bytes_used + space_info->bytes_reserved + in need_preemptive_reclaim()
872 used = space_info->bytes_may_use + space_info->bytes_pinned; in need_preemptive_reclaim()
890 if (space_info->reclaim_size) in need_preemptive_reclaim()
922 thresh = calc_available_free_space(fs_info, space_info, in need_preemptive_reclaim()
924 used = space_info->bytes_used + space_info->bytes_reserved + in need_preemptive_reclaim()
925 space_info->bytes_readonly + global_rsv_size; in need_preemptive_reclaim()
928 thresh >>= space_info->clamp; in need_preemptive_reclaim()
930 used = space_info->bytes_pinned; in need_preemptive_reclaim()
961 used += space_info->bytes_may_use - global_rsv_size; in need_preemptive_reclaim()
968 struct btrfs_space_info *space_info, in steal_from_global_rsv() argument
977 if (global_rsv->space_info != space_info) in steal_from_global_rsv()
987 remove_ticket(space_info, ticket); in steal_from_global_rsv()
990 space_info->tickets_id++; in steal_from_global_rsv()
1014 struct btrfs_space_info *space_info) in maybe_fail_all_tickets() argument
1017 u64 tickets_id = space_info->tickets_id; in maybe_fail_all_tickets()
1020 trace_btrfs_fail_all_tickets(fs_info, space_info); in maybe_fail_all_tickets()
1024 __btrfs_dump_space_info(fs_info, space_info); in maybe_fail_all_tickets()
1027 while (!list_empty(&space_info->tickets) && in maybe_fail_all_tickets()
1028 tickets_id == space_info->tickets_id) { in maybe_fail_all_tickets()
1029 ticket = list_first_entry(&space_info->tickets, in maybe_fail_all_tickets()
1032 if (!aborted && steal_from_global_rsv(fs_info, space_info, ticket)) in maybe_fail_all_tickets()
1039 remove_ticket(space_info, ticket); in maybe_fail_all_tickets()
1053 btrfs_try_granting_tickets(fs_info, space_info); in maybe_fail_all_tickets()
1055 return (tickets_id != space_info->tickets_id); in maybe_fail_all_tickets()
1066 struct btrfs_space_info *space_info; in btrfs_async_reclaim_metadata_space() local
1073 space_info = btrfs_find_space_info(fs_info, BTRFS_BLOCK_GROUP_METADATA); in btrfs_async_reclaim_metadata_space()
1075 spin_lock(&space_info->lock); in btrfs_async_reclaim_metadata_space()
1076 to_reclaim = btrfs_calc_reclaim_metadata_size(fs_info, space_info); in btrfs_async_reclaim_metadata_space()
1078 space_info->flush = 0; in btrfs_async_reclaim_metadata_space()
1079 spin_unlock(&space_info->lock); in btrfs_async_reclaim_metadata_space()
1082 last_tickets_id = space_info->tickets_id; in btrfs_async_reclaim_metadata_space()
1083 spin_unlock(&space_info->lock); in btrfs_async_reclaim_metadata_space()
1087 flush_space(fs_info, space_info, to_reclaim, flush_state, false); in btrfs_async_reclaim_metadata_space()
1088 spin_lock(&space_info->lock); in btrfs_async_reclaim_metadata_space()
1089 if (list_empty(&space_info->tickets)) { in btrfs_async_reclaim_metadata_space()
1090 space_info->flush = 0; in btrfs_async_reclaim_metadata_space()
1091 spin_unlock(&space_info->lock); in btrfs_async_reclaim_metadata_space()
1095 space_info); in btrfs_async_reclaim_metadata_space()
1096 if (last_tickets_id == space_info->tickets_id) { in btrfs_async_reclaim_metadata_space()
1099 last_tickets_id = space_info->tickets_id; in btrfs_async_reclaim_metadata_space()
1129 if (maybe_fail_all_tickets(fs_info, space_info)) { in btrfs_async_reclaim_metadata_space()
1133 space_info->flush = 0; in btrfs_async_reclaim_metadata_space()
1139 spin_unlock(&space_info->lock); in btrfs_async_reclaim_metadata_space()
1154 struct btrfs_space_info *space_info; in btrfs_preempt_reclaim_metadata_space() local
1163 space_info = btrfs_find_space_info(fs_info, BTRFS_BLOCK_GROUP_METADATA); in btrfs_preempt_reclaim_metadata_space()
1169 spin_lock(&space_info->lock); in btrfs_preempt_reclaim_metadata_space()
1170 while (need_preemptive_reclaim(fs_info, space_info)) { in btrfs_preempt_reclaim_metadata_space()
1189 if (block_rsv_size < space_info->bytes_may_use) in btrfs_preempt_reclaim_metadata_space()
1190 delalloc_size = space_info->bytes_may_use - block_rsv_size; in btrfs_preempt_reclaim_metadata_space()
1207 } else if (space_info->bytes_pinned > in btrfs_preempt_reclaim_metadata_space()
1210 to_reclaim = space_info->bytes_pinned; in btrfs_preempt_reclaim_metadata_space()
1221 spin_unlock(&space_info->lock); in btrfs_preempt_reclaim_metadata_space()
1231 flush_space(fs_info, space_info, to_reclaim, flush, true); in btrfs_preempt_reclaim_metadata_space()
1233 spin_lock(&space_info->lock); in btrfs_preempt_reclaim_metadata_space()
1237 if (loops == 1 && !space_info->reclaim_size) in btrfs_preempt_reclaim_metadata_space()
1238 space_info->clamp = max(1, space_info->clamp - 1); in btrfs_preempt_reclaim_metadata_space()
1239 trace_btrfs_done_preemptive_reclaim(fs_info, space_info); in btrfs_preempt_reclaim_metadata_space()
1240 spin_unlock(&space_info->lock); in btrfs_preempt_reclaim_metadata_space()
1286 struct btrfs_space_info *space_info; in btrfs_async_reclaim_data_space() local
1291 space_info = fs_info->data_sinfo; in btrfs_async_reclaim_data_space()
1293 spin_lock(&space_info->lock); in btrfs_async_reclaim_data_space()
1294 if (list_empty(&space_info->tickets)) { in btrfs_async_reclaim_data_space()
1295 space_info->flush = 0; in btrfs_async_reclaim_data_space()
1296 spin_unlock(&space_info->lock); in btrfs_async_reclaim_data_space()
1299 last_tickets_id = space_info->tickets_id; in btrfs_async_reclaim_data_space()
1300 spin_unlock(&space_info->lock); in btrfs_async_reclaim_data_space()
1302 while (!space_info->full) { in btrfs_async_reclaim_data_space()
1303 flush_space(fs_info, space_info, U64_MAX, ALLOC_CHUNK_FORCE, false); in btrfs_async_reclaim_data_space()
1304 spin_lock(&space_info->lock); in btrfs_async_reclaim_data_space()
1305 if (list_empty(&space_info->tickets)) { in btrfs_async_reclaim_data_space()
1306 space_info->flush = 0; in btrfs_async_reclaim_data_space()
1307 spin_unlock(&space_info->lock); in btrfs_async_reclaim_data_space()
1314 last_tickets_id = space_info->tickets_id; in btrfs_async_reclaim_data_space()
1315 spin_unlock(&space_info->lock); in btrfs_async_reclaim_data_space()
1319 flush_space(fs_info, space_info, U64_MAX, in btrfs_async_reclaim_data_space()
1321 spin_lock(&space_info->lock); in btrfs_async_reclaim_data_space()
1322 if (list_empty(&space_info->tickets)) { in btrfs_async_reclaim_data_space()
1323 space_info->flush = 0; in btrfs_async_reclaim_data_space()
1324 spin_unlock(&space_info->lock); in btrfs_async_reclaim_data_space()
1328 if (last_tickets_id == space_info->tickets_id) { in btrfs_async_reclaim_data_space()
1331 last_tickets_id = space_info->tickets_id; in btrfs_async_reclaim_data_space()
1336 if (space_info->full) { in btrfs_async_reclaim_data_space()
1337 if (maybe_fail_all_tickets(fs_info, space_info)) in btrfs_async_reclaim_data_space()
1340 space_info->flush = 0; in btrfs_async_reclaim_data_space()
1350 spin_unlock(&space_info->lock); in btrfs_async_reclaim_data_space()
1355 maybe_fail_all_tickets(fs_info, space_info); in btrfs_async_reclaim_data_space()
1356 space_info->flush = 0; in btrfs_async_reclaim_data_space()
1357 spin_unlock(&space_info->lock); in btrfs_async_reclaim_data_space()
1387 struct btrfs_space_info *space_info, in priority_reclaim_metadata_space() argument
1395 spin_lock(&space_info->lock); in priority_reclaim_metadata_space()
1396 to_reclaim = btrfs_calc_reclaim_metadata_size(fs_info, space_info); in priority_reclaim_metadata_space()
1404 spin_unlock(&space_info->lock); in priority_reclaim_metadata_space()
1409 spin_unlock(&space_info->lock); in priority_reclaim_metadata_space()
1410 flush_space(fs_info, space_info, to_reclaim, states[flush_state], in priority_reclaim_metadata_space()
1413 spin_lock(&space_info->lock); in priority_reclaim_metadata_space()
1415 spin_unlock(&space_info->lock); in priority_reclaim_metadata_space()
1421 if (!steal_from_global_rsv(fs_info, space_info, ticket)) { in priority_reclaim_metadata_space()
1423 remove_ticket(space_info, ticket); in priority_reclaim_metadata_space()
1431 btrfs_try_granting_tickets(fs_info, space_info); in priority_reclaim_metadata_space()
1432 spin_unlock(&space_info->lock); in priority_reclaim_metadata_space()
1436 struct btrfs_space_info *space_info, in priority_reclaim_data_space() argument
1439 spin_lock(&space_info->lock); in priority_reclaim_data_space()
1443 spin_unlock(&space_info->lock); in priority_reclaim_data_space()
1447 while (!space_info->full) { in priority_reclaim_data_space()
1448 spin_unlock(&space_info->lock); in priority_reclaim_data_space()
1449 flush_space(fs_info, space_info, U64_MAX, ALLOC_CHUNK_FORCE, false); in priority_reclaim_data_space()
1450 spin_lock(&space_info->lock); in priority_reclaim_data_space()
1452 spin_unlock(&space_info->lock); in priority_reclaim_data_space()
1458 remove_ticket(space_info, ticket); in priority_reclaim_data_space()
1459 btrfs_try_granting_tickets(fs_info, space_info); in priority_reclaim_data_space()
1460 spin_unlock(&space_info->lock); in priority_reclaim_data_space()
1464 struct btrfs_space_info *space_info, in wait_reserve_ticket() argument
1471 spin_lock(&space_info->lock); in wait_reserve_ticket()
1483 remove_ticket(space_info, ticket); in wait_reserve_ticket()
1487 spin_unlock(&space_info->lock); in wait_reserve_ticket()
1492 spin_lock(&space_info->lock); in wait_reserve_ticket()
1494 spin_unlock(&space_info->lock); in wait_reserve_ticket()
1511 struct btrfs_space_info *space_info, in handle_reserve_ticket() argument
1522 wait_reserve_ticket(fs_info, space_info, ticket); in handle_reserve_ticket()
1525 priority_reclaim_metadata_space(fs_info, space_info, ticket, in handle_reserve_ticket()
1530 priority_reclaim_metadata_space(fs_info, space_info, ticket, in handle_reserve_ticket()
1535 priority_reclaim_data_space(fs_info, space_info, ticket); in handle_reserve_ticket()
1551 trace_btrfs_reserve_ticket(fs_info, space_info->flags, orig_bytes, in handle_reserve_ticket()
1567 struct btrfs_space_info *space_info) in maybe_clamp_preempt() argument
1581 space_info->clamp = min(space_info->clamp + 1, 8); in maybe_clamp_preempt()
1616 struct btrfs_space_info *space_info, u64 orig_bytes, in __reserve_bytes() argument
1634 spin_lock(&space_info->lock); in __reserve_bytes()
1636 used = btrfs_space_info_used(space_info, true); in __reserve_bytes()
1644 pending_tickets = !list_empty(&space_info->tickets) || in __reserve_bytes()
1645 !list_empty(&space_info->priority_tickets); in __reserve_bytes()
1647 pending_tickets = !list_empty(&space_info->priority_tickets); in __reserve_bytes()
1654 ((used + orig_bytes <= writable_total_bytes(fs_info, space_info)) || in __reserve_bytes()
1655 btrfs_can_overcommit(fs_info, space_info, orig_bytes, flush))) { in __reserve_bytes()
1656 btrfs_space_info_update_bytes_may_use(fs_info, space_info, in __reserve_bytes()
1667 used = btrfs_space_info_used(space_info, false); in __reserve_bytes()
1669 writable_total_bytes(fs_info, space_info)) { in __reserve_bytes()
1670 btrfs_space_info_update_bytes_may_use(fs_info, space_info, in __reserve_bytes()
1686 space_info->reclaim_size += ticket.bytes; in __reserve_bytes()
1695 list_add_tail(&ticket.list, &space_info->tickets); in __reserve_bytes()
1696 if (!space_info->flush) { in __reserve_bytes()
1704 maybe_clamp_preempt(fs_info, space_info); in __reserve_bytes()
1706 space_info->flush = 1; in __reserve_bytes()
1708 space_info->flags, in __reserve_bytes()
1715 &space_info->priority_tickets); in __reserve_bytes()
1717 } else if (!ret && space_info->flags & BTRFS_BLOCK_GROUP_METADATA) { in __reserve_bytes()
1725 need_preemptive_reclaim(fs_info, space_info)) { in __reserve_bytes()
1726 trace_btrfs_trigger_flush(fs_info, space_info->flags, in __reserve_bytes()
1732 spin_unlock(&space_info->lock); in __reserve_bytes()
1736 return handle_reserve_ticket(fs_info, space_info, &ticket, start_ns, in __reserve_bytes()
1762 ret = __reserve_bytes(fs_info, block_rsv->space_info, orig_bytes, flush); in btrfs_reserve_metadata_bytes()
1765 block_rsv->space_info->flags, in btrfs_reserve_metadata_bytes()
1769 btrfs_dump_space_info(fs_info, block_rsv->space_info, in btrfs_reserve_metadata_bytes()
1809 struct btrfs_space_info *space_info; in btrfs_dump_space_info_for_trans_abort() local
1812 list_for_each_entry(space_info, &fs_info->space_info, list) { in btrfs_dump_space_info_for_trans_abort()
1813 spin_lock(&space_info->lock); in btrfs_dump_space_info_for_trans_abort()
1814 __btrfs_dump_space_info(fs_info, space_info); in btrfs_dump_space_info_for_trans_abort()
1815 spin_unlock(&space_info->lock); in btrfs_dump_space_info_for_trans_abort()