.. | .. |
---|
5 | 5 | |
---|
6 | 6 | #include <linux/rbtree.h> |
---|
7 | 7 | #include <linux/refcount.h> |
---|
| 8 | +#include <linux/fiemap.h> |
---|
8 | 9 | #include "ulist.h" |
---|
9 | | - |
---|
10 | | -/* bits for the extent state */ |
---|
11 | | -#define EXTENT_DIRTY (1U << 0) |
---|
12 | | -#define EXTENT_WRITEBACK (1U << 1) |
---|
13 | | -#define EXTENT_UPTODATE (1U << 2) |
---|
14 | | -#define EXTENT_LOCKED (1U << 3) |
---|
15 | | -#define EXTENT_NEW (1U << 4) |
---|
16 | | -#define EXTENT_DELALLOC (1U << 5) |
---|
17 | | -#define EXTENT_DEFRAG (1U << 6) |
---|
18 | | -#define EXTENT_BOUNDARY (1U << 9) |
---|
19 | | -#define EXTENT_NODATASUM (1U << 10) |
---|
20 | | -#define EXTENT_CLEAR_META_RESV (1U << 11) |
---|
21 | | -#define EXTENT_FIRST_DELALLOC (1U << 12) |
---|
22 | | -#define EXTENT_NEED_WAIT (1U << 13) |
---|
23 | | -#define EXTENT_DAMAGED (1U << 14) |
---|
24 | | -#define EXTENT_NORESERVE (1U << 15) |
---|
25 | | -#define EXTENT_QGROUP_RESERVED (1U << 16) |
---|
26 | | -#define EXTENT_CLEAR_DATA_RESV (1U << 17) |
---|
27 | | -#define EXTENT_DELALLOC_NEW (1U << 18) |
---|
28 | | -#define EXTENT_IOBITS (EXTENT_LOCKED | EXTENT_WRITEBACK) |
---|
29 | | -#define EXTENT_DO_ACCOUNTING (EXTENT_CLEAR_META_RESV | \ |
---|
30 | | - EXTENT_CLEAR_DATA_RESV) |
---|
31 | | -#define EXTENT_CTLBITS (EXTENT_DO_ACCOUNTING | EXTENT_FIRST_DELALLOC) |
---|
32 | 10 | |
---|
33 | 11 | /* |
---|
34 | 12 | * flags for bio submission. The high bits indicate the compression |
---|
.. | .. |
---|
37 | 15 | #define EXTENT_BIO_COMPRESSED 1 |
---|
38 | 16 | #define EXTENT_BIO_FLAG_SHIFT 16 |
---|
39 | 17 | |
---|
40 | | -/* these are bit numbers for test/set bit */ |
---|
41 | | -#define EXTENT_BUFFER_UPTODATE 0 |
---|
42 | | -#define EXTENT_BUFFER_DIRTY 2 |
---|
43 | | -#define EXTENT_BUFFER_CORRUPT 3 |
---|
44 | | -#define EXTENT_BUFFER_READAHEAD 4 /* this got triggered by readahead */ |
---|
45 | | -#define EXTENT_BUFFER_TREE_REF 5 |
---|
46 | | -#define EXTENT_BUFFER_STALE 6 |
---|
47 | | -#define EXTENT_BUFFER_WRITEBACK 7 |
---|
48 | | -#define EXTENT_BUFFER_READ_ERR 8 /* read IO error */ |
---|
49 | | -#define EXTENT_BUFFER_UNMAPPED 9 |
---|
50 | | -#define EXTENT_BUFFER_IN_TREE 10 |
---|
51 | | -#define EXTENT_BUFFER_WRITE_ERR 11 /* write IO error */ |
---|
| 18 | +enum { |
---|
| 19 | + EXTENT_BUFFER_UPTODATE, |
---|
| 20 | + EXTENT_BUFFER_DIRTY, |
---|
| 21 | + EXTENT_BUFFER_CORRUPT, |
---|
| 22 | + /* this got triggered by readahead */ |
---|
| 23 | + EXTENT_BUFFER_READAHEAD, |
---|
| 24 | + EXTENT_BUFFER_TREE_REF, |
---|
| 25 | + EXTENT_BUFFER_STALE, |
---|
| 26 | + EXTENT_BUFFER_WRITEBACK, |
---|
| 27 | + /* read IO error */ |
---|
| 28 | + EXTENT_BUFFER_READ_ERR, |
---|
| 29 | + EXTENT_BUFFER_UNMAPPED, |
---|
| 30 | + EXTENT_BUFFER_IN_TREE, |
---|
| 31 | + /* write IO error */ |
---|
| 32 | + EXTENT_BUFFER_WRITE_ERR, |
---|
| 33 | +}; |
---|
52 | 34 | |
---|
53 | 35 | /* these are flags for __process_pages_contig */ |
---|
54 | 36 | #define PAGE_UNLOCK (1 << 0) |
---|
.. | .. |
---|
79 | 61 | #define BITMAP_LAST_BYTE_MASK(nbits) \ |
---|
80 | 62 | (BYTE_MASK >> (-(nbits) & (BITS_PER_BYTE - 1))) |
---|
81 | 63 | |
---|
82 | | -struct extent_state; |
---|
83 | 64 | struct btrfs_root; |
---|
84 | 65 | struct btrfs_inode; |
---|
85 | 66 | struct btrfs_io_bio; |
---|
86 | 67 | struct io_failure_record; |
---|
| 68 | +struct extent_io_tree; |
---|
87 | 69 | |
---|
88 | | -typedef blk_status_t (extent_submit_bio_hook_t)(void *private_data, struct bio *bio, |
---|
89 | | - int mirror_num, unsigned long bio_flags, |
---|
90 | | - u64 bio_offset); |
---|
| 70 | +typedef blk_status_t (submit_bio_hook_t)(struct inode *inode, struct bio *bio, |
---|
| 71 | + int mirror_num, |
---|
| 72 | + unsigned long bio_flags); |
---|
91 | 73 | |
---|
92 | 74 | typedef blk_status_t (extent_submit_bio_start_t)(void *private_data, |
---|
93 | 75 | struct bio *bio, u64 bio_offset); |
---|
94 | | - |
---|
95 | | -struct extent_io_ops { |
---|
96 | | - /* |
---|
97 | | - * The following callbacks must be allways defined, the function |
---|
98 | | - * pointer will be called unconditionally. |
---|
99 | | - */ |
---|
100 | | - extent_submit_bio_hook_t *submit_bio_hook; |
---|
101 | | - int (*readpage_end_io_hook)(struct btrfs_io_bio *io_bio, u64 phy_offset, |
---|
102 | | - struct page *page, u64 start, u64 end, |
---|
103 | | - int mirror); |
---|
104 | | - int (*readpage_io_failed_hook)(struct page *page, int failed_mirror); |
---|
105 | | - |
---|
106 | | - /* |
---|
107 | | - * Optional hooks, called if the pointer is not NULL |
---|
108 | | - */ |
---|
109 | | - int (*writepage_start_hook)(struct page *page, u64 start, u64 end); |
---|
110 | | - void (*writepage_end_io_hook)(struct page *page, u64 start, u64 end, |
---|
111 | | - struct extent_state *state, int uptodate); |
---|
112 | | - void (*set_bit_hook)(void *private_data, struct extent_state *state, |
---|
113 | | - unsigned *bits); |
---|
114 | | - void (*clear_bit_hook)(void *private_data, |
---|
115 | | - struct extent_state *state, |
---|
116 | | - unsigned *bits); |
---|
117 | | - void (*merge_extent_hook)(void *private_data, |
---|
118 | | - struct extent_state *new, |
---|
119 | | - struct extent_state *other); |
---|
120 | | - void (*split_extent_hook)(void *private_data, |
---|
121 | | - struct extent_state *orig, u64 split); |
---|
122 | | - void (*check_extent_io_range)(void *private_data, const char *caller, |
---|
123 | | - u64 start, u64 end); |
---|
124 | | -}; |
---|
125 | | - |
---|
126 | | -struct extent_io_tree { |
---|
127 | | - struct rb_root state; |
---|
128 | | - void *private_data; |
---|
129 | | - u64 dirty_bytes; |
---|
130 | | - int track_uptodate; |
---|
131 | | - spinlock_t lock; |
---|
132 | | - const struct extent_io_ops *ops; |
---|
133 | | -}; |
---|
134 | | - |
---|
135 | | -struct extent_state { |
---|
136 | | - u64 start; |
---|
137 | | - u64 end; /* inclusive */ |
---|
138 | | - struct rb_node rb_node; |
---|
139 | | - |
---|
140 | | - /* ADD NEW ELEMENTS AFTER THIS */ |
---|
141 | | - wait_queue_head_t wq; |
---|
142 | | - refcount_t refs; |
---|
143 | | - unsigned state; |
---|
144 | | - |
---|
145 | | - struct io_failure_record *failrec; |
---|
146 | | - |
---|
147 | | -#ifdef CONFIG_BTRFS_DEBUG |
---|
148 | | - struct list_head leak_list; |
---|
149 | | -#endif |
---|
150 | | -}; |
---|
151 | 76 | |
---|
152 | 77 | #define INLINE_EXTENT_BUFFER_PAGES 16 |
---|
153 | 78 | #define MAX_INLINE_EXTENT_BUFFER_SIZE (INLINE_EXTENT_BUFFER_PAGES * PAGE_SIZE) |
---|
.. | .. |
---|
163 | 88 | struct rcu_head rcu_head; |
---|
164 | 89 | pid_t lock_owner; |
---|
165 | 90 | |
---|
166 | | - /* count of read lock holders on the extent buffer */ |
---|
167 | | - atomic_t write_locks; |
---|
168 | | - atomic_t read_locks; |
---|
169 | | - atomic_t blocking_writers; |
---|
| 91 | + int blocking_writers; |
---|
170 | 92 | atomic_t blocking_readers; |
---|
171 | | - atomic_t spinning_readers; |
---|
172 | | - atomic_t spinning_writers; |
---|
173 | | - short lock_nested; |
---|
| 93 | + bool lock_recursed; |
---|
174 | 94 | /* >= 0 if eb belongs to a log tree, -1 otherwise */ |
---|
175 | 95 | short log_index; |
---|
176 | 96 | |
---|
.. | .. |
---|
188 | 108 | wait_queue_head_t read_lock_wq; |
---|
189 | 109 | struct page *pages[INLINE_EXTENT_BUFFER_PAGES]; |
---|
190 | 110 | #ifdef CONFIG_BTRFS_DEBUG |
---|
| 111 | + int spinning_writers; |
---|
| 112 | + atomic_t spinning_readers; |
---|
| 113 | + atomic_t read_locks; |
---|
| 114 | + int write_locks; |
---|
191 | 115 | struct list_head leak_list; |
---|
192 | 116 | #endif |
---|
193 | 117 | }; |
---|
.. | .. |
---|
197 | 121 | */ |
---|
198 | 122 | struct extent_changeset { |
---|
199 | 123 | /* How many bytes are set/cleared in this operation */ |
---|
200 | | - unsigned int bytes_changed; |
---|
| 124 | + u64 bytes_changed; |
---|
201 | 125 | |
---|
202 | 126 | /* Changed ranges */ |
---|
203 | 127 | struct ulist range_changed; |
---|
.. | .. |
---|
251 | 175 | struct extent_map_tree; |
---|
252 | 176 | |
---|
253 | 177 | typedef struct extent_map *(get_extent_t)(struct btrfs_inode *inode, |
---|
254 | | - struct page *page, |
---|
255 | | - size_t pg_offset, |
---|
256 | | - u64 start, u64 len, |
---|
257 | | - int create); |
---|
| 178 | + struct page *page, size_t pg_offset, |
---|
| 179 | + u64 start, u64 len); |
---|
258 | 180 | |
---|
259 | | -void extent_io_tree_init(struct extent_io_tree *tree, void *private_data); |
---|
260 | 181 | int try_release_extent_mapping(struct page *page, gfp_t mask); |
---|
261 | 182 | int try_release_extent_buffer(struct page *page); |
---|
262 | | -int lock_extent_bits(struct extent_io_tree *tree, u64 start, u64 end, |
---|
263 | | - struct extent_state **cached); |
---|
264 | 183 | |
---|
265 | | -static inline int lock_extent(struct extent_io_tree *tree, u64 start, u64 end) |
---|
266 | | -{ |
---|
267 | | - return lock_extent_bits(tree, start, end, NULL); |
---|
268 | | -} |
---|
269 | | - |
---|
270 | | -int try_lock_extent(struct extent_io_tree *tree, u64 start, u64 end); |
---|
271 | | -int extent_read_full_page(struct extent_io_tree *tree, struct page *page, |
---|
272 | | - get_extent_t *get_extent, int mirror_num); |
---|
273 | | -int __init extent_io_init(void); |
---|
274 | | -void __cold extent_io_exit(void); |
---|
275 | | - |
---|
276 | | -u64 count_range_bits(struct extent_io_tree *tree, |
---|
277 | | - u64 *start, u64 search_end, |
---|
278 | | - u64 max_bytes, unsigned bits, int contig); |
---|
279 | | - |
---|
280 | | -void free_extent_state(struct extent_state *state); |
---|
281 | | -int test_range_bit(struct extent_io_tree *tree, u64 start, u64 end, |
---|
282 | | - unsigned bits, int filled, |
---|
283 | | - struct extent_state *cached_state); |
---|
284 | | -int clear_record_extent_bits(struct extent_io_tree *tree, u64 start, u64 end, |
---|
285 | | - unsigned bits, struct extent_changeset *changeset); |
---|
286 | | -int clear_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, |
---|
287 | | - unsigned bits, int wake, int delete, |
---|
288 | | - struct extent_state **cached); |
---|
289 | | -int __clear_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, |
---|
290 | | - unsigned bits, int wake, int delete, |
---|
291 | | - struct extent_state **cached, gfp_t mask, |
---|
292 | | - struct extent_changeset *changeset); |
---|
293 | | - |
---|
294 | | -static inline int unlock_extent(struct extent_io_tree *tree, u64 start, u64 end) |
---|
295 | | -{ |
---|
296 | | - return clear_extent_bit(tree, start, end, EXTENT_LOCKED, 1, 0, NULL); |
---|
297 | | -} |
---|
298 | | - |
---|
299 | | -static inline int unlock_extent_cached(struct extent_io_tree *tree, u64 start, |
---|
300 | | - u64 end, struct extent_state **cached) |
---|
301 | | -{ |
---|
302 | | - return __clear_extent_bit(tree, start, end, EXTENT_LOCKED, 1, 0, cached, |
---|
303 | | - GFP_NOFS, NULL); |
---|
304 | | -} |
---|
305 | | - |
---|
306 | | -static inline int unlock_extent_cached_atomic(struct extent_io_tree *tree, |
---|
307 | | - u64 start, u64 end, struct extent_state **cached) |
---|
308 | | -{ |
---|
309 | | - return __clear_extent_bit(tree, start, end, EXTENT_LOCKED, 1, 0, cached, |
---|
310 | | - GFP_ATOMIC, NULL); |
---|
311 | | -} |
---|
312 | | - |
---|
313 | | -static inline int clear_extent_bits(struct extent_io_tree *tree, u64 start, |
---|
314 | | - u64 end, unsigned bits) |
---|
315 | | -{ |
---|
316 | | - int wake = 0; |
---|
317 | | - |
---|
318 | | - if (bits & EXTENT_LOCKED) |
---|
319 | | - wake = 1; |
---|
320 | | - |
---|
321 | | - return clear_extent_bit(tree, start, end, bits, wake, 0, NULL); |
---|
322 | | -} |
---|
323 | | - |
---|
324 | | -int set_record_extent_bits(struct extent_io_tree *tree, u64 start, u64 end, |
---|
325 | | - unsigned bits, struct extent_changeset *changeset); |
---|
326 | | -int set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, |
---|
327 | | - unsigned bits, u64 *failed_start, |
---|
328 | | - struct extent_state **cached_state, gfp_t mask); |
---|
329 | | - |
---|
330 | | -static inline int set_extent_bits(struct extent_io_tree *tree, u64 start, |
---|
331 | | - u64 end, unsigned bits) |
---|
332 | | -{ |
---|
333 | | - return set_extent_bit(tree, start, end, bits, NULL, NULL, GFP_NOFS); |
---|
334 | | -} |
---|
335 | | - |
---|
336 | | -static inline int clear_extent_uptodate(struct extent_io_tree *tree, u64 start, |
---|
337 | | - u64 end, struct extent_state **cached_state) |
---|
338 | | -{ |
---|
339 | | - return __clear_extent_bit(tree, start, end, EXTENT_UPTODATE, 0, 0, |
---|
340 | | - cached_state, GFP_NOFS, NULL); |
---|
341 | | -} |
---|
342 | | - |
---|
343 | | -static inline int set_extent_dirty(struct extent_io_tree *tree, u64 start, |
---|
344 | | - u64 end, gfp_t mask) |
---|
345 | | -{ |
---|
346 | | - return set_extent_bit(tree, start, end, EXTENT_DIRTY, NULL, |
---|
347 | | - NULL, mask); |
---|
348 | | -} |
---|
349 | | - |
---|
350 | | -static inline int clear_extent_dirty(struct extent_io_tree *tree, u64 start, |
---|
351 | | - u64 end, struct extent_state **cached) |
---|
352 | | -{ |
---|
353 | | - return clear_extent_bit(tree, start, end, |
---|
354 | | - EXTENT_DIRTY | EXTENT_DELALLOC | |
---|
355 | | - EXTENT_DO_ACCOUNTING, 0, 0, cached); |
---|
356 | | -} |
---|
357 | | - |
---|
358 | | -int convert_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, |
---|
359 | | - unsigned bits, unsigned clear_bits, |
---|
360 | | - struct extent_state **cached_state); |
---|
361 | | - |
---|
362 | | -static inline int set_extent_delalloc(struct extent_io_tree *tree, u64 start, |
---|
363 | | - u64 end, unsigned int extra_bits, |
---|
364 | | - struct extent_state **cached_state) |
---|
365 | | -{ |
---|
366 | | - return set_extent_bit(tree, start, end, |
---|
367 | | - EXTENT_DELALLOC | EXTENT_UPTODATE | extra_bits, |
---|
368 | | - NULL, cached_state, GFP_NOFS); |
---|
369 | | -} |
---|
370 | | - |
---|
371 | | -static inline int set_extent_defrag(struct extent_io_tree *tree, u64 start, |
---|
372 | | - u64 end, struct extent_state **cached_state) |
---|
373 | | -{ |
---|
374 | | - return set_extent_bit(tree, start, end, |
---|
375 | | - EXTENT_DELALLOC | EXTENT_UPTODATE | EXTENT_DEFRAG, |
---|
376 | | - NULL, cached_state, GFP_NOFS); |
---|
377 | | -} |
---|
378 | | - |
---|
379 | | -static inline int set_extent_new(struct extent_io_tree *tree, u64 start, |
---|
380 | | - u64 end) |
---|
381 | | -{ |
---|
382 | | - return set_extent_bit(tree, start, end, EXTENT_NEW, NULL, NULL, |
---|
383 | | - GFP_NOFS); |
---|
384 | | -} |
---|
385 | | - |
---|
386 | | -static inline int set_extent_uptodate(struct extent_io_tree *tree, u64 start, |
---|
387 | | - u64 end, struct extent_state **cached_state, gfp_t mask) |
---|
388 | | -{ |
---|
389 | | - return set_extent_bit(tree, start, end, EXTENT_UPTODATE, NULL, |
---|
390 | | - cached_state, mask); |
---|
391 | | -} |
---|
392 | | - |
---|
393 | | -int find_first_extent_bit(struct extent_io_tree *tree, u64 start, |
---|
394 | | - u64 *start_ret, u64 *end_ret, unsigned bits, |
---|
395 | | - struct extent_state **cached_state); |
---|
396 | | -int extent_invalidatepage(struct extent_io_tree *tree, |
---|
397 | | - struct page *page, unsigned long offset); |
---|
| 184 | +int __must_check submit_one_bio(struct bio *bio, int mirror_num, |
---|
| 185 | + unsigned long bio_flags); |
---|
| 186 | +int btrfs_do_readpage(struct page *page, struct extent_map **em_cached, |
---|
| 187 | + struct bio **bio, unsigned long *bio_flags, |
---|
| 188 | + unsigned int read_flags, u64 *prev_em_start); |
---|
398 | 189 | int extent_write_full_page(struct page *page, struct writeback_control *wbc); |
---|
399 | 190 | int extent_write_locked_range(struct inode *inode, u64 start, u64 end, |
---|
400 | 191 | int mode); |
---|
.. | .. |
---|
402 | 193 | struct writeback_control *wbc); |
---|
403 | 194 | int btree_write_cache_pages(struct address_space *mapping, |
---|
404 | 195 | struct writeback_control *wbc); |
---|
405 | | -int extent_readpages(struct address_space *mapping, struct list_head *pages, |
---|
406 | | - unsigned nr_pages); |
---|
407 | | -int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, |
---|
408 | | - __u64 start, __u64 len); |
---|
| 196 | +void extent_readahead(struct readahead_control *rac); |
---|
| 197 | +int extent_fiemap(struct btrfs_inode *inode, struct fiemap_extent_info *fieinfo, |
---|
| 198 | + u64 start, u64 len); |
---|
409 | 199 | void set_page_extent_mapped(struct page *page); |
---|
410 | 200 | |
---|
411 | 201 | struct extent_buffer *alloc_extent_buffer(struct btrfs_fs_info *fs_info, |
---|
.. | .. |
---|
414 | 204 | u64 start, unsigned long len); |
---|
415 | 205 | struct extent_buffer *alloc_dummy_extent_buffer(struct btrfs_fs_info *fs_info, |
---|
416 | 206 | u64 start); |
---|
417 | | -struct extent_buffer *btrfs_clone_extent_buffer(struct extent_buffer *src); |
---|
| 207 | +struct extent_buffer *btrfs_clone_extent_buffer(const struct extent_buffer *src); |
---|
418 | 208 | struct extent_buffer *find_extent_buffer(struct btrfs_fs_info *fs_info, |
---|
419 | 209 | u64 start); |
---|
420 | 210 | void free_extent_buffer(struct extent_buffer *eb); |
---|
.. | .. |
---|
422 | 212 | #define WAIT_NONE 0 |
---|
423 | 213 | #define WAIT_COMPLETE 1 |
---|
424 | 214 | #define WAIT_PAGE_LOCK 2 |
---|
425 | | -int read_extent_buffer_pages(struct extent_io_tree *tree, |
---|
426 | | - struct extent_buffer *eb, int wait, |
---|
| 215 | +int read_extent_buffer_pages(struct extent_buffer *eb, int wait, |
---|
427 | 216 | int mirror_num); |
---|
428 | 217 | void wait_on_extent_buffer_writeback(struct extent_buffer *eb); |
---|
429 | 218 | |
---|
.. | .. |
---|
433 | 222 | (eb->start >> PAGE_SHIFT); |
---|
434 | 223 | } |
---|
435 | 224 | |
---|
436 | | -static inline void extent_buffer_get(struct extent_buffer *eb) |
---|
437 | | -{ |
---|
438 | | - atomic_inc(&eb->refs); |
---|
439 | | -} |
---|
440 | | - |
---|
441 | | -static inline int extent_buffer_uptodate(struct extent_buffer *eb) |
---|
| 225 | +static inline int extent_buffer_uptodate(const struct extent_buffer *eb) |
---|
442 | 226 | { |
---|
443 | 227 | return test_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags); |
---|
444 | 228 | } |
---|
.. | .. |
---|
451 | 235 | int read_extent_buffer_to_user_nofault(const struct extent_buffer *eb, |
---|
452 | 236 | void __user *dst, unsigned long start, |
---|
453 | 237 | unsigned long len); |
---|
454 | | -void write_extent_buffer_fsid(struct extent_buffer *eb, const void *src); |
---|
455 | | -void write_extent_buffer_chunk_tree_uuid(struct extent_buffer *eb, |
---|
| 238 | +void write_extent_buffer_fsid(const struct extent_buffer *eb, const void *src); |
---|
| 239 | +void write_extent_buffer_chunk_tree_uuid(const struct extent_buffer *eb, |
---|
456 | 240 | const void *src); |
---|
457 | | -void write_extent_buffer(struct extent_buffer *eb, const void *src, |
---|
| 241 | +void write_extent_buffer(const struct extent_buffer *eb, const void *src, |
---|
458 | 242 | unsigned long start, unsigned long len); |
---|
459 | | -void copy_extent_buffer_full(struct extent_buffer *dst, |
---|
460 | | - struct extent_buffer *src); |
---|
461 | | -void copy_extent_buffer(struct extent_buffer *dst, struct extent_buffer *src, |
---|
| 243 | +void copy_extent_buffer_full(const struct extent_buffer *dst, |
---|
| 244 | + const struct extent_buffer *src); |
---|
| 245 | +void copy_extent_buffer(const struct extent_buffer *dst, |
---|
| 246 | + const struct extent_buffer *src, |
---|
462 | 247 | unsigned long dst_offset, unsigned long src_offset, |
---|
463 | 248 | unsigned long len); |
---|
464 | | -void memcpy_extent_buffer(struct extent_buffer *dst, unsigned long dst_offset, |
---|
465 | | - unsigned long src_offset, unsigned long len); |
---|
466 | | -void memmove_extent_buffer(struct extent_buffer *dst, unsigned long dst_offset, |
---|
467 | | - unsigned long src_offset, unsigned long len); |
---|
468 | | -void memzero_extent_buffer(struct extent_buffer *eb, unsigned long start, |
---|
| 249 | +void memcpy_extent_buffer(const struct extent_buffer *dst, |
---|
| 250 | + unsigned long dst_offset, unsigned long src_offset, |
---|
| 251 | + unsigned long len); |
---|
| 252 | +void memmove_extent_buffer(const struct extent_buffer *dst, |
---|
| 253 | + unsigned long dst_offset, unsigned long src_offset, |
---|
469 | 254 | unsigned long len); |
---|
470 | | -int extent_buffer_test_bit(struct extent_buffer *eb, unsigned long start, |
---|
| 255 | +void memzero_extent_buffer(const struct extent_buffer *eb, unsigned long start, |
---|
| 256 | + unsigned long len); |
---|
| 257 | +int extent_buffer_test_bit(const struct extent_buffer *eb, unsigned long start, |
---|
471 | 258 | unsigned long pos); |
---|
472 | | -void extent_buffer_bitmap_set(struct extent_buffer *eb, unsigned long start, |
---|
| 259 | +void extent_buffer_bitmap_set(const struct extent_buffer *eb, unsigned long start, |
---|
473 | 260 | unsigned long pos, unsigned long len); |
---|
474 | | -void extent_buffer_bitmap_clear(struct extent_buffer *eb, unsigned long start, |
---|
475 | | - unsigned long pos, unsigned long len); |
---|
476 | | -void clear_extent_buffer_dirty(struct extent_buffer *eb); |
---|
477 | | -int set_extent_buffer_dirty(struct extent_buffer *eb); |
---|
| 261 | +void extent_buffer_bitmap_clear(const struct extent_buffer *eb, |
---|
| 262 | + unsigned long start, unsigned long pos, |
---|
| 263 | + unsigned long len); |
---|
| 264 | +void clear_extent_buffer_dirty(const struct extent_buffer *eb); |
---|
| 265 | +bool set_extent_buffer_dirty(struct extent_buffer *eb); |
---|
478 | 266 | void set_extent_buffer_uptodate(struct extent_buffer *eb); |
---|
479 | 267 | void clear_extent_buffer_uptodate(struct extent_buffer *eb); |
---|
480 | | -int extent_buffer_under_io(struct extent_buffer *eb); |
---|
481 | | -int map_private_extent_buffer(const struct extent_buffer *eb, |
---|
482 | | - unsigned long offset, unsigned long min_len, |
---|
483 | | - char **map, unsigned long *map_start, |
---|
484 | | - unsigned long *map_len); |
---|
| 268 | +int extent_buffer_under_io(const struct extent_buffer *eb); |
---|
485 | 269 | void extent_range_clear_dirty_for_io(struct inode *inode, u64 start, u64 end); |
---|
486 | 270 | void extent_range_redirty_for_io(struct inode *inode, u64 start, u64 end); |
---|
487 | | -void extent_clear_unlock_delalloc(struct inode *inode, u64 start, u64 end, |
---|
488 | | - u64 delalloc_end, struct page *locked_page, |
---|
489 | | - unsigned bits_to_clear, |
---|
490 | | - unsigned long page_ops); |
---|
491 | | -struct bio *btrfs_bio_alloc(struct block_device *bdev, u64 first_byte); |
---|
| 271 | +void extent_clear_unlock_delalloc(struct btrfs_inode *inode, u64 start, u64 end, |
---|
| 272 | + struct page *locked_page, |
---|
| 273 | + unsigned bits_to_clear, |
---|
| 274 | + unsigned long page_ops); |
---|
| 275 | +struct bio *btrfs_bio_alloc(u64 first_byte); |
---|
492 | 276 | struct bio *btrfs_io_bio_alloc(unsigned int nr_iovecs); |
---|
493 | 277 | struct bio *btrfs_bio_clone(struct bio *bio); |
---|
494 | 278 | struct bio *btrfs_bio_clone_partial(struct bio *orig, int offset, int size); |
---|
.. | .. |
---|
499 | 283 | int repair_io_failure(struct btrfs_fs_info *fs_info, u64 ino, u64 start, |
---|
500 | 284 | u64 length, u64 logical, struct page *page, |
---|
501 | 285 | unsigned int pg_offset, int mirror_num); |
---|
502 | | -int clean_io_failure(struct btrfs_fs_info *fs_info, |
---|
503 | | - struct extent_io_tree *failure_tree, |
---|
504 | | - struct extent_io_tree *io_tree, u64 start, |
---|
505 | | - struct page *page, u64 ino, unsigned int pg_offset); |
---|
506 | 286 | void end_extent_writepage(struct page *page, int err, u64 start, u64 end); |
---|
507 | | -int repair_eb_io_failure(struct btrfs_fs_info *fs_info, |
---|
508 | | - struct extent_buffer *eb, int mirror_num); |
---|
| 287 | +int btrfs_repair_eb_io_failure(const struct extent_buffer *eb, int mirror_num); |
---|
509 | 288 | |
---|
510 | 289 | /* |
---|
511 | 290 | * When IO fails, either with EIO or csum verification fails, we |
---|
.. | .. |
---|
527 | 306 | }; |
---|
528 | 307 | |
---|
529 | 308 | |
---|
530 | | -void btrfs_free_io_failure_record(struct btrfs_inode *inode, u64 start, |
---|
531 | | - u64 end); |
---|
532 | | -int btrfs_get_io_failure_record(struct inode *inode, u64 start, u64 end, |
---|
533 | | - struct io_failure_record **failrec_ret); |
---|
534 | | -bool btrfs_check_repairable(struct inode *inode, unsigned failed_bio_pages, |
---|
535 | | - struct io_failure_record *failrec, int fail_mirror); |
---|
536 | | -struct bio *btrfs_create_repair_bio(struct inode *inode, struct bio *failed_bio, |
---|
537 | | - struct io_failure_record *failrec, |
---|
538 | | - struct page *page, int pg_offset, int icsum, |
---|
539 | | - bio_end_io_t *endio_func, void *data); |
---|
540 | | -int free_io_failure(struct extent_io_tree *failure_tree, |
---|
541 | | - struct extent_io_tree *io_tree, |
---|
542 | | - struct io_failure_record *rec); |
---|
| 309 | +blk_status_t btrfs_submit_read_repair(struct inode *inode, |
---|
| 310 | + struct bio *failed_bio, u64 phy_offset, |
---|
| 311 | + struct page *page, unsigned int pgoff, |
---|
| 312 | + u64 start, u64 end, int failed_mirror, |
---|
| 313 | + submit_bio_hook_t *submit_bio_hook); |
---|
| 314 | + |
---|
543 | 315 | #ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS |
---|
544 | | -noinline u64 find_lock_delalloc_range(struct inode *inode, |
---|
545 | | - struct extent_io_tree *tree, |
---|
546 | | - struct page *locked_page, u64 *start, |
---|
547 | | - u64 *end, u64 max_bytes); |
---|
| 316 | +bool find_lock_delalloc_range(struct inode *inode, |
---|
| 317 | + struct page *locked_page, u64 *start, |
---|
| 318 | + u64 *end); |
---|
548 | 319 | #endif |
---|
549 | 320 | struct extent_buffer *alloc_test_extent_buffer(struct btrfs_fs_info *fs_info, |
---|
550 | 321 | u64 start); |
---|
551 | 322 | |
---|
| 323 | +#ifdef CONFIG_BTRFS_DEBUG |
---|
| 324 | +void btrfs_extent_buffer_leak_debug_check(struct btrfs_fs_info *fs_info); |
---|
| 325 | +#else |
---|
| 326 | +#define btrfs_extent_buffer_leak_debug_check(fs_info) do {} while (0) |
---|
| 327 | +#endif |
---|
| 328 | + |
---|
552 | 329 | #endif |
---|