scsi: qla2xxx: Simplify the code for aborting SCSI commands
authorBart Van Assche <bvanassche@acm.org>
Thu, 20 Feb 2020 04:34:37 +0000 (20:34 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Sat, 29 Feb 2020 00:54:58 +0000 (19:54 -0500)
Since the SCSI core does not reuse the tag of the SCSI command that is
being aborted by .eh_abort() before .eh_abort() has finished it is not
necessary to check from inside that callback whether or not the SCSI
command has already completed. Instead, rely on the firmware to return an
error code when attempting to abort a command that has already
completed. Additionally, rely on the firmware to return an error code when
attempting to abort an already aborted command.

In qla2x00_abort_srb(), use blk_mq_request_started() instead of
sp->completed and sp->aborted.

Link: https://lore.kernel.org/r/20200220043441.20504-2-bvanassche@acm.org
Cc: Martin Wilck <mwilck@suse.com>
Cc: Quinn Tran <qutran@marvell.com>
Reviewed-by: Daniel Wagner <dwagner@suse.de>
Reviewed-by: Roman Bolshakov <r.bolshakov@yadro.com>
Acked-by: Himanshu Madhani <hmadhani@marvell.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/qla2xxx/qla_def.h
drivers/scsi/qla2xxx/qla_isr.c
drivers/scsi/qla2xxx/qla_os.c

index 17367639953c427aabe997d0fb771ddc93a6f1f3..138152c2673325337a4337b84ed05b12fdc107b5 100644 (file)
@@ -597,9 +597,6 @@ typedef struct srb {
        struct fc_port *fcport;
        struct scsi_qla_host *vha;
        unsigned int start_timer:1;
-       unsigned int abort:1;
-       unsigned int aborted:1;
-       unsigned int completed:1;
 
        uint32_t handle;
        uint16_t flags;
index 7c0c32d5d6ece8ea78b490e873ec31a0103494e8..7eb3df42316229869deeca5f5ecfeaee8f71a880 100644 (file)
@@ -2657,11 +2657,6 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt)
                return;
        }
 
-       if (sp->abort)
-               sp->aborted = 1;
-       else
-               sp->completed = 1;
-
        if (sp->cmd_type != TYPE_SRB) {
                req->outstanding_cmds[handle] = NULL;
                ql_dbg(ql_dbg_io, vha, 0x3015,
index f5a264f0afd6877db46f48b13e513a0f0181f1b9..78ce264d91686d9ed03c456f9d6007338b675b8f 100644 (file)
@@ -1270,17 +1270,6 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
                return SUCCESS;
 
        spin_lock_irqsave(qpair->qp_lock_ptr, flags);
-       if (sp->completed) {
-               spin_unlock_irqrestore(qpair->qp_lock_ptr, flags);
-               return SUCCESS;
-       }
-
-       if (sp->abort || sp->aborted) {
-               spin_unlock_irqrestore(qpair->qp_lock_ptr, flags);
-               return FAILED;
-       }
-
-       sp->abort = 1;
        sp->comp = &comp;
        spin_unlock_irqrestore(qpair->qp_lock_ptr, flags);
 
@@ -1705,6 +1694,10 @@ qla2x00_loop_reset(scsi_qla_host_t *vha)
        return QLA_SUCCESS;
 }
 
+/*
+ * The caller must ensure that no completion interrupts will happen
+ * while this function is in progress.
+ */
 static void qla2x00_abort_srb(struct qla_qpair *qp, srb_t *sp, const int res,
                              unsigned long *flags)
        __releases(qp->qp_lock_ptr)
@@ -1713,6 +1706,7 @@ static void qla2x00_abort_srb(struct qla_qpair *qp, srb_t *sp, const int res,
        DECLARE_COMPLETION_ONSTACK(comp);
        scsi_qla_host_t *vha = qp->vha;
        struct qla_hw_data *ha = vha->hw;
+       struct scsi_cmnd *cmd = GET_CMD_SP(sp);
        int rval;
        bool ret_cmd;
        uint32_t ratov_j;
@@ -1734,7 +1728,6 @@ static void qla2x00_abort_srb(struct qla_qpair *qp, srb_t *sp, const int res,
                }
 
                sp->comp = &comp;
-               sp->abort =  1;
                spin_unlock_irqrestore(qp->qp_lock_ptr, *flags);
 
                rval = ha->isp_ops->abort_command(sp);
@@ -1758,13 +1751,17 @@ static void qla2x00_abort_srb(struct qla_qpair *qp, srb_t *sp, const int res,
                }
 
                spin_lock_irqsave(qp->qp_lock_ptr, *flags);
-               if (ret_cmd && (!sp->completed || !sp->aborted))
+               if (ret_cmd && blk_mq_request_started(cmd->request))
                        sp->done(sp, res);
        } else {
                sp->done(sp, res);
        }
 }
 
+/*
+ * The caller must ensure that no completion interrupts will happen
+ * while this function is in progress.
+ */
 static void
 __qla2x00_abort_all_cmds(struct qla_qpair *qp, int res)
 {
@@ -1811,6 +1808,10 @@ __qla2x00_abort_all_cmds(struct qla_qpair *qp, int res)
        spin_unlock_irqrestore(qp->qp_lock_ptr, flags);
 }
 
+/*
+ * The caller must ensure that no completion interrupts will happen
+ * while this function is in progress.
+ */
 void
 qla2x00_abort_all_cmds(scsi_qla_host_t *vha, int res)
 {