]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blobdiff - src/patches/suse-2.6.27.31/patches.fixes/scsi-dh-rdac-retry-mode-select
Move xen patchset to new version's subdir.
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.31 / patches.fixes / scsi-dh-rdac-retry-mode-select
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/scsi-dh-rdac-retry-mode-select b/src/patches/suse-2.6.27.31/patches.fixes/scsi-dh-rdac-retry-mode-select
new file mode 100644 (file)
index 0000000..a8416f1
--- /dev/null
@@ -0,0 +1,58 @@
+Subject: Retry mode select in RDAC device handler
+From: Chandra Seetharaman <sekharan@us.ibm.com>
+References: bnc#441337
+
+When the mode select sent to the controller fails with the retryable
+error, it is better to retry the mode_select from the hardware handler
+itself, instead of propagating the failure to dm-multipath.
+
+Signed-off-by: Chandra Seetharaman <sekharan@us.ibm.com>
+Signed-off-by: Hannes Reinecke <hare@suse.de>
+
+---
+---
+ drivers/scsi/device_handler/scsi_dh_rdac.c |   15 +++++++++++----
+ 1 file changed, 11 insertions(+), 4 deletions(-)
+
+--- a/drivers/scsi/device_handler/scsi_dh_rdac.c
++++ b/drivers/scsi/device_handler/scsi_dh_rdac.c
+@@ -24,6 +24,7 @@
+ #include <scsi/scsi_dh.h>
+ #define RDAC_NAME "rdac"
++#define RDAC_RETRY_COUNT 5
+ /*
+  * LSI mode page stuff
+@@ -475,21 +476,27 @@ static int send_mode_select(struct scsi_
+ {
+       struct request *rq;
+       struct request_queue *q = sdev->request_queue;
+-      int err = SCSI_DH_RES_TEMP_UNAVAIL;
++      int err, retry_cnt = RDAC_RETRY_COUNT;
++retry:
++      err = SCSI_DH_RES_TEMP_UNAVAIL;
+       rq = rdac_failover_get(sdev, h);
+       if (!rq)
+               goto done;
+-      sdev_printk(KERN_INFO, sdev, "queueing MODE_SELECT command.\n");
++      sdev_printk(KERN_INFO, sdev, "%s MODE_SELECT command.\n",
++              (retry_cnt == RDAC_RETRY_COUNT) ? "queueing" : "retrying");
+       err = blk_execute_rq(q, NULL, rq, 1);
+-      if (err != SCSI_DH_OK)
++      blk_put_request(rq);
++      if (err != SCSI_DH_OK) {
+               err = mode_select_handle_sense(sdev, h->sense);
++              if (err == SCSI_DH_RETRY && retry_cnt--)
++                      goto retry;
++      }
+       if (err == SCSI_DH_OK)
+               h->state = RDAC_STATE_ACTIVE;
+-      blk_put_request(rq);
+ done:
+       return err;
+ }