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