[Qemu-devel] [PATCH 6/8] usb-storage: don't try to send the status early.

2011-11-21 Thread Gerd Hoffmann
Until recently all scsi commands sent to scsi-disk did either transfer
data or finished instantly.  The correct implementation of
SYNCRONIZE_CACHE changed the picture though, and usb-storage needs
a fix to handle that case correctly.
---
 hw/usb-msd.c |   16 ++--
 1 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/hw/usb-msd.c b/hw/usb-msd.c
index 6f32a0e..68e3756 100644
--- a/hw/usb-msd.c
+++ b/hw/usb-msd.c
@@ -378,9 +378,7 @@ static int usb_msd_handle_data(USBDevice *dev, USBPacket *p)
 s->scsi_len = 0;
 s->req = scsi_req_new(s->scsi_dev, tag, 0, cbw.cmd, NULL);
 scsi_req_enqueue(s->req);
-/* ??? Should check that USB and SCSI data transfer
-   directions match.  */
-if (s->mode != USB_MSDM_CSW && s->residue == 0) {
+if (s->req && s->req->cmd.xfer != SCSI_XFER_NONE) {
 scsi_req_continue(s->req);
 }
 ret = p->result;
@@ -439,9 +437,15 @@ static int usb_msd_handle_data(USBDevice *dev, USBPacket 
*p)
 goto fail;
 }
 
-usb_msd_send_status(s, p);
-s->mode = USB_MSDM_CBW;
-ret = 13;
+if (s->req) {
+/* still in flight */
+s->packet = p;
+ret = USB_RET_ASYNC;
+} else {
+usb_msd_send_status(s, p);
+s->mode = USB_MSDM_CBW;
+ret = 13;
+}
 break;
 
 case USB_MSDM_DATAIN:
-- 
1.7.1




Re: [Qemu-devel] [PATCH 6/8] usb-storage: don't try to send the status early.

2011-11-21 Thread Paolo Bonzini

On 11/21/2011 02:40 PM, Gerd Hoffmann wrote:

Until recently all scsi commands sent to scsi-disk did either transfer
data or finished instantly.  The correct implementation of
SYNCRONIZE_CACHE changed the picture though, and usb-storage needs
a fix to handle that case correctly.
---
  hw/usb-msd.c |   16 ++--
  1 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/hw/usb-msd.c b/hw/usb-msd.c
index 6f32a0e..68e3756 100644
--- a/hw/usb-msd.c
+++ b/hw/usb-msd.c
@@ -378,9 +378,7 @@ static int usb_msd_handle_data(USBDevice *dev, USBPacket *p)
  s->scsi_len = 0;
  s->req = scsi_req_new(s->scsi_dev, tag, 0, cbw.cmd, NULL);
  scsi_req_enqueue(s->req);
-/* ??? Should check that USB and SCSI data transfer
-   directions match.  */
-if (s->mode != USB_MSDM_CSW&&  s->residue == 0) {
+if (s->req&&  s->req->cmd.xfer != SCSI_XFER_NONE) {
  scsi_req_continue(s->req);
  }
  ret = p->result;
@@ -439,9 +437,15 @@ static int usb_msd_handle_data(USBDevice *dev, USBPacket 
*p)
  goto fail;
  }

-usb_msd_send_status(s, p);
-s->mode = USB_MSDM_CBW;
-ret = 13;
+if (s->req) {
+/* still in flight */
+s->packet = p;
+ret = USB_RET_ASYNC;
+} else {
+usb_msd_send_status(s, p);
+s->mode = USB_MSDM_CBW;
+ret = 13;
+}
  break;

  case USB_MSDM_DATAIN:


Acked-by: Paolo Bonzini 

... even without 5/8.

Paolo