|
@@ -107,6 +107,7 @@ static int hp_sw_tur(struct scsi_device *sdev, struct hp_sw_dh_data *h)
|
|
|
struct request *req;
|
|
|
int ret;
|
|
|
|
|
|
+retry:
|
|
|
req = blk_get_request(sdev->request_queue, WRITE, GFP_NOIO);
|
|
|
if (!req)
|
|
|
return SCSI_DH_RES_TEMP_UNAVAIL;
|
|
@@ -121,7 +122,6 @@ static int hp_sw_tur(struct scsi_device *sdev, struct hp_sw_dh_data *h)
|
|
|
memset(req->sense, 0, SCSI_SENSE_BUFFERSIZE);
|
|
|
req->sense_len = 0;
|
|
|
|
|
|
-retry:
|
|
|
ret = blk_execute_rq(req->q, NULL, req, 1);
|
|
|
if (ret == -EIO) {
|
|
|
if (req->sense_len > 0) {
|
|
@@ -136,8 +136,10 @@ retry:
|
|
|
h->path_state = HP_SW_PATH_ACTIVE;
|
|
|
ret = SCSI_DH_OK;
|
|
|
}
|
|
|
- if (ret == SCSI_DH_IMM_RETRY)
|
|
|
+ if (ret == SCSI_DH_IMM_RETRY) {
|
|
|
+ blk_put_request(req);
|
|
|
goto retry;
|
|
|
+ }
|
|
|
if (ret == SCSI_DH_DEV_OFFLINED) {
|
|
|
h->path_state = HP_SW_PATH_PASSIVE;
|
|
|
ret = SCSI_DH_OK;
|
|
@@ -200,6 +202,7 @@ static int hp_sw_start_stop(struct scsi_device *sdev, struct hp_sw_dh_data *h)
|
|
|
struct request *req;
|
|
|
int ret, retry;
|
|
|
|
|
|
+retry:
|
|
|
req = blk_get_request(sdev->request_queue, WRITE, GFP_NOIO);
|
|
|
if (!req)
|
|
|
return SCSI_DH_RES_TEMP_UNAVAIL;
|
|
@@ -216,7 +219,6 @@ static int hp_sw_start_stop(struct scsi_device *sdev, struct hp_sw_dh_data *h)
|
|
|
req->sense_len = 0;
|
|
|
retry = h->retries;
|
|
|
|
|
|
-retry:
|
|
|
ret = blk_execute_rq(req->q, NULL, req, 1);
|
|
|
if (ret == -EIO) {
|
|
|
if (req->sense_len > 0) {
|
|
@@ -231,8 +233,10 @@ retry:
|
|
|
ret = SCSI_DH_OK;
|
|
|
|
|
|
if (ret == SCSI_DH_RETRY) {
|
|
|
- if (--retry)
|
|
|
+ if (--retry) {
|
|
|
+ blk_put_request(req);
|
|
|
goto retry;
|
|
|
+ }
|
|
|
ret = SCSI_DH_IO;
|
|
|
}
|
|
|
|