diff options
author | Hans de Goede <hdegoede@redhat.com> | 2013-11-12 07:57:24 -0500 |
---|---|---|
committer | Sarah Sharp <sarah.a.sharp@linux.intel.com> | 2014-03-04 18:38:22 -0500 |
commit | da3033ea08397fb70279f22789002e6001432f3d (patch) | |
tree | 4eab2a463fcac67d9197738d1c175729964e71c4 | |
parent | 61c09ce510a1eba8595beda6aac194f42571d768 (diff) |
uas: add uas_mark_cmd_dead helper function
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 | 35 |
1 files changed, 18 insertions, 17 deletions
diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c index 1a188399e090..7810c135a69e 100644 --- a/drivers/usb/storage/uas.c +++ b/drivers/usb/storage/uas.c | |||
@@ -146,6 +146,21 @@ static void uas_do_work(struct work_struct *work) | |||
146 | spin_unlock_irqrestore(&devinfo->lock, flags); | 146 | spin_unlock_irqrestore(&devinfo->lock, flags); |
147 | } | 147 | } |
148 | 148 | ||
149 | static void uas_mark_cmd_dead(struct uas_dev_info *devinfo, | ||
150 | struct uas_cmd_info *cmdinfo, const char *caller) | ||
151 | { | ||
152 | struct scsi_pointer *scp = (void *)cmdinfo; | ||
153 | struct scsi_cmnd *cmnd = container_of(scp, struct scsi_cmnd, SCp); | ||
154 | |||
155 | uas_log_cmd_state(cmnd, caller); | ||
156 | WARN_ON_ONCE(!spin_is_locked(&devinfo->lock)); | ||
157 | WARN_ON_ONCE(cmdinfo->state & COMMAND_ABORTED); | ||
158 | cmdinfo->state |= COMMAND_ABORTED; | ||
159 | cmdinfo->state &= ~IS_IN_WORK_LIST; | ||
160 | list_del(&cmdinfo->inflight); | ||
161 | list_add_tail(&cmdinfo->dead, &devinfo->dead_list); | ||
162 | } | ||
163 | |||
149 | static void uas_abort_inflight(struct uas_dev_info *devinfo) | 164 | static void uas_abort_inflight(struct uas_dev_info *devinfo) |
150 | { | 165 | { |
151 | struct uas_cmd_info *cmdinfo; | 166 | struct uas_cmd_info *cmdinfo; |
@@ -154,17 +169,8 @@ static void uas_abort_inflight(struct uas_dev_info *devinfo) | |||
154 | 169 | ||
155 | spin_lock_irqsave(&devinfo->lock, flags); | 170 | spin_lock_irqsave(&devinfo->lock, flags); |
156 | list_for_each_entry_safe(cmdinfo, temp, &devinfo->inflight_list, | 171 | list_for_each_entry_safe(cmdinfo, temp, &devinfo->inflight_list, |
157 | inflight) { | 172 | inflight) |
158 | struct scsi_pointer *scp = (void *)cmdinfo; | 173 | uas_mark_cmd_dead(devinfo, cmdinfo, __func__); |
159 | struct scsi_cmnd *cmnd = container_of(scp, struct scsi_cmnd, | ||
160 | SCp); | ||
161 | uas_log_cmd_state(cmnd, __func__); | ||
162 | WARN_ON_ONCE(cmdinfo->state & COMMAND_ABORTED); | ||
163 | cmdinfo->state |= COMMAND_ABORTED; | ||
164 | cmdinfo->state &= ~IS_IN_WORK_LIST; | ||
165 | list_del(&cmdinfo->inflight); | ||
166 | list_add_tail(&cmdinfo->dead, &devinfo->dead_list); | ||
167 | } | ||
168 | spin_unlock_irqrestore(&devinfo->lock, flags); | 174 | spin_unlock_irqrestore(&devinfo->lock, flags); |
169 | } | 175 | } |
170 | 176 | ||
@@ -806,13 +812,8 @@ static int uas_eh_abort_handler(struct scsi_cmnd *cmnd) | |||
806 | unsigned long flags; | 812 | unsigned long flags; |
807 | int ret; | 813 | int ret; |
808 | 814 | ||
809 | uas_log_cmd_state(cmnd, __func__); | ||
810 | spin_lock_irqsave(&devinfo->lock, flags); | 815 | spin_lock_irqsave(&devinfo->lock, flags); |
811 | WARN_ON_ONCE(cmdinfo->state & COMMAND_ABORTED); | 816 | uas_mark_cmd_dead(devinfo, cmdinfo, __func__); |
812 | cmdinfo->state |= COMMAND_ABORTED; | ||
813 | cmdinfo->state &= ~IS_IN_WORK_LIST; | ||
814 | list_del(&cmdinfo->inflight); | ||
815 | list_add_tail(&cmdinfo->dead, &devinfo->dead_list); | ||
816 | if (cmdinfo->state & COMMAND_INFLIGHT) { | 817 | if (cmdinfo->state & COMMAND_INFLIGHT) { |
817 | spin_unlock_irqrestore(&devinfo->lock, flags); | 818 | spin_unlock_irqrestore(&devinfo->lock, flags); |
818 | ret = uas_eh_task_mgmt(cmnd, "ABORT TASK", TMF_ABORT_TASK); | 819 | ret = uas_eh_task_mgmt(cmnd, "ABORT TASK", TMF_ABORT_TASK); |