diff options
author | Hans de Goede <hdegoede@redhat.com> | 2013-11-12 08:02:12 -0500 |
---|---|---|
committer | Sarah Sharp <sarah.a.sharp@linux.intel.com> | 2014-03-04 18:38:23 -0500 |
commit | 040d1a8f11f390f36a8cd7fc04c0c836639b0b6a (patch) | |
tree | 1457f1b4ace1507527d6f99a45bc205788e0b4e7 /drivers/usb | |
parent | da3033ea08397fb70279f22789002e6001432f3d (diff) |
uas: cmdinfo: use only one list head
cmds are either on the inflight list or on the dead list, never both, so
we only need one list head.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/storage/uas.c | 20 |
1 files changed, 8 insertions, 12 deletions
diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c index 7810c135a69e..cfe0102fcbae 100644 --- a/drivers/usb/storage/uas.c +++ b/drivers/usb/storage/uas.c | |||
@@ -86,8 +86,7 @@ struct uas_cmd_info { | |||
86 | struct urb *cmd_urb; | 86 | struct urb *cmd_urb; |
87 | struct urb *data_in_urb; | 87 | struct urb *data_in_urb; |
88 | struct urb *data_out_urb; | 88 | struct urb *data_out_urb; |
89 | struct list_head inflight; | 89 | struct list_head list; |
90 | struct list_head dead; | ||
91 | }; | 90 | }; |
92 | 91 | ||
93 | /* I hate forward declarations, but I actually have a loop */ | 92 | /* I hate forward declarations, but I actually have a loop */ |
@@ -129,7 +128,7 @@ static void uas_do_work(struct work_struct *work) | |||
129 | int err; | 128 | int err; |
130 | 129 | ||
131 | spin_lock_irqsave(&devinfo->lock, flags); | 130 | spin_lock_irqsave(&devinfo->lock, flags); |
132 | list_for_each_entry(cmdinfo, &devinfo->inflight_list, inflight) { | 131 | list_for_each_entry(cmdinfo, &devinfo->inflight_list, list) { |
133 | struct scsi_pointer *scp = (void *)cmdinfo; | 132 | struct scsi_pointer *scp = (void *)cmdinfo; |
134 | struct scsi_cmnd *cmnd = container_of(scp, struct scsi_cmnd, | 133 | struct scsi_cmnd *cmnd = container_of(scp, struct scsi_cmnd, |
135 | SCp); | 134 | SCp); |
@@ -157,8 +156,7 @@ static void uas_mark_cmd_dead(struct uas_dev_info *devinfo, | |||
157 | WARN_ON_ONCE(cmdinfo->state & COMMAND_ABORTED); | 156 | WARN_ON_ONCE(cmdinfo->state & COMMAND_ABORTED); |
158 | cmdinfo->state |= COMMAND_ABORTED; | 157 | cmdinfo->state |= COMMAND_ABORTED; |
159 | cmdinfo->state &= ~IS_IN_WORK_LIST; | 158 | cmdinfo->state &= ~IS_IN_WORK_LIST; |
160 | list_del(&cmdinfo->inflight); | 159 | list_move_tail(&cmdinfo->list, &devinfo->dead_list); |
161 | list_add_tail(&cmdinfo->dead, &devinfo->dead_list); | ||
162 | } | 160 | } |
163 | 161 | ||
164 | static void uas_abort_inflight(struct uas_dev_info *devinfo) | 162 | static void uas_abort_inflight(struct uas_dev_info *devinfo) |
@@ -168,8 +166,7 @@ static void uas_abort_inflight(struct uas_dev_info *devinfo) | |||
168 | unsigned long flags; | 166 | unsigned long flags; |
169 | 167 | ||
170 | spin_lock_irqsave(&devinfo->lock, flags); | 168 | spin_lock_irqsave(&devinfo->lock, flags); |
171 | list_for_each_entry_safe(cmdinfo, temp, &devinfo->inflight_list, | 169 | list_for_each_entry_safe(cmdinfo, temp, &devinfo->inflight_list, list) |
172 | inflight) | ||
173 | uas_mark_cmd_dead(devinfo, cmdinfo, __func__); | 170 | uas_mark_cmd_dead(devinfo, cmdinfo, __func__); |
174 | spin_unlock_irqrestore(&devinfo->lock, flags); | 171 | spin_unlock_irqrestore(&devinfo->lock, flags); |
175 | } | 172 | } |
@@ -192,7 +189,7 @@ static void uas_zap_dead(struct uas_dev_info *devinfo) | |||
192 | unsigned long flags; | 189 | unsigned long flags; |
193 | 190 | ||
194 | spin_lock_irqsave(&devinfo->lock, flags); | 191 | spin_lock_irqsave(&devinfo->lock, flags); |
195 | list_for_each_entry_safe(cmdinfo, temp, &devinfo->dead_list, dead) { | 192 | list_for_each_entry_safe(cmdinfo, temp, &devinfo->dead_list, list) { |
196 | struct scsi_pointer *scp = (void *)cmdinfo; | 193 | struct scsi_pointer *scp = (void *)cmdinfo; |
197 | struct scsi_cmnd *cmnd = container_of(scp, struct scsi_cmnd, | 194 | struct scsi_cmnd *cmnd = container_of(scp, struct scsi_cmnd, |
198 | SCp); | 195 | SCp); |
@@ -295,9 +292,8 @@ static int uas_try_complete(struct scsi_cmnd *cmnd, const char *caller) | |||
295 | if (cmdinfo->state & COMMAND_ABORTED) { | 292 | if (cmdinfo->state & COMMAND_ABORTED) { |
296 | scmd_printk(KERN_INFO, cmnd, "abort completed\n"); | 293 | scmd_printk(KERN_INFO, cmnd, "abort completed\n"); |
297 | cmnd->result = DID_ABORT << 16; | 294 | cmnd->result = DID_ABORT << 16; |
298 | list_del(&cmdinfo->dead); | 295 | } |
299 | } else | 296 | list_del(&cmdinfo->list); |
300 | list_del(&cmdinfo->inflight); | ||
301 | cmnd->scsi_done(cmnd); | 297 | cmnd->scsi_done(cmnd); |
302 | return 0; | 298 | return 0; |
303 | } | 299 | } |
@@ -725,7 +721,7 @@ static int uas_queuecommand_lck(struct scsi_cmnd *cmnd, | |||
725 | uas_add_work(cmdinfo); | 721 | uas_add_work(cmdinfo); |
726 | } | 722 | } |
727 | 723 | ||
728 | list_add_tail(&cmdinfo->inflight, &devinfo->inflight_list); | 724 | list_add_tail(&cmdinfo->list, &devinfo->inflight_list); |
729 | spin_unlock_irqrestore(&devinfo->lock, flags); | 725 | spin_unlock_irqrestore(&devinfo->lock, flags); |
730 | return 0; | 726 | return 0; |
731 | } | 727 | } |