Lines Matching refs:fs_info
217 int btrfs_init_space_info(struct btrfs_fs_info *fs_info) in btrfs_init_space_info() argument
225 disk_super = fs_info->super_copy; in btrfs_init_space_info()
234 ret = create_space_info(fs_info, flags); in btrfs_init_space_info()
240 ret = create_space_info(fs_info, flags); in btrfs_init_space_info()
243 ret = create_space_info(fs_info, flags); in btrfs_init_space_info()
248 ret = create_space_info(fs_info, flags); in btrfs_init_space_info()
295 static u64 calc_available_free_space(struct btrfs_fs_info *fs_info, in calc_available_free_space() argument
304 profile = btrfs_system_alloc_profile(fs_info); in calc_available_free_space()
306 profile = btrfs_metadata_alloc_profile(fs_info); in calc_available_free_space()
308 avail = atomic64_read(&fs_info->free_chunk_space); in calc_available_free_space()
331 int btrfs_can_overcommit(struct btrfs_fs_info *fs_info, in btrfs_can_overcommit() argument
343 avail = calc_available_free_space(fs_info, space_info, flush); in btrfs_can_overcommit()
364 void btrfs_try_granting_tickets(struct btrfs_fs_info *fs_info, in btrfs_try_granting_tickets() argument
382 btrfs_can_overcommit(fs_info, space_info, ticket->bytes, in btrfs_try_granting_tickets()
384 btrfs_space_info_update_bytes_may_use(fs_info, in btrfs_try_granting_tickets()
403 #define DUMP_BLOCK_RSV(fs_info, rsv_name) \ argument
405 struct btrfs_block_rsv *__rsv = &(fs_info)->rsv_name; \
407 btrfs_info(fs_info, #rsv_name ": size %llu reserved %llu", \
412 static void __btrfs_dump_space_info(struct btrfs_fs_info *fs_info, in __btrfs_dump_space_info() argument
418 btrfs_info(fs_info, "space_info %llu has %lld free, is %sfull", in __btrfs_dump_space_info()
422 btrfs_info(fs_info, in __btrfs_dump_space_info()
428 DUMP_BLOCK_RSV(fs_info, global_block_rsv); in __btrfs_dump_space_info()
429 DUMP_BLOCK_RSV(fs_info, trans_block_rsv); in __btrfs_dump_space_info()
430 DUMP_BLOCK_RSV(fs_info, chunk_block_rsv); in __btrfs_dump_space_info()
431 DUMP_BLOCK_RSV(fs_info, delayed_block_rsv); in __btrfs_dump_space_info()
432 DUMP_BLOCK_RSV(fs_info, delayed_refs_rsv); in __btrfs_dump_space_info()
436 void btrfs_dump_space_info(struct btrfs_fs_info *fs_info, in btrfs_dump_space_info() argument
444 __btrfs_dump_space_info(fs_info, info); in btrfs_dump_space_info()
454 btrfs_info(fs_info, in btrfs_dump_space_info()
467 static inline u64 calc_reclaim_items_nr(struct btrfs_fs_info *fs_info, in calc_reclaim_items_nr() argument
473 bytes = btrfs_calc_insert_metadata_size(fs_info, 1); in calc_reclaim_items_nr()
485 static void shrink_delalloc(struct btrfs_fs_info *fs_info, in shrink_delalloc() argument
497 delalloc_bytes = percpu_counter_sum_positive(&fs_info->delalloc_bytes); in shrink_delalloc()
498 ordered_bytes = percpu_counter_sum_positive(&fs_info->ordered_bytes); in shrink_delalloc()
519 items = calc_reclaim_items_nr(fs_info, to_reclaim) * 2; in shrink_delalloc()
538 btrfs_start_delalloc_roots(fs_info, nr_pages, true); in shrink_delalloc()
561 async_pages = atomic_read(&fs_info->async_delalloc_pages); in shrink_delalloc()
575 wait_event(fs_info->async_submit_wait, in shrink_delalloc()
576 atomic_read(&fs_info->async_delalloc_pages) <= in shrink_delalloc()
581 btrfs_wait_ordered_roots(fs_info, items, 0, (u64)-1); in shrink_delalloc()
605 &fs_info->delalloc_bytes); in shrink_delalloc()
607 &fs_info->ordered_bytes); in shrink_delalloc()
616 static void flush_space(struct btrfs_fs_info *fs_info, in flush_space() argument
620 struct btrfs_root *root = fs_info->extent_root; in flush_space()
629 nr = calc_reclaim_items_nr(fs_info, num_bytes) * 2; in flush_space()
646 shrink_delalloc(fs_info, space_info, num_bytes, in flush_space()
657 nr = calc_reclaim_items_nr(fs_info, num_bytes); in flush_space()
671 btrfs_get_alloc_profile(fs_info, space_info->flags), in flush_space()
684 btrfs_run_delayed_iputs(fs_info); in flush_space()
685 btrfs_wait_on_delayed_iputs(fs_info); in flush_space()
701 trace_btrfs_flush_space(fs_info, space_info->flags, num_bytes, state, in flush_space()
707 btrfs_calc_reclaim_metadata_size(struct btrfs_fs_info *fs_info, in btrfs_calc_reclaim_metadata_size() argument
716 avail = calc_available_free_space(fs_info, space_info, in btrfs_calc_reclaim_metadata_size()
732 static bool need_preemptive_reclaim(struct btrfs_fs_info *fs_info, in need_preemptive_reclaim() argument
735 u64 global_rsv_size = fs_info->global_block_rsv.reserved; in need_preemptive_reclaim()
795 thresh = calc_available_free_space(fs_info, space_info, in need_preemptive_reclaim()
828 ordered = percpu_counter_read_positive(&fs_info->ordered_bytes) >> 1; in need_preemptive_reclaim()
829 delalloc = percpu_counter_read_positive(&fs_info->delalloc_bytes); in need_preemptive_reclaim()
831 used += fs_info->delayed_refs_rsv.reserved + in need_preemptive_reclaim()
832 fs_info->delayed_block_rsv.reserved; in need_preemptive_reclaim()
836 return (used >= thresh && !btrfs_fs_closing(fs_info) && in need_preemptive_reclaim()
837 !test_bit(BTRFS_FS_STATE_REMOUNTING, &fs_info->fs_state)); in need_preemptive_reclaim()
840 static bool steal_from_global_rsv(struct btrfs_fs_info *fs_info, in steal_from_global_rsv() argument
844 struct btrfs_block_rsv *global_rsv = &fs_info->global_block_rsv; in steal_from_global_rsv()
883 static bool maybe_fail_all_tickets(struct btrfs_fs_info *fs_info, in maybe_fail_all_tickets() argument
888 const bool aborted = BTRFS_FS_ERROR(fs_info); in maybe_fail_all_tickets()
890 trace_btrfs_fail_all_tickets(fs_info, space_info); in maybe_fail_all_tickets()
892 if (btrfs_test_opt(fs_info, ENOSPC_DEBUG)) { in maybe_fail_all_tickets()
893 btrfs_info(fs_info, "cannot satisfy tickets, dumping space info"); in maybe_fail_all_tickets()
894 __btrfs_dump_space_info(fs_info, space_info); in maybe_fail_all_tickets()
903 steal_from_global_rsv(fs_info, space_info, ticket)) in maybe_fail_all_tickets()
906 if (!aborted && btrfs_test_opt(fs_info, ENOSPC_DEBUG)) in maybe_fail_all_tickets()
907 btrfs_info(fs_info, "failing ticket with %llu bytes", in maybe_fail_all_tickets()
924 btrfs_try_granting_tickets(fs_info, space_info); in maybe_fail_all_tickets()
936 struct btrfs_fs_info *fs_info; in btrfs_async_reclaim_metadata_space() local
943 fs_info = container_of(work, struct btrfs_fs_info, async_reclaim_work); in btrfs_async_reclaim_metadata_space()
944 space_info = btrfs_find_space_info(fs_info, BTRFS_BLOCK_GROUP_METADATA); in btrfs_async_reclaim_metadata_space()
947 to_reclaim = btrfs_calc_reclaim_metadata_size(fs_info, space_info); in btrfs_async_reclaim_metadata_space()
958 flush_space(fs_info, space_info, to_reclaim, flush_state, false); in btrfs_async_reclaim_metadata_space()
965 to_reclaim = btrfs_calc_reclaim_metadata_size(fs_info, in btrfs_async_reclaim_metadata_space()
1000 if (maybe_fail_all_tickets(fs_info, space_info)) { in btrfs_async_reclaim_metadata_space()
1024 struct btrfs_fs_info *fs_info; in btrfs_preempt_reclaim_metadata_space() local
1032 fs_info = container_of(work, struct btrfs_fs_info, in btrfs_preempt_reclaim_metadata_space()
1034 space_info = btrfs_find_space_info(fs_info, BTRFS_BLOCK_GROUP_METADATA); in btrfs_preempt_reclaim_metadata_space()
1035 delayed_block_rsv = &fs_info->delayed_block_rsv; in btrfs_preempt_reclaim_metadata_space()
1036 delayed_refs_rsv = &fs_info->delayed_refs_rsv; in btrfs_preempt_reclaim_metadata_space()
1037 global_rsv = &fs_info->global_block_rsv; in btrfs_preempt_reclaim_metadata_space()
1038 trans_rsv = &fs_info->trans_block_rsv; in btrfs_preempt_reclaim_metadata_space()
1041 while (need_preemptive_reclaim(fs_info, space_info)) { in btrfs_preempt_reclaim_metadata_space()
1100 to_reclaim = btrfs_calc_insert_metadata_size(fs_info, 1); in btrfs_preempt_reclaim_metadata_space()
1101 flush_space(fs_info, space_info, to_reclaim, flush, true); in btrfs_preempt_reclaim_metadata_space()
1109 trace_btrfs_done_preemptive_reclaim(fs_info, space_info); in btrfs_preempt_reclaim_metadata_space()
1155 struct btrfs_fs_info *fs_info; in btrfs_async_reclaim_data_space() local
1160 fs_info = container_of(work, struct btrfs_fs_info, async_data_reclaim_work); in btrfs_async_reclaim_data_space()
1161 space_info = fs_info->data_sinfo; in btrfs_async_reclaim_data_space()
1173 flush_space(fs_info, space_info, U64_MAX, ALLOC_CHUNK_FORCE, false); in btrfs_async_reclaim_data_space()
1182 if (BTRFS_FS_ERROR(fs_info)) in btrfs_async_reclaim_data_space()
1189 flush_space(fs_info, space_info, U64_MAX, in btrfs_async_reclaim_data_space()
1207 if (maybe_fail_all_tickets(fs_info, space_info)) in btrfs_async_reclaim_data_space()
1216 if (BTRFS_FS_ERROR(fs_info)) in btrfs_async_reclaim_data_space()
1225 maybe_fail_all_tickets(fs_info, space_info); in btrfs_async_reclaim_data_space()
1230 void btrfs_init_async_reclaim_work(struct btrfs_fs_info *fs_info) in btrfs_init_async_reclaim_work() argument
1232 INIT_WORK(&fs_info->async_reclaim_work, btrfs_async_reclaim_metadata_space); in btrfs_init_async_reclaim_work()
1233 INIT_WORK(&fs_info->async_data_reclaim_work, btrfs_async_reclaim_data_space); in btrfs_init_async_reclaim_work()
1234 INIT_WORK(&fs_info->preempt_reclaim_work, in btrfs_init_async_reclaim_work()
1256 static void priority_reclaim_metadata_space(struct btrfs_fs_info *fs_info, in priority_reclaim_metadata_space() argument
1266 to_reclaim = btrfs_calc_reclaim_metadata_size(fs_info, space_info); in priority_reclaim_metadata_space()
1275 flush_space(fs_info, space_info, to_reclaim, states[flush_state], in priority_reclaim_metadata_space()
1287 static void priority_reclaim_data_space(struct btrfs_fs_info *fs_info, in priority_reclaim_data_space() argument
1292 flush_space(fs_info, space_info, U64_MAX, ALLOC_CHUNK_FORCE, false); in priority_reclaim_data_space()
1302 static void wait_reserve_ticket(struct btrfs_fs_info *fs_info, in wait_reserve_ticket() argument
1349 static int handle_reserve_ticket(struct btrfs_fs_info *fs_info, in handle_reserve_ticket() argument
1361 wait_reserve_ticket(fs_info, space_info, ticket); in handle_reserve_ticket()
1364 priority_reclaim_metadata_space(fs_info, space_info, ticket, in handle_reserve_ticket()
1369 priority_reclaim_metadata_space(fs_info, space_info, ticket, in handle_reserve_ticket()
1374 priority_reclaim_data_space(fs_info, space_info, ticket); in handle_reserve_ticket()
1393 btrfs_try_granting_tickets(fs_info, space_info); in handle_reserve_ticket()
1408 trace_btrfs_reserve_ticket(fs_info, space_info->flags, orig_bytes, in handle_reserve_ticket()
1423 static inline void maybe_clamp_preempt(struct btrfs_fs_info *fs_info, in maybe_clamp_preempt() argument
1426 u64 ordered = percpu_counter_sum_positive(&fs_info->ordered_bytes); in maybe_clamp_preempt()
1427 u64 delalloc = percpu_counter_sum_positive(&fs_info->delalloc_bytes); in maybe_clamp_preempt()
1456 static int __reserve_bytes(struct btrfs_fs_info *fs_info, in __reserve_bytes() argument
1471 async_work = &fs_info->async_data_reclaim_work; in __reserve_bytes()
1473 async_work = &fs_info->async_reclaim_work; in __reserve_bytes()
1496 btrfs_can_overcommit(fs_info, space_info, orig_bytes, flush))) { in __reserve_bytes()
1497 btrfs_space_info_update_bytes_may_use(fs_info, space_info, in __reserve_bytes()
1530 maybe_clamp_preempt(fs_info, space_info); in __reserve_bytes()
1533 trace_btrfs_trigger_flush(fs_info, in __reserve_bytes()
1550 if (!test_bit(BTRFS_FS_LOG_RECOVERING, &fs_info->flags) && in __reserve_bytes()
1551 !work_busy(&fs_info->preempt_reclaim_work) && in __reserve_bytes()
1552 need_preemptive_reclaim(fs_info, space_info)) { in __reserve_bytes()
1553 trace_btrfs_trigger_flush(fs_info, space_info->flags, in __reserve_bytes()
1556 &fs_info->preempt_reclaim_work); in __reserve_bytes()
1563 return handle_reserve_ticket(fs_info, space_info, &ticket, start_ns, in __reserve_bytes()
1587 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_reserve_metadata_bytes() local
1588 struct btrfs_block_rsv *global_rsv = &fs_info->global_block_rsv; in btrfs_reserve_metadata_bytes()
1591 ret = __reserve_bytes(fs_info, block_rsv->space_info, orig_bytes, flush); in btrfs_reserve_metadata_bytes()
1599 trace_btrfs_space_reservation(fs_info, "space_info:enospc", in btrfs_reserve_metadata_bytes()
1603 if (btrfs_test_opt(fs_info, ENOSPC_DEBUG)) in btrfs_reserve_metadata_bytes()
1604 btrfs_dump_space_info(fs_info, block_rsv->space_info, in btrfs_reserve_metadata_bytes()
1620 int btrfs_reserve_data_bytes(struct btrfs_fs_info *fs_info, u64 bytes, in btrfs_reserve_data_bytes() argument
1623 struct btrfs_space_info *data_sinfo = fs_info->data_sinfo; in btrfs_reserve_data_bytes()
1630 ret = __reserve_bytes(fs_info, data_sinfo, bytes, flush); in btrfs_reserve_data_bytes()
1632 trace_btrfs_space_reservation(fs_info, "space_info:enospc", in btrfs_reserve_data_bytes()
1634 if (btrfs_test_opt(fs_info, ENOSPC_DEBUG)) in btrfs_reserve_data_bytes()
1635 btrfs_dump_space_info(fs_info, data_sinfo, bytes, 0); in btrfs_reserve_data_bytes()