virtio_blk: use blk_rq_map_kern
authorChristoph Hellwig <hch@lst.de>
Tue, 19 Jul 2016 09:31:49 +0000 (11:31 +0200)
committerJens Axboe <axboe@fb.com>
Wed, 20 Jul 2016 23:38:29 +0000 (17:38 -0600)
Similar to how SCSI and NVMe prepare passthrough requests.  This avoids
poking into request internals too much.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@fb.com>
drivers/block/virtio_blk.c

index 5fd2e0ac2711456e7069900d428f489e6193721e..a85a14355efabdf5723277af7c7b0db4ac8a89ac 100644 (file)
@@ -236,25 +236,23 @@ static int virtio_queue_rq(struct blk_mq_hw_ctx *hctx,
 static int virtblk_get_id(struct gendisk *disk, char *id_str)
 {
        struct virtio_blk *vblk = disk->private_data;
+       struct request_queue *q = vblk->disk->queue;
        struct request *req;
-       struct bio *bio;
        int err;
 
-       bio = bio_map_kern(vblk->disk->queue, id_str, VIRTIO_BLK_ID_BYTES,
-                          GFP_KERNEL);
-       if (IS_ERR(bio))
-               return PTR_ERR(bio);
-
-       req = blk_make_request(vblk->disk->queue, bio, GFP_KERNEL);
-       if (IS_ERR(req)) {
-               bio_put(bio);
+       req = blk_get_request(q, READ, GFP_KERNEL);
+       if (IS_ERR(req))
                return PTR_ERR(req);
-       }
-
+       blk_rq_set_block_pc(req);
        req->cmd_type = REQ_TYPE_DRV_PRIV;
+
+       err = blk_rq_map_kern(q, req, id_str, VIRTIO_BLK_ID_BYTES, GFP_KERNEL);
+       if (err)
+               goto out;
+
        err = blk_execute_rq(vblk->disk->queue, vblk->disk, req, false);
+out:
        blk_put_request(req);
-
        return err;
 }