]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/commitdiff
uas: improve error handling
authorGerd Hoffmann <kraxel@redhat.com>
Tue, 19 Jun 2012 07:54:52 +0000 (09:54 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 25 Jun 2012 18:51:00 +0000 (11:51 -0700)
(1) Handle data pipe errors: When the data urb failed we
    didn't transfer anything, update scsi_cmnd accordingly.
(2) Cancel data transfers when we got back an error on the
    status pipe.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/storage/uas.c

index b589b2e0e928984cedc451b9718fd36bb7e61730..d8b7bc6ea141525b6ad76872c383f2de957d4ea6 100644 (file)
@@ -242,6 +242,13 @@ static void uas_stat_cmplt(struct urb *urb)
                        uas_sense_old(urb, cmnd);
                else
                        uas_sense(urb, cmnd);
+               if (cmnd->result != 0) {
+                       /* cancel data transfers on error */
+                       if (cmdinfo->state & DATA_IN_URB_INFLIGHT)
+                               usb_unlink_urb(cmdinfo->data_in_urb);
+                       if (cmdinfo->state & DATA_OUT_URB_INFLIGHT)
+                               usb_unlink_urb(cmdinfo->data_out_urb);
+               }
                cmdinfo->state &= ~COMMAND_INFLIGHT;
                uas_try_complete(cmnd, __func__);
                break;
@@ -272,7 +279,12 @@ static void uas_data_cmplt(struct urb *urb)
                cmdinfo->state &= ~DATA_OUT_URB_INFLIGHT;
        }
        BUG_ON(sdb == NULL);
-       sdb->resid = sdb->length - urb->actual_length;
+       if (urb->status) {
+               /* error: no data transfered */
+               sdb->resid = sdb->length;
+       } else {
+               sdb->resid = sdb->length - urb->actual_length;
+       }
        uas_try_complete(cmnd, __func__);
 }