コード例 #1
0
ファイル: ltp_tbio.c プロジェクト: ArnoldWu/ltp
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;
}
コード例 #2
0
ファイル: virtio_blk.c プロジェクト: 0-T-0/ps4-linux
/* 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;
}