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