task management commands expect a response_iu rather then a sense_iu, and these have different sizes. Make the urb we submit to get the reply the right size. Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx> --- drivers/usb/storage/uas.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c index 33f9dcd..83c2ef8 100644 --- a/drivers/usb/storage/uas.c +++ b/drivers/usb/storage/uas.c @@ -429,7 +429,8 @@ static struct urb *uas_alloc_data_urb(struct uas_dev_info *devinfo, gfp_t gfp, return urb; } -static struct urb *uas_alloc_sense_urb(struct uas_dev_info *devinfo, gfp_t gfp, +static struct urb *uas_alloc_sense_urb(struct uas_dev_info *devinfo, + int size, gfp_t gfp, struct Scsi_Host *shost, u16 stream_id) { struct usb_device *udev = devinfo->udev; @@ -439,11 +440,11 @@ static struct urb *uas_alloc_sense_urb(struct uas_dev_info *devinfo, gfp_t gfp, if (!urb) goto out; - iu = kzalloc(sizeof(*iu), gfp); + iu = kzalloc(size, gfp); if (!iu) goto free; - usb_fill_bulk_urb(urb, udev, devinfo->status_pipe, iu, sizeof(*iu), + usb_fill_bulk_urb(urb, udev, devinfo->status_pipe, iu, size, uas_stat_cmplt, shost); urb->stream_id = stream_id; urb->transfer_flags |= URB_FREE_BUFFER; @@ -548,13 +549,13 @@ err: * daft to me. */ -static int uas_submit_sense_urb(struct Scsi_Host *shost, +static int uas_submit_sense_urb(struct Scsi_Host *shost, int size, gfp_t gfp, unsigned int stream) { struct uas_dev_info *devinfo = (void *)shost->hostdata[0]; struct urb *urb; - urb = uas_alloc_sense_urb(devinfo, gfp, shost, stream); + urb = uas_alloc_sense_urb(devinfo, size, gfp, shost, stream); if (!urb) return SCSI_MLQUEUE_DEVICE_BUSY; usb_anchor_urb(urb, &devinfo->sense_urbs); @@ -576,7 +577,8 @@ static int uas_submit_urbs(struct scsi_cmnd *cmnd, WARN_ON_ONCE(!spin_is_locked(&devinfo->lock)); if (cmdinfo->state & SUBMIT_STATUS_URB) { - err = uas_submit_sense_urb(cmnd->device->host, gfp, + err = uas_submit_sense_urb(cmnd->device->host, + sizeof(struct sense_iu), gfp, cmdinfo->stream); if (err) { return err; @@ -724,10 +726,13 @@ static int uas_eh_task_mgmt(struct scsi_cmnd *cmnd, struct uas_dev_info *devinfo = (void *)shost->hostdata[0]; u16 tag = devinfo->qdepth - 1; unsigned long flags; + int r; spin_lock_irqsave(&devinfo->lock, flags); memset(&devinfo->response, 0, sizeof(devinfo->response)); - if (uas_submit_sense_urb(shost, GFP_ATOMIC, tag)) { + r = uas_submit_sense_urb(shost, sizeof(struct response_iu), + GFP_ATOMIC, tag); + if (r != 0) { shost_printk(KERN_INFO, shost, "%s: %s: submit sense urb failed\n", __func__, fname); -- 1.8.4.2 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html