Commit 43cd99cb authored by Hans de Goede's avatar Hans de Goede Committed by Greg Kroah-Hartman

uas: Drop inflight list

We've the same info doubled in both the inflight list and the cmnd array,
drop the list.
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 9c15c573
...@@ -61,7 +61,6 @@ struct uas_dev_info { ...@@ -61,7 +61,6 @@ struct uas_dev_info {
struct scsi_cmnd *cmnd[MAX_CMNDS]; struct scsi_cmnd *cmnd[MAX_CMNDS];
spinlock_t lock; spinlock_t lock;
struct work_struct work; struct work_struct work;
struct list_head inflight_list;
}; };
enum { enum {
...@@ -87,7 +86,6 @@ struct uas_cmd_info { ...@@ -87,7 +86,6 @@ struct uas_cmd_info {
struct urb *cmd_urb; struct urb *cmd_urb;
struct urb *data_in_urb; struct urb *data_in_urb;
struct urb *data_out_urb; struct urb *data_out_urb;
struct list_head list;
}; };
/* I hate forward declarations, but I actually have a loop */ /* I hate forward declarations, but I actually have a loop */
...@@ -103,18 +101,21 @@ static void uas_do_work(struct work_struct *work) ...@@ -103,18 +101,21 @@ static void uas_do_work(struct work_struct *work)
struct uas_dev_info *devinfo = struct uas_dev_info *devinfo =
container_of(work, struct uas_dev_info, work); container_of(work, struct uas_dev_info, work);
struct uas_cmd_info *cmdinfo; struct uas_cmd_info *cmdinfo;
struct scsi_cmnd *cmnd;
unsigned long flags; unsigned long flags;
int err; int i, err;
spin_lock_irqsave(&devinfo->lock, flags); spin_lock_irqsave(&devinfo->lock, flags);
if (devinfo->resetting) if (devinfo->resetting)
goto out; goto out;
list_for_each_entry(cmdinfo, &devinfo->inflight_list, list) { for (i = 0; i < devinfo->qdepth; i++) {
struct scsi_pointer *scp = (void *)cmdinfo; if (!devinfo->cmnd[i])
struct scsi_cmnd *cmnd = container_of(scp, struct scsi_cmnd, continue;
SCp);
cmnd = devinfo->cmnd[i];
cmdinfo = (void *)&cmnd->SCp;
if (!(cmdinfo->state & IS_IN_WORK_LIST)) if (!(cmdinfo->state & IS_IN_WORK_LIST))
continue; continue;
...@@ -143,15 +144,17 @@ static void uas_add_work(struct uas_cmd_info *cmdinfo) ...@@ -143,15 +144,17 @@ static void uas_add_work(struct uas_cmd_info *cmdinfo)
static void uas_zap_pending(struct uas_dev_info *devinfo, int result) static void uas_zap_pending(struct uas_dev_info *devinfo, int result)
{ {
struct uas_cmd_info *cmdinfo; struct uas_cmd_info *cmdinfo;
struct uas_cmd_info *temp; struct scsi_cmnd *cmnd;
unsigned long flags; unsigned long flags;
int err; int i, err;
spin_lock_irqsave(&devinfo->lock, flags); spin_lock_irqsave(&devinfo->lock, flags);
list_for_each_entry_safe(cmdinfo, temp, &devinfo->dead_list, list) { for (i = 0; i < devinfo->qdepth; i++) {
struct scsi_pointer *scp = (void *)cmdinfo; if (!devinfo->cmnd[i])
struct scsi_cmnd *cmnd = container_of(scp, struct scsi_cmnd, continue;
SCp);
cmnd = devinfo->cmnd[i];
cmdinfo = (void *)&cmnd->SCp;
uas_log_cmd_state(cmnd, __func__); uas_log_cmd_state(cmnd, __func__);
/* Sense urbs were killed, clear COMMAND_INFLIGHT manually */ /* Sense urbs were killed, clear COMMAND_INFLIGHT manually */
cmdinfo->state &= ~COMMAND_INFLIGHT; cmdinfo->state &= ~COMMAND_INFLIGHT;
...@@ -260,7 +263,6 @@ static int uas_try_complete(struct scsi_cmnd *cmnd, const char *caller) ...@@ -260,7 +263,6 @@ static int uas_try_complete(struct scsi_cmnd *cmnd, const char *caller)
cmdinfo->state |= COMMAND_COMPLETED; cmdinfo->state |= COMMAND_COMPLETED;
if (cmdinfo->state & COMMAND_ABORTED) if (cmdinfo->state & COMMAND_ABORTED)
scmd_printk(KERN_INFO, cmnd, "abort completed\n"); scmd_printk(KERN_INFO, cmnd, "abort completed\n");
list_del(&cmdinfo->list);
devinfo->cmnd[uas_get_tag(cmnd) - 1] = NULL; devinfo->cmnd[uas_get_tag(cmnd) - 1] = NULL;
cmnd->scsi_done(cmnd); cmnd->scsi_done(cmnd);
return 0; return 0;
...@@ -707,7 +709,6 @@ static int uas_queuecommand_lck(struct scsi_cmnd *cmnd, ...@@ -707,7 +709,6 @@ static int uas_queuecommand_lck(struct scsi_cmnd *cmnd,
} }
devinfo->cmnd[stream - 1] = cmnd; devinfo->cmnd[stream - 1] = cmnd;
list_add_tail(&cmdinfo->list, &devinfo->inflight_list);
spin_unlock_irqrestore(&devinfo->lock, flags); spin_unlock_irqrestore(&devinfo->lock, flags);
return 0; return 0;
} }
...@@ -921,7 +922,6 @@ static int uas_probe(struct usb_interface *intf, const struct usb_device_id *id) ...@@ -921,7 +922,6 @@ static int uas_probe(struct usb_interface *intf, const struct usb_device_id *id)
init_usb_anchor(&devinfo->data_urbs); init_usb_anchor(&devinfo->data_urbs);
spin_lock_init(&devinfo->lock); spin_lock_init(&devinfo->lock);
INIT_WORK(&devinfo->work, uas_do_work); INIT_WORK(&devinfo->work, uas_do_work);
INIT_LIST_HEAD(&devinfo->inflight_list);
result = uas_configure_endpoints(devinfo); result = uas_configure_endpoints(devinfo);
if (result) if (result)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment