Skip to content

Commit

Permalink
[SCSI] scsi_dh: Retry mode select in rdac device handler
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Chandra Seetharaman authored and James Bottomley committed Dec 29, 2008
1 parent 9eece96 commit c85f8cb
Showing 1 changed file with 11 additions and 4 deletions.
15 changes: 11 additions & 4 deletions drivers/scsi/device_handler/scsi_dh_rdac.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include <scsi/scsi_dh.h>

#define RDAC_NAME "rdac"
#define RDAC_RETRY_COUNT 5

/*
* LSI mode page stuff
Expand Down Expand Up @@ -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;
}
Expand Down

0 comments on commit c85f8cb

Please sign in to comment.