aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/extent_io.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/extent_io.c')
-rw-r--r--fs/btrfs/extent_io.c88
1 files changed, 43 insertions, 45 deletions
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 40e8dcc319d4..3d5ac79a6e3c 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -2387,7 +2387,7 @@ static int bio_readpage_error(struct bio *failed_bio, u64 phy_offset,
2387 int read_mode; 2387 int read_mode;
2388 int ret; 2388 int ret;
2389 2389
2390 BUG_ON(failed_bio->bi_rw & REQ_WRITE); 2390 BUG_ON(bio_op(failed_bio) == REQ_OP_WRITE);
2391 2391
2392 ret = btrfs_get_io_failure_record(inode, start, end, &failrec); 2392 ret = btrfs_get_io_failure_record(inode, start, end, &failrec);
2393 if (ret) 2393 if (ret)
@@ -2413,6 +2413,7 @@ static int bio_readpage_error(struct bio *failed_bio, u64 phy_offset,
2413 free_io_failure(inode, failrec); 2413 free_io_failure(inode, failrec);
2414 return -EIO; 2414 return -EIO;
2415 } 2415 }
2416 bio_set_op_attrs(bio, REQ_OP_READ, read_mode);
2416 2417
2417 pr_debug("Repair Read Error: submitting new read[%#x] to this_mirror=%d, in_validation=%d\n", 2418 pr_debug("Repair Read Error: submitting new read[%#x] to this_mirror=%d, in_validation=%d\n",
2418 read_mode, failrec->this_mirror, failrec->in_validation); 2419 read_mode, failrec->this_mirror, failrec->in_validation);
@@ -2724,8 +2725,8 @@ struct bio *btrfs_io_bio_alloc(gfp_t gfp_mask, unsigned int nr_iovecs)
2724} 2725}
2725 2726
2726 2727
2727static int __must_check submit_one_bio(int rw, struct bio *bio, 2728static int __must_check submit_one_bio(struct bio *bio, int mirror_num,
2728 int mirror_num, unsigned long bio_flags) 2729 unsigned long bio_flags)
2729{ 2730{
2730 int ret = 0; 2731 int ret = 0;
2731 struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1; 2732 struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1;
@@ -2736,12 +2737,12 @@ static int __must_check submit_one_bio(int rw, struct bio *bio,
2736 start = page_offset(page) + bvec->bv_offset; 2737 start = page_offset(page) + bvec->bv_offset;
2737 2738
2738 bio->bi_private = NULL; 2739 bio->bi_private = NULL;
2739 bio->bi_rw = rw;
2740 bio_get(bio); 2740 bio_get(bio);
2741 2741
2742 if (tree->ops && tree->ops->submit_bio_hook) 2742 if (tree->ops && tree->ops->submit_bio_hook)
2743 ret = tree->ops->submit_bio_hook(page->mapping->host, rw, bio, 2743 ret = tree->ops->submit_bio_hook(page->mapping->host,
2744 mirror_num, bio_flags, start); 2744 bio->bi_rw, bio, mirror_num,
2745 bio_flags, start);
2745 else 2746 else
2746 btrfsic_submit_bio(bio); 2747 btrfsic_submit_bio(bio);
2747 2748
@@ -2749,20 +2750,20 @@ static int __must_check submit_one_bio(int rw, struct bio *bio,
2749 return ret; 2750 return ret;
2750} 2751}
2751 2752
2752static int merge_bio(int rw, struct extent_io_tree *tree, struct page *page, 2753static int merge_bio(struct extent_io_tree *tree, struct page *page,
2753 unsigned long offset, size_t size, struct bio *bio, 2754 unsigned long offset, size_t size, struct bio *bio,
2754 unsigned long bio_flags) 2755 unsigned long bio_flags)
2755{ 2756{
2756 int ret = 0; 2757 int ret = 0;
2757 if (tree->ops && tree->ops->merge_bio_hook) 2758 if (tree->ops && tree->ops->merge_bio_hook)
2758 ret = tree->ops->merge_bio_hook(rw, page, offset, size, bio, 2759 ret = tree->ops->merge_bio_hook(bio_op(bio), page, offset, size,
2759 bio_flags); 2760 bio, bio_flags);
2760 BUG_ON(ret < 0); 2761 BUG_ON(ret < 0);
2761 return ret; 2762 return ret;
2762 2763
2763} 2764}
2764 2765
2765static int submit_extent_page(int rw, struct extent_io_tree *tree, 2766static int submit_extent_page(int op, int op_flags, struct extent_io_tree *tree,
2766 struct writeback_control *wbc, 2767 struct writeback_control *wbc,
2767 struct page *page, sector_t sector, 2768 struct page *page, sector_t sector,
2768 size_t size, unsigned long offset, 2769 size_t size, unsigned long offset,
@@ -2790,10 +2791,9 @@ static int submit_extent_page(int rw, struct extent_io_tree *tree,
2790 2791
2791 if (prev_bio_flags != bio_flags || !contig || 2792 if (prev_bio_flags != bio_flags || !contig ||
2792 force_bio_submit || 2793 force_bio_submit ||
2793 merge_bio(rw, tree, page, offset, page_size, bio, bio_flags) || 2794 merge_bio(tree, page, offset, page_size, bio, bio_flags) ||
2794 bio_add_page(bio, page, page_size, offset) < page_size) { 2795 bio_add_page(bio, page, page_size, offset) < page_size) {
2795 ret = submit_one_bio(rw, bio, mirror_num, 2796 ret = submit_one_bio(bio, mirror_num, prev_bio_flags);
2796 prev_bio_flags);
2797 if (ret < 0) { 2797 if (ret < 0) {
2798 *bio_ret = NULL; 2798 *bio_ret = NULL;
2799 return ret; 2799 return ret;
@@ -2814,6 +2814,7 @@ static int submit_extent_page(int rw, struct extent_io_tree *tree,
2814 bio_add_page(bio, page, page_size, offset); 2814 bio_add_page(bio, page, page_size, offset);
2815 bio->bi_end_io = end_io_func; 2815 bio->bi_end_io = end_io_func;
2816 bio->bi_private = tree; 2816 bio->bi_private = tree;
2817 bio_set_op_attrs(bio, op, op_flags);
2817 if (wbc) { 2818 if (wbc) {
2818 wbc_init_bio(wbc, bio); 2819 wbc_init_bio(wbc, bio);
2819 wbc_account_io(wbc, page, page_size); 2820 wbc_account_io(wbc, page, page_size);
@@ -2822,7 +2823,7 @@ static int submit_extent_page(int rw, struct extent_io_tree *tree,
2822 if (bio_ret) 2823 if (bio_ret)
2823 *bio_ret = bio; 2824 *bio_ret = bio;
2824 else 2825 else
2825 ret = submit_one_bio(rw, bio, mirror_num, bio_flags); 2826 ret = submit_one_bio(bio, mirror_num, bio_flags);
2826 2827
2827 return ret; 2828 return ret;
2828} 2829}
@@ -2886,7 +2887,7 @@ static int __do_readpage(struct extent_io_tree *tree,
2886 get_extent_t *get_extent, 2887 get_extent_t *get_extent,
2887 struct extent_map **em_cached, 2888 struct extent_map **em_cached,
2888 struct bio **bio, int mirror_num, 2889 struct bio **bio, int mirror_num,
2889 unsigned long *bio_flags, int rw, 2890 unsigned long *bio_flags, int read_flags,
2890 u64 *prev_em_start) 2891 u64 *prev_em_start)
2891{ 2892{
2892 struct inode *inode = page->mapping->host; 2893 struct inode *inode = page->mapping->host;
@@ -3069,8 +3070,8 @@ static int __do_readpage(struct extent_io_tree *tree,
3069 } 3070 }
3070 3071
3071 pnr -= page->index; 3072 pnr -= page->index;
3072 ret = submit_extent_page(rw, tree, NULL, page, 3073 ret = submit_extent_page(REQ_OP_READ, read_flags, tree, NULL,
3073 sector, disk_io_size, pg_offset, 3074 page, sector, disk_io_size, pg_offset,
3074 bdev, bio, pnr, 3075 bdev, bio, pnr,
3075 end_bio_extent_readpage, mirror_num, 3076 end_bio_extent_readpage, mirror_num,
3076 *bio_flags, 3077 *bio_flags,
@@ -3101,7 +3102,7 @@ static inline void __do_contiguous_readpages(struct extent_io_tree *tree,
3101 get_extent_t *get_extent, 3102 get_extent_t *get_extent,
3102 struct extent_map **em_cached, 3103 struct extent_map **em_cached,
3103 struct bio **bio, int mirror_num, 3104 struct bio **bio, int mirror_num,
3104 unsigned long *bio_flags, int rw, 3105 unsigned long *bio_flags,
3105 u64 *prev_em_start) 3106 u64 *prev_em_start)
3106{ 3107{
3107 struct inode *inode; 3108 struct inode *inode;
@@ -3122,7 +3123,7 @@ static inline void __do_contiguous_readpages(struct extent_io_tree *tree,
3122 3123
3123 for (index = 0; index < nr_pages; index++) { 3124 for (index = 0; index < nr_pages; index++) {
3124 __do_readpage(tree, pages[index], get_extent, em_cached, bio, 3125 __do_readpage(tree, pages[index], get_extent, em_cached, bio,
3125 mirror_num, bio_flags, rw, prev_em_start); 3126 mirror_num, bio_flags, 0, prev_em_start);
3126 put_page(pages[index]); 3127 put_page(pages[index]);
3127 } 3128 }
3128} 3129}
@@ -3132,7 +3133,7 @@ static void __extent_readpages(struct extent_io_tree *tree,
3132 int nr_pages, get_extent_t *get_extent, 3133 int nr_pages, get_extent_t *get_extent,
3133 struct extent_map **em_cached, 3134 struct extent_map **em_cached,
3134 struct bio **bio, int mirror_num, 3135 struct bio **bio, int mirror_num,
3135 unsigned long *bio_flags, int rw, 3136 unsigned long *bio_flags,
3136 u64 *prev_em_start) 3137 u64 *prev_em_start)
3137{ 3138{
3138 u64 start = 0; 3139 u64 start = 0;
@@ -3154,7 +3155,7 @@ static void __extent_readpages(struct extent_io_tree *tree,
3154 index - first_index, start, 3155 index - first_index, start,
3155 end, get_extent, em_cached, 3156 end, get_extent, em_cached,
3156 bio, mirror_num, bio_flags, 3157 bio, mirror_num, bio_flags,
3157 rw, prev_em_start); 3158 prev_em_start);
3158 start = page_start; 3159 start = page_start;
3159 end = start + PAGE_SIZE - 1; 3160 end = start + PAGE_SIZE - 1;
3160 first_index = index; 3161 first_index = index;
@@ -3165,7 +3166,7 @@ static void __extent_readpages(struct extent_io_tree *tree,
3165 __do_contiguous_readpages(tree, &pages[first_index], 3166 __do_contiguous_readpages(tree, &pages[first_index],
3166 index - first_index, start, 3167 index - first_index, start,
3167 end, get_extent, em_cached, bio, 3168 end, get_extent, em_cached, bio,
3168 mirror_num, bio_flags, rw, 3169 mirror_num, bio_flags,
3169 prev_em_start); 3170 prev_em_start);
3170} 3171}
3171 3172
@@ -3173,7 +3174,7 @@ static int __extent_read_full_page(struct extent_io_tree *tree,
3173 struct page *page, 3174 struct page *page,
3174 get_extent_t *get_extent, 3175 get_extent_t *get_extent,
3175 struct bio **bio, int mirror_num, 3176 struct bio **bio, int mirror_num,
3176 unsigned long *bio_flags, int rw) 3177 unsigned long *bio_flags, int read_flags)
3177{ 3178{
3178 struct inode *inode = page->mapping->host; 3179 struct inode *inode = page->mapping->host;
3179 struct btrfs_ordered_extent *ordered; 3180 struct btrfs_ordered_extent *ordered;
@@ -3193,7 +3194,7 @@ static int __extent_read_full_page(struct extent_io_tree *tree,
3193 } 3194 }
3194 3195
3195 ret = __do_readpage(tree, page, get_extent, NULL, bio, mirror_num, 3196 ret = __do_readpage(tree, page, get_extent, NULL, bio, mirror_num,
3196 bio_flags, rw, NULL); 3197 bio_flags, read_flags, NULL);
3197 return ret; 3198 return ret;
3198} 3199}
3199 3200
@@ -3205,9 +3206,9 @@ int extent_read_full_page(struct extent_io_tree *tree, struct page *page,
3205 int ret; 3206 int ret;
3206 3207
3207 ret = __extent_read_full_page(tree, page, get_extent, &bio, mirror_num, 3208 ret = __extent_read_full_page(tree, page, get_extent, &bio, mirror_num,
3208 &bio_flags, READ); 3209 &bio_flags, 0);
3209 if (bio) 3210 if (bio)
3210 ret = submit_one_bio(READ, bio, mirror_num, bio_flags); 3211 ret = submit_one_bio(bio, mirror_num, bio_flags);
3211 return ret; 3212 return ret;
3212} 3213}
3213 3214
@@ -3441,8 +3442,8 @@ static noinline_for_stack int __extent_writepage_io(struct inode *inode,
3441 page->index, cur, end); 3442 page->index, cur, end);
3442 } 3443 }
3443 3444
3444 ret = submit_extent_page(write_flags, tree, wbc, page, 3445 ret = submit_extent_page(REQ_OP_WRITE, write_flags, tree, wbc,
3445 sector, iosize, pg_offset, 3446 page, sector, iosize, pg_offset,
3446 bdev, &epd->bio, max_nr, 3447 bdev, &epd->bio, max_nr,
3447 end_bio_extent_writepage, 3448 end_bio_extent_writepage,
3448 0, 0, 0, false); 3449 0, 0, 0, false);
@@ -3481,13 +3482,11 @@ static int __extent_writepage(struct page *page, struct writeback_control *wbc,
3481 size_t pg_offset = 0; 3482 size_t pg_offset = 0;
3482 loff_t i_size = i_size_read(inode); 3483 loff_t i_size = i_size_read(inode);
3483 unsigned long end_index = i_size >> PAGE_SHIFT; 3484 unsigned long end_index = i_size >> PAGE_SHIFT;
3484 int write_flags; 3485 int write_flags = 0;
3485 unsigned long nr_written = 0; 3486 unsigned long nr_written = 0;
3486 3487
3487 if (wbc->sync_mode == WB_SYNC_ALL) 3488 if (wbc->sync_mode == WB_SYNC_ALL)
3488 write_flags = WRITE_SYNC; 3489 write_flags = WRITE_SYNC;
3489 else
3490 write_flags = WRITE;
3491 3490
3492 trace___extent_writepage(page, inode, wbc); 3491 trace___extent_writepage(page, inode, wbc);
3493 3492
@@ -3731,7 +3730,7 @@ static noinline_for_stack int write_one_eb(struct extent_buffer *eb,
3731 u64 offset = eb->start; 3730 u64 offset = eb->start;
3732 unsigned long i, num_pages; 3731 unsigned long i, num_pages;
3733 unsigned long bio_flags = 0; 3732 unsigned long bio_flags = 0;
3734 int rw = (epd->sync_io ? WRITE_SYNC : WRITE) | REQ_META; 3733 int write_flags = (epd->sync_io ? WRITE_SYNC : 0) | REQ_META;
3735 int ret = 0; 3734 int ret = 0;
3736 3735
3737 clear_bit(EXTENT_BUFFER_WRITE_ERR, &eb->bflags); 3736 clear_bit(EXTENT_BUFFER_WRITE_ERR, &eb->bflags);
@@ -3745,9 +3744,10 @@ static noinline_for_stack int write_one_eb(struct extent_buffer *eb,
3745 3744
3746 clear_page_dirty_for_io(p); 3745 clear_page_dirty_for_io(p);
3747 set_page_writeback(p); 3746 set_page_writeback(p);
3748 ret = submit_extent_page(rw, tree, wbc, p, offset >> 9, 3747 ret = submit_extent_page(REQ_OP_WRITE, write_flags, tree, wbc,
3749 PAGE_SIZE, 0, bdev, &epd->bio, 3748 p, offset >> 9, PAGE_SIZE, 0, bdev,
3750 -1, end_bio_extent_buffer_writepage, 3749 &epd->bio, -1,
3750 end_bio_extent_buffer_writepage,
3751 0, epd->bio_flags, bio_flags, false); 3751 0, epd->bio_flags, bio_flags, false);
3752 epd->bio_flags = bio_flags; 3752 epd->bio_flags = bio_flags;
3753 if (ret) { 3753 if (ret) {
@@ -4057,13 +4057,12 @@ retry:
4057static void flush_epd_write_bio(struct extent_page_data *epd) 4057static void flush_epd_write_bio(struct extent_page_data *epd)
4058{ 4058{
4059 if (epd->bio) { 4059 if (epd->bio) {
4060 int rw = WRITE;
4061 int ret; 4060 int ret;
4062 4061
4063 if (epd->sync_io) 4062 bio_set_op_attrs(epd->bio, REQ_OP_WRITE,
4064 rw = WRITE_SYNC; 4063 epd->sync_io ? WRITE_SYNC : 0);
4065 4064
4066 ret = submit_one_bio(rw, epd->bio, 0, epd->bio_flags); 4065 ret = submit_one_bio(epd->bio, 0, epd->bio_flags);
4067 BUG_ON(ret < 0); /* -ENOMEM */ 4066 BUG_ON(ret < 0); /* -ENOMEM */
4068 epd->bio = NULL; 4067 epd->bio = NULL;
4069 } 4068 }
@@ -4190,19 +4189,19 @@ int extent_readpages(struct extent_io_tree *tree,
4190 if (nr < ARRAY_SIZE(pagepool)) 4189 if (nr < ARRAY_SIZE(pagepool))
4191 continue; 4190 continue;
4192 __extent_readpages(tree, pagepool, nr, get_extent, &em_cached, 4191 __extent_readpages(tree, pagepool, nr, get_extent, &em_cached,
4193 &bio, 0, &bio_flags, READ, &prev_em_start); 4192 &bio, 0, &bio_flags, &prev_em_start);
4194 nr = 0; 4193 nr = 0;
4195 } 4194 }
4196 if (nr) 4195 if (nr)
4197 __extent_readpages(tree, pagepool, nr, get_extent, &em_cached, 4196 __extent_readpages(tree, pagepool, nr, get_extent, &em_cached,
4198 &bio, 0, &bio_flags, READ, &prev_em_start); 4197 &bio, 0, &bio_flags, &prev_em_start);
4199 4198
4200 if (em_cached) 4199 if (em_cached)
4201 free_extent_map(em_cached); 4200 free_extent_map(em_cached);
4202 4201
4203 BUG_ON(!list_empty(pages)); 4202 BUG_ON(!list_empty(pages));
4204 if (bio) 4203 if (bio)
4205 return submit_one_bio(READ, bio, 0, bio_flags); 4204 return submit_one_bio(bio, 0, bio_flags);
4206 return 0; 4205 return 0;
4207} 4206}
4208 4207
@@ -5228,7 +5227,7 @@ int read_extent_buffer_pages(struct extent_io_tree *tree,
5228 err = __extent_read_full_page(tree, page, 5227 err = __extent_read_full_page(tree, page,
5229 get_extent, &bio, 5228 get_extent, &bio,
5230 mirror_num, &bio_flags, 5229 mirror_num, &bio_flags,
5231 READ | REQ_META); 5230 REQ_META);
5232 if (err) 5231 if (err)
5233 ret = err; 5232 ret = err;
5234 } else { 5233 } else {
@@ -5237,8 +5236,7 @@ int read_extent_buffer_pages(struct extent_io_tree *tree,
5237 } 5236 }
5238 5237
5239 if (bio) { 5238 if (bio) {
5240 err = submit_one_bio(READ | REQ_META, bio, mirror_num, 5239 err = submit_one_bio(bio, mirror_num, bio_flags);
5241 bio_flags);
5242 if (err) 5240 if (err)
5243 return err; 5241 return err;
5244 } 5242 }