Pull block layer fix from Jens Axboe: "This just contains the fix for the split issue that we had in -rc1. It's been well tested at this point, so let's get it in mainline so we don't have the same split issue for -rc2" * 'for-linus' of git://git.kernel.dk/linux-block: block: fix bio splitting on max sectors
Unified · Split
| @@ -70,6 +70,18 @@ static struct bio *blk_bio_write_same_split(struct request_queue *q, · 69 unmodified lines | ||
| 70 | 70 | return bio_split(bio, q->limits.max_write_same_sectors, GFP_NOIO, bs); |
| 71 | 71 | } |
| 72 | 72 | |
| 73 | +static inline unsigned get_max_io_size(struct request_queue *q, | |
| 74 | + struct bio *bio) | |
| 75 | +{ | |
| 76 | + unsigned sectors = blk_max_size_offset(q, bio->bi_iter.bi_sector); | |
| 77 | + unsigned mask = queue_logical_block_size(q) - 1; | |
| 78 | + | |
| 79 | + /* aligned to logical block size */ | |
| 80 | + sectors &= ~(mask >> 9); | |
| 81 | + | |
| 82 | + return sectors; | |
| 83 | +} | |
| 84 | + | |
| 73 | 85 | static struct bio *blk_bio_segment_split(struct request_queue *q, |
| 74 | 86 | struct bio *bio, |
| 75 | 87 | struct bio_set *bs, |
| @@ -81,6 +93,7 @@ static struct bio *blk_bio_segment_split(struct request_queue *q, · 5 unmodified lines | ||
| 81 | 93 | unsigned front_seg_size = bio->bi_seg_front_size; |
| 82 | 94 | bool do_split = true; |
| 83 | 95 | struct bio *new = NULL; |
| 96 | + const unsigned max_sectors = get_max_io_size(q, bio); | |
| 84 | 97 | |
| 85 | 98 | bio_for_each_segment(bv, bio, iter) { |
| 86 | 99 | /* |
| @@ -90,20 +103,19 @@ static struct bio *blk_bio_segment_split(struct request_queue *q, · 3 unmodified lines | ||
| 90 | 103 | if (bvprvp && bvec_gap_to_prev(q, bvprvp, bv.bv_offset)) |
| 91 | 104 | goto split; |
| 92 | 105 | |
| 93 | − if (sectors + (bv.bv_len >> 9) > | |
| 94 | − blk_max_size_offset(q, bio->bi_iter.bi_sector)) { | |
| 106 | + if (sectors + (bv.bv_len >> 9) > max_sectors) { | |
| 95 | 107 | /* |
| 96 | 108 | * Consider this a new segment if we're splitting in |
| 97 | 109 | * the middle of this vector. |
| 98 | 110 | */ |
| 99 | 111 | if (nsegs < queue_max_segments(q) && |
| 100 | − sectors < blk_max_size_offset(q, | |
| 101 | − bio->bi_iter.bi_sector)) { | |
| 112 | + sectors < max_sectors) { | |
| 102 | 113 | nsegs++; |
| 103 | − sectors = blk_max_size_offset(q, | |
| 104 | − bio->bi_iter.bi_sector); | |
| 114 | + sectors = max_sectors; | |
| 105 | 115 | } |
| 106 | − goto split; | |
| 116 | + if (sectors) | |
| 117 | + goto split; | |
| 118 | + /* Make this single bvec as the 1st segment */ | |
| 107 | 119 | } |
| 108 | 120 | |
| 109 | 121 | if (bvprvp && blk_queue_cluster(q)) { |