From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58692) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WxFtj-0002qV-O1 for qemu-devel@nongnu.org; Wed, 18 Jun 2014 09:27:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WxFta-00027J-NY for qemu-devel@nongnu.org; Wed, 18 Jun 2014 09:27:31 -0400 Received: from mail-we0-x230.google.com ([2a00:1450:400c:c03::230]:62876) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WxFta-000272-HL for qemu-devel@nongnu.org; Wed, 18 Jun 2014 09:27:22 -0400 Received: by mail-we0-f176.google.com with SMTP id u56so869700wes.35 for ; Wed, 18 Jun 2014 06:27:21 -0700 (PDT) Received: from yakj.station (net-37-117-140-88.cust.vodafonedsl.it. [37.117.140.88]) by mx.google.com with ESMTPSA id l5sm3853238wif.22.2014.06.18.06.27.20 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 18 Jun 2014 06:27:21 -0700 (PDT) Sender: Paolo Bonzini From: Paolo Bonzini Date: Wed, 18 Jun 2014 15:26:52 +0200 Message-Id: <1403098014-1522-13-git-send-email-pbonzini@redhat.com> In-Reply-To: <1403098014-1522-1-git-send-email-pbonzini@redhat.com> References: <1403098014-1522-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PULL 12/14] 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