^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #ifndef BTRFS_BLOCK_RSV_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) #define BTRFS_BLOCK_RSV_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) struct btrfs_trans_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) enum btrfs_reserve_flush_enum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * Types of block reserves
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) BTRFS_BLOCK_RSV_GLOBAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) BTRFS_BLOCK_RSV_DELALLOC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) BTRFS_BLOCK_RSV_TRANS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) BTRFS_BLOCK_RSV_CHUNK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) BTRFS_BLOCK_RSV_DELOPS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) BTRFS_BLOCK_RSV_DELREFS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) BTRFS_BLOCK_RSV_EMPTY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) BTRFS_BLOCK_RSV_TEMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) struct btrfs_block_rsv {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) u64 size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) u64 reserved;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) struct btrfs_space_info *space_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) spinlock_t lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) unsigned short full;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) unsigned short type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) unsigned short failfast;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) * Qgroup equivalent for @size @reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) * Unlike normal @size/@reserved for inode rsv, qgroup doesn't care
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) * about things like csum size nor how many tree blocks it will need to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) * reserve.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) * Qgroup cares more about net change of the extent usage.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) * So for one newly inserted file extent, in worst case it will cause
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) * leaf split and level increase, nodesize for each file extent is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) * already too much.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) * In short, qgroup_size/reserved is the upper limit of possible needed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) * qgroup metadata reservation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) u64 qgroup_rsv_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) u64 qgroup_rsv_reserved;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) void btrfs_init_block_rsv(struct btrfs_block_rsv *rsv, unsigned short type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) struct btrfs_block_rsv *btrfs_alloc_block_rsv(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) unsigned short type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) void btrfs_init_metadata_block_rsv(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) struct btrfs_block_rsv *rsv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) unsigned short type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) void btrfs_free_block_rsv(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) struct btrfs_block_rsv *rsv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) int btrfs_block_rsv_add(struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) struct btrfs_block_rsv *block_rsv, u64 num_bytes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) enum btrfs_reserve_flush_enum flush);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) int btrfs_block_rsv_check(struct btrfs_block_rsv *block_rsv, int min_factor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) int btrfs_block_rsv_refill(struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) struct btrfs_block_rsv *block_rsv, u64 min_reserved,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) enum btrfs_reserve_flush_enum flush);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) int btrfs_block_rsv_migrate(struct btrfs_block_rsv *src_rsv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) struct btrfs_block_rsv *dst_rsv, u64 num_bytes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) bool update_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) int btrfs_block_rsv_use_bytes(struct btrfs_block_rsv *block_rsv, u64 num_bytes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) int btrfs_cond_migrate_bytes(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) struct btrfs_block_rsv *dest, u64 num_bytes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) int min_factor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) void btrfs_block_rsv_add_bytes(struct btrfs_block_rsv *block_rsv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) u64 num_bytes, bool update_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) u64 btrfs_block_rsv_release(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) struct btrfs_block_rsv *block_rsv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) u64 num_bytes, u64 *qgroup_to_release);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) void btrfs_update_global_block_rsv(struct btrfs_fs_info *fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) void btrfs_init_global_block_rsv(struct btrfs_fs_info *fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) void btrfs_release_global_block_rsv(struct btrfs_fs_info *fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) struct btrfs_block_rsv *btrfs_use_block_rsv(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) struct btrfs_root *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) u32 blocksize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) static inline void btrfs_unuse_block_rsv(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) struct btrfs_block_rsv *block_rsv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) u32 blocksize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) btrfs_block_rsv_add_bytes(block_rsv, blocksize, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) btrfs_block_rsv_release(fs_info, block_rsv, 0, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #endif /* BTRFS_BLOCK_RSV_H */