|
@@ -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)
|
|
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 @@ Again:
|
|
}
|
|
}
|
|
/* 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);
|