Signed-off-by: Hans de Goede <hdego...@redhat.com>
---
 drivers/usb/storage/uas.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c
index 4b67852..5b31fbf 100644
--- a/drivers/usb/storage/uas.c
+++ b/drivers/usb/storage/uas.c
@@ -672,13 +672,15 @@ static int uas_queuecommand_lck(struct scsi_cmnd *cmnd,
 
        BUILD_BUG_ON(sizeof(struct uas_cmd_info) > sizeof(struct scsi_pointer));
 
+       spin_lock_irqsave(&devinfo->lock, flags);
+
        if (devinfo->resetting) {
                cmnd->result = DID_ERROR << 16;
                cmnd->scsi_done(cmnd);
+               spin_unlock_irqrestore(&devinfo->lock, flags);
                return 0;
        }
 
-       spin_lock_irqsave(&devinfo->lock, flags);
        if (devinfo->cmnd) {
                spin_unlock_irqrestore(&devinfo->lock, flags);
                return SCSI_MLQUEUE_DEVICE_BUSY;
@@ -742,6 +744,11 @@ static int uas_eh_task_mgmt(struct scsi_cmnd *cmnd,
 
        spin_lock_irqsave(&devinfo->lock, flags);
 
+       if (devinfo->resetting) {
+               spin_unlock_irqrestore(&devinfo->lock, flags);
+               return FAILED;
+       }
+
        if (devinfo->running_task) {
                shost_printk(KERN_INFO, shost,
                             "%s: %s: error already running a task\n",
@@ -812,6 +819,12 @@ static int uas_eh_abort_handler(struct scsi_cmnd *cmnd)
        int ret;
 
        spin_lock_irqsave(&devinfo->lock, flags);
+
+       if (devinfo->resetting) {
+               spin_unlock_irqrestore(&devinfo->lock, flags);
+               return FAILED;
+       }
+
        uas_mark_cmd_dead(devinfo, cmdinfo, __func__);
        if (cmdinfo->state & COMMAND_INFLIGHT) {
                spin_unlock_irqrestore(&devinfo->lock, flags);
-- 
1.8.4.2

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to