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