Retry mode select in rdac device handler
Subsystems (2)
PATCH 1/1 Retry mode select in rdac device handler
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 <[email protected]>
---
drivers/scsi/device_handler/scsi_dh_rdac.c +11 -4
@@ -24,6 +24,7 @@#include <scsi/scsi_dh.h> #define RDAC_NAME "rdac" +#define RDAC_RETRY_COUNT 5/* * LSI mode page stuff
@@ -477,21 +478,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; }