Skip to content

Commit c26b85e

Browse files
Ajish Koshymartinkpetersen
authored andcommitted
scsi: pm80xx: Fix double completion for SATA devices
Current code handles completions for SATA devices in mpi_sata_completion() and mpi_sata_event(). However, at the time when any SATA event happens, for almost all the event types, the command is still in the target. It is therefore incorrect to complete the task in sata_event(). There are some events for which we get sata_completions, some need recovery procedure and others abort. All the tasks must be completed via sata_completion() path. Removed the task done related code from sata_events(). For tasks where we don't get completions, let top layer call abort() to abort the command post timeout. Link: https://lore.kernel.org/r/[email protected] Acked-by: Jack Wang <[email protected]> Co-developed-by: Viswas G <[email protected]> Signed-off-by: Viswas G <[email protected]> Signed-off-by: Ajish Koshy <[email protected]> Signed-off-by: Martin K. Petersen <[email protected]>
1 parent 4db0959 commit c26b85e

File tree

2 files changed

+0
-44
lines changed

2 files changed

+0
-44
lines changed

drivers/scsi/pm8001/pm8001_hwi.c

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2692,7 +2692,6 @@ static void mpi_sata_event(struct pm8001_hba_info *pm8001_ha, void *piomb)
26922692
u32 tag = le32_to_cpu(psataPayload->tag);
26932693
u32 port_id = le32_to_cpu(psataPayload->port_id);
26942694
u32 dev_id = le32_to_cpu(psataPayload->device_id);
2695-
unsigned long flags;
26962695

26972696
if (event)
26982697
pm8001_dbg(pm8001_ha, FAIL, "SATA EVENT 0x%x\n", event);
@@ -2724,8 +2723,6 @@ static void mpi_sata_event(struct pm8001_hba_info *pm8001_ha, void *piomb)
27242723
ts->resp = SAS_TASK_COMPLETE;
27252724
ts->stat = SAS_DATA_OVERRUN;
27262725
ts->residual = 0;
2727-
if (pm8001_dev)
2728-
atomic_dec(&pm8001_dev->running_req);
27292726
break;
27302727
case IO_XFER_ERROR_BREAK:
27312728
pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_BREAK\n");
@@ -2767,7 +2764,6 @@ static void mpi_sata_event(struct pm8001_hba_info *pm8001_ha, void *piomb)
27672764
IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS);
27682765
ts->resp = SAS_TASK_COMPLETE;
27692766
ts->stat = SAS_QUEUE_FULL;
2770-
pm8001_ccb_task_free_done(pm8001_ha, t, ccb, tag);
27712767
return;
27722768
}
27732769
break;
@@ -2853,20 +2849,6 @@ static void mpi_sata_event(struct pm8001_hba_info *pm8001_ha, void *piomb)
28532849
ts->stat = SAS_OPEN_TO;
28542850
break;
28552851
}
2856-
spin_lock_irqsave(&t->task_state_lock, flags);
2857-
t->task_state_flags &= ~SAS_TASK_STATE_PENDING;
2858-
t->task_state_flags &= ~SAS_TASK_AT_INITIATOR;
2859-
t->task_state_flags |= SAS_TASK_STATE_DONE;
2860-
if (unlikely((t->task_state_flags & SAS_TASK_STATE_ABORTED))) {
2861-
spin_unlock_irqrestore(&t->task_state_lock, flags);
2862-
pm8001_dbg(pm8001_ha, FAIL,
2863-
"task 0x%p done with io_status 0x%x resp 0x%x stat 0x%x but aborted by upper layer!\n",
2864-
t, event, ts->resp, ts->stat);
2865-
pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
2866-
} else {
2867-
spin_unlock_irqrestore(&t->task_state_lock, flags);
2868-
pm8001_ccb_task_free_done(pm8001_ha, t, ccb, tag);
2869-
}
28702852
}
28712853

28722854
/*See the comments for mpi_ssp_completion */

drivers/scsi/pm8001/pm80xx_hwi.c

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2821,7 +2821,6 @@ static void mpi_sata_event(struct pm8001_hba_info *pm8001_ha,
28212821
u32 tag = le32_to_cpu(psataPayload->tag);
28222822
u32 port_id = le32_to_cpu(psataPayload->port_id);
28232823
u32 dev_id = le32_to_cpu(psataPayload->device_id);
2824-
unsigned long flags;
28252824

28262825
if (event)
28272826
pm8001_dbg(pm8001_ha, FAIL, "SATA EVENT 0x%x\n", event);
@@ -2854,8 +2853,6 @@ static void mpi_sata_event(struct pm8001_hba_info *pm8001_ha,
28542853
ts->resp = SAS_TASK_COMPLETE;
28552854
ts->stat = SAS_DATA_OVERRUN;
28562855
ts->residual = 0;
2857-
if (pm8001_dev)
2858-
atomic_dec(&pm8001_dev->running_req);
28592856
break;
28602857
case IO_XFER_ERROR_BREAK:
28612858
pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_BREAK\n");
@@ -2904,11 +2901,6 @@ static void mpi_sata_event(struct pm8001_hba_info *pm8001_ha,
29042901
IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS);
29052902
ts->resp = SAS_TASK_COMPLETE;
29062903
ts->stat = SAS_QUEUE_FULL;
2907-
spin_unlock_irqrestore(&circularQ->oq_lock,
2908-
circularQ->lock_flags);
2909-
pm8001_ccb_task_free_done(pm8001_ha, t, ccb, tag);
2910-
spin_lock_irqsave(&circularQ->oq_lock,
2911-
circularQ->lock_flags);
29122904
return;
29132905
}
29142906
break;
@@ -3008,24 +3000,6 @@ static void mpi_sata_event(struct pm8001_hba_info *pm8001_ha,
30083000
ts->stat = SAS_OPEN_TO;
30093001
break;
30103002
}
3011-
spin_lock_irqsave(&t->task_state_lock, flags);
3012-
t->task_state_flags &= ~SAS_TASK_STATE_PENDING;
3013-
t->task_state_flags &= ~SAS_TASK_AT_INITIATOR;
3014-
t->task_state_flags |= SAS_TASK_STATE_DONE;
3015-
if (unlikely((t->task_state_flags & SAS_TASK_STATE_ABORTED))) {
3016-
spin_unlock_irqrestore(&t->task_state_lock, flags);
3017-
pm8001_dbg(pm8001_ha, FAIL,
3018-
"task 0x%p done with io_status 0x%x resp 0x%x stat 0x%x but aborted by upper layer!\n",
3019-
t, event, ts->resp, ts->stat);
3020-
pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
3021-
} else {
3022-
spin_unlock_irqrestore(&t->task_state_lock, flags);
3023-
spin_unlock_irqrestore(&circularQ->oq_lock,
3024-
circularQ->lock_flags);
3025-
pm8001_ccb_task_free_done(pm8001_ha, t, ccb, tag);
3026-
spin_lock_irqsave(&circularQ->oq_lock,
3027-
circularQ->lock_flags);
3028-
}
30293003
}
30303004

30313005
/*See the comments for mpi_ssp_completion */

0 commit comments

Comments
 (0)