Lines Matching refs:space_info
177 struct list_head *head = &info->space_info; in btrfs_clear_space_info_full()
187 struct btrfs_space_info *space_info; in create_space_info() local
191 space_info = kzalloc(sizeof(*space_info), GFP_NOFS); in create_space_info()
192 if (!space_info) in create_space_info()
196 INIT_LIST_HEAD(&space_info->block_groups[i]); in create_space_info()
197 init_rwsem(&space_info->groups_sem); in create_space_info()
198 spin_lock_init(&space_info->lock); in create_space_info()
199 space_info->flags = flags & BTRFS_BLOCK_GROUP_TYPE_MASK; in create_space_info()
200 space_info->force_alloc = CHUNK_ALLOC_NO_FORCE; in create_space_info()
201 INIT_LIST_HEAD(&space_info->ro_bgs); in create_space_info()
202 INIT_LIST_HEAD(&space_info->tickets); in create_space_info()
203 INIT_LIST_HEAD(&space_info->priority_tickets); in create_space_info()
204 space_info->clamp = 1; in create_space_info()
206 ret = btrfs_sysfs_add_space_info_type(info, space_info); in create_space_info()
210 list_add(&space_info->list, &info->space_info); in create_space_info()
212 info->data_sinfo = space_info; in create_space_info()
257 struct btrfs_space_info **space_info) in btrfs_update_space_info() argument
277 *space_info = found; in btrfs_update_space_info()
283 struct list_head *head = &info->space_info; in btrfs_find_space_info()
296 struct btrfs_space_info *space_info, in calc_available_free_space() argument
303 if (space_info->flags & BTRFS_BLOCK_GROUP_SYSTEM) in calc_available_free_space()
332 struct btrfs_space_info *space_info, u64 bytes, in btrfs_can_overcommit() argument
339 if (space_info->flags & BTRFS_BLOCK_GROUP_DATA) in btrfs_can_overcommit()
342 used = btrfs_space_info_used(space_info, true); in btrfs_can_overcommit()
343 avail = calc_available_free_space(fs_info, space_info, flush); in btrfs_can_overcommit()
345 if (used + bytes < space_info->total_bytes + avail) in btrfs_can_overcommit()
350 static void remove_ticket(struct btrfs_space_info *space_info, in remove_ticket() argument
355 ASSERT(space_info->reclaim_size >= ticket->bytes); in remove_ticket()
356 space_info->reclaim_size -= ticket->bytes; in remove_ticket()
365 struct btrfs_space_info *space_info) in btrfs_try_granting_tickets() argument
370 lockdep_assert_held(&space_info->lock); in btrfs_try_granting_tickets()
372 head = &space_info->priority_tickets; in btrfs_try_granting_tickets()
376 u64 used = btrfs_space_info_used(space_info, true); in btrfs_try_granting_tickets()
381 if ((used + ticket->bytes <= space_info->total_bytes) || in btrfs_try_granting_tickets()
382 btrfs_can_overcommit(fs_info, space_info, ticket->bytes, in btrfs_try_granting_tickets()
385 space_info, in btrfs_try_granting_tickets()
387 remove_ticket(space_info, ticket); in btrfs_try_granting_tickets()
389 space_info->tickets_id++; in btrfs_try_granting_tickets()
396 if (head == &space_info->priority_tickets) { in btrfs_try_granting_tickets()
397 head = &space_info->tickets; in btrfs_try_granting_tickets()
486 struct btrfs_space_info *space_info, in shrink_delalloc() argument
596 spin_lock(&space_info->lock); in shrink_delalloc()
597 if (list_empty(&space_info->tickets) && in shrink_delalloc()
598 list_empty(&space_info->priority_tickets)) { in shrink_delalloc()
599 spin_unlock(&space_info->lock); in shrink_delalloc()
602 spin_unlock(&space_info->lock); in shrink_delalloc()
617 struct btrfs_space_info *space_info, u64 num_bytes, in flush_space() argument
646 shrink_delalloc(fs_info, space_info, num_bytes, in flush_space()
671 btrfs_get_alloc_profile(fs_info, space_info->flags), in flush_space()
701 trace_btrfs_flush_space(fs_info, space_info->flags, num_bytes, state, in flush_space()
708 struct btrfs_space_info *space_info) in btrfs_calc_reclaim_metadata_size() argument
712 u64 to_reclaim = space_info->reclaim_size; in btrfs_calc_reclaim_metadata_size()
714 lockdep_assert_held(&space_info->lock); in btrfs_calc_reclaim_metadata_size()
716 avail = calc_available_free_space(fs_info, space_info, in btrfs_calc_reclaim_metadata_size()
718 used = btrfs_space_info_used(space_info, true); in btrfs_calc_reclaim_metadata_size()
726 if (space_info->total_bytes + avail < used) in btrfs_calc_reclaim_metadata_size()
727 to_reclaim += used - (space_info->total_bytes + avail); in btrfs_calc_reclaim_metadata_size()
733 struct btrfs_space_info *space_info) in need_preemptive_reclaim() argument
737 u64 thresh = div_factor_fine(space_info->total_bytes, 90); in need_preemptive_reclaim()
741 if ((space_info->bytes_used + space_info->bytes_reserved + in need_preemptive_reclaim()
745 used = space_info->bytes_may_use + space_info->bytes_pinned; in need_preemptive_reclaim()
763 if (space_info->reclaim_size) in need_preemptive_reclaim()
795 thresh = calc_available_free_space(fs_info, space_info, in need_preemptive_reclaim()
797 used = space_info->bytes_used + space_info->bytes_reserved + in need_preemptive_reclaim()
798 space_info->bytes_readonly + global_rsv_size; in need_preemptive_reclaim()
799 if (used < space_info->total_bytes) in need_preemptive_reclaim()
800 thresh += space_info->total_bytes - used; in need_preemptive_reclaim()
801 thresh >>= space_info->clamp; in need_preemptive_reclaim()
803 used = space_info->bytes_pinned; in need_preemptive_reclaim()
834 used += space_info->bytes_may_use - global_rsv_size; in need_preemptive_reclaim()
841 struct btrfs_space_info *space_info, in steal_from_global_rsv() argument
847 if (global_rsv->space_info != space_info) in steal_from_global_rsv()
857 remove_ticket(space_info, ticket); in steal_from_global_rsv()
860 space_info->tickets_id++; in steal_from_global_rsv()
884 struct btrfs_space_info *space_info) in maybe_fail_all_tickets() argument
887 u64 tickets_id = space_info->tickets_id; in maybe_fail_all_tickets()
890 trace_btrfs_fail_all_tickets(fs_info, space_info); in maybe_fail_all_tickets()
894 __btrfs_dump_space_info(fs_info, space_info); in maybe_fail_all_tickets()
897 while (!list_empty(&space_info->tickets) && in maybe_fail_all_tickets()
898 tickets_id == space_info->tickets_id) { in maybe_fail_all_tickets()
899 ticket = list_first_entry(&space_info->tickets, in maybe_fail_all_tickets()
903 steal_from_global_rsv(fs_info, space_info, ticket)) in maybe_fail_all_tickets()
910 remove_ticket(space_info, ticket); in maybe_fail_all_tickets()
924 btrfs_try_granting_tickets(fs_info, space_info); in maybe_fail_all_tickets()
926 return (tickets_id != space_info->tickets_id); in maybe_fail_all_tickets()
937 struct btrfs_space_info *space_info; in btrfs_async_reclaim_metadata_space() local
944 space_info = btrfs_find_space_info(fs_info, BTRFS_BLOCK_GROUP_METADATA); in btrfs_async_reclaim_metadata_space()
946 spin_lock(&space_info->lock); in btrfs_async_reclaim_metadata_space()
947 to_reclaim = btrfs_calc_reclaim_metadata_size(fs_info, space_info); in btrfs_async_reclaim_metadata_space()
949 space_info->flush = 0; in btrfs_async_reclaim_metadata_space()
950 spin_unlock(&space_info->lock); in btrfs_async_reclaim_metadata_space()
953 last_tickets_id = space_info->tickets_id; in btrfs_async_reclaim_metadata_space()
954 spin_unlock(&space_info->lock); in btrfs_async_reclaim_metadata_space()
958 flush_space(fs_info, space_info, to_reclaim, flush_state, false); in btrfs_async_reclaim_metadata_space()
959 spin_lock(&space_info->lock); in btrfs_async_reclaim_metadata_space()
960 if (list_empty(&space_info->tickets)) { in btrfs_async_reclaim_metadata_space()
961 space_info->flush = 0; in btrfs_async_reclaim_metadata_space()
962 spin_unlock(&space_info->lock); in btrfs_async_reclaim_metadata_space()
966 space_info); in btrfs_async_reclaim_metadata_space()
967 if (last_tickets_id == space_info->tickets_id) { in btrfs_async_reclaim_metadata_space()
970 last_tickets_id = space_info->tickets_id; in btrfs_async_reclaim_metadata_space()
1000 if (maybe_fail_all_tickets(fs_info, space_info)) { in btrfs_async_reclaim_metadata_space()
1004 space_info->flush = 0; in btrfs_async_reclaim_metadata_space()
1010 spin_unlock(&space_info->lock); in btrfs_async_reclaim_metadata_space()
1025 struct btrfs_space_info *space_info; in btrfs_preempt_reclaim_metadata_space() local
1034 space_info = btrfs_find_space_info(fs_info, BTRFS_BLOCK_GROUP_METADATA); in btrfs_preempt_reclaim_metadata_space()
1040 spin_lock(&space_info->lock); in btrfs_preempt_reclaim_metadata_space()
1041 while (need_preemptive_reclaim(fs_info, space_info)) { in btrfs_preempt_reclaim_metadata_space()
1060 if (block_rsv_size < space_info->bytes_may_use) in btrfs_preempt_reclaim_metadata_space()
1061 delalloc_size = space_info->bytes_may_use - block_rsv_size; in btrfs_preempt_reclaim_metadata_space()
1062 spin_unlock(&space_info->lock); in btrfs_preempt_reclaim_metadata_space()
1079 } else if (space_info->bytes_pinned > in btrfs_preempt_reclaim_metadata_space()
1082 to_reclaim = space_info->bytes_pinned; in btrfs_preempt_reclaim_metadata_space()
1101 flush_space(fs_info, space_info, to_reclaim, flush, true); in btrfs_preempt_reclaim_metadata_space()
1103 spin_lock(&space_info->lock); in btrfs_preempt_reclaim_metadata_space()
1107 if (loops == 1 && !space_info->reclaim_size) in btrfs_preempt_reclaim_metadata_space()
1108 space_info->clamp = max(1, space_info->clamp - 1); in btrfs_preempt_reclaim_metadata_space()
1109 trace_btrfs_done_preemptive_reclaim(fs_info, space_info); in btrfs_preempt_reclaim_metadata_space()
1110 spin_unlock(&space_info->lock); in btrfs_preempt_reclaim_metadata_space()
1156 struct btrfs_space_info *space_info; in btrfs_async_reclaim_data_space() local
1161 space_info = fs_info->data_sinfo; in btrfs_async_reclaim_data_space()
1163 spin_lock(&space_info->lock); in btrfs_async_reclaim_data_space()
1164 if (list_empty(&space_info->tickets)) { in btrfs_async_reclaim_data_space()
1165 space_info->flush = 0; in btrfs_async_reclaim_data_space()
1166 spin_unlock(&space_info->lock); in btrfs_async_reclaim_data_space()
1169 last_tickets_id = space_info->tickets_id; in btrfs_async_reclaim_data_space()
1170 spin_unlock(&space_info->lock); in btrfs_async_reclaim_data_space()
1172 while (!space_info->full) { 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()
1174 spin_lock(&space_info->lock); in btrfs_async_reclaim_data_space()
1175 if (list_empty(&space_info->tickets)) { in btrfs_async_reclaim_data_space()
1176 space_info->flush = 0; in btrfs_async_reclaim_data_space()
1177 spin_unlock(&space_info->lock); in btrfs_async_reclaim_data_space()
1184 last_tickets_id = space_info->tickets_id; in btrfs_async_reclaim_data_space()
1185 spin_unlock(&space_info->lock); in btrfs_async_reclaim_data_space()
1189 flush_space(fs_info, space_info, U64_MAX, in btrfs_async_reclaim_data_space()
1191 spin_lock(&space_info->lock); in btrfs_async_reclaim_data_space()
1192 if (list_empty(&space_info->tickets)) { in btrfs_async_reclaim_data_space()
1193 space_info->flush = 0; in btrfs_async_reclaim_data_space()
1194 spin_unlock(&space_info->lock); in btrfs_async_reclaim_data_space()
1198 if (last_tickets_id == space_info->tickets_id) { in btrfs_async_reclaim_data_space()
1201 last_tickets_id = space_info->tickets_id; in btrfs_async_reclaim_data_space()
1206 if (space_info->full) { in btrfs_async_reclaim_data_space()
1207 if (maybe_fail_all_tickets(fs_info, space_info)) in btrfs_async_reclaim_data_space()
1210 space_info->flush = 0; in btrfs_async_reclaim_data_space()
1220 spin_unlock(&space_info->lock); in btrfs_async_reclaim_data_space()
1225 maybe_fail_all_tickets(fs_info, space_info); in btrfs_async_reclaim_data_space()
1226 space_info->flush = 0; in btrfs_async_reclaim_data_space()
1227 spin_unlock(&space_info->lock); in btrfs_async_reclaim_data_space()
1257 struct btrfs_space_info *space_info, in priority_reclaim_metadata_space() argument
1265 spin_lock(&space_info->lock); in priority_reclaim_metadata_space()
1266 to_reclaim = btrfs_calc_reclaim_metadata_size(fs_info, space_info); in priority_reclaim_metadata_space()
1268 spin_unlock(&space_info->lock); in priority_reclaim_metadata_space()
1271 spin_unlock(&space_info->lock); in priority_reclaim_metadata_space()
1275 flush_space(fs_info, space_info, to_reclaim, states[flush_state], in priority_reclaim_metadata_space()
1278 spin_lock(&space_info->lock); in priority_reclaim_metadata_space()
1280 spin_unlock(&space_info->lock); in priority_reclaim_metadata_space()
1283 spin_unlock(&space_info->lock); in priority_reclaim_metadata_space()
1288 struct btrfs_space_info *space_info, in priority_reclaim_data_space() argument
1291 while (!space_info->full) { in priority_reclaim_data_space()
1292 flush_space(fs_info, space_info, U64_MAX, ALLOC_CHUNK_FORCE, false); in priority_reclaim_data_space()
1293 spin_lock(&space_info->lock); in priority_reclaim_data_space()
1295 spin_unlock(&space_info->lock); in priority_reclaim_data_space()
1298 spin_unlock(&space_info->lock); in priority_reclaim_data_space()
1303 struct btrfs_space_info *space_info, in wait_reserve_ticket() argument
1310 spin_lock(&space_info->lock); in wait_reserve_ticket()
1322 remove_ticket(space_info, ticket); in wait_reserve_ticket()
1326 spin_unlock(&space_info->lock); in wait_reserve_ticket()
1331 spin_lock(&space_info->lock); in wait_reserve_ticket()
1333 spin_unlock(&space_info->lock); in wait_reserve_ticket()
1350 struct btrfs_space_info *space_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()
1381 spin_lock(&space_info->lock); in handle_reserve_ticket()
1392 remove_ticket(space_info, ticket); in handle_reserve_ticket()
1393 btrfs_try_granting_tickets(fs_info, space_info); in handle_reserve_ticket()
1399 spin_unlock(&space_info->lock); in handle_reserve_ticket()
1408 trace_btrfs_reserve_ticket(fs_info, space_info->flags, orig_bytes, in handle_reserve_ticket()
1424 struct btrfs_space_info *space_info) in maybe_clamp_preempt() argument
1438 space_info->clamp = min(space_info->clamp + 1, 8); in maybe_clamp_preempt()
1457 struct btrfs_space_info *space_info, u64 orig_bytes, in __reserve_bytes() argument
1475 spin_lock(&space_info->lock); in __reserve_bytes()
1477 used = btrfs_space_info_used(space_info, true); in __reserve_bytes()
1485 pending_tickets = !list_empty(&space_info->tickets) || in __reserve_bytes()
1486 !list_empty(&space_info->priority_tickets); in __reserve_bytes()
1488 pending_tickets = !list_empty(&space_info->priority_tickets); in __reserve_bytes()
1495 ((used + orig_bytes <= space_info->total_bytes) || 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()
1512 space_info->reclaim_size += ticket.bytes; in __reserve_bytes()
1521 list_add_tail(&ticket.list, &space_info->tickets); in __reserve_bytes()
1522 if (!space_info->flush) { in __reserve_bytes()
1530 maybe_clamp_preempt(fs_info, space_info); in __reserve_bytes()
1532 space_info->flush = 1; in __reserve_bytes()
1534 space_info->flags, in __reserve_bytes()
1541 &space_info->priority_tickets); in __reserve_bytes()
1543 } else if (!ret && space_info->flags & BTRFS_BLOCK_GROUP_METADATA) { 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()
1559 spin_unlock(&space_info->lock); in __reserve_bytes()
1563 return handle_reserve_ticket(fs_info, space_info, &ticket, start_ns, in __reserve_bytes()
1591 ret = __reserve_bytes(fs_info, block_rsv->space_info, orig_bytes, flush); in btrfs_reserve_metadata_bytes()
1600 block_rsv->space_info->flags, in btrfs_reserve_metadata_bytes()
1604 btrfs_dump_space_info(fs_info, block_rsv->space_info, in btrfs_reserve_metadata_bytes()