Commit c4e521b6 authored by Bart Van Assche's avatar Bart Van Assche Committed by Martin K. Petersen
Browse files

scsi: qla2xxx: Split the __qla2x00_abort_all_cmds() function



Nesting in __qla2x00_abort_all_cmds() is way too deep. Reduce the nesting
level by introducing a helper function. This patch does not change any
functionality.

Reviewed-by: default avatarLaurence Oberman <loberman@redhat.com>
Acked-by: default avatarHimanshu Madhani <himanshu.madhani@cavium.com>
Signed-off-by: default avatarBart Van Assche <bvanassche@acm.org>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 14e9a890
Loading
Loading
Loading
Loading
+36 −38
Original line number Diff line number Diff line
@@ -1746,6 +1746,41 @@ qla2x00_loop_reset(scsi_qla_host_t *vha)
	return QLA_SUCCESS;
}

static void qla2x00_abort_srb(struct qla_qpair *qp, srb_t *sp, const int res,
			      unsigned long *flags)
	__releases(qp->qp_lock_ptr)
	__acquires(qp->qp_lock_ptr)
{
	scsi_qla_host_t *vha = qp->vha;
	struct qla_hw_data *ha = vha->hw;

	if (sp->type == SRB_NVME_CMD || sp->type == SRB_NVME_LS) {
		if (!sp_get(sp)) {
			/* got sp */
			spin_unlock_irqrestore(qp->qp_lock_ptr, *flags);
			qla_nvme_abort(ha, sp, res);
			spin_lock_irqsave(qp->qp_lock_ptr, *flags);
		}
	} else if (GET_CMD_SP(sp) && !ha->flags.eeh_busy &&
		   !test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags) &&
		   !qla2x00_isp_reg_stat(ha) && sp->type == SRB_SCSI_CMD) {
		/*
		 * Don't abort commands in adapter during EEH recovery as it's
		 * not accessible/responding.
		 *
		 * Get a reference to the sp and drop the lock. The reference
		 * ensures this sp->done() call and not the call in
		 * qla2xxx_eh_abort() ends the SCSI cmd (with result 'res').
		 */
		if (!sp_get(sp)) {
			spin_unlock_irqrestore(qp->qp_lock_ptr, *flags);
			qla2xxx_eh_abort(GET_CMD_SP(sp));
			spin_lock_irqsave(qp->qp_lock_ptr, *flags);
		}
	}
	sp->done(sp, res);
}

static void
__qla2x00_abort_all_cmds(struct qla_qpair *qp, int res)
{
@@ -1768,44 +1803,7 @@ __qla2x00_abort_all_cmds(struct qla_qpair *qp, int res)
			req->outstanding_cmds[cnt] = NULL;
			switch (sp->cmd_type) {
			case TYPE_SRB:
				if (sp->type == SRB_NVME_CMD ||
				    sp->type == SRB_NVME_LS) {
					if (!sp_get(sp)) {
						/* got sp */
						spin_unlock_irqrestore
							(qp->qp_lock_ptr,
							 flags);
						qla_nvme_abort(ha, sp, res);
						spin_lock_irqsave
							(qp->qp_lock_ptr, flags);
					}
				} else if (GET_CMD_SP(sp) &&
				    !ha->flags.eeh_busy &&
				    (!test_bit(ABORT_ISP_ACTIVE,
					&vha->dpc_flags)) &&
				    !qla2x00_isp_reg_stat(ha) &&
				    (sp->type == SRB_SCSI_CMD)) {
					/*
					 * Don't abort commands in adapter
					 * during EEH recovery as it's not
					 * accessible/responding.
					 *
					 * Get a reference to the sp and drop
					 * the lock. The reference ensures this
					 * sp->done() call and not the call in
					 * qla2xxx_eh_abort() ends the SCSI cmd
					 * (with result 'res').
					 */
					if (!sp_get(sp)) {
						spin_unlock_irqrestore
							(qp->qp_lock_ptr, flags);
						qla2xxx_eh_abort(
							GET_CMD_SP(sp));
						spin_lock_irqsave
							(qp->qp_lock_ptr, flags);
					}
				}
				sp->done(sp, res);
				qla2x00_abort_srb(qp, sp, res, &flags);
				break;
			case TYPE_TGT_CMD:
				if (!vha->hw->tgt.tgt_ops || !tgt ||