aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2013-11-12 07:57:24 -0500
committerSarah Sharp <sarah.a.sharp@linux.intel.com>2014-03-04 18:38:22 -0500
commitda3033ea08397fb70279f22789002e6001432f3d (patch)
tree4eab2a463fcac67d9197738d1c175729964e71c4
parent61c09ce510a1eba8595beda6aac194f42571d768 (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.c35
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
149static 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
149static void uas_abort_inflight(struct uas_dev_info *devinfo) 164static 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);