| From 712d8ee7dc96c58f9277e73d6189e1846821300b Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 15 Feb 2019 19:13:08 +0800 |
| Subject: block: don't use bio->bi_vcnt to figure out segment number |
| |
| From: Ming Lei <ming.lei@redhat.com> |
| |
| [ Upstream commit 1a67356e9a4829da2935dd338630a550c59c8489 ] |
| |
| It is wrong to use bio->bi_vcnt to figure out how many segments |
| there are in the bio even though CLONED flag isn't set on this bio, |
| because this bio may be splitted or advanced. |
| |
| So always use bio_segments() in blk_recount_segments(), and it shouldn't |
| cause any performance loss now because the physical segment number is figured |
| out in blk_queue_split() and BIO_SEG_VALID is set meantime since |
| bdced438acd83ad83a6c ("block: setup bi_phys_segments after splitting"). |
| |
| Reviewed-by: Omar Sandoval <osandov@fb.com> |
| Reviewed-by: Christoph Hellwig <hch@lst.de> |
| Fixes: 76d8137a3113 ("blk-merge: recaculate segment if it isn't less than max segments") |
| Signed-off-by: Ming Lei <ming.lei@redhat.com> |
| Signed-off-by: Jens Axboe <axboe@kernel.dk> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| block/blk-merge.c | 8 +------- |
| 1 file changed, 1 insertion(+), 7 deletions(-) |
| |
| diff --git a/block/blk-merge.c b/block/blk-merge.c |
| index 2642e5fc8b69a..66795cca662a3 100644 |
| --- a/block/blk-merge.c |
| +++ b/block/blk-merge.c |
| @@ -305,13 +305,7 @@ void blk_recalc_rq_segments(struct request *rq) |
| |
| void blk_recount_segments(struct request_queue *q, struct bio *bio) |
| { |
| - unsigned short seg_cnt; |
| - |
| - /* estimate segment number by bi_vcnt for non-cloned bio */ |
| - if (bio_flagged(bio, BIO_CLONED)) |
| - seg_cnt = bio_segments(bio); |
| - else |
| - seg_cnt = bio->bi_vcnt; |
| + unsigned short seg_cnt = bio_segments(bio); |
| |
| if (test_bit(QUEUE_FLAG_NO_SG_MERGE, &q->queue_flags) && |
| (seg_cnt < queue_max_segments(q))) |
| -- |
| 2.20.1 |
| |