1 /* SPDX-License-Identifier: GPL-2.0 */ 2 3 #ifndef BTRFS_EXTENT_TREE_H 4 #define BTRFS_EXTENT_TREE_H 5 6 #include <linux/types.h> 7 #include "misc.h" 8 #include "block-group.h" 9 #include "locking.h" 10 11 struct extent_buffer; 12 struct btrfs_free_cluster; 13 struct btrfs_fs_info; 14 struct btrfs_root; 15 struct btrfs_path; 16 struct btrfs_ref; 17 struct btrfs_disk_key; 18 struct btrfs_delayed_ref_head; 19 struct btrfs_delayed_ref_root; 20 struct btrfs_extent_inline_ref; 21 22 enum btrfs_extent_allocation_policy { 23 BTRFS_EXTENT_ALLOC_CLUSTERED, 24 BTRFS_EXTENT_ALLOC_ZONED, 25 }; 26 27 struct find_free_extent_ctl { 28 /* Basic allocation info */ 29 u64 ram_bytes; 30 u64 num_bytes; 31 u64 min_alloc_size; 32 u64 empty_size; 33 u64 flags; 34 int delalloc; 35 36 /* Where to start the search inside the bg */ 37 u64 search_start; 38 39 /* For clustered allocation */ 40 u64 empty_cluster; 41 struct btrfs_free_cluster *last_ptr; 42 bool use_cluster; 43 44 bool have_caching_bg; 45 bool orig_have_caching_bg; 46 47 /* Allocation is called for tree-log */ 48 bool for_treelog; 49 50 /* Allocation is called for data relocation */ 51 bool for_data_reloc; 52 53 /* RAID index, converted from flags */ 54 int index; 55 56 /* 57 * Current loop number, check find_free_extent_update_loop() for details 58 */ 59 int loop; 60 61 /* 62 * Set to true if we're retrying the allocation on this block group 63 * after waiting for caching progress, this is so that we retry only 64 * once before moving on to another block group. 65 */ 66 bool retry_uncached; 67 68 /* If current block group is cached */ 69 int cached; 70 71 /* Max contiguous hole found */ 72 u64 max_extent_size; 73 74 /* Total free space from free space cache, not always contiguous */ 75 u64 total_free_space; 76 77 /* Found result */ 78 u64 found_offset; 79 80 /* Hint where to start looking for an empty space */ 81 u64 hint_byte; 82 83 /* Allocation policy */ 84 enum btrfs_extent_allocation_policy policy; 85 86 /* Whether or not the allocator is currently following a hint */ 87 bool hinted; 88 89 /* Size class of block groups to prefer in early loops */ 90 enum btrfs_block_group_size_class size_class; 91 }; 92 93 enum btrfs_inline_ref_type { 94 BTRFS_REF_TYPE_INVALID, 95 BTRFS_REF_TYPE_BLOCK, 96 BTRFS_REF_TYPE_DATA, 97 BTRFS_REF_TYPE_ANY, 98 }; 99 100 int btrfs_get_extent_inline_ref_type(const struct extent_buffer *eb, 101 struct btrfs_extent_inline_ref *iref, 102 enum btrfs_inline_ref_type is_data); 103 u64 hash_extent_data_ref(u64 root_objectid, u64 owner, u64 offset); 104 105 int btrfs_run_delayed_refs(struct btrfs_trans_handle *trans, u64 min_bytes); 106 u64 btrfs_cleanup_ref_head_accounting(struct btrfs_fs_info *fs_info, 107 struct btrfs_delayed_ref_root *delayed_refs, 108 struct btrfs_delayed_ref_head *head); 109 int btrfs_lookup_data_extent(struct btrfs_fs_info *fs_info, u64 start, u64 len); 110 int btrfs_lookup_extent_info(struct btrfs_trans_handle *trans, 111 struct btrfs_fs_info *fs_info, u64 bytenr, 112 u64 offset, int metadata, u64 *refs, u64 *flags, 113 u64 *owner_root); 114 int btrfs_pin_extent(struct btrfs_trans_handle *trans, u64 bytenr, u64 num, 115 int reserved); 116 int btrfs_pin_extent_for_log_replay(struct btrfs_trans_handle *trans, 117 const struct extent_buffer *eb); 118 int btrfs_exclude_logged_extents(struct extent_buffer *eb); 119 int btrfs_cross_ref_exist(struct btrfs_root *root, 120 u64 objectid, u64 offset, u64 bytenr, bool strict, 121 struct btrfs_path *path); 122 struct extent_buffer *btrfs_alloc_tree_block(struct btrfs_trans_handle *trans, 123 struct btrfs_root *root, 124 u64 parent, u64 root_objectid, 125 const struct btrfs_disk_key *key, 126 int level, u64 hint, 127 u64 empty_size, 128 u64 reloc_src_root, 129 enum btrfs_lock_nesting nest); 130 int btrfs_free_tree_block(struct btrfs_trans_handle *trans, 131 u64 root_id, 132 struct extent_buffer *buf, 133 u64 parent, int last_ref); 134 int btrfs_alloc_reserved_file_extent(struct btrfs_trans_handle *trans, 135 struct btrfs_root *root, u64 owner, 136 u64 offset, u64 ram_bytes, 137 struct btrfs_key *ins); 138 int btrfs_alloc_logged_file_extent(struct btrfs_trans_handle *trans, 139 u64 root_objectid, u64 owner, u64 offset, 140 struct btrfs_key *ins); 141 int btrfs_reserve_extent(struct btrfs_root *root, u64 ram_bytes, u64 num_bytes, 142 u64 min_alloc_size, u64 empty_size, u64 hint_byte, 143 struct btrfs_key *ins, int is_data, int delalloc); 144 int btrfs_inc_ref(struct btrfs_trans_handle *trans, struct btrfs_root *root, 145 struct extent_buffer *buf, int full_backref); 146 int btrfs_dec_ref(struct btrfs_trans_handle *trans, struct btrfs_root *root, 147 struct extent_buffer *buf, int full_backref); 148 int btrfs_set_disk_extent_flags(struct btrfs_trans_handle *trans, 149 struct extent_buffer *eb, u64 flags); 150 int btrfs_free_extent(struct btrfs_trans_handle *trans, struct btrfs_ref *ref); 151 152 u64 btrfs_get_extent_owner_root(struct btrfs_fs_info *fs_info, 153 struct extent_buffer *leaf, int slot); 154 int btrfs_free_reserved_extent(struct btrfs_fs_info *fs_info, 155 u64 start, u64 len, int delalloc); 156 int btrfs_pin_reserved_extent(struct btrfs_trans_handle *trans, 157 const struct extent_buffer *eb); 158 int btrfs_finish_extent_commit(struct btrfs_trans_handle *trans); 159 int btrfs_inc_extent_ref(struct btrfs_trans_handle *trans, struct btrfs_ref *generic_ref); 160 int btrfs_drop_snapshot(struct btrfs_root *root, int update_ref, 161 int for_reloc); 162 int btrfs_drop_subtree(struct btrfs_trans_handle *trans, 163 struct btrfs_root *root, 164 struct extent_buffer *node, 165 struct extent_buffer *parent); 166 167 #endif 168