From: Orit Wasserman <owasserm@redhat.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: amit.shah@redhat.com, qemu-devel@nongnu.org, mst@redhat.com
Subject: Re: [Qemu-devel] [PATCH 1/3] virtio-blk: report non-zero status when failing SG_IO requests
Date: Tue, 13 Mar 2012 15:36:13 +0200 [thread overview]
Message-ID: <4F5F4D4D.1060600@redhat.com> (raw)
In-Reply-To: <1331143301-28408-2-git-send-email-pbonzini@redhat.com>
On 03/07/2012 08:01 PM, Paolo Bonzini wrote:
> Linux really looks only at scsi->errors. Arguably it is their bug,
> but we can make it safe for older guests now.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
> hw/virtio-blk.c | 48 +++++++++++++++++++++++-------------------------
> 1 files changed, 23 insertions(+), 25 deletions(-)
>
> diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c
> index 49990f8..b7e510d 100644
> --- a/hw/virtio-blk.c
> +++ b/hw/virtio-blk.c
> @@ -145,20 +145,12 @@ static VirtIOBlockReq *virtio_blk_get_request(VirtIOBlock *s)
> return req;
> }
>
> -#ifdef __linux__
> static void virtio_blk_handle_scsi(VirtIOBlockReq *req)
> {
> - struct sg_io_hdr hdr;
> - int ret;
> + int ret = -1;
> int status;
> int i;
>
> - if ((req->dev->vdev.guest_features & (1 << VIRTIO_BLK_F_SCSI)) == 0) {
> - virtio_blk_req_complete(req, VIRTIO_BLK_S_UNSUPP);
> - g_free(req);
> - return;
> - }
> -
> /*
> * We require at least one output segment each for the virtio_blk_outhdr
> * and the SCSI command block.
> @@ -173,20 +165,26 @@ static void virtio_blk_handle_scsi(VirtIOBlockReq *req)
> }
>
> /*
> - * No support for bidirection commands yet.
> + * The scsi inhdr is placed in the second-to-last input segment, just
> + * before the regular inhdr.
> */
> - if (req->elem.out_num > 2 && req->elem.in_num > 3) {
> - virtio_blk_req_complete(req, VIRTIO_BLK_S_UNSUPP);
> - g_free(req);
> - return;
> + req->scsi = (void *)req->elem.in_sg[req->elem.in_num - 2].iov_base;
> +
> + if ((req->dev->vdev.guest_features & (1 << VIRTIO_BLK_F_SCSI)) == 0) {
> + status = VIRTIO_BLK_S_UNSUPP;
> + goto fail;
> }
>
> /*
> - * The scsi inhdr is placed in the second-to-last input segment, just
> - * before the regular inhdr.
> + * No support for bidirection commands yet.
> */
> - req->scsi = (void *)req->elem.in_sg[req->elem.in_num - 2].iov_base;
> + if (req->elem.out_num > 2 && req->elem.in_num > 3) {
> + status = VIRTIO_BLK_S_UNSUPP;
> + goto fail;
> + }
>
> +#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;
> @@ -229,9 +227,7 @@ static void virtio_blk_handle_scsi(VirtIOBlockReq *req)
>
> ret = bdrv_ioctl(req->dev->bs, SG_IO, &hdr);
> if (ret) {
> - status = VIRTIO_BLK_S_UNSUPP;
> - hdr.status = ret;
> - hdr.resid = hdr.dxfer_len;
> + goto fail;
> } else if (hdr.status) {
> status = VIRTIO_BLK_S_IOERR;
> } else {
> @@ -258,14 +254,16 @@ static void virtio_blk_handle_scsi(VirtIOBlockReq *req)
>
> virtio_blk_req_complete(req, status);
> g_free(req);
> -}
> #else
> -static void virtio_blk_handle_scsi(VirtIOBlockReq *req)
> -{
> - virtio_blk_req_complete(req, VIRTIO_BLK_S_UNSUPP);
> + abort();
> +#endif
> +
> +fail:
> + /* Just put anything nonzero so that the ioctl fails in the guest. */
> + stl_p(&req->scsi->errors, 255);
> + virtio_blk_req_complete(req, status);
I get to following compile error:
In function ‘virtio_blk_handle_request’:
virtio-blk.c:264:28: error: ‘status’ may be used uninitialized in this function [-Werror=uninitialized]
virtio-blk.c:151:9: note: ‘status’ was declared here
cc1: all warnings being treated as errors
Are you using -disable-werror ?
Orit
> g_free(req);
> }
> -#endif /* __linux__ */
>
> typedef struct MultiReqBuffer {
> BlockRequest blkreq[32];
next prev parent reply other threads:[~2012-03-13 13:36 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-03-07 18:01 [Qemu-devel] [PATCH 0/3] decouple VIRTIO_BLK_F_SCSI from SG_IO support Paolo Bonzini
2012-03-07 18:01 ` [Qemu-devel] [PATCH 1/3] virtio-blk: report non-zero status when failing SG_IO requests Paolo Bonzini
2012-03-13 13:36 ` Orit Wasserman [this message]
2012-03-13 13:39 ` Paolo Bonzini
2012-03-13 13:44 ` Orit Wasserman
2012-03-13 15:17 ` Eric Blake
2012-03-07 18:01 ` [Qemu-devel] [PATCH 2/3] virtio-blk: define VirtIOBlkConf Paolo Bonzini
2012-03-07 18:01 ` [Qemu-devel] [PATCH 3/3] virtio-blk: always enable VIRTIO_BLK_F_SCSI Paolo Bonzini
2012-03-12 14:32 ` [Qemu-devel] [PATCH 0/3] decouple VIRTIO_BLK_F_SCSI from SG_IO support Paolo Bonzini
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=4F5F4D4D.1060600@redhat.com \
--to=owasserm@redhat.com \
--cc=amit.shah@redhat.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
/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.