diff --git a/block/blk-merge.c b/block/blk-merge.c
index 7904e45fc5c62f5496b5c7408f379f6aefd6722c..89a9bec91b8deb296d36babdf5a23ed8ccbab5a7 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) {
/*