From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57076) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WxILw-0000K6-5Y for qemu-devel@nongnu.org; Wed, 18 Jun 2014 12:04:55 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WxILo-0008Lf-NP for qemu-devel@nongnu.org; Wed, 18 Jun 2014 12:04:48 -0400 Received: from mx1.redhat.com ([209.132.183.28]:45829) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WxILo-0008LK-EJ for qemu-devel@nongnu.org; Wed, 18 Jun 2014 12:04:40 -0400 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s5IG4cfR011646 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 18 Jun 2014 12:04:39 -0400 Received: from playground.com (ovpn-112-50.ams2.redhat.com [10.36.112.50]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s5IG4BSQ019566 for ; Wed, 18 Jun 2014 12:04:37 -0400 From: Paolo Bonzini Date: Wed, 18 Jun 2014 18:04:06 +0200 Message-Id: <1403107449-6186-13-git-send-email-pbonzini@redhat.com> In-Reply-To: <1403107449-6186-1-git-send-email-pbonzini@redhat.com> References: <1403107449-6186-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PULL 12/15] virtio-scsi: prepare sense data handling for any_layout List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Retrieve sense and copy it to guest memory, to prepare for when we will use qemu_iovec_from_buf. Swap response and request, since we'll use the tail of VirtIOSCSIReq for the CDB. Signed-off-by: Paolo Bonzini --- hw/scsi/virtio-scsi.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c index 0718626..fbc7db7 100644 --- a/hw/scsi/virtio-scsi.c +++ b/hw/scsi/virtio-scsi.c @@ -26,12 +26,7 @@ typedef struct VirtIOSCSIReq { VirtQueueElement elem; QEMUSGList qsgl; SCSIRequest *sreq; - union { - char *buf; - VirtIOSCSICmdReq *cmd; - VirtIOSCSICtrlTMFReq *tmf; - VirtIOSCSICtrlANReq *an; - } req; + size_t resp_size; union { char *buf; VirtIOSCSICmdResp *cmd; @@ -39,6 +34,12 @@ typedef struct VirtIOSCSIReq { VirtIOSCSICtrlANResp *an; VirtIOSCSIEvent *event; } resp; + union { + char *buf; + VirtIOSCSICmdReq *cmd; + VirtIOSCSICtrlTMFReq *tmf; + VirtIOSCSICtrlANReq *an; + } req; } VirtIOSCSIReq; static inline int virtio_scsi_get_lun(uint8_t *lun) @@ -136,6 +137,7 @@ static int virtio_scsi_parse_req(VirtIOSCSIReq *req, return -EINVAL; } req->resp.buf = req->elem.in_sg[0].iov_base; + req->resp_size = resp_size; if (req->elem.out_num > 1) { qemu_sgl_concat(req, &req->elem.out_sg[1], @@ -358,8 +360,7 @@ static void virtio_scsi_command_complete(SCSIRequest *r, uint32_t status, size_t resid) { VirtIOSCSIReq *req = r->hba_private; - VirtIOSCSI *s = req->dev; - VirtIOSCSICommon *vs = VIRTIO_SCSI_COMMON(s); + uint8_t sense[SCSI_SENSE_BUF_SIZE]; uint32_t sense_len; if (r->io_canceled) { @@ -372,8 +373,9 @@ static void virtio_scsi_command_complete(SCSIRequest *r, uint32_t status, req->resp.cmd->resid = tswap32(resid); } else { req->resp.cmd->resid = 0; - sense_len = scsi_req_get_sense(r, req->resp.cmd->sense, - vs->sense_size); + sense_len = scsi_req_get_sense(r, sense, sizeof(sense)); + sense_len = MIN(sense_len, req->resp_size - sizeof(req->resp.cmd)); + memcpy(req->resp.cmd->sense, sense, sense_len); req->resp.cmd->sense_len = tswap32(sense_len); } virtio_scsi_complete_req(req); -- 1.8.3.1