--- /dev/null
+From: Mike Christie <michaelc@cs.wisc.edu>
+Date: Wed, 13 May 2009 17:57:47 -0500
+X-Git: 301e0f7e4d78e956c58b66888e134dbdb44ea28e
+Subject: libiscsi: don't let io sit in queue when session has failed
+
+If the session is failed, but we have not yet fully transitioned
+to the recovery stage we were still queueuing IO. The idea is
+that for some failures we can recvover at the command level
+and still continue to execute other IO. Well, we never have
+added the recovery within a command code, so queueing up IO here
+just creates the possibility that it might time time out so
+this just has us requeue the IO the scsi layer for now.
+
+Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
+Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
+Signed-off-by: Hannes Reinecke <hare@suse.de>
+
+---
+ drivers/scsi/libiscsi.c | 15 ++++++---------
+ 1 file changed, 6 insertions(+), 9 deletions(-)
+
+--- a/drivers/scsi/libiscsi.c
++++ b/drivers/scsi/libiscsi.c
+@@ -1242,13 +1242,7 @@ int iscsi_queuecommand(struct scsi_cmnd
+ goto fault;
+ }
+
+- /*
+- * ISCSI_STATE_FAILED is a temp. state. The recovery
+- * code will decide what is best to do with command queued
+- * during this time
+- */
+- if (session->state != ISCSI_STATE_LOGGED_IN &&
+- session->state != ISCSI_STATE_FAILED) {
++ if (session->state != ISCSI_STATE_LOGGED_IN) {
+ /*
+ * to handle the race between when we set the recovery state
+ * and block the session we requeue here (commands could
+@@ -1256,12 +1250,15 @@ int iscsi_queuecommand(struct scsi_cmnd
+ * up because the block code is not locked)
+ */
+ switch (session->state) {
++ case ISCSI_STATE_FAILED:
+ case ISCSI_STATE_IN_RECOVERY:
+ reason = FAILURE_SESSION_IN_RECOVERY;
+- goto reject;
++ sc->result = DID_IMM_RETRY << 16;
++ break;
+ case ISCSI_STATE_LOGGING_OUT:
+ reason = FAILURE_SESSION_LOGGING_OUT;
+- goto reject;
++ sc->result = DID_IMM_RETRY << 16;
++ break;
+ case ISCSI_STATE_RECOVERY_FAILED:
+ reason = FAILURE_SESSION_RECOVERY_TIMEOUT;
+ sc->result = DID_TRANSPORT_FAILFAST << 16;