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 | |