Skip to content

Commit 76d8137

Browse files
ming1axboe
authored andcommitted
blk-merge: recaculate segment if it isn't less than max segments
The problem is introduced by commit 764f612(blk-merge: don't compute bi_phys_segments from bi_vcnt for cloned bio), and merge is needed if number of current segment isn't less than max segments. Strictly speaking, bio->bi_vcnt shouldn't be used here since it may not be accurate in cases of both cloned bio or bio cloned from, but bio_segments() is a bit expensive, and bi_vcnt is still the biggest number, so the approach should work. Signed-off-by: Ming Lei <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
1 parent 432f16e commit 76d8137

File tree

1 file changed

+3
-2
lines changed

1 file changed

+3
-2
lines changed

block/blk-merge.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,16 +99,17 @@ void blk_recount_segments(struct request_queue *q, struct bio *bio)
9999
{
100100
bool no_sg_merge = !!test_bit(QUEUE_FLAG_NO_SG_MERGE,
101101
&q->queue_flags);
102+
bool merge_not_need = bio->bi_vcnt < queue_max_segments(q);
102103

103104
if (no_sg_merge && !bio_flagged(bio, BIO_CLONED) &&
104-
bio->bi_vcnt < queue_max_segments(q))
105+
merge_not_need)
105106
bio->bi_phys_segments = bio->bi_vcnt;
106107
else {
107108
struct bio *nxt = bio->bi_next;
108109

109110
bio->bi_next = NULL;
110111
bio->bi_phys_segments = __blk_recalc_rq_segments(q, bio,
111-
no_sg_merge);
112+
no_sg_merge && merge_not_need);
112113
bio->bi_next = nxt;
113114
}
114115

0 commit comments

Comments
 (0)