All of lore.kernel.org
 help / color / mirror / Atom feed
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];

  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.