Commit 02cd743b authored by Darrick J. Wong's avatar Darrick J. Wong Committed by James Bottomley

[SCSI] libsas: Start I_T recovery if ABORT TASK fails

The EH should fall into I_T recovery (and potentially stronger
remedies) if ABORT TASK fails.
Signed-off-by: default avatarAlexis Bruemmer <alexisb@us.ibm.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent 6b0efb85
...@@ -281,6 +281,7 @@ enum task_disposition { ...@@ -281,6 +281,7 @@ enum task_disposition {
TASK_IS_ABORTED, TASK_IS_ABORTED,
TASK_IS_AT_LU, TASK_IS_AT_LU,
TASK_IS_NOT_AT_LU, TASK_IS_NOT_AT_LU,
TASK_ABORT_FAILED,
}; };
static enum task_disposition sas_scsi_find_task(struct sas_task *task) static enum task_disposition sas_scsi_find_task(struct sas_task *task)
...@@ -331,15 +332,21 @@ static enum task_disposition sas_scsi_find_task(struct sas_task *task) ...@@ -331,15 +332,21 @@ static enum task_disposition sas_scsi_find_task(struct sas_task *task)
SAS_DPRINTK("%s: querying task 0x%p\n", SAS_DPRINTK("%s: querying task 0x%p\n",
__FUNCTION__, task); __FUNCTION__, task);
res = si->dft->lldd_query_task(task); res = si->dft->lldd_query_task(task);
if (res == TMF_RESP_FUNC_SUCC) { switch (res) {
case TMF_RESP_FUNC_SUCC:
SAS_DPRINTK("%s: task 0x%p at LU\n", SAS_DPRINTK("%s: task 0x%p at LU\n",
__FUNCTION__, task); __FUNCTION__, task);
return TASK_IS_AT_LU; return TASK_IS_AT_LU;
} else if (res == TMF_RESP_FUNC_COMPLETE) { case TMF_RESP_FUNC_COMPLETE:
SAS_DPRINTK("%s: task 0x%p not at LU\n", SAS_DPRINTK("%s: task 0x%p not at LU\n",
__FUNCTION__, task); __FUNCTION__, task);
return TASK_IS_NOT_AT_LU; return TASK_IS_NOT_AT_LU;
} case TMF_RESP_FUNC_FAILED:
SAS_DPRINTK("%s: task 0x%p failed to abort\n",
__FUNCTION__, task);
return TASK_ABORT_FAILED;
}
} }
} }
return res; return res;
...@@ -475,6 +482,7 @@ void sas_scsi_recover_host(struct Scsi_Host *shost) ...@@ -475,6 +482,7 @@ void sas_scsi_recover_host(struct Scsi_Host *shost)
} }
/* fallthrough */ /* fallthrough */
case TASK_IS_NOT_AT_LU: case TASK_IS_NOT_AT_LU:
case TASK_ABORT_FAILED:
SAS_DPRINTK("task 0x%p is not at LU: I_T recover\n", SAS_DPRINTK("task 0x%p is not at LU: I_T recover\n",
task); task);
tmf_resp = sas_recover_I_T(task->dev); tmf_resp = sas_recover_I_T(task->dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment