[SCSI] scsi_error: Escalate to LUN reset if abort fails
authorHannes Reinecke <hare@suse.de>
Wed, 23 Oct 2013 08:51:22 +0000 (10:51 +0200)
committerJames Bottomley <JBottomley@Parallels.com>
Fri, 25 Oct 2013 11:18:30 +0000 (12:18 +0100)
If a command abort fails there is a fair chance that all other
aborts will be failing, too.
So we should be calling LUN reset directly after the first failed
abort and skip aborting the remaining commands.

Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/scsi_error.c

index edae9e2..e8bee9f 100644 (file)
@@ -1192,18 +1192,20 @@ static int scsi_eh_abort_cmds(struct list_head *work_q,
                                                  "0x%p\n", current->comm,
                                                  scmd));
                rtn = scsi_try_to_abort_cmd(shost->hostt, scmd);
-               if (rtn == SUCCESS || rtn == FAST_IO_FAIL) {
-                       scmd->eh_eflags &= ~SCSI_EH_CANCEL_CMD;
-                       if (rtn == FAST_IO_FAIL)
-                               scsi_eh_finish_cmd(scmd, done_q);
-                       else
-                               list_move_tail(&scmd->eh_entry, &check_list);
-               } else
+               if (rtn == FAILED) {
                        SCSI_LOG_ERROR_RECOVERY(3, printk("%s: aborting"
                                                          " cmd failed:"
                                                          "0x%p\n",
                                                          current->comm,
                                                          scmd));
+                       list_splice_init(&check_list, work_q);
+                       return list_empty(work_q);
+               }
+               scmd->eh_eflags &= ~SCSI_EH_CANCEL_CMD;
+               if (rtn == FAST_IO_FAIL)
+                       scsi_eh_finish_cmd(scmd, done_q);
+               else
+                       list_move_tail(&scmd->eh_entry, &check_list);
        }
 
        return scsi_eh_test_devices(&check_list, work_q, done_q, 0);