diff options
author | Mike Christie <mchristi@redhat.com> | 2016-06-05 15:31:51 -0400 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2016-06-07 15:41:38 -0400 |
commit | 1f7ad75b13b5bd50680d5d3ccff7807e15620448 (patch) | |
tree | a075348f3a73188d241064226e39c17f49ef68e6 /fs/btrfs | |
parent | 8a4c1e42e0eb7189296ac140761370e2549cffe7 (diff) |
btrfs: have submit_one_bio users use bio op accessors
This patch has btrfs's submit_one_bio users set the bio op using
bio_set_op_attrs and get the op using bio_op.
The next patches will continue to convert btrfs,
so submit_bio_hook and merge_bio_hook
related code will be modified to take only the bio. I did
not do it in this patch to try and keep it smaller.
Signed-off-by: Mike Christie <mchristi@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'fs/btrfs')
-rw-r--r-- | fs/btrfs/extent_io.c | 88 |
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 | ||
2727 | static int __must_check submit_one_bio(int rw, struct bio *bio, | 2728 | static 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 | ||
2752 | static int merge_bio(int rw, struct extent_io_tree *tree, struct page *page, | 2753 | static 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 | ||
2765 | static int submit_extent_page(int rw, struct extent_io_tree *tree, | 2766 | static 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: | |||
4057 | static void flush_epd_write_bio(struct extent_page_data *epd) | 4057 | static 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 | } |