diff options
Diffstat (limited to 'drivers/scsi/device_handler')
| -rw-r--r-- | drivers/scsi/device_handler/scsi_dh_alua.c | 33 | ||||
| -rw-r--r-- | drivers/scsi/device_handler/scsi_dh_emc.c | 2 | ||||
| -rw-r--r-- | drivers/scsi/device_handler/scsi_dh_hp_sw.c | 4 | ||||
| -rw-r--r-- | drivers/scsi/device_handler/scsi_dh_rdac.c | 3 | 
4 files changed, 27 insertions, 15 deletions
diff --git a/drivers/scsi/device_handler/scsi_dh_alua.c b/drivers/scsi/device_handler/scsi_dh_alua.c index 68adb8955d2..7bcf67eec92 100644 --- a/drivers/scsi/device_handler/scsi_dh_alua.c +++ b/drivers/scsi/device_handler/scsi_dh_alua.c @@ -120,6 +120,7 @@ static struct request *get_alua_req(struct scsi_device *sdev,  			    "%s: blk_get_request failed\n", __func__);  		return NULL;  	} +	blk_rq_set_block_pc(rq);  	if (buflen && blk_rq_map_kern(q, rq, buffer, buflen, GFP_NOIO)) {  		blk_put_request(rq); @@ -128,7 +129,6 @@ static struct request *get_alua_req(struct scsi_device *sdev,  		return NULL;  	} -	rq->cmd_type = REQ_TYPE_BLOCK_PC;  	rq->cmd_flags |= REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT |  			 REQ_FAILFAST_DRIVER;  	rq->retries = ALUA_FAILOVER_RETRIES; @@ -481,6 +481,11 @@ static int alua_check_sense(struct scsi_device *sdev,  			 * Power On, Reset, or Bus Device Reset, just retry.  			 */  			return ADD_TO_MLQUEUE; +		if (sense_hdr->asc == 0x29 && sense_hdr->ascq == 0x04) +			/* +			 * Device internal reset +			 */ +			return ADD_TO_MLQUEUE;  		if (sense_hdr->asc == 0x2a && sense_hdr->ascq == 0x01)  			/*  			 * Mode Parameters Changed @@ -517,12 +522,13 @@ static int alua_check_sense(struct scsi_device *sdev,  /*   * alua_rtpg - Evaluate REPORT TARGET GROUP STATES   * @sdev: the device to be evaluated. + * @wait_for_transition: if nonzero, wait ALUA_FAILOVER_TIMEOUT seconds for device to exit transitioning state   *   * Evaluate the Target Port Group State.   * Returns SCSI_DH_DEV_OFFLINED if the path is   * found to be unusable.   */ -static int alua_rtpg(struct scsi_device *sdev, struct alua_dh_data *h) +static int alua_rtpg(struct scsi_device *sdev, struct alua_dh_data *h, int wait_for_transition)  {  	struct scsi_sense_hdr sense_hdr;  	int len, k, off, valid_states = 0; @@ -594,7 +600,7 @@ static int alua_rtpg(struct scsi_device *sdev, struct alua_dh_data *h)  	else  		h->transition_tmo = ALUA_FAILOVER_TIMEOUT; -	if (orig_transition_tmo != h->transition_tmo) { +	if (wait_for_transition && (orig_transition_tmo != h->transition_tmo)) {  		sdev_printk(KERN_INFO, sdev,  			    "%s: transition timeout set to %d seconds\n",  			    ALUA_DH_NAME, h->transition_tmo); @@ -632,14 +638,19 @@ static int alua_rtpg(struct scsi_device *sdev, struct alua_dh_data *h)  	switch (h->state) {  	case TPGS_STATE_TRANSITIONING: -		if (time_before(jiffies, expiry)) { -			/* State transition, retry */ -			interval += 2000; -			msleep(interval); -			goto retry; +		if (wait_for_transition) { +			if (time_before(jiffies, expiry)) { +				/* State transition, retry */ +				interval += 2000; +				msleep(interval); +				goto retry; +			} +			err = SCSI_DH_RETRY; +		} else { +			err = SCSI_DH_OK;  		} +  		/* Transitioning time exceeded, set port to standby */ -		err = SCSI_DH_RETRY;  		h->state = TPGS_STATE_STANDBY;  		break;  	case TPGS_STATE_OFFLINE: @@ -673,7 +684,7 @@ static int alua_initialize(struct scsi_device *sdev, struct alua_dh_data *h)  	if (err != SCSI_DH_OK)  		goto out; -	err = alua_rtpg(sdev, h); +	err = alua_rtpg(sdev, h, 0);  	if (err != SCSI_DH_OK)  		goto out; @@ -733,7 +744,7 @@ static int alua_activate(struct scsi_device *sdev,  	int err = SCSI_DH_OK;  	int stpg = 0; -	err = alua_rtpg(sdev, h); +	err = alua_rtpg(sdev, h, 1);  	if (err != SCSI_DH_OK)  		goto out; diff --git a/drivers/scsi/device_handler/scsi_dh_emc.c b/drivers/scsi/device_handler/scsi_dh_emc.c index e1c8be06de9..6f07f7fe3aa 100644 --- a/drivers/scsi/device_handler/scsi_dh_emc.c +++ b/drivers/scsi/device_handler/scsi_dh_emc.c @@ -280,6 +280,7 @@ static struct request *get_req(struct scsi_device *sdev, int cmd,  		return NULL;  	} +	blk_rq_set_block_pc(rq);  	rq->cmd_len = COMMAND_SIZE(cmd);  	rq->cmd[0] = cmd; @@ -304,7 +305,6 @@ static struct request *get_req(struct scsi_device *sdev, int cmd,  		break;  	} -	rq->cmd_type = REQ_TYPE_BLOCK_PC;  	rq->cmd_flags |= REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT |  			 REQ_FAILFAST_DRIVER;  	rq->timeout = CLARIION_TIMEOUT; diff --git a/drivers/scsi/device_handler/scsi_dh_hp_sw.c b/drivers/scsi/device_handler/scsi_dh_hp_sw.c index 084062bb8ee..e9d9fea9e27 100644 --- a/drivers/scsi/device_handler/scsi_dh_hp_sw.c +++ b/drivers/scsi/device_handler/scsi_dh_hp_sw.c @@ -120,7 +120,7 @@ retry:  	if (!req)  		return SCSI_DH_RES_TEMP_UNAVAIL; -	req->cmd_type = REQ_TYPE_BLOCK_PC; +	blk_rq_set_block_pc(req);  	req->cmd_flags |= REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT |  			  REQ_FAILFAST_DRIVER;  	req->cmd_len = COMMAND_SIZE(TEST_UNIT_READY); @@ -250,7 +250,7 @@ static int hp_sw_start_stop(struct hp_sw_dh_data *h)  	if (!req)  		return SCSI_DH_RES_TEMP_UNAVAIL; -	req->cmd_type = REQ_TYPE_BLOCK_PC; +	blk_rq_set_block_pc(req);  	req->cmd_flags |= REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT |  			  REQ_FAILFAST_DRIVER;  	req->cmd_len = COMMAND_SIZE(START_STOP); diff --git a/drivers/scsi/device_handler/scsi_dh_rdac.c b/drivers/scsi/device_handler/scsi_dh_rdac.c index 69c915aa77c..826069db984 100644 --- a/drivers/scsi/device_handler/scsi_dh_rdac.c +++ b/drivers/scsi/device_handler/scsi_dh_rdac.c @@ -279,6 +279,7 @@ static struct request *get_rdac_req(struct scsi_device *sdev,  				"get_rdac_req: blk_get_request failed.\n");  		return NULL;  	} +	blk_rq_set_block_pc(rq);  	if (buflen && blk_rq_map_kern(q, rq, buffer, buflen, GFP_NOIO)) {  		blk_put_request(rq); @@ -287,7 +288,6 @@ static struct request *get_rdac_req(struct scsi_device *sdev,  		return NULL;  	} -	rq->cmd_type = REQ_TYPE_BLOCK_PC;  	rq->cmd_flags |= REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT |  			 REQ_FAILFAST_DRIVER;  	rq->retries = RDAC_RETRIES; @@ -786,6 +786,7 @@ static const struct scsi_dh_devlist rdac_dev_list[] = {  	{"IBM", "1742"},  	{"IBM", "1745"},  	{"IBM", "1746"}, +	{"IBM", "1813"},  	{"IBM", "1814"},  	{"IBM", "1815"},  	{"IBM", "1818"},  | 
