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