From: Paolo Bonzini <pbonzini@redhat.com>
To: Fam Zheng <famz@redhat.com>, qemu-devel@nongnu.org
Cc: Stefan Hajnoczi <stefanha@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v2 1/2] virtio-blk: Factor out virtio_blk_handle_scsi_req from virtio_blk_handle_scsi
Date: Thu, 22 May 2014 09:58:04 +0200 [thread overview]
Message-ID: <537DAE0C.7030308@redhat.com> (raw)
In-Reply-To: <1400744232-29173-2-git-send-email-famz@redhat.com>
Il 22/05/2014 09:37, Fam Zheng ha scritto:
> -static void virtio_blk_handle_scsi(VirtIOBlockReq *req)
> +int virtio_blk_handle_scsi_req(BlockDriverState *bs,
> + VirtIOBlkConf *conf,
> + VirtQueueElement *elem)
Two more comments...
please pass the VirtIOBlock * instead of bs/conf here.
> {
> + int status = VIRTIO_BLK_S_OK;
> + struct virtio_scsi_inhdr *scsi = NULL;
> #ifdef __linux__
> - int ret;
> int i;
> + struct sg_io_hdr hdr;
> #endif
> - int status = VIRTIO_BLK_S_OK;
>
> /*
> * We require at least one output segment each for the virtio_blk_outhdr
> @@ -140,63 +142,61 @@ static void virtio_blk_handle_scsi(VirtIOBlockReq *req)
> * We also at least require the virtio_blk_inhdr, the virtio_scsi_inhdr
> * and the sense buffer pointer in the input segments.
> */
> - if (req->elem.out_num < 2 || req->elem.in_num < 3) {
> - virtio_blk_req_complete(req, VIRTIO_BLK_S_IOERR);
> - g_free(req);
> - return;
> + if (elem->out_num < 2 || elem->in_num < 3) {
> + status = VIRTIO_BLK_S_IOERR;
> + goto fail;
> }
>
> /*
> * The scsi inhdr is placed in the second-to-last input segment, just
> * before the regular inhdr.
> */
> - req->scsi = (void *)req->elem.in_sg[req->elem.in_num - 2].iov_base;
> + scsi = (void *)elem->in_sg[elem->in_num - 2].iov_base;
>
> - if (!req->dev->blk.scsi) {
> + /*
> + * No support for bidirection commands yet.
> + */
> + if (elem->out_num > 2 && elem->in_num > 3) {
> status = VIRTIO_BLK_S_UNSUPP;
> goto fail;
> }
>
> - /*
> - * No support for bidirection commands yet.
> - */
> - if (req->elem.out_num > 2 && req->elem.in_num > 3) {
> + if (!conf->scsi) {
> status = VIRTIO_BLK_S_UNSUPP;
> goto fail;
> }
Swapping the two conditionals unnecessarily makes the patch bigger.
Paolo
> #ifdef __linux__
> - struct sg_io_hdr hdr;
> memset(&hdr, 0, sizeof(struct sg_io_hdr));
> hdr.interface_id = 'S';
> - hdr.cmd_len = req->elem.out_sg[1].iov_len;
> - hdr.cmdp = req->elem.out_sg[1].iov_base;
> + hdr.cmd_len = elem->out_sg[1].iov_len;
> + hdr.cmdp = elem->out_sg[1].iov_base;
> hdr.dxfer_len = 0;
>
> - if (req->elem.out_num > 2) {
> + if (elem->out_num > 2) {
> /*
> * If there are more than the minimally required 2 output segments
> * there is write payload starting from the third iovec.
> */
> hdr.dxfer_direction = SG_DXFER_TO_DEV;
> - hdr.iovec_count = req->elem.out_num - 2;
> + hdr.iovec_count = elem->out_num - 2;
>
> for (i = 0; i < hdr.iovec_count; i++)
> - hdr.dxfer_len += req->elem.out_sg[i + 2].iov_len;
> + hdr.dxfer_len += elem->out_sg[i + 2].iov_len;
>
> - hdr.dxferp = req->elem.out_sg + 2;
> + hdr.dxferp = elem->out_sg + 2;
>
> - } else if (req->elem.in_num > 3) {
> + } else if (elem->in_num > 3) {
> /*
> * If we have more than 3 input segments the guest wants to actually
> * read data.
> */
> hdr.dxfer_direction = SG_DXFER_FROM_DEV;
> - hdr.iovec_count = req->elem.in_num - 3;
> + hdr.iovec_count = elem->in_num - 3;
> for (i = 0; i < hdr.iovec_count; i++)
> - hdr.dxfer_len += req->elem.in_sg[i].iov_len;
> + hdr.dxfer_len += elem->in_sg[i].iov_len;
>
> - hdr.dxferp = req->elem.in_sg;
> + hdr.dxferp = elem->in_sg;
> } else {
> /*
> * Some SCSI commands don't actually transfer any data.
> @@ -204,11 +204,11 @@ static void virtio_blk_handle_scsi(VirtIOBlockReq *req)
> hdr.dxfer_direction = SG_DXFER_NONE;
> }
>
> - hdr.sbp = req->elem.in_sg[req->elem.in_num - 3].iov_base;
> - hdr.mx_sb_len = req->elem.in_sg[req->elem.in_num - 3].iov_len;
> + hdr.sbp = elem->in_sg[elem->in_num - 3].iov_base;
> + hdr.mx_sb_len = elem->in_sg[elem->in_num - 3].iov_len;
>
> - ret = bdrv_ioctl(req->dev->bs, SG_IO, &hdr);
> - if (ret) {
> + status = bdrv_ioctl(bs, SG_IO, &hdr);
> + if (status) {
> status = VIRTIO_BLK_S_UNSUPP;
> goto fail;
> }
> @@ -224,23 +224,32 @@ static void virtio_blk_handle_scsi(VirtIOBlockReq *req)
> hdr.status = CHECK_CONDITION;
> }
>
> - stl_p(&req->scsi->errors,
> + stl_p(&scsi->errors,
> hdr.status | (hdr.msg_status << 8) |
> (hdr.host_status << 16) | (hdr.driver_status << 24));
> - stl_p(&req->scsi->residual, hdr.resid);
> - stl_p(&req->scsi->sense_len, hdr.sb_len_wr);
> - stl_p(&req->scsi->data_len, hdr.dxfer_len);
> + stl_p(&scsi->residual, hdr.resid);
> + stl_p(&scsi->sense_len, hdr.sb_len_wr);
> + stl_p(&scsi->data_len, hdr.dxfer_len);
>
> - virtio_blk_req_complete(req, status);
> - g_free(req);
> - return;
> + return status;
> #else
> abort();
> #endif
>
> fail:
> /* Just put anything nonzero so that the ioctl fails in the guest. */
> - stl_p(&req->scsi->errors, 255);
> + if (scsi) {
> + stl_p(&scsi->errors, 255);
> + }
> + return status;
> +}
> +
> +static void virtio_blk_handle_scsi(VirtIOBlockReq *req)
> +{
> + int status;
> +
> + status = virtio_blk_handle_scsi_req(req->dev->bs, &req->dev->blk,
> + &req->elem);
> virtio_blk_req_complete(req, status);
> g_free(req);
> }
> diff --git a/include/hw/virtio/virtio-blk.h b/include/hw/virtio/virtio-blk.h
> index e4c41ff..1b00b48 100644
> --- a/include/hw/virtio/virtio-blk.h
> +++ b/include/hw/virtio/virtio-blk.h
> @@ -155,4 +155,8 @@ typedef struct VirtIOBlock {
>
> void virtio_blk_set_conf(DeviceState *dev, VirtIOBlkConf *blk);
>
> +int virtio_blk_handle_scsi_req(BlockDriverState *bs,
> + VirtIOBlkConf *conf,
> + VirtQueueElement *elem);
> +
> #endif
>
next prev parent reply other threads:[~2014-05-22 7:58 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-05-22 7:37 [Qemu-devel] [PATCH v2 0/2] dataplane: Enable "scsi=on" Fam Zheng
2014-05-22 7:37 ` [Qemu-devel] [PATCH v2 1/2] virtio-blk: Factor out virtio_blk_handle_scsi_req from virtio_blk_handle_scsi Fam Zheng
2014-05-22 7:58 ` Paolo Bonzini [this message]
2014-05-22 7:37 ` [Qemu-devel] [PATCH v2 2/2] dataplane: Support VIRTIO_BLK_T_SCSI_CMD Fam Zheng
2014-05-22 12:48 ` [Qemu-devel] [PATCH v2 0/2] dataplane: Enable "scsi=on" Stefan Hajnoczi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=537DAE0C.7030308@redhat.com \
--to=pbonzini@redhat.com \
--cc=famz@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.