|
@@ -349,6 +349,7 @@ Again:
|
|
|
|
|
|
spin_lock_irqsave(&task->task_state_lock, flags);
|
|
|
task->task_state_flags &= ~SAS_TASK_STATE_PENDING;
|
|
|
+ task->task_state_flags &= ~SAS_TASK_AT_INITIATOR;
|
|
|
task->task_state_flags |= SAS_TASK_STATE_DONE;
|
|
|
if (unlikely((task->task_state_flags & SAS_TASK_STATE_ABORTED))) {
|
|
|
spin_unlock_irqrestore(&task->task_state_lock, flags);
|
|
@@ -557,6 +558,7 @@ int asd_execute_task(struct sas_task *task, const int num,
|
|
|
struct sas_task *t = task;
|
|
|
struct asd_ascb *ascb = NULL, *a;
|
|
|
struct asd_ha_struct *asd_ha = task->dev->port->ha->lldd_ha;
|
|
|
+ unsigned long flags;
|
|
|
|
|
|
res = asd_can_queue(asd_ha, num);
|
|
|
if (res)
|
|
@@ -599,6 +601,10 @@ int asd_execute_task(struct sas_task *task, const int num,
|
|
|
}
|
|
|
if (res)
|
|
|
goto out_err_unmap;
|
|
|
+
|
|
|
+ spin_lock_irqsave(&t->task_state_lock, flags);
|
|
|
+ t->task_state_flags |= SAS_TASK_AT_INITIATOR;
|
|
|
+ spin_unlock_irqrestore(&t->task_state_lock, flags);
|
|
|
}
|
|
|
list_del_init(&alist);
|
|
|
|
|
@@ -617,6 +623,9 @@ out_err_unmap:
|
|
|
if (a == b)
|
|
|
break;
|
|
|
t = a->uldd_task;
|
|
|
+ spin_lock_irqsave(&t->task_state_lock, flags);
|
|
|
+ t->task_state_flags &= ~SAS_TASK_AT_INITIATOR;
|
|
|
+ spin_unlock_irqrestore(&t->task_state_lock, flags);
|
|
|
switch (t->task_proto) {
|
|
|
case SATA_PROTO:
|
|
|
case SAS_PROTO_STP:
|