Lines Matching +full:full +full:- +full:size

1 // SPDX-License-Identifier: GPL-2.0
5 #include "block-rsv.h"
6 #include "space-info.h"
8 #include "block-group.h"
14 * reservations. Each block_rsv has a ->size and a ->reserved. ->size is
15 * how large we want our block rsv to be, ->reserved is how much space is
18 * ->failfast exists for the truncate case, and is described below.
22 * -> Reserve
26 * accounted for in space_info->bytes_may_use, and then add the bytes to
27 * ->reserved, and ->size in the case of btrfs_block_rsv_add.
29 * ->size is an over-estimation of how much we may use for a particular
32 * -> Use
37 * ->reserved has enough space for our tree block allocation. Once
38 * successful we subtract fs_info->nodesize from ->reserved.
40 * -> Finish
44 * from ->size, and then subtract ->size from ->reserved and free up the
49 * space_info->bytes_may_use.
68 * The individual item sizes are determined by the per-inode size
70 * straightforward, it's just the calculation of ->size encodes a lot of
76 * We assume each one of these delayed refs are going to use a full
77 * reservation. We use the transaction items and pre-reserve space for every
78 * operation, and use this reservation to refill any gap between ->size and
79 * ->reserved that may exist.
82 * count from ->size and free up reservations as necessary. Since this is
94 * allocate a block reserve, set it to some size, and then truncate bytes
95 * until we have no space left. With ->failfast set we'll simply return
99 * re-reserve.
107 struct btrfs_space_info *space_info = block_rsv->space_info; in block_rsv_release_bytes()
111 spin_lock(&block_rsv->lock); in block_rsv_release_bytes()
112 if (num_bytes == (u64)-1) { in block_rsv_release_bytes()
113 num_bytes = block_rsv->size; in block_rsv_release_bytes()
114 qgroup_to_release = block_rsv->qgroup_rsv_size; in block_rsv_release_bytes()
116 block_rsv->size -= num_bytes; in block_rsv_release_bytes()
117 if (block_rsv->reserved >= block_rsv->size) { in block_rsv_release_bytes()
118 num_bytes = block_rsv->reserved - block_rsv->size; in block_rsv_release_bytes()
119 block_rsv->reserved = block_rsv->size; in block_rsv_release_bytes()
120 block_rsv->full = 1; in block_rsv_release_bytes()
124 if (block_rsv->qgroup_rsv_reserved >= block_rsv->qgroup_rsv_size) { in block_rsv_release_bytes()
125 qgroup_to_release = block_rsv->qgroup_rsv_reserved - in block_rsv_release_bytes()
126 block_rsv->qgroup_rsv_size; in block_rsv_release_bytes()
127 block_rsv->qgroup_rsv_reserved = block_rsv->qgroup_rsv_size; in block_rsv_release_bytes()
131 spin_unlock(&block_rsv->lock); in block_rsv_release_bytes()
136 spin_lock(&dest->lock); in block_rsv_release_bytes()
137 if (!dest->full) { in block_rsv_release_bytes()
140 bytes_to_add = dest->size - dest->reserved; in block_rsv_release_bytes()
142 dest->reserved += bytes_to_add; in block_rsv_release_bytes()
143 if (dest->reserved >= dest->size) in block_rsv_release_bytes()
144 dest->full = 1; in block_rsv_release_bytes()
145 num_bytes -= bytes_to_add; in block_rsv_release_bytes()
147 spin_unlock(&dest->lock); in block_rsv_release_bytes()
176 spin_lock_init(&rsv->lock); in btrfs_init_block_rsv()
177 rsv->type = type; in btrfs_init_block_rsv()
185 rsv->space_info = btrfs_find_space_info(fs_info, in btrfs_init_metadata_block_rsv()
207 btrfs_block_rsv_release(fs_info, rsv, (u64)-1, NULL); in btrfs_free_block_rsv()
230 int ret = -ENOSPC; in btrfs_block_rsv_check()
235 spin_lock(&block_rsv->lock); in btrfs_block_rsv_check()
236 num_bytes = div_factor(block_rsv->size, min_factor); in btrfs_block_rsv_check()
237 if (block_rsv->reserved >= num_bytes) in btrfs_block_rsv_check()
239 spin_unlock(&block_rsv->lock); in btrfs_block_rsv_check()
249 int ret = -ENOSPC; in btrfs_block_rsv_refill()
254 spin_lock(&block_rsv->lock); in btrfs_block_rsv_refill()
256 if (block_rsv->reserved >= num_bytes) in btrfs_block_rsv_refill()
259 num_bytes -= block_rsv->reserved; in btrfs_block_rsv_refill()
260 spin_unlock(&block_rsv->lock); in btrfs_block_rsv_refill()
278 struct btrfs_block_rsv *global_rsv = &fs_info->global_block_rsv; in btrfs_block_rsv_release()
279 struct btrfs_block_rsv *delayed_rsv = &fs_info->delayed_refs_rsv; in btrfs_block_rsv_release()
284 * into the delayed rsv if it is not full. in btrfs_block_rsv_release()
288 else if (block_rsv != global_rsv && !delayed_rsv->full) in btrfs_block_rsv_release()
291 if (target && block_rsv->space_info != target->space_info) in btrfs_block_rsv_release()
300 int ret = -ENOSPC; in btrfs_block_rsv_use_bytes()
302 spin_lock(&block_rsv->lock); in btrfs_block_rsv_use_bytes()
303 if (block_rsv->reserved >= num_bytes) { in btrfs_block_rsv_use_bytes()
304 block_rsv->reserved -= num_bytes; in btrfs_block_rsv_use_bytes()
305 if (block_rsv->reserved < block_rsv->size) in btrfs_block_rsv_use_bytes()
306 block_rsv->full = 0; in btrfs_block_rsv_use_bytes()
309 spin_unlock(&block_rsv->lock); in btrfs_block_rsv_use_bytes()
316 spin_lock(&block_rsv->lock); in btrfs_block_rsv_add_bytes()
317 block_rsv->reserved += num_bytes; in btrfs_block_rsv_add_bytes()
319 block_rsv->size += num_bytes; in btrfs_block_rsv_add_bytes()
320 else if (block_rsv->reserved >= block_rsv->size) in btrfs_block_rsv_add_bytes()
321 block_rsv->full = 1; in btrfs_block_rsv_add_bytes()
322 spin_unlock(&block_rsv->lock); in btrfs_block_rsv_add_bytes()
329 struct btrfs_block_rsv *global_rsv = &fs_info->global_block_rsv; in btrfs_cond_migrate_bytes()
332 if (global_rsv->space_info != dest->space_info) in btrfs_cond_migrate_bytes()
333 return -ENOSPC; in btrfs_cond_migrate_bytes()
335 spin_lock(&global_rsv->lock); in btrfs_cond_migrate_bytes()
336 min_bytes = div_factor(global_rsv->size, min_factor); in btrfs_cond_migrate_bytes()
337 if (global_rsv->reserved < min_bytes + num_bytes) { in btrfs_cond_migrate_bytes()
338 spin_unlock(&global_rsv->lock); in btrfs_cond_migrate_bytes()
339 return -ENOSPC; in btrfs_cond_migrate_bytes()
341 global_rsv->reserved -= num_bytes; in btrfs_cond_migrate_bytes()
342 if (global_rsv->reserved < global_rsv->size) in btrfs_cond_migrate_bytes()
343 global_rsv->full = 0; in btrfs_cond_migrate_bytes()
344 spin_unlock(&global_rsv->lock); in btrfs_cond_migrate_bytes()
352 struct btrfs_block_rsv *block_rsv = &fs_info->global_block_rsv; in btrfs_update_global_block_rsv()
353 struct btrfs_space_info *sinfo = block_rsv->space_info; in btrfs_update_global_block_rsv()
358 * The global block rsv is based on the size of the extent tree, the in btrfs_update_global_block_rsv()
362 num_bytes = btrfs_root_used(&fs_info->extent_root->root_item) + in btrfs_update_global_block_rsv()
363 btrfs_root_used(&fs_info->csum_root->root_item) + in btrfs_update_global_block_rsv()
364 btrfs_root_used(&fs_info->tree_root->root_item); in btrfs_update_global_block_rsv()
386 spin_lock(&sinfo->lock); in btrfs_update_global_block_rsv()
387 spin_lock(&block_rsv->lock); in btrfs_update_global_block_rsv()
389 block_rsv->size = min_t(u64, num_bytes, SZ_512M); in btrfs_update_global_block_rsv()
391 if (block_rsv->reserved < block_rsv->size) { in btrfs_update_global_block_rsv()
392 num_bytes = block_rsv->size - block_rsv->reserved; in btrfs_update_global_block_rsv()
395 block_rsv->reserved = block_rsv->size; in btrfs_update_global_block_rsv()
396 } else if (block_rsv->reserved > block_rsv->size) { in btrfs_update_global_block_rsv()
397 num_bytes = block_rsv->reserved - block_rsv->size; in btrfs_update_global_block_rsv()
399 -num_bytes); in btrfs_update_global_block_rsv()
400 block_rsv->reserved = block_rsv->size; in btrfs_update_global_block_rsv()
404 if (block_rsv->reserved == block_rsv->size) in btrfs_update_global_block_rsv()
405 block_rsv->full = 1; in btrfs_update_global_block_rsv()
407 block_rsv->full = 0; in btrfs_update_global_block_rsv()
409 if (block_rsv->size >= sinfo->total_bytes) in btrfs_update_global_block_rsv()
410 sinfo->force_alloc = CHUNK_ALLOC_FORCE; in btrfs_update_global_block_rsv()
411 spin_unlock(&block_rsv->lock); in btrfs_update_global_block_rsv()
412 spin_unlock(&sinfo->lock); in btrfs_update_global_block_rsv()
420 fs_info->chunk_block_rsv.space_info = space_info; in btrfs_init_global_block_rsv()
423 fs_info->global_block_rsv.space_info = space_info; in btrfs_init_global_block_rsv()
424 fs_info->trans_block_rsv.space_info = space_info; in btrfs_init_global_block_rsv()
425 fs_info->empty_block_rsv.space_info = space_info; in btrfs_init_global_block_rsv()
426 fs_info->delayed_block_rsv.space_info = space_info; in btrfs_init_global_block_rsv()
427 fs_info->delayed_refs_rsv.space_info = space_info; in btrfs_init_global_block_rsv()
433 if (!fs_info->extent_root || !fs_info->csum_root || in btrfs_init_global_block_rsv()
434 !fs_info->dev_root || !fs_info->chunk_root || !fs_info->tree_root) in btrfs_init_global_block_rsv()
437 fs_info->extent_root->block_rsv = &fs_info->delayed_refs_rsv; in btrfs_init_global_block_rsv()
438 fs_info->csum_root->block_rsv = &fs_info->delayed_refs_rsv; in btrfs_init_global_block_rsv()
439 fs_info->dev_root->block_rsv = &fs_info->global_block_rsv; in btrfs_init_global_block_rsv()
440 fs_info->tree_root->block_rsv = &fs_info->global_block_rsv; in btrfs_init_global_block_rsv()
441 if (fs_info->quota_root) in btrfs_init_global_block_rsv()
442 fs_info->quota_root->block_rsv = &fs_info->global_block_rsv; in btrfs_init_global_block_rsv()
443 fs_info->chunk_root->block_rsv = &fs_info->chunk_block_rsv; in btrfs_init_global_block_rsv()
450 btrfs_block_rsv_release(fs_info, &fs_info->global_block_rsv, (u64)-1, in btrfs_release_global_block_rsv()
452 WARN_ON(fs_info->trans_block_rsv.size > 0); in btrfs_release_global_block_rsv()
453 WARN_ON(fs_info->trans_block_rsv.reserved > 0); in btrfs_release_global_block_rsv()
454 WARN_ON(fs_info->chunk_block_rsv.size > 0); in btrfs_release_global_block_rsv()
455 WARN_ON(fs_info->chunk_block_rsv.reserved > 0); in btrfs_release_global_block_rsv()
456 WARN_ON(fs_info->delayed_block_rsv.size > 0); in btrfs_release_global_block_rsv()
457 WARN_ON(fs_info->delayed_block_rsv.reserved > 0); in btrfs_release_global_block_rsv()
458 WARN_ON(fs_info->delayed_refs_rsv.reserved > 0); in btrfs_release_global_block_rsv()
459 WARN_ON(fs_info->delayed_refs_rsv.size > 0); in btrfs_release_global_block_rsv()
466 struct btrfs_fs_info *fs_info = root->fs_info; in get_block_rsv()
469 if (test_bit(BTRFS_ROOT_SHAREABLE, &root->state) || in get_block_rsv()
470 (root == fs_info->csum_root && trans->adding_csums) || in get_block_rsv()
471 (root == fs_info->uuid_root)) in get_block_rsv()
472 block_rsv = trans->block_rsv; in get_block_rsv()
475 block_rsv = root->block_rsv; in get_block_rsv()
478 block_rsv = &fs_info->empty_block_rsv; in get_block_rsv()
487 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_use_block_rsv()
489 struct btrfs_block_rsv *global_rsv = &fs_info->global_block_rsv; in btrfs_use_block_rsv()
495 if (unlikely(block_rsv->size == 0)) in btrfs_use_block_rsv()
502 if (block_rsv->failfast) in btrfs_use_block_rsv()
505 if (block_rsv->type == BTRFS_BLOCK_RSV_GLOBAL && !global_updated) { in btrfs_use_block_rsv()
515 if (block_rsv->type != BTRFS_BLOCK_RSV_DELREFS && in btrfs_use_block_rsv()
523 block_rsv->type, ret); in btrfs_use_block_rsv()
535 if (block_rsv->type != BTRFS_BLOCK_RSV_GLOBAL && in btrfs_use_block_rsv()
536 block_rsv->space_info == global_rsv->space_info) { in btrfs_use_block_rsv()