|
@@ -54,6 +54,20 @@ static struct bio *blk_bio_discard_split(struct request_queue *q,
|
|
|
return bio_split(bio, split_sectors, GFP_NOIO, bs);
|
|
|
}
|
|
|
|
|
|
+static struct bio *blk_bio_write_zeroes_split(struct request_queue *q,
|
|
|
+ struct bio *bio, struct bio_set *bs, unsigned *nsegs)
|
|
|
+{
|
|
|
+ *nsegs = 1;
|
|
|
+
|
|
|
+ if (!q->limits.max_write_zeroes_sectors)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ if (bio_sectors(bio) <= q->limits.max_write_zeroes_sectors)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ return bio_split(bio, q->limits.max_write_zeroes_sectors, GFP_NOIO, bs);
|
|
|
+}
|
|
|
+
|
|
|
static struct bio *blk_bio_write_same_split(struct request_queue *q,
|
|
|
struct bio *bio,
|
|
|
struct bio_set *bs,
|
|
@@ -200,8 +214,7 @@ void blk_queue_split(struct request_queue *q, struct bio **bio,
|
|
|
split = blk_bio_discard_split(q, *bio, bs, &nsegs);
|
|
|
break;
|
|
|
case REQ_OP_WRITE_ZEROES:
|
|
|
- split = NULL;
|
|
|
- nsegs = (*bio)->bi_phys_segments;
|
|
|
+ split = blk_bio_write_zeroes_split(q, *bio, bs, &nsegs);
|
|
|
break;
|
|
|
case REQ_OP_WRITE_SAME:
|
|
|
split = blk_bio_write_same_split(q, *bio, bs, &nsegs);
|