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;
                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__);
 }