[SCSI] libiscsi: Do not fail commands immediately during logout
authorMike Christie <michaelc@cs.wisc.edu>
Thu, 13 Dec 2007 18:43:32 +0000 (12:43 -0600)
committerJames Bottomley <James.Bottomley@HansenPartnership.com>
Sat, 12 Jan 2008 00:28:38 +0000 (18:28 -0600)
If the target requests a logout, then we do not want
to fail commands to scsi-ml right away. This patch just
fails in pending commands for a requeue immediately, and then lets
iscsid handle running commands like normal recovery.

Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
drivers/scsi/libiscsi.c

index 96883614ba08d7d68a01e0dc3104740c31a7a088..b17081bed128a379984da9d10e4d7670ded5c3cc 100644 (file)
@@ -917,7 +917,7 @@ check_mgmt:
                conn->ctask = list_entry(conn->xmitqueue.next,
                                         struct iscsi_cmd_task, running);
                if (conn->session->state == ISCSI_STATE_LOGGING_OUT) {
-                       fail_command(conn, conn->ctask, DID_NO_CONNECT << 16);
+                       fail_command(conn, conn->ctask, DID_IMM_RETRY << 16);
                        continue;
                }
                if (iscsi_prep_scsi_cmd_pdu(conn->ctask)) {
@@ -1024,21 +1024,19 @@ int iscsi_queuecommand(struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *))
                 * be entering our queuecommand while a block is starting
                 * up because the block code is not locked)
                 */
-               if (session->state == ISCSI_STATE_IN_RECOVERY) {
+               switch (session->state) {
+               case ISCSI_STATE_IN_RECOVERY:
                        reason = FAILURE_SESSION_IN_RECOVERY;
                        goto reject;
-               }
-
-               switch (session->state) {
+               case ISCSI_STATE_LOGGING_OUT:
+                       reason = FAILURE_SESSION_LOGGING_OUT;
+                       goto reject;
                case ISCSI_STATE_RECOVERY_FAILED:
                        reason = FAILURE_SESSION_RECOVERY_TIMEOUT;
                        break;
                case ISCSI_STATE_TERMINATE:
                        reason = FAILURE_SESSION_TERMINATE;
                        break;
-               case ISCSI_STATE_LOGGING_OUT:
-                       reason = FAILURE_SESSION_LOGGING_OUT;
-                       break;
                default:
                        reason = FAILURE_SESSION_FREED;
                }