diff options
Diffstat (limited to 'drivers/usb/storage')
-rw-r--r-- | drivers/usb/storage/uas.c | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c index d758faef8664..9c6f9f9804fd 100644 --- a/drivers/usb/storage/uas.c +++ b/drivers/usb/storage/uas.c | |||
@@ -550,39 +550,38 @@ err: | |||
550 | * daft to me. | 550 | * daft to me. |
551 | */ | 551 | */ |
552 | 552 | ||
553 | static int uas_submit_sense_urb(struct Scsi_Host *shost, | 553 | static struct urb *uas_submit_sense_urb(struct Scsi_Host *shost, |
554 | gfp_t gfp, unsigned int stream) | 554 | gfp_t gfp, unsigned int stream) |
555 | { | 555 | { |
556 | struct uas_dev_info *devinfo = (void *)shost->hostdata[0]; | 556 | struct uas_dev_info *devinfo = (void *)shost->hostdata[0]; |
557 | struct urb *urb; | 557 | struct urb *urb; |
558 | 558 | ||
559 | urb = uas_alloc_sense_urb(devinfo, gfp, shost, stream); | 559 | urb = uas_alloc_sense_urb(devinfo, gfp, shost, stream); |
560 | if (!urb) | 560 | if (!urb) |
561 | return SCSI_MLQUEUE_DEVICE_BUSY; | 561 | return NULL; |
562 | usb_anchor_urb(urb, &devinfo->sense_urbs); | 562 | usb_anchor_urb(urb, &devinfo->sense_urbs); |
563 | if (usb_submit_urb(urb, gfp)) { | 563 | if (usb_submit_urb(urb, gfp)) { |
564 | usb_unanchor_urb(urb); | 564 | usb_unanchor_urb(urb); |
565 | shost_printk(KERN_INFO, shost, | 565 | shost_printk(KERN_INFO, shost, |
566 | "sense urb submission failure\n"); | 566 | "sense urb submission failure\n"); |
567 | usb_free_urb(urb); | 567 | usb_free_urb(urb); |
568 | return SCSI_MLQUEUE_DEVICE_BUSY; | 568 | return NULL; |
569 | } | 569 | } |
570 | return 0; | 570 | return urb; |
571 | } | 571 | } |
572 | 572 | ||
573 | static int uas_submit_urbs(struct scsi_cmnd *cmnd, | 573 | static int uas_submit_urbs(struct scsi_cmnd *cmnd, |
574 | struct uas_dev_info *devinfo, gfp_t gfp) | 574 | struct uas_dev_info *devinfo, gfp_t gfp) |
575 | { | 575 | { |
576 | struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp; | 576 | struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp; |
577 | int err; | 577 | struct urb *urb; |
578 | 578 | ||
579 | WARN_ON_ONCE(!spin_is_locked(&devinfo->lock)); | 579 | WARN_ON_ONCE(!spin_is_locked(&devinfo->lock)); |
580 | if (cmdinfo->state & SUBMIT_STATUS_URB) { | 580 | if (cmdinfo->state & SUBMIT_STATUS_URB) { |
581 | err = uas_submit_sense_urb(cmnd->device->host, gfp, | 581 | urb = uas_submit_sense_urb(cmnd->device->host, gfp, |
582 | cmdinfo->stream); | 582 | cmdinfo->stream); |
583 | if (err) { | 583 | if (!urb) |
584 | return err; | 584 | return SCSI_MLQUEUE_DEVICE_BUSY; |
585 | } | ||
586 | cmdinfo->state &= ~SUBMIT_STATUS_URB; | 585 | cmdinfo->state &= ~SUBMIT_STATUS_URB; |
587 | } | 586 | } |
588 | 587 | ||
@@ -726,10 +725,12 @@ static int uas_eh_task_mgmt(struct scsi_cmnd *cmnd, | |||
726 | struct uas_dev_info *devinfo = (void *)shost->hostdata[0]; | 725 | struct uas_dev_info *devinfo = (void *)shost->hostdata[0]; |
727 | u16 tag = devinfo->qdepth; | 726 | u16 tag = devinfo->qdepth; |
728 | unsigned long flags; | 727 | unsigned long flags; |
728 | struct urb *sense_urb; | ||
729 | 729 | ||
730 | spin_lock_irqsave(&devinfo->lock, flags); | 730 | spin_lock_irqsave(&devinfo->lock, flags); |
731 | memset(&devinfo->response, 0, sizeof(devinfo->response)); | 731 | memset(&devinfo->response, 0, sizeof(devinfo->response)); |
732 | if (uas_submit_sense_urb(shost, GFP_ATOMIC, tag)) { | 732 | sense_urb = uas_submit_sense_urb(shost, GFP_ATOMIC, tag); |
733 | if (!sense_urb) { | ||
733 | shost_printk(KERN_INFO, shost, | 734 | shost_printk(KERN_INFO, shost, |
734 | "%s: %s: submit sense urb failed\n", | 735 | "%s: %s: submit sense urb failed\n", |
735 | __func__, fname); | 736 | __func__, fname); |
@@ -741,6 +742,7 @@ static int uas_eh_task_mgmt(struct scsi_cmnd *cmnd, | |||
741 | "%s: %s: submit task mgmt urb failed\n", | 742 | "%s: %s: submit task mgmt urb failed\n", |
742 | __func__, fname); | 743 | __func__, fname); |
743 | spin_unlock_irqrestore(&devinfo->lock, flags); | 744 | spin_unlock_irqrestore(&devinfo->lock, flags); |
745 | usb_kill_urb(sense_urb); | ||
744 | return FAILED; | 746 | return FAILED; |
745 | } | 747 | } |
746 | spin_unlock_irqrestore(&devinfo->lock, flags); | 748 | spin_unlock_irqrestore(&devinfo->lock, flags); |