+++ /dev/null
-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;
- }