uas: add IS_IN_WORK_LIST flag
authorGerd Hoffmann <kraxel@redhat.com>
Fri, 30 Nov 2012 10:54:42 +0000 (11:54 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 11 Jan 2013 20:14:17 +0000 (12:14 -0800)
Keep track whenever the request is linked into the work list or not.
Needed for request abort.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/storage/uas.c

index a972e53656f5d95cec5c25f3a2442779a7d9a5ec..05f1f2b8c33bcc627c387600b0f7154b7e8e1c83 100644 (file)
@@ -67,6 +67,7 @@ enum {
        COMMAND_COMPLETED       = (1 << 11),
        COMMAND_ABORTED         = (1 << 12),
        UNLINK_DATA_URBS        = (1 << 13),
+       IS_IN_WORK_LIST         = (1 << 14),
 };
 
 /* Overrides scsi_pointer */
@@ -131,6 +132,8 @@ static void uas_do_work(struct work_struct *work)
                struct uas_dev_info *devinfo = (void *)cmnd->device->hostdata;
                spin_lock_irqsave(&devinfo->lock, flags);
                err = uas_submit_urbs(cmnd, cmnd->device->hostdata, GFP_ATOMIC);
+               if (!err)
+                       cmdinfo->state &= ~IS_IN_WORK_LIST;
                spin_unlock_irqrestore(&devinfo->lock, flags);
                if (err) {
                        list_del(&cmdinfo->list);
@@ -193,7 +196,7 @@ static void uas_log_cmd_state(struct scsi_cmnd *cmnd, const char *caller)
        struct uas_cmd_info *ci = (void *)&cmnd->SCp;
 
        scmd_printk(KERN_INFO, cmnd, "%s %p tag %d, inflight:"
-                   "%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
+                   "%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
                    caller, cmnd, cmnd->request->tag,
                    (ci->state & SUBMIT_STATUS_URB)     ? " s-st"  : "",
                    (ci->state & ALLOC_DATA_IN_URB)     ? " a-in"  : "",
@@ -207,7 +210,8 @@ static void uas_log_cmd_state(struct scsi_cmnd *cmnd, const char *caller)
                    (ci->state & DATA_OUT_URB_INFLIGHT) ? " OUT"   : "",
                    (ci->state & COMMAND_COMPLETED)     ? " done"  : "",
                    (ci->state & COMMAND_ABORTED)       ? " abort" : "",
-                   (ci->state & UNLINK_DATA_URBS)      ? " unlink": "");
+                   (ci->state & UNLINK_DATA_URBS)      ? " unlink": "",
+                   (ci->state & IS_IN_WORK_LIST)       ? " work"  : "");
 }
 
 static int uas_try_complete(struct scsi_cmnd *cmnd, const char *caller)
@@ -244,6 +248,7 @@ static void uas_xfer_data(struct urb *urb, struct scsi_cmnd *cmnd,
        if (err) {
                spin_lock(&uas_work_lock);
                list_add_tail(&cmdinfo->list, &uas_work_list);
+               cmdinfo->state |= IS_IN_WORK_LIST;
                spin_unlock(&uas_work_lock);
                schedule_work(&uas_work);
        }
@@ -643,6 +648,7 @@ static int uas_queuecommand_lck(struct scsi_cmnd *cmnd,
                }
                spin_lock(&uas_work_lock);
                list_add_tail(&cmdinfo->list, &uas_work_list);
+               cmdinfo->state |= IS_IN_WORK_LIST;
                spin_unlock(&uas_work_lock);
                schedule_work(&uas_work);
        }