diff options
author | Hans de Goede <hdegoede@redhat.com> | 2013-11-14 08:27:27 -0500 |
---|---|---|
committer | Sarah Sharp <sarah.a.sharp@linux.intel.com> | 2014-03-04 18:38:25 -0500 |
commit | 673331c87c492898a9152f3754f3174128e1514a (patch) | |
tree | 69166878d07aae21555e6f5188e82780d4ffb8f1 | |
parent | 3a4462e0e2fe8f715f54147d36b5433a7ff5a85a (diff) |
uas: Use the right error codes for different kinds of errors
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 | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c index fceffccc1be1..6ec48c2daf45 100644 --- a/drivers/usb/storage/uas.c +++ b/drivers/usb/storage/uas.c | |||
@@ -146,7 +146,8 @@ static void uas_do_work(struct work_struct *work) | |||
146 | } | 146 | } |
147 | 147 | ||
148 | static void uas_mark_cmd_dead(struct uas_dev_info *devinfo, | 148 | static void uas_mark_cmd_dead(struct uas_dev_info *devinfo, |
149 | struct uas_cmd_info *cmdinfo, const char *caller) | 149 | struct uas_cmd_info *cmdinfo, |
150 | int result, const char *caller) | ||
150 | { | 151 | { |
151 | struct scsi_pointer *scp = (void *)cmdinfo; | 152 | struct scsi_pointer *scp = (void *)cmdinfo; |
152 | struct scsi_cmnd *cmnd = container_of(scp, struct scsi_cmnd, SCp); | 153 | struct scsi_cmnd *cmnd = container_of(scp, struct scsi_cmnd, SCp); |
@@ -156,10 +157,12 @@ static void uas_mark_cmd_dead(struct uas_dev_info *devinfo, | |||
156 | WARN_ON_ONCE(cmdinfo->state & COMMAND_ABORTED); | 157 | WARN_ON_ONCE(cmdinfo->state & COMMAND_ABORTED); |
157 | cmdinfo->state |= COMMAND_ABORTED; | 158 | cmdinfo->state |= COMMAND_ABORTED; |
158 | cmdinfo->state &= ~IS_IN_WORK_LIST; | 159 | cmdinfo->state &= ~IS_IN_WORK_LIST; |
160 | cmnd->result = result << 16; | ||
159 | list_move_tail(&cmdinfo->list, &devinfo->dead_list); | 161 | list_move_tail(&cmdinfo->list, &devinfo->dead_list); |
160 | } | 162 | } |
161 | 163 | ||
162 | static void uas_abort_inflight(struct uas_dev_info *devinfo) | 164 | static void uas_abort_inflight(struct uas_dev_info *devinfo, int result, |
165 | const char *caller) | ||
163 | { | 166 | { |
164 | struct uas_cmd_info *cmdinfo; | 167 | struct uas_cmd_info *cmdinfo; |
165 | struct uas_cmd_info *temp; | 168 | struct uas_cmd_info *temp; |
@@ -167,7 +170,7 @@ static void uas_abort_inflight(struct uas_dev_info *devinfo) | |||
167 | 170 | ||
168 | spin_lock_irqsave(&devinfo->lock, flags); | 171 | spin_lock_irqsave(&devinfo->lock, flags); |
169 | list_for_each_entry_safe(cmdinfo, temp, &devinfo->inflight_list, list) | 172 | list_for_each_entry_safe(cmdinfo, temp, &devinfo->inflight_list, list) |
170 | uas_mark_cmd_dead(devinfo, cmdinfo, __func__); | 173 | uas_mark_cmd_dead(devinfo, cmdinfo, result, caller); |
171 | spin_unlock_irqrestore(&devinfo->lock, flags); | 174 | spin_unlock_irqrestore(&devinfo->lock, flags); |
172 | } | 175 | } |
173 | 176 | ||
@@ -289,10 +292,8 @@ static int uas_try_complete(struct scsi_cmnd *cmnd, const char *caller) | |||
289 | cmdinfo->state |= COMMAND_COMPLETED; | 292 | cmdinfo->state |= COMMAND_COMPLETED; |
290 | usb_free_urb(cmdinfo->data_in_urb); | 293 | usb_free_urb(cmdinfo->data_in_urb); |
291 | usb_free_urb(cmdinfo->data_out_urb); | 294 | usb_free_urb(cmdinfo->data_out_urb); |
292 | if (cmdinfo->state & COMMAND_ABORTED) { | 295 | if (cmdinfo->state & COMMAND_ABORTED) |
293 | scmd_printk(KERN_INFO, cmnd, "abort completed\n"); | 296 | scmd_printk(KERN_INFO, cmnd, "abort completed\n"); |
294 | cmnd->result = DID_ABORT << 16; | ||
295 | } | ||
296 | list_del(&cmdinfo->list); | 297 | list_del(&cmdinfo->list); |
297 | cmnd->scsi_done(cmnd); | 298 | cmnd->scsi_done(cmnd); |
298 | return 0; | 299 | return 0; |
@@ -824,7 +825,7 @@ static int uas_eh_abort_handler(struct scsi_cmnd *cmnd) | |||
824 | return FAILED; | 825 | return FAILED; |
825 | } | 826 | } |
826 | 827 | ||
827 | uas_mark_cmd_dead(devinfo, cmdinfo, __func__); | 828 | uas_mark_cmd_dead(devinfo, cmdinfo, DID_ABORT, __func__); |
828 | if (cmdinfo->state & COMMAND_INFLIGHT) { | 829 | if (cmdinfo->state & COMMAND_INFLIGHT) { |
829 | spin_unlock_irqrestore(&devinfo->lock, flags); | 830 | spin_unlock_irqrestore(&devinfo->lock, flags); |
830 | ret = uas_eh_task_mgmt(cmnd, "ABORT TASK", TMF_ABORT_TASK); | 831 | ret = uas_eh_task_mgmt(cmnd, "ABORT TASK", TMF_ABORT_TASK); |
@@ -860,7 +861,7 @@ static int uas_eh_bus_reset_handler(struct scsi_cmnd *cmnd) | |||
860 | 861 | ||
861 | shost_printk(KERN_INFO, sdev->host, "%s start\n", __func__); | 862 | shost_printk(KERN_INFO, sdev->host, "%s start\n", __func__); |
862 | devinfo->resetting = 1; | 863 | devinfo->resetting = 1; |
863 | uas_abort_inflight(devinfo); | 864 | uas_abort_inflight(devinfo, DID_RESET, __func__); |
864 | usb_kill_anchored_urbs(&devinfo->cmd_urbs); | 865 | usb_kill_anchored_urbs(&devinfo->cmd_urbs); |
865 | usb_kill_anchored_urbs(&devinfo->sense_urbs); | 866 | usb_kill_anchored_urbs(&devinfo->sense_urbs); |
866 | usb_kill_anchored_urbs(&devinfo->data_urbs); | 867 | usb_kill_anchored_urbs(&devinfo->data_urbs); |
@@ -1153,7 +1154,7 @@ static void uas_disconnect(struct usb_interface *intf) | |||
1153 | 1154 | ||
1154 | devinfo->resetting = 1; | 1155 | devinfo->resetting = 1; |
1155 | cancel_work_sync(&devinfo->work); | 1156 | cancel_work_sync(&devinfo->work); |
1156 | uas_abort_inflight(devinfo); | 1157 | uas_abort_inflight(devinfo, DID_NO_CONNECT, __func__); |
1157 | usb_kill_anchored_urbs(&devinfo->cmd_urbs); | 1158 | usb_kill_anchored_urbs(&devinfo->cmd_urbs); |
1158 | usb_kill_anchored_urbs(&devinfo->sense_urbs); | 1159 | usb_kill_anchored_urbs(&devinfo->sense_urbs); |
1159 | usb_kill_anchored_urbs(&devinfo->data_urbs); | 1160 | usb_kill_anchored_urbs(&devinfo->data_urbs); |