diff --git a/block/blk-merge.c b/block/blk-merge.c index d24a6c9398ed80767fe379ad88b7d9c096134b6e..b19fc258d089f09cd9df65ee426ec2f058d712c5 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c @@ -235,7 +235,8 @@ static unsigned int __blk_recalc_rq_segments(struct request_queue *q, { struct bio_vec bv, bvprv = { NULL }; int cluster, prev = 0; - unsigned int seg_size, nr_phys_segs; + unsigned int nr_phys_segs = 0; + unsigned int seg_size; struct bio *fbio, *bbio; struct bvec_iter iter; @@ -245,6 +246,12 @@ static unsigned int __blk_recalc_rq_segments(struct request_queue *q, switch (bio_op(bio)) { case REQ_OP_DISCARD: case REQ_OP_SECURE_ERASE: + if (queue_max_discard_segments(q) > 1) { + for_each_bio(bio) + nr_phys_segs++; + return nr_phys_segs; + } + return 1; case REQ_OP_WRITE_ZEROES: return 0; case REQ_OP_WRITE_SAME: @@ -254,7 +261,6 @@ static unsigned int __blk_recalc_rq_segments(struct request_queue *q, fbio = bio; cluster = blk_queue_cluster(q); seg_size = 0; - nr_phys_segs = 0; for_each_bio(bio) { bio_for_each_segment(bv, bio, iter) { /*