Lines Matching refs:fs_info

197 static u64 calc_chunk_size(const struct btrfs_fs_info *fs_info, u64 flags)  in calc_chunk_size()  argument
199 if (btrfs_is_zoned(fs_info)) in calc_chunk_size()
200 return fs_info->zone_size; in calc_chunk_size()
210 if (fs_info->fs_devices->total_rw_bytes > 50ULL * SZ_1G) in calc_chunk_size()
262 int btrfs_init_space_info(struct btrfs_fs_info *fs_info) in btrfs_init_space_info() argument
270 disk_super = fs_info->super_copy; in btrfs_init_space_info()
279 ret = create_space_info(fs_info, flags); in btrfs_init_space_info()
285 ret = create_space_info(fs_info, flags); in btrfs_init_space_info()
288 ret = create_space_info(fs_info, flags); in btrfs_init_space_info()
293 ret = create_space_info(fs_info, flags); in btrfs_init_space_info()
346 static u64 calc_available_free_space(struct btrfs_fs_info *fs_info, in calc_available_free_space() argument
355 profile = btrfs_system_alloc_profile(fs_info); in calc_available_free_space()
357 profile = btrfs_metadata_alloc_profile(fs_info); in calc_available_free_space()
359 avail = atomic64_read(&fs_info->free_chunk_space); in calc_available_free_space()
382 static inline u64 writable_total_bytes(struct btrfs_fs_info *fs_info, in writable_total_bytes() argument
392 if (!btrfs_is_zoned(fs_info) || (space_info->flags & BTRFS_BLOCK_GROUP_DATA)) in writable_total_bytes()
398 int btrfs_can_overcommit(struct btrfs_fs_info *fs_info, in btrfs_can_overcommit() argument
410 if (test_bit(BTRFS_FS_NO_OVERCOMMIT, &fs_info->flags) && 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()
435 void btrfs_try_granting_tickets(struct btrfs_fs_info *fs_info, in btrfs_try_granting_tickets() argument
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()
455 btrfs_space_info_update_bytes_may_use(fs_info, in btrfs_try_granting_tickets()
474 #define DUMP_BLOCK_RSV(fs_info, rsv_name) \ argument
476 struct btrfs_block_rsv *__rsv = &(fs_info)->rsv_name; \
478 btrfs_info(fs_info, #rsv_name ": size %llu reserved %llu", \
499 static void dump_global_block_rsv(struct btrfs_fs_info *fs_info) in dump_global_block_rsv() argument
501 DUMP_BLOCK_RSV(fs_info, global_block_rsv); in dump_global_block_rsv()
502 DUMP_BLOCK_RSV(fs_info, trans_block_rsv); in dump_global_block_rsv()
503 DUMP_BLOCK_RSV(fs_info, chunk_block_rsv); in dump_global_block_rsv()
504 DUMP_BLOCK_RSV(fs_info, delayed_block_rsv); in dump_global_block_rsv()
505 DUMP_BLOCK_RSV(fs_info, delayed_refs_rsv); in dump_global_block_rsv()
508 static void __btrfs_dump_space_info(struct btrfs_fs_info *fs_info, in __btrfs_dump_space_info() argument
515 btrfs_info(fs_info, "space_info %s has %lld free, is %sfull", in __btrfs_dump_space_info()
519 btrfs_info(fs_info, in __btrfs_dump_space_info()
526 void btrfs_dump_space_info(struct btrfs_fs_info *fs_info, in btrfs_dump_space_info() argument
534 __btrfs_dump_space_info(fs_info, info); in btrfs_dump_space_info()
535 dump_global_block_rsv(fs_info); in btrfs_dump_space_info()
545 btrfs_info(fs_info, in btrfs_dump_space_info()
558 static inline u64 calc_reclaim_items_nr(struct btrfs_fs_info *fs_info, in calc_reclaim_items_nr() argument
564 bytes = btrfs_calc_insert_metadata_size(fs_info, 1); in calc_reclaim_items_nr()
576 static void shrink_delalloc(struct btrfs_fs_info *fs_info, in shrink_delalloc() argument
588 delalloc_bytes = percpu_counter_sum_positive(&fs_info->delalloc_bytes); in shrink_delalloc()
589 ordered_bytes = percpu_counter_sum_positive(&fs_info->ordered_bytes); in shrink_delalloc()
610 items = calc_reclaim_items_nr(fs_info, to_reclaim) * 2; in shrink_delalloc()
629 btrfs_start_delalloc_roots(fs_info, nr_pages, true); in shrink_delalloc()
652 async_pages = atomic_read(&fs_info->async_delalloc_pages); in shrink_delalloc()
666 wait_event(fs_info->async_submit_wait, in shrink_delalloc()
667 atomic_read(&fs_info->async_delalloc_pages) <= in shrink_delalloc()
672 btrfs_wait_ordered_roots(fs_info, items, 0, (u64)-1); in shrink_delalloc()
696 &fs_info->delalloc_bytes); in shrink_delalloc()
698 &fs_info->ordered_bytes); in shrink_delalloc()
707 static void flush_space(struct btrfs_fs_info *fs_info, in flush_space() argument
711 struct btrfs_root *root = fs_info->tree_root; in flush_space()
720 nr = calc_reclaim_items_nr(fs_info, num_bytes) * 2; in flush_space()
737 shrink_delalloc(fs_info, space_info, num_bytes, in flush_space()
748 nr = calc_reclaim_items_nr(fs_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()
804 btrfs_run_delayed_iputs(fs_info); in flush_space()
805 btrfs_wait_on_delayed_iputs(fs_info); in flush_space()
821 trace_btrfs_flush_space(fs_info, space_info->flags, num_bytes, state, in flush_space()
827 btrfs_calc_reclaim_metadata_size(struct btrfs_fs_info *fs_info, in btrfs_calc_reclaim_metadata_size() argument
837 avail = calc_available_free_space(fs_info, space_info, in btrfs_calc_reclaim_metadata_size()
847 total = writable_total_bytes(fs_info, space_info); in btrfs_calc_reclaim_metadata_size()
854 static bool need_preemptive_reclaim(struct btrfs_fs_info *fs_info, in need_preemptive_reclaim() argument
857 u64 global_rsv_size = fs_info->global_block_rsv.reserved; in need_preemptive_reclaim()
859 u64 total = writable_total_bytes(fs_info, space_info); in need_preemptive_reclaim()
922 thresh = calc_available_free_space(fs_info, space_info, in need_preemptive_reclaim()
955 ordered = percpu_counter_read_positive(&fs_info->ordered_bytes) >> 1; in need_preemptive_reclaim()
956 delalloc = percpu_counter_read_positive(&fs_info->delalloc_bytes); in need_preemptive_reclaim()
958 used += fs_info->delayed_refs_rsv.reserved + in need_preemptive_reclaim()
959 fs_info->delayed_block_rsv.reserved; in need_preemptive_reclaim()
963 return (used >= thresh && !btrfs_fs_closing(fs_info) && in need_preemptive_reclaim()
964 !test_bit(BTRFS_FS_STATE_REMOUNTING, &fs_info->fs_state)); in need_preemptive_reclaim()
967 static bool steal_from_global_rsv(struct btrfs_fs_info *fs_info, in steal_from_global_rsv() argument
971 struct btrfs_block_rsv *global_rsv = &fs_info->global_block_rsv; in steal_from_global_rsv()
1013 static bool maybe_fail_all_tickets(struct btrfs_fs_info *fs_info, in maybe_fail_all_tickets() argument
1018 const bool aborted = BTRFS_FS_ERROR(fs_info); in maybe_fail_all_tickets()
1020 trace_btrfs_fail_all_tickets(fs_info, space_info); in maybe_fail_all_tickets()
1022 if (btrfs_test_opt(fs_info, ENOSPC_DEBUG)) { in maybe_fail_all_tickets()
1023 btrfs_info(fs_info, "cannot satisfy tickets, dumping space info"); in maybe_fail_all_tickets()
1024 __btrfs_dump_space_info(fs_info, space_info); in maybe_fail_all_tickets()
1032 if (!aborted && steal_from_global_rsv(fs_info, space_info, ticket)) in maybe_fail_all_tickets()
1035 if (!aborted && btrfs_test_opt(fs_info, ENOSPC_DEBUG)) in maybe_fail_all_tickets()
1036 btrfs_info(fs_info, "failing ticket with %llu bytes", in maybe_fail_all_tickets()
1053 btrfs_try_granting_tickets(fs_info, space_info); in maybe_fail_all_tickets()
1065 struct btrfs_fs_info *fs_info; in btrfs_async_reclaim_metadata_space() local
1072 fs_info = container_of(work, struct btrfs_fs_info, async_reclaim_work); in btrfs_async_reclaim_metadata_space()
1073 space_info = btrfs_find_space_info(fs_info, BTRFS_BLOCK_GROUP_METADATA); in btrfs_async_reclaim_metadata_space()
1076 to_reclaim = btrfs_calc_reclaim_metadata_size(fs_info, space_info); in btrfs_async_reclaim_metadata_space()
1087 flush_space(fs_info, space_info, to_reclaim, flush_state, false); in btrfs_async_reclaim_metadata_space()
1094 to_reclaim = btrfs_calc_reclaim_metadata_size(fs_info, in btrfs_async_reclaim_metadata_space()
1129 if (maybe_fail_all_tickets(fs_info, space_info)) { in btrfs_async_reclaim_metadata_space()
1153 struct btrfs_fs_info *fs_info; in btrfs_preempt_reclaim_metadata_space() local
1161 fs_info = container_of(work, struct btrfs_fs_info, in btrfs_preempt_reclaim_metadata_space()
1163 space_info = btrfs_find_space_info(fs_info, BTRFS_BLOCK_GROUP_METADATA); in btrfs_preempt_reclaim_metadata_space()
1164 delayed_block_rsv = &fs_info->delayed_block_rsv; in btrfs_preempt_reclaim_metadata_space()
1165 delayed_refs_rsv = &fs_info->delayed_refs_rsv; in btrfs_preempt_reclaim_metadata_space()
1166 global_rsv = &fs_info->global_block_rsv; in btrfs_preempt_reclaim_metadata_space()
1167 trans_rsv = &fs_info->trans_block_rsv; in btrfs_preempt_reclaim_metadata_space()
1170 while (need_preemptive_reclaim(fs_info, space_info)) { in btrfs_preempt_reclaim_metadata_space()
1230 to_reclaim = btrfs_calc_insert_metadata_size(fs_info, 1); in btrfs_preempt_reclaim_metadata_space()
1231 flush_space(fs_info, space_info, to_reclaim, flush, true); in btrfs_preempt_reclaim_metadata_space()
1239 trace_btrfs_done_preemptive_reclaim(fs_info, space_info); in btrfs_preempt_reclaim_metadata_space()
1285 struct btrfs_fs_info *fs_info; in btrfs_async_reclaim_data_space() local
1290 fs_info = container_of(work, struct btrfs_fs_info, async_data_reclaim_work); in btrfs_async_reclaim_data_space()
1291 space_info = fs_info->data_sinfo; 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()
1312 if (BTRFS_FS_ERROR(fs_info)) in btrfs_async_reclaim_data_space()
1319 flush_space(fs_info, space_info, U64_MAX, in btrfs_async_reclaim_data_space()
1337 if (maybe_fail_all_tickets(fs_info, space_info)) in btrfs_async_reclaim_data_space()
1346 if (BTRFS_FS_ERROR(fs_info)) in btrfs_async_reclaim_data_space()
1355 maybe_fail_all_tickets(fs_info, space_info); in btrfs_async_reclaim_data_space()
1360 void btrfs_init_async_reclaim_work(struct btrfs_fs_info *fs_info) in btrfs_init_async_reclaim_work() argument
1362 INIT_WORK(&fs_info->async_reclaim_work, btrfs_async_reclaim_metadata_space); in btrfs_init_async_reclaim_work()
1363 INIT_WORK(&fs_info->async_data_reclaim_work, btrfs_async_reclaim_data_space); in btrfs_init_async_reclaim_work()
1364 INIT_WORK(&fs_info->preempt_reclaim_work, in btrfs_init_async_reclaim_work()
1386 static void priority_reclaim_metadata_space(struct btrfs_fs_info *fs_info, in priority_reclaim_metadata_space() argument
1396 to_reclaim = btrfs_calc_reclaim_metadata_size(fs_info, space_info); in priority_reclaim_metadata_space()
1410 flush_space(fs_info, space_info, to_reclaim, states[flush_state], in priority_reclaim_metadata_space()
1421 if (!steal_from_global_rsv(fs_info, space_info, ticket)) { in priority_reclaim_metadata_space()
1431 btrfs_try_granting_tickets(fs_info, space_info); in priority_reclaim_metadata_space()
1435 static void priority_reclaim_data_space(struct btrfs_fs_info *fs_info, in priority_reclaim_data_space() argument
1449 flush_space(fs_info, space_info, U64_MAX, ALLOC_CHUNK_FORCE, false); in priority_reclaim_data_space()
1459 btrfs_try_granting_tickets(fs_info, space_info); in priority_reclaim_data_space()
1463 static void wait_reserve_ticket(struct btrfs_fs_info *fs_info, in wait_reserve_ticket() argument
1510 static int handle_reserve_ticket(struct btrfs_fs_info *fs_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()
1566 static inline void maybe_clamp_preempt(struct btrfs_fs_info *fs_info, in maybe_clamp_preempt() argument
1569 u64 ordered = percpu_counter_sum_positive(&fs_info->ordered_bytes); in maybe_clamp_preempt()
1570 u64 delalloc = percpu_counter_sum_positive(&fs_info->delalloc_bytes); in maybe_clamp_preempt()
1615 static int __reserve_bytes(struct btrfs_fs_info *fs_info, in __reserve_bytes() argument
1630 async_work = &fs_info->async_data_reclaim_work; in __reserve_bytes()
1632 async_work = &fs_info->async_reclaim_work; 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()
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()
1704 maybe_clamp_preempt(fs_info, space_info); in __reserve_bytes()
1707 trace_btrfs_trigger_flush(fs_info, in __reserve_bytes()
1723 if (!test_bit(BTRFS_FS_LOG_RECOVERING, &fs_info->flags) && in __reserve_bytes()
1724 !work_busy(&fs_info->preempt_reclaim_work) && 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()
1729 &fs_info->preempt_reclaim_work); in __reserve_bytes()
1736 return handle_reserve_ticket(fs_info, space_info, &ticket, start_ns, in __reserve_bytes()
1755 int btrfs_reserve_metadata_bytes(struct btrfs_fs_info *fs_info, in btrfs_reserve_metadata_bytes() argument
1762 ret = __reserve_bytes(fs_info, block_rsv->space_info, orig_bytes, flush); in btrfs_reserve_metadata_bytes()
1764 trace_btrfs_space_reservation(fs_info, "space_info:enospc", in btrfs_reserve_metadata_bytes()
1768 if (btrfs_test_opt(fs_info, ENOSPC_DEBUG)) in btrfs_reserve_metadata_bytes()
1769 btrfs_dump_space_info(fs_info, block_rsv->space_info, in btrfs_reserve_metadata_bytes()
1785 int btrfs_reserve_data_bytes(struct btrfs_fs_info *fs_info, u64 bytes, in btrfs_reserve_data_bytes() argument
1788 struct btrfs_space_info *data_sinfo = fs_info->data_sinfo; in btrfs_reserve_data_bytes()
1796 ret = __reserve_bytes(fs_info, data_sinfo, bytes, flush); in btrfs_reserve_data_bytes()
1798 trace_btrfs_space_reservation(fs_info, "space_info:enospc", in btrfs_reserve_data_bytes()
1800 if (btrfs_test_opt(fs_info, ENOSPC_DEBUG)) in btrfs_reserve_data_bytes()
1801 btrfs_dump_space_info(fs_info, data_sinfo, bytes, 0); in btrfs_reserve_data_bytes()
1807 __cold void btrfs_dump_space_info_for_trans_abort(struct btrfs_fs_info *fs_info) in btrfs_dump_space_info_for_trans_abort() argument
1811 btrfs_info(fs_info, "dumping space info:"); in btrfs_dump_space_info_for_trans_abort()
1812 list_for_each_entry(space_info, &fs_info->space_info, list) { 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()
1817 dump_global_block_rsv(fs_info); in btrfs_dump_space_info_for_trans_abort()