]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blobdiff - src/patches/suse-2.6.27.31/patches.fixes/libiscsi-don-t-let-io-sit-in-queue-when-session-has-failed
Reenabled linux-xen, added patches for Xen Kernel Version 2.6.27.31,
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.31 / patches.fixes / libiscsi-don-t-let-io-sit-in-queue-when-session-has-failed
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/libiscsi-don-t-let-io-sit-in-queue-when-session-has-failed b/src/patches/suse-2.6.27.31/patches.fixes/libiscsi-don-t-let-io-sit-in-queue-when-session-has-failed
new file mode 100644 (file)
index 0000000..68a5026
--- /dev/null
@@ -0,0 +1,56 @@
+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;