[SCSI] scsi_dh: 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 <sekharan@us.ibm.com> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
This commit is contained in:
		
							parent
							
								
									9eece961fc
								
							
						
					
					
						commit
						c85f8cb925
					
				| @ -24,6 +24,7 @@ | ||||
| #include <scsi/scsi_dh.h> | ||||
| 
 | ||||
| #define RDAC_NAME "rdac" | ||||
| #define RDAC_RETRY_COUNT 5 | ||||
| 
 | ||||
| /*
 | ||||
|  * LSI mode page stuff | ||||
| @ -478,21 +479,27 @@ static int send_mode_select(struct scsi_device *sdev, struct rdac_dh_data *h) | ||||
| { | ||||
| 	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; | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user