• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: GPL-2.0 */
2 
3 #ifndef BTRFS_EXTENT_IO_TREE_H
4 #define BTRFS_EXTENT_IO_TREE_H
5 
6 struct extent_changeset;
7 struct io_failure_record;
8 
9 /* Bits for the extent state */
10 #define EXTENT_DIRTY		(1U << 0)
11 #define EXTENT_UPTODATE		(1U << 1)
12 #define EXTENT_LOCKED		(1U << 2)
13 #define EXTENT_NEW		(1U << 3)
14 #define EXTENT_DELALLOC		(1U << 4)
15 #define EXTENT_DEFRAG		(1U << 5)
16 #define EXTENT_BOUNDARY		(1U << 6)
17 #define EXTENT_NODATASUM	(1U << 7)
18 #define EXTENT_CLEAR_META_RESV	(1U << 8)
19 #define EXTENT_NEED_WAIT	(1U << 9)
20 #define EXTENT_DAMAGED		(1U << 10)
21 #define EXTENT_NORESERVE	(1U << 11)
22 #define EXTENT_QGROUP_RESERVED	(1U << 12)
23 #define EXTENT_CLEAR_DATA_RESV	(1U << 13)
24 /*
25  * Must be cleared only during ordered extent completion or on error paths if we
26  * did not manage to submit bios and create the ordered extents for the range.
27  * Should not be cleared during page release and page invalidation (if there is
28  * an ordered extent in flight), that is left for the ordered extent completion.
29  */
30 #define EXTENT_DELALLOC_NEW	(1U << 14)
31 /*
32  * When an ordered extent successfully completes for a region marked as a new
33  * delalloc range, use this flag when clearing a new delalloc range to indicate
34  * that the VFS' inode number of bytes should be incremented and the inode's new
35  * delalloc bytes decremented, in an atomic way to prevent races with stat(2).
36  */
37 #define EXTENT_ADD_INODE_BYTES  (1U << 15)
38 #define EXTENT_DO_ACCOUNTING    (EXTENT_CLEAR_META_RESV | \
39 				 EXTENT_CLEAR_DATA_RESV)
40 #define EXTENT_CTLBITS		(EXTENT_DO_ACCOUNTING | \
41 				 EXTENT_ADD_INODE_BYTES)
42 
43 /*
44  * Redefined bits above which are used only in the device allocation tree,
45  * shouldn't be using EXTENT_LOCKED / EXTENT_BOUNDARY / EXTENT_CLEAR_META_RESV
46  * / EXTENT_CLEAR_DATA_RESV because they have special meaning to the bit
47  * manipulation functions
48  */
49 #define CHUNK_ALLOCATED				EXTENT_DIRTY
50 #define CHUNK_TRIMMED				EXTENT_DEFRAG
51 #define CHUNK_STATE_MASK			(CHUNK_ALLOCATED |		\
52 						 CHUNK_TRIMMED)
53 
54 enum {
55 	IO_TREE_FS_PINNED_EXTENTS,
56 	IO_TREE_FS_EXCLUDED_EXTENTS,
57 	IO_TREE_BTREE_INODE_IO,
58 	IO_TREE_INODE_IO,
59 	IO_TREE_INODE_IO_FAILURE,
60 	IO_TREE_RELOC_BLOCKS,
61 	IO_TREE_TRANS_DIRTY_PAGES,
62 	IO_TREE_ROOT_DIRTY_LOG_PAGES,
63 	IO_TREE_INODE_FILE_EXTENT,
64 	IO_TREE_LOG_CSUM_RANGE,
65 	IO_TREE_SELFTEST,
66 	IO_TREE_DEVICE_ALLOC_STATE,
67 };
68 
69 struct extent_io_tree {
70 	struct rb_root state;
71 	struct btrfs_fs_info *fs_info;
72 	void *private_data;
73 	u64 dirty_bytes;
74 	bool track_uptodate;
75 
76 	/* Who owns this io tree, should be one of IO_TREE_* */
77 	u8 owner;
78 
79 	spinlock_t lock;
80 };
81 
82 struct extent_state {
83 	u64 start;
84 	u64 end; /* inclusive */
85 	struct rb_node rb_node;
86 
87 	/* ADD NEW ELEMENTS AFTER THIS */
88 	wait_queue_head_t wq;
89 	refcount_t refs;
90 	u32 state;
91 
92 	struct io_failure_record *failrec;
93 
94 #ifdef CONFIG_BTRFS_DEBUG
95 	struct list_head leak_list;
96 #endif
97 };
98 
99 int __init extent_state_cache_init(void);
100 void __cold extent_state_cache_exit(void);
101 
102 void extent_io_tree_init(struct btrfs_fs_info *fs_info,
103 			 struct extent_io_tree *tree, unsigned int owner,
104 			 void *private_data);
105 void extent_io_tree_release(struct extent_io_tree *tree);
106 
107 int lock_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
108 		     struct extent_state **cached);
109 
lock_extent(struct extent_io_tree * tree,u64 start,u64 end)110 static inline int lock_extent(struct extent_io_tree *tree, u64 start, u64 end)
111 {
112 	return lock_extent_bits(tree, start, end, NULL);
113 }
114 
115 int try_lock_extent(struct extent_io_tree *tree, u64 start, u64 end);
116 
117 int __init extent_io_init(void);
118 void __cold extent_io_exit(void);
119 
120 u64 count_range_bits(struct extent_io_tree *tree,
121 		     u64 *start, u64 search_end,
122 		     u64 max_bytes, u32 bits, int contig);
123 
124 void free_extent_state(struct extent_state *state);
125 int test_range_bit(struct extent_io_tree *tree, u64 start, u64 end,
126 		   u32 bits, int filled, struct extent_state *cached_state);
127 int clear_record_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
128 			     u32 bits, struct extent_changeset *changeset);
129 int clear_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
130 		     u32 bits, int wake, int delete,
131 		     struct extent_state **cached);
132 int __clear_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
133 		     u32 bits, int wake, int delete,
134 		     struct extent_state **cached, gfp_t mask,
135 		     struct extent_changeset *changeset);
136 
unlock_extent(struct extent_io_tree * tree,u64 start,u64 end)137 static inline int unlock_extent(struct extent_io_tree *tree, u64 start, u64 end)
138 {
139 	return clear_extent_bit(tree, start, end, EXTENT_LOCKED, 1, 0, NULL);
140 }
141 
unlock_extent_cached(struct extent_io_tree * tree,u64 start,u64 end,struct extent_state ** cached)142 static inline int unlock_extent_cached(struct extent_io_tree *tree, u64 start,
143 		u64 end, struct extent_state **cached)
144 {
145 	return __clear_extent_bit(tree, start, end, EXTENT_LOCKED, 1, 0, cached,
146 				GFP_NOFS, NULL);
147 }
148 
unlock_extent_cached_atomic(struct extent_io_tree * tree,u64 start,u64 end,struct extent_state ** cached)149 static inline int unlock_extent_cached_atomic(struct extent_io_tree *tree,
150 		u64 start, u64 end, struct extent_state **cached)
151 {
152 	return __clear_extent_bit(tree, start, end, EXTENT_LOCKED, 1, 0, cached,
153 				GFP_ATOMIC, NULL);
154 }
155 
clear_extent_bits(struct extent_io_tree * tree,u64 start,u64 end,u32 bits)156 static inline int clear_extent_bits(struct extent_io_tree *tree, u64 start,
157 				    u64 end, u32 bits)
158 {
159 	int wake = 0;
160 
161 	if (bits & EXTENT_LOCKED)
162 		wake = 1;
163 
164 	return clear_extent_bit(tree, start, end, bits, wake, 0, NULL);
165 }
166 
167 int set_record_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
168 			   u32 bits, struct extent_changeset *changeset);
169 int set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
170 		   u32 bits, unsigned exclusive_bits, u64 *failed_start,
171 		   struct extent_state **cached_state, gfp_t mask,
172 		   struct extent_changeset *changeset);
173 int set_extent_bits_nowait(struct extent_io_tree *tree, u64 start, u64 end,
174 			   u32 bits);
175 
set_extent_bits(struct extent_io_tree * tree,u64 start,u64 end,u32 bits)176 static inline int set_extent_bits(struct extent_io_tree *tree, u64 start,
177 		u64 end, u32 bits)
178 {
179 	return set_extent_bit(tree, start, end, bits, 0, NULL, NULL, GFP_NOFS,
180 			      NULL);
181 }
182 
clear_extent_uptodate(struct extent_io_tree * tree,u64 start,u64 end,struct extent_state ** cached_state)183 static inline int clear_extent_uptodate(struct extent_io_tree *tree, u64 start,
184 		u64 end, struct extent_state **cached_state)
185 {
186 	return __clear_extent_bit(tree, start, end, EXTENT_UPTODATE, 0, 0,
187 				cached_state, GFP_NOFS, NULL);
188 }
189 
set_extent_dirty(struct extent_io_tree * tree,u64 start,u64 end,gfp_t mask)190 static inline int set_extent_dirty(struct extent_io_tree *tree, u64 start,
191 		u64 end, gfp_t mask)
192 {
193 	return set_extent_bit(tree, start, end, EXTENT_DIRTY, 0, NULL, NULL,
194 			      mask, NULL);
195 }
196 
clear_extent_dirty(struct extent_io_tree * tree,u64 start,u64 end,struct extent_state ** cached)197 static inline int clear_extent_dirty(struct extent_io_tree *tree, u64 start,
198 				     u64 end, struct extent_state **cached)
199 {
200 	return clear_extent_bit(tree, start, end,
201 				EXTENT_DIRTY | EXTENT_DELALLOC |
202 				EXTENT_DO_ACCOUNTING, 0, 0, cached);
203 }
204 
205 int convert_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
206 		       u32 bits, u32 clear_bits,
207 		       struct extent_state **cached_state);
208 
set_extent_delalloc(struct extent_io_tree * tree,u64 start,u64 end,u32 extra_bits,struct extent_state ** cached_state)209 static inline int set_extent_delalloc(struct extent_io_tree *tree, u64 start,
210 				      u64 end, u32 extra_bits,
211 				      struct extent_state **cached_state)
212 {
213 	return set_extent_bit(tree, start, end,
214 			      EXTENT_DELALLOC | EXTENT_UPTODATE | extra_bits,
215 			      0, NULL, cached_state, GFP_NOFS, NULL);
216 }
217 
set_extent_defrag(struct extent_io_tree * tree,u64 start,u64 end,struct extent_state ** cached_state)218 static inline int set_extent_defrag(struct extent_io_tree *tree, u64 start,
219 		u64 end, struct extent_state **cached_state)
220 {
221 	return set_extent_bit(tree, start, end,
222 			      EXTENT_DELALLOC | EXTENT_UPTODATE | EXTENT_DEFRAG,
223 			      0, NULL, cached_state, GFP_NOFS, NULL);
224 }
225 
set_extent_new(struct extent_io_tree * tree,u64 start,u64 end)226 static inline int set_extent_new(struct extent_io_tree *tree, u64 start,
227 		u64 end)
228 {
229 	return set_extent_bit(tree, start, end, EXTENT_NEW, 0, NULL, NULL,
230 			      GFP_NOFS, NULL);
231 }
232 
set_extent_uptodate(struct extent_io_tree * tree,u64 start,u64 end,struct extent_state ** cached_state,gfp_t mask)233 static inline int set_extent_uptodate(struct extent_io_tree *tree, u64 start,
234 		u64 end, struct extent_state **cached_state, gfp_t mask)
235 {
236 	return set_extent_bit(tree, start, end, EXTENT_UPTODATE, 0, NULL,
237 			      cached_state, mask, NULL);
238 }
239 
240 int find_first_extent_bit(struct extent_io_tree *tree, u64 start,
241 			  u64 *start_ret, u64 *end_ret, u32 bits,
242 			  struct extent_state **cached_state);
243 void find_first_clear_extent_bit(struct extent_io_tree *tree, u64 start,
244 				 u64 *start_ret, u64 *end_ret, u32 bits);
245 int find_contiguous_extent_bit(struct extent_io_tree *tree, u64 start,
246 			       u64 *start_ret, u64 *end_ret, u32 bits);
247 int extent_invalidatepage(struct extent_io_tree *tree,
248 			  struct page *page, unsigned long offset);
249 bool btrfs_find_delalloc_range(struct extent_io_tree *tree, u64 *start,
250 			       u64 *end, u64 max_bytes,
251 			       struct extent_state **cached_state);
252 
253 /* This should be reworked in the future and put elsewhere. */
254 struct io_failure_record *get_state_failrec(struct extent_io_tree *tree, u64 start);
255 int set_state_failrec(struct extent_io_tree *tree, u64 start,
256 		      struct io_failure_record *failrec);
257 void btrfs_free_io_failure_record(struct btrfs_inode *inode, u64 start,
258 		u64 end);
259 int free_io_failure(struct extent_io_tree *failure_tree,
260 		    struct extent_io_tree *io_tree,
261 		    struct io_failure_record *rec);
262 int clean_io_failure(struct btrfs_fs_info *fs_info,
263 		     struct extent_io_tree *failure_tree,
264 		     struct extent_io_tree *io_tree, u64 start,
265 		     struct page *page, u64 ino, unsigned int pg_offset);
266 
267 #endif /* BTRFS_EXTENT_IO_TREE_H */
268