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 pbonz...@redhat.com

... even without 5/8.

Paolo



[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