block: implement splitting of REQ_OP_WRITE_ZEROES bios
authorChristoph Hellwig <hch@lst.de>
Wed, 5 Apr 2017 17:21:01 +0000 (19:21 +0200)
committerJens Axboe <axboe@fb.com>
Sat, 8 Apr 2017 17:25:38 +0000 (11:25 -0600)
Copy and past the REQ_OP_WRITE_SAME code to prepare to implementations
that limit the write zeroes size.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
block/blk-merge.c

index 2afa262..3990ae4 100644 (file)
@@ -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);