bdev_virtio: moved virtio_req init to separate function

This is required for upcoming UNMAP implementation.

Change-Id: I81fb744e0813121cebd64aa60a03a80bfbecc94d
Signed-off-by: Dariusz Stojaczyk <dariuszx.stojaczyk@intel.com>
Reviewed-on: https://review.gerrithub.io/377421
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Dariusz Stojaczyk 2017-09-06 20:51:28 +02:00 committed by Jim Harris
parent 3595fc5f40
commit bf5a7293d0

View File

@ -109,41 +109,50 @@ SPDK_BDEV_MODULE_REGISTER(virtio_scsi, bdev_virtio_initialize, bdev_virtio_finis
SPDK_BDEV_MODULE_ASYNC_INIT(virtio_scsi)
static void
bdev_virtio_rw(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io)
static struct virtio_req *
bdev_virtio_init_vreq(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io)
{
struct virtio_req *vreq;
struct virtio_scsi_cmd_req *req;
struct virtio_scsi_cmd_resp *resp;
struct virtio_scsi_disk *disk = (struct virtio_scsi_disk *)bdev_io->bdev;
struct virtio_scsi_io_ctx *io_ctx = (struct virtio_scsi_io_ctx *)bdev_io->driver_ctx;
bool is_read = (bdev_io->type == SPDK_BDEV_IO_TYPE_READ);
vreq = &io_ctx->vreq;
req = &io_ctx->req;
resp = &io_ctx->resp;
vreq->iov_req.iov_base = (void *)req;
vreq->iov_req.iov_base = req;
vreq->iov_req.iov_len = sizeof(*req);
vreq->iov_resp.iov_base = (void *)resp;
vreq->iov_resp.iov_base = resp;
vreq->iov_resp.iov_len = sizeof(*resp);
vreq->is_write = !is_read;
vreq->is_write = bdev_io->type != SPDK_BDEV_IO_TYPE_READ;
memset(req, 0, sizeof(*req));
req->lun[0] = 1;
req->lun[1] = disk->target;
return vreq;
}
static void
bdev_virtio_rw(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io)
{
struct virtio_scsi_disk *disk = (struct virtio_scsi_disk *)bdev_io->bdev;
struct virtio_req *vreq = bdev_virtio_init_vreq(ch, bdev_io);
struct virtio_scsi_cmd_req *req = vreq->iov_req.iov_base;
vreq->iov = bdev_io->u.bdev.iovs;
vreq->iovcnt = bdev_io->u.bdev.iovcnt;
if (disk->num_blocks > (1ULL << 32)) {
req->cdb[0] = is_read ? SPDK_SBC_READ_16 : SPDK_SBC_WRITE_16;
req->cdb[0] = vreq->is_write ? SPDK_SBC_WRITE_16 : SPDK_SBC_READ_16;
to_be64(&req->cdb[2], bdev_io->u.bdev.offset_blocks);
to_be32(&req->cdb[10], bdev_io->u.bdev.num_blocks);
} else {
req->cdb[0] = is_read ? SPDK_SBC_READ_10 : SPDK_SBC_WRITE_10;
req->cdb[0] = vreq->is_write ? SPDK_SBC_WRITE_10 : SPDK_SBC_READ_10;
to_be32(&req->cdb[2], bdev_io->u.bdev.offset_blocks);
to_be16(&req->cdb[7], bdev_io->u.bdev.num_blocks);
}