diff options
author | Christoph Hellwig <hch@lst.de> | 2016-07-19 11:31:49 +0200 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2016-07-20 17:38:29 -0600 |
commit | f9596695bee6a88d17118ee9f2f826f96b826644 (patch) | |
tree | 95375f2d42332471400ac5ce73343e50aad016ef /drivers/block | |
parent | 4eef39c90665fe73689b176dcd8cdff4a9a91274 (diff) | |
download | linux-f9596695bee6a88d17118ee9f2f826f96b826644.tar.bz2 |
virtio_blk: use blk_rq_map_kern
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>
Diffstat (limited to 'drivers/block')
-rw-r--r-- | drivers/block/virtio_blk.c | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c index 5fd2e0ac2711..a85a14355efa 100644 --- a/drivers/block/virtio_blk.c +++ b/drivers/block/virtio_blk.c @@ -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; } |