static int send_request(struct request_queue *q, struct bio *bio, struct block_device *bdev, struct tbio_interface *inter, int writing) { struct request *rq; rq = blk_make_request(q, bio, GFP_KERNEL); if (!rq) { prk_err("failed to make request"); return -EFAULT; } rq->cmd_len = inter->cmd_len; if (copy_from_user(rq->cmd, inter->cmd, inter->cmd_len)) goto out_request; if (sizeof(rq->cmd) != inter->cmd_len) { memset(rq->cmd + inter->cmd_len, 0, sizeof(rq->cmd) - inter->cmd_len); } rq->__sector = bio->bi_sector; if (blk_execute_rq(q, bdev->bd_disk, rq, 0)) goto out_request; blk_put_request(rq); return 0; out_request: blk_put_request(rq); return -EFAULT; }
/* return id (s/n) string for *disk to *id_str */ static int virtblk_get_id(struct gendisk *disk, char *id_str) { struct virtio_blk *vblk = disk->private_data; 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); return PTR_ERR(req); } req->cmd_type = REQ_TYPE_DRV_PRIV; err = blk_execute_rq(vblk->disk->queue, vblk->disk, req, false); blk_put_request(req); return err; }