mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-22 04:03:58 +08:00
[SCSI] isci: Allow SSP tasks into the task management path.
This commit fixes a driver bug for SSP tasks that require task management in the target after they complete in the SCU hardware. The problem was manifested in the function "isci_task_abort_task", which tests to see if the sas_task.lldd_task is non-NULL before allowing task management; this bug would always NULL lldd_task in the SCU I/O completion path even if target management was required, which would prevent task / target manangement from happening. Note that in the case of SATA/STP targets, error recovery is provided by the libata error handler which is why SATA/STP device recovery worked correctly even though SSP handling did not. Signed-off-by: Jeff Skirvin <jeffrey.d.skirvin@intel.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
parent
2c8bd81010
commit
54b4667775
@ -1079,7 +1079,6 @@ static void sci_controller_completion_handler(struct isci_host *ihost)
|
|||||||
|
|
||||||
void ireq_done(struct isci_host *ihost, struct isci_request *ireq, struct sas_task *task)
|
void ireq_done(struct isci_host *ihost, struct isci_request *ireq, struct sas_task *task)
|
||||||
{
|
{
|
||||||
task->lldd_task = NULL;
|
|
||||||
if (!test_bit(IREQ_ABORT_PATH_ACTIVE, &ireq->flags) &&
|
if (!test_bit(IREQ_ABORT_PATH_ACTIVE, &ireq->flags) &&
|
||||||
!(task->task_state_flags & SAS_TASK_STATE_ABORTED)) {
|
!(task->task_state_flags & SAS_TASK_STATE_ABORTED)) {
|
||||||
if (test_bit(IREQ_COMPLETE_IN_TARGET, &ireq->flags)) {
|
if (test_bit(IREQ_COMPLETE_IN_TARGET, &ireq->flags)) {
|
||||||
@ -1087,16 +1086,19 @@ void ireq_done(struct isci_host *ihost, struct isci_request *ireq, struct sas_ta
|
|||||||
dev_dbg(&ihost->pdev->dev,
|
dev_dbg(&ihost->pdev->dev,
|
||||||
"%s: Normal - ireq/task = %p/%p\n",
|
"%s: Normal - ireq/task = %p/%p\n",
|
||||||
__func__, ireq, task);
|
__func__, ireq, task);
|
||||||
|
task->lldd_task = NULL;
|
||||||
task->task_done(task);
|
task->task_done(task);
|
||||||
} else {
|
} else {
|
||||||
dev_dbg(&ihost->pdev->dev,
|
dev_dbg(&ihost->pdev->dev,
|
||||||
"%s: Error - ireq/task = %p/%p\n",
|
"%s: Error - ireq/task = %p/%p\n",
|
||||||
__func__, ireq, task);
|
__func__, ireq, task);
|
||||||
|
if (sas_protocol_ata(task->task_proto))
|
||||||
|
task->lldd_task = NULL;
|
||||||
sas_task_abort(task);
|
sas_task_abort(task);
|
||||||
}
|
}
|
||||||
}
|
} else
|
||||||
|
task->lldd_task = NULL;
|
||||||
|
|
||||||
if (test_and_clear_bit(IREQ_ABORT_PATH_ACTIVE, &ireq->flags))
|
if (test_and_clear_bit(IREQ_ABORT_PATH_ACTIVE, &ireq->flags))
|
||||||
wake_up_all(&ihost->eventq);
|
wake_up_all(&ihost->eventq);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user