diff options
| author | Hans de Goede <hdegoede@redhat.com> | 2013-09-22 10:27:02 -0400 |
|---|---|---|
| committer | Sarah Sharp <sarah.a.sharp@linux.intel.com> | 2014-03-04 18:38:10 -0500 |
| commit | be326f4c9bdfdff8a85145fb89b0a44c4d20ebc6 (patch) | |
| tree | 69026af05608449162f9eb2920953486392c18e2 | |
| parent | 6c2334e9019039d7952190e239e6a8f0d10101fe (diff) | |
uas: Fix reset locking
Fix the uas_eh_bus_reset_handler not properly taking the usbdev lock
before calling usb_device_reset, the usb-core expects this lock to be
taken when usb_device_reset is called.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
| -rw-r--r-- | drivers/usb/storage/uas.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c index 6ad5de9639d5..36ef82a34131 100644 --- a/drivers/usb/storage/uas.c +++ b/drivers/usb/storage/uas.c | |||
| @@ -804,6 +804,13 @@ static int uas_eh_bus_reset_handler(struct scsi_cmnd *cmnd) | |||
| 804 | struct usb_device *udev = devinfo->udev; | 804 | struct usb_device *udev = devinfo->udev; |
| 805 | int err; | 805 | int err; |
| 806 | 806 | ||
| 807 | err = usb_lock_device_for_reset(udev, devinfo->intf); | ||
| 808 | if (err) { | ||
| 809 | shost_printk(KERN_ERR, sdev->host, | ||
| 810 | "%s FAILED to get lock err %d\n", __func__, err); | ||
| 811 | return FAILED; | ||
| 812 | } | ||
| 813 | |||
| 807 | shost_printk(KERN_INFO, sdev->host, "%s start\n", __func__); | 814 | shost_printk(KERN_INFO, sdev->host, "%s start\n", __func__); |
| 808 | devinfo->resetting = 1; | 815 | devinfo->resetting = 1; |
| 809 | uas_abort_work(devinfo); | 816 | uas_abort_work(devinfo); |
| @@ -817,6 +824,8 @@ static int uas_eh_bus_reset_handler(struct scsi_cmnd *cmnd) | |||
| 817 | uas_configure_endpoints(devinfo); | 824 | uas_configure_endpoints(devinfo); |
| 818 | devinfo->resetting = 0; | 825 | devinfo->resetting = 0; |
| 819 | 826 | ||
| 827 | usb_unlock_device(udev); | ||
| 828 | |||
| 820 | if (err) { | 829 | if (err) { |
| 821 | shost_printk(KERN_INFO, sdev->host, "%s FAILED\n", __func__); | 830 | shost_printk(KERN_INFO, sdev->host, "%s FAILED\n", __func__); |
| 822 | return FAILED; | 831 | return FAILED; |
