|
@@ -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)
|
|
static int virtblk_get_id(struct gendisk *disk, char *id_str)
|
|
{
|
|
{
|
|
struct virtio_blk *vblk = disk->private_data;
|
|
struct virtio_blk *vblk = disk->private_data;
|
|
|
|
+ struct request_queue *q = vblk->disk->queue;
|
|
struct request *req;
|
|
struct request *req;
|
|
- struct bio *bio;
|
|
|
|
int err;
|
|
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);
|
|
return PTR_ERR(req);
|
|
- }
|
|
|
|
-
|
|
|
|
|
|
+ blk_rq_set_block_pc(req);
|
|
req->cmd_type = REQ_TYPE_DRV_PRIV;
|
|
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);
|
|
err = blk_execute_rq(vblk->disk->queue, vblk->disk, req, false);
|
|
|
|
+out:
|
|
blk_put_request(req);
|
|
blk_put_request(req);
|
|
-
|
|
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|