diff options
Diffstat (limited to 'fs/btrfs/extent_io.c')
-rw-r--r-- | fs/btrfs/extent_io.c | 87 |
1 files changed, 52 insertions, 35 deletions
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index c73df6a7c9b6..c7233ff1d533 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
@@ -64,7 +64,7 @@ void btrfs_leak_debug_check(void) | |||
64 | 64 | ||
65 | while (!list_empty(&states)) { | 65 | while (!list_empty(&states)) { |
66 | state = list_entry(states.next, struct extent_state, leak_list); | 66 | state = list_entry(states.next, struct extent_state, leak_list); |
67 | pr_err("BTRFS: state leak: start %llu end %llu state %lu in tree %d refs %d\n", | 67 | pr_err("BTRFS: state leak: start %llu end %llu state %u in tree %d refs %d\n", |
68 | state->start, state->end, state->state, | 68 | state->start, state->end, state->state, |
69 | extent_state_in_tree(state), | 69 | extent_state_in_tree(state), |
70 | atomic_read(&state->refs)); | 70 | atomic_read(&state->refs)); |
@@ -396,21 +396,21 @@ static void merge_state(struct extent_io_tree *tree, | |||
396 | } | 396 | } |
397 | 397 | ||
398 | static void set_state_cb(struct extent_io_tree *tree, | 398 | static void set_state_cb(struct extent_io_tree *tree, |
399 | struct extent_state *state, unsigned long *bits) | 399 | struct extent_state *state, unsigned *bits) |
400 | { | 400 | { |
401 | if (tree->ops && tree->ops->set_bit_hook) | 401 | if (tree->ops && tree->ops->set_bit_hook) |
402 | tree->ops->set_bit_hook(tree->mapping->host, state, bits); | 402 | tree->ops->set_bit_hook(tree->mapping->host, state, bits); |
403 | } | 403 | } |
404 | 404 | ||
405 | static void clear_state_cb(struct extent_io_tree *tree, | 405 | static void clear_state_cb(struct extent_io_tree *tree, |
406 | struct extent_state *state, unsigned long *bits) | 406 | struct extent_state *state, unsigned *bits) |
407 | { | 407 | { |
408 | if (tree->ops && tree->ops->clear_bit_hook) | 408 | if (tree->ops && tree->ops->clear_bit_hook) |
409 | tree->ops->clear_bit_hook(tree->mapping->host, state, bits); | 409 | tree->ops->clear_bit_hook(tree->mapping->host, state, bits); |
410 | } | 410 | } |
411 | 411 | ||
412 | static void set_state_bits(struct extent_io_tree *tree, | 412 | static void set_state_bits(struct extent_io_tree *tree, |
413 | struct extent_state *state, unsigned long *bits); | 413 | struct extent_state *state, unsigned *bits); |
414 | 414 | ||
415 | /* | 415 | /* |
416 | * insert an extent_state struct into the tree. 'bits' are set on the | 416 | * insert an extent_state struct into the tree. 'bits' are set on the |
@@ -426,7 +426,7 @@ static int insert_state(struct extent_io_tree *tree, | |||
426 | struct extent_state *state, u64 start, u64 end, | 426 | struct extent_state *state, u64 start, u64 end, |
427 | struct rb_node ***p, | 427 | struct rb_node ***p, |
428 | struct rb_node **parent, | 428 | struct rb_node **parent, |
429 | unsigned long *bits) | 429 | unsigned *bits) |
430 | { | 430 | { |
431 | struct rb_node *node; | 431 | struct rb_node *node; |
432 | 432 | ||
@@ -511,10 +511,10 @@ static struct extent_state *next_state(struct extent_state *state) | |||
511 | */ | 511 | */ |
512 | static struct extent_state *clear_state_bit(struct extent_io_tree *tree, | 512 | static struct extent_state *clear_state_bit(struct extent_io_tree *tree, |
513 | struct extent_state *state, | 513 | struct extent_state *state, |
514 | unsigned long *bits, int wake) | 514 | unsigned *bits, int wake) |
515 | { | 515 | { |
516 | struct extent_state *next; | 516 | struct extent_state *next; |
517 | unsigned long bits_to_clear = *bits & ~EXTENT_CTLBITS; | 517 | unsigned bits_to_clear = *bits & ~EXTENT_CTLBITS; |
518 | 518 | ||
519 | if ((bits_to_clear & EXTENT_DIRTY) && (state->state & EXTENT_DIRTY)) { | 519 | if ((bits_to_clear & EXTENT_DIRTY) && (state->state & EXTENT_DIRTY)) { |
520 | u64 range = state->end - state->start + 1; | 520 | u64 range = state->end - state->start + 1; |
@@ -570,7 +570,7 @@ static void extent_io_tree_panic(struct extent_io_tree *tree, int err) | |||
570 | * This takes the tree lock, and returns 0 on success and < 0 on error. | 570 | * This takes the tree lock, and returns 0 on success and < 0 on error. |
571 | */ | 571 | */ |
572 | int clear_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, | 572 | int clear_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, |
573 | unsigned long bits, int wake, int delete, | 573 | unsigned bits, int wake, int delete, |
574 | struct extent_state **cached_state, | 574 | struct extent_state **cached_state, |
575 | gfp_t mask) | 575 | gfp_t mask) |
576 | { | 576 | { |
@@ -789,9 +789,9 @@ out: | |||
789 | 789 | ||
790 | static void set_state_bits(struct extent_io_tree *tree, | 790 | static void set_state_bits(struct extent_io_tree *tree, |
791 | struct extent_state *state, | 791 | struct extent_state *state, |
792 | unsigned long *bits) | 792 | unsigned *bits) |
793 | { | 793 | { |
794 | unsigned long bits_to_set = *bits & ~EXTENT_CTLBITS; | 794 | unsigned bits_to_set = *bits & ~EXTENT_CTLBITS; |
795 | 795 | ||
796 | set_state_cb(tree, state, bits); | 796 | set_state_cb(tree, state, bits); |
797 | if ((bits_to_set & EXTENT_DIRTY) && !(state->state & EXTENT_DIRTY)) { | 797 | if ((bits_to_set & EXTENT_DIRTY) && !(state->state & EXTENT_DIRTY)) { |
@@ -803,7 +803,7 @@ static void set_state_bits(struct extent_io_tree *tree, | |||
803 | 803 | ||
804 | static void cache_state_if_flags(struct extent_state *state, | 804 | static void cache_state_if_flags(struct extent_state *state, |
805 | struct extent_state **cached_ptr, | 805 | struct extent_state **cached_ptr, |
806 | const u64 flags) | 806 | unsigned flags) |
807 | { | 807 | { |
808 | if (cached_ptr && !(*cached_ptr)) { | 808 | if (cached_ptr && !(*cached_ptr)) { |
809 | if (!flags || (state->state & flags)) { | 809 | if (!flags || (state->state & flags)) { |
@@ -833,7 +833,7 @@ static void cache_state(struct extent_state *state, | |||
833 | 833 | ||
834 | static int __must_check | 834 | static int __must_check |
835 | __set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, | 835 | __set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, |
836 | unsigned long bits, unsigned long exclusive_bits, | 836 | unsigned bits, unsigned exclusive_bits, |
837 | u64 *failed_start, struct extent_state **cached_state, | 837 | u64 *failed_start, struct extent_state **cached_state, |
838 | gfp_t mask) | 838 | gfp_t mask) |
839 | { | 839 | { |
@@ -1034,7 +1034,7 @@ search_again: | |||
1034 | } | 1034 | } |
1035 | 1035 | ||
1036 | int set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, | 1036 | int set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, |
1037 | unsigned long bits, u64 * failed_start, | 1037 | unsigned bits, u64 * failed_start, |
1038 | struct extent_state **cached_state, gfp_t mask) | 1038 | struct extent_state **cached_state, gfp_t mask) |
1039 | { | 1039 | { |
1040 | return __set_extent_bit(tree, start, end, bits, 0, failed_start, | 1040 | return __set_extent_bit(tree, start, end, bits, 0, failed_start, |
@@ -1060,7 +1060,7 @@ int set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, | |||
1060 | * boundary bits like LOCK. | 1060 | * boundary bits like LOCK. |
1061 | */ | 1061 | */ |
1062 | int convert_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, | 1062 | int convert_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, |
1063 | unsigned long bits, unsigned long clear_bits, | 1063 | unsigned bits, unsigned clear_bits, |
1064 | struct extent_state **cached_state, gfp_t mask) | 1064 | struct extent_state **cached_state, gfp_t mask) |
1065 | { | 1065 | { |
1066 | struct extent_state *state; | 1066 | struct extent_state *state; |
@@ -1268,14 +1268,14 @@ int set_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end, | |||
1268 | } | 1268 | } |
1269 | 1269 | ||
1270 | int set_extent_bits(struct extent_io_tree *tree, u64 start, u64 end, | 1270 | int set_extent_bits(struct extent_io_tree *tree, u64 start, u64 end, |
1271 | unsigned long bits, gfp_t mask) | 1271 | unsigned bits, gfp_t mask) |
1272 | { | 1272 | { |
1273 | return set_extent_bit(tree, start, end, bits, NULL, | 1273 | return set_extent_bit(tree, start, end, bits, NULL, |
1274 | NULL, mask); | 1274 | NULL, mask); |
1275 | } | 1275 | } |
1276 | 1276 | ||
1277 | int clear_extent_bits(struct extent_io_tree *tree, u64 start, u64 end, | 1277 | int clear_extent_bits(struct extent_io_tree *tree, u64 start, u64 end, |
1278 | unsigned long bits, gfp_t mask) | 1278 | unsigned bits, gfp_t mask) |
1279 | { | 1279 | { |
1280 | return clear_extent_bit(tree, start, end, bits, 0, 0, NULL, mask); | 1280 | return clear_extent_bit(tree, start, end, bits, 0, 0, NULL, mask); |
1281 | } | 1281 | } |
@@ -1330,10 +1330,11 @@ int clear_extent_uptodate(struct extent_io_tree *tree, u64 start, u64 end, | |||
1330 | * us if waiting is desired. | 1330 | * us if waiting is desired. |
1331 | */ | 1331 | */ |
1332 | int lock_extent_bits(struct extent_io_tree *tree, u64 start, u64 end, | 1332 | int lock_extent_bits(struct extent_io_tree *tree, u64 start, u64 end, |
1333 | unsigned long bits, struct extent_state **cached_state) | 1333 | unsigned bits, struct extent_state **cached_state) |
1334 | { | 1334 | { |
1335 | int err; | 1335 | int err; |
1336 | u64 failed_start; | 1336 | u64 failed_start; |
1337 | |||
1337 | while (1) { | 1338 | while (1) { |
1338 | err = __set_extent_bit(tree, start, end, EXTENT_LOCKED | bits, | 1339 | err = __set_extent_bit(tree, start, end, EXTENT_LOCKED | bits, |
1339 | EXTENT_LOCKED, &failed_start, | 1340 | EXTENT_LOCKED, &failed_start, |
@@ -1440,7 +1441,7 @@ static int set_range_writeback(struct extent_io_tree *tree, u64 start, u64 end) | |||
1440 | */ | 1441 | */ |
1441 | static struct extent_state * | 1442 | static struct extent_state * |
1442 | find_first_extent_bit_state(struct extent_io_tree *tree, | 1443 | find_first_extent_bit_state(struct extent_io_tree *tree, |
1443 | u64 start, unsigned long bits) | 1444 | u64 start, unsigned bits) |
1444 | { | 1445 | { |
1445 | struct rb_node *node; | 1446 | struct rb_node *node; |
1446 | struct extent_state *state; | 1447 | struct extent_state *state; |
@@ -1474,7 +1475,7 @@ out: | |||
1474 | * If nothing was found, 1 is returned. If found something, return 0. | 1475 | * If nothing was found, 1 is returned. If found something, return 0. |
1475 | */ | 1476 | */ |
1476 | int find_first_extent_bit(struct extent_io_tree *tree, u64 start, | 1477 | int find_first_extent_bit(struct extent_io_tree *tree, u64 start, |
1477 | u64 *start_ret, u64 *end_ret, unsigned long bits, | 1478 | u64 *start_ret, u64 *end_ret, unsigned bits, |
1478 | struct extent_state **cached_state) | 1479 | struct extent_state **cached_state) |
1479 | { | 1480 | { |
1480 | struct extent_state *state; | 1481 | struct extent_state *state; |
@@ -1753,7 +1754,7 @@ out_failed: | |||
1753 | 1754 | ||
1754 | int extent_clear_unlock_delalloc(struct inode *inode, u64 start, u64 end, | 1755 | int extent_clear_unlock_delalloc(struct inode *inode, u64 start, u64 end, |
1755 | struct page *locked_page, | 1756 | struct page *locked_page, |
1756 | unsigned long clear_bits, | 1757 | unsigned clear_bits, |
1757 | unsigned long page_ops) | 1758 | unsigned long page_ops) |
1758 | { | 1759 | { |
1759 | struct extent_io_tree *tree = &BTRFS_I(inode)->io_tree; | 1760 | struct extent_io_tree *tree = &BTRFS_I(inode)->io_tree; |
@@ -1810,7 +1811,7 @@ int extent_clear_unlock_delalloc(struct inode *inode, u64 start, u64 end, | |||
1810 | */ | 1811 | */ |
1811 | u64 count_range_bits(struct extent_io_tree *tree, | 1812 | u64 count_range_bits(struct extent_io_tree *tree, |
1812 | u64 *start, u64 search_end, u64 max_bytes, | 1813 | u64 *start, u64 search_end, u64 max_bytes, |
1813 | unsigned long bits, int contig) | 1814 | unsigned bits, int contig) |
1814 | { | 1815 | { |
1815 | struct rb_node *node; | 1816 | struct rb_node *node; |
1816 | struct extent_state *state; | 1817 | struct extent_state *state; |
@@ -1928,7 +1929,7 @@ out: | |||
1928 | * range is found set. | 1929 | * range is found set. |
1929 | */ | 1930 | */ |
1930 | int test_range_bit(struct extent_io_tree *tree, u64 start, u64 end, | 1931 | int test_range_bit(struct extent_io_tree *tree, u64 start, u64 end, |
1931 | unsigned long bits, int filled, struct extent_state *cached) | 1932 | unsigned bits, int filled, struct extent_state *cached) |
1932 | { | 1933 | { |
1933 | struct extent_state *state = NULL; | 1934 | struct extent_state *state = NULL; |
1934 | struct rb_node *node; | 1935 | struct rb_node *node; |
@@ -2057,7 +2058,7 @@ int repair_io_failure(struct inode *inode, u64 start, u64 length, u64 logical, | |||
2057 | sector = bbio->stripes[mirror_num-1].physical >> 9; | 2058 | sector = bbio->stripes[mirror_num-1].physical >> 9; |
2058 | bio->bi_iter.bi_sector = sector; | 2059 | bio->bi_iter.bi_sector = sector; |
2059 | dev = bbio->stripes[mirror_num-1].dev; | 2060 | dev = bbio->stripes[mirror_num-1].dev; |
2060 | kfree(bbio); | 2061 | btrfs_put_bbio(bbio); |
2061 | if (!dev || !dev->bdev || !dev->writeable) { | 2062 | if (!dev || !dev->bdev || !dev->writeable) { |
2062 | bio_put(bio); | 2063 | bio_put(bio); |
2063 | return -EIO; | 2064 | return -EIO; |
@@ -2816,8 +2817,10 @@ static int submit_extent_page(int rw, struct extent_io_tree *tree, | |||
2816 | bio_add_page(bio, page, page_size, offset) < page_size) { | 2817 | bio_add_page(bio, page, page_size, offset) < page_size) { |
2817 | ret = submit_one_bio(rw, bio, mirror_num, | 2818 | ret = submit_one_bio(rw, bio, mirror_num, |
2818 | prev_bio_flags); | 2819 | prev_bio_flags); |
2819 | if (ret < 0) | 2820 | if (ret < 0) { |
2821 | *bio_ret = NULL; | ||
2820 | return ret; | 2822 | return ret; |
2823 | } | ||
2821 | bio = NULL; | 2824 | bio = NULL; |
2822 | } else { | 2825 | } else { |
2823 | return 0; | 2826 | return 0; |
@@ -3239,7 +3242,7 @@ static noinline_for_stack int writepage_delalloc(struct inode *inode, | |||
3239 | page, | 3242 | page, |
3240 | &delalloc_start, | 3243 | &delalloc_start, |
3241 | &delalloc_end, | 3244 | &delalloc_end, |
3242 | 128 * 1024 * 1024); | 3245 | BTRFS_MAX_EXTENT_SIZE); |
3243 | if (nr_delalloc == 0) { | 3246 | if (nr_delalloc == 0) { |
3244 | delalloc_start = delalloc_end + 1; | 3247 | delalloc_start = delalloc_end + 1; |
3245 | continue; | 3248 | continue; |
@@ -4598,11 +4601,11 @@ static inline void btrfs_release_extent_buffer(struct extent_buffer *eb) | |||
4598 | 4601 | ||
4599 | static struct extent_buffer * | 4602 | static struct extent_buffer * |
4600 | __alloc_extent_buffer(struct btrfs_fs_info *fs_info, u64 start, | 4603 | __alloc_extent_buffer(struct btrfs_fs_info *fs_info, u64 start, |
4601 | unsigned long len, gfp_t mask) | 4604 | unsigned long len) |
4602 | { | 4605 | { |
4603 | struct extent_buffer *eb = NULL; | 4606 | struct extent_buffer *eb = NULL; |
4604 | 4607 | ||
4605 | eb = kmem_cache_zalloc(extent_buffer_cache, mask); | 4608 | eb = kmem_cache_zalloc(extent_buffer_cache, GFP_NOFS); |
4606 | if (eb == NULL) | 4609 | if (eb == NULL) |
4607 | return NULL; | 4610 | return NULL; |
4608 | eb->start = start; | 4611 | eb->start = start; |
@@ -4643,7 +4646,7 @@ struct extent_buffer *btrfs_clone_extent_buffer(struct extent_buffer *src) | |||
4643 | struct extent_buffer *new; | 4646 | struct extent_buffer *new; |
4644 | unsigned long num_pages = num_extent_pages(src->start, src->len); | 4647 | unsigned long num_pages = num_extent_pages(src->start, src->len); |
4645 | 4648 | ||
4646 | new = __alloc_extent_buffer(NULL, src->start, src->len, GFP_NOFS); | 4649 | new = __alloc_extent_buffer(src->fs_info, src->start, src->len); |
4647 | if (new == NULL) | 4650 | if (new == NULL) |
4648 | return NULL; | 4651 | return NULL; |
4649 | 4652 | ||
@@ -4666,13 +4669,26 @@ struct extent_buffer *btrfs_clone_extent_buffer(struct extent_buffer *src) | |||
4666 | return new; | 4669 | return new; |
4667 | } | 4670 | } |
4668 | 4671 | ||
4669 | struct extent_buffer *alloc_dummy_extent_buffer(u64 start, unsigned long len) | 4672 | struct extent_buffer *alloc_dummy_extent_buffer(struct btrfs_fs_info *fs_info, |
4673 | u64 start) | ||
4670 | { | 4674 | { |
4671 | struct extent_buffer *eb; | 4675 | struct extent_buffer *eb; |
4672 | unsigned long num_pages = num_extent_pages(0, len); | 4676 | unsigned long len; |
4677 | unsigned long num_pages; | ||
4673 | unsigned long i; | 4678 | unsigned long i; |
4674 | 4679 | ||
4675 | eb = __alloc_extent_buffer(NULL, start, len, GFP_NOFS); | 4680 | if (!fs_info) { |
4681 | /* | ||
4682 | * Called only from tests that don't always have a fs_info | ||
4683 | * available, but we know that nodesize is 4096 | ||
4684 | */ | ||
4685 | len = 4096; | ||
4686 | } else { | ||
4687 | len = fs_info->tree_root->nodesize; | ||
4688 | } | ||
4689 | num_pages = num_extent_pages(0, len); | ||
4690 | |||
4691 | eb = __alloc_extent_buffer(fs_info, start, len); | ||
4676 | if (!eb) | 4692 | if (!eb) |
4677 | return NULL; | 4693 | return NULL; |
4678 | 4694 | ||
@@ -4762,7 +4778,7 @@ struct extent_buffer *find_extent_buffer(struct btrfs_fs_info *fs_info, | |||
4762 | 4778 | ||
4763 | #ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS | 4779 | #ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS |
4764 | struct extent_buffer *alloc_test_extent_buffer(struct btrfs_fs_info *fs_info, | 4780 | struct extent_buffer *alloc_test_extent_buffer(struct btrfs_fs_info *fs_info, |
4765 | u64 start, unsigned long len) | 4781 | u64 start) |
4766 | { | 4782 | { |
4767 | struct extent_buffer *eb, *exists = NULL; | 4783 | struct extent_buffer *eb, *exists = NULL; |
4768 | int ret; | 4784 | int ret; |
@@ -4770,7 +4786,7 @@ struct extent_buffer *alloc_test_extent_buffer(struct btrfs_fs_info *fs_info, | |||
4770 | eb = find_extent_buffer(fs_info, start); | 4786 | eb = find_extent_buffer(fs_info, start); |
4771 | if (eb) | 4787 | if (eb) |
4772 | return eb; | 4788 | return eb; |
4773 | eb = alloc_dummy_extent_buffer(start, len); | 4789 | eb = alloc_dummy_extent_buffer(fs_info, start); |
4774 | if (!eb) | 4790 | if (!eb) |
4775 | return NULL; | 4791 | return NULL; |
4776 | eb->fs_info = fs_info; | 4792 | eb->fs_info = fs_info; |
@@ -4808,8 +4824,9 @@ free_eb: | |||
4808 | #endif | 4824 | #endif |
4809 | 4825 | ||
4810 | struct extent_buffer *alloc_extent_buffer(struct btrfs_fs_info *fs_info, | 4826 | struct extent_buffer *alloc_extent_buffer(struct btrfs_fs_info *fs_info, |
4811 | u64 start, unsigned long len) | 4827 | u64 start) |
4812 | { | 4828 | { |
4829 | unsigned long len = fs_info->tree_root->nodesize; | ||
4813 | unsigned long num_pages = num_extent_pages(start, len); | 4830 | unsigned long num_pages = num_extent_pages(start, len); |
4814 | unsigned long i; | 4831 | unsigned long i; |
4815 | unsigned long index = start >> PAGE_CACHE_SHIFT; | 4832 | unsigned long index = start >> PAGE_CACHE_SHIFT; |
@@ -4824,7 +4841,7 @@ struct extent_buffer *alloc_extent_buffer(struct btrfs_fs_info *fs_info, | |||
4824 | if (eb) | 4841 | if (eb) |
4825 | return eb; | 4842 | return eb; |
4826 | 4843 | ||
4827 | eb = __alloc_extent_buffer(fs_info, start, len, GFP_NOFS); | 4844 | eb = __alloc_extent_buffer(fs_info, start, len); |
4828 | if (!eb) | 4845 | if (!eb) |
4829 | return NULL; | 4846 | return NULL; |
4830 | 4847 | ||