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