Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 764f612c authored by Ming Lei's avatar Ming Lei Committed by Jens Axboe
Browse files

blk-merge: don't compute bi_phys_segments from bi_vcnt for cloned bio



It isn't correct to figure out req->bi_phys_segments from bio->bi_vcnt
if the bio is cloned.

Signed-off-by: default avatarMing Lei <ming.lei@canonical.com>
Tested-by: default avatarJeff Mahoney <jeffm@suse.com>
Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent b8839b8c
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -97,14 +97,18 @@ void blk_recalc_rq_segments(struct request *rq)

void blk_recount_segments(struct request_queue *q, struct bio *bio)
{
	if (test_bit(QUEUE_FLAG_NO_SG_MERGE, &q->queue_flags) &&
	bool no_sg_merge = !!test_bit(QUEUE_FLAG_NO_SG_MERGE,
			&q->queue_flags);

	if (no_sg_merge && !bio_flagged(bio, BIO_CLONED) &&
			bio->bi_vcnt < queue_max_segments(q))
		bio->bi_phys_segments = bio->bi_vcnt;
	else {
		struct bio *nxt = bio->bi_next;

		bio->bi_next = NULL;
		bio->bi_phys_segments = __blk_recalc_rq_segments(q, bio, false);
		bio->bi_phys_segments = __blk_recalc_rq_segments(q, bio,
				no_sg_merge);
		bio->bi_next = nxt;
	}