Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 92e3af66 authored by James Smart's avatar James Smart Committed by James Bottomley
Browse files

[SCSI] lpfc 8.3.34: Correct lock handling to eliminate reset escalation on I/O abort

parent 1c13bf66
Loading
Loading
Loading
Loading
+9 −3
Original line number Original line Diff line number Diff line
@@ -3829,12 +3829,15 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn,
	cmd->scsi_done(cmd);
	cmd->scsi_done(cmd);


	if (phba->cfg_poll & ENABLE_FCP_RING_POLLING) {
	if (phba->cfg_poll & ENABLE_FCP_RING_POLLING) {
		spin_lock_irq(&phba->hbalock);
		lpfc_cmd->pCmd = NULL;
		spin_unlock_irq(&phba->hbalock);

		/*
		/*
		 * If there is a thread waiting for command completion
		 * If there is a thread waiting for command completion
		 * wake up the thread.
		 * wake up the thread.
		 */
		 */
		spin_lock_irqsave(shost->host_lock, flags);
		spin_lock_irqsave(shost->host_lock, flags);
		lpfc_cmd->pCmd = NULL;
		if (lpfc_cmd->waitq)
		if (lpfc_cmd->waitq)
			wake_up(lpfc_cmd->waitq);
			wake_up(lpfc_cmd->waitq);
		spin_unlock_irqrestore(shost->host_lock, flags);
		spin_unlock_irqrestore(shost->host_lock, flags);
@@ -3868,12 +3871,15 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn,
		}
		}
	}
	}


	spin_lock_irq(&phba->hbalock);
	lpfc_cmd->pCmd = NULL;
	spin_unlock_irq(&phba->hbalock);

	/*
	/*
	 * If there is a thread waiting for command completion
	 * If there is a thread waiting for command completion
	 * wake up the thread.
	 * wake up the thread.
	 */
	 */
	spin_lock_irqsave(shost->host_lock, flags);
	spin_lock_irqsave(shost->host_lock, flags);
	lpfc_cmd->pCmd = NULL;
	if (lpfc_cmd->waitq)
	if (lpfc_cmd->waitq)
		wake_up(lpfc_cmd->waitq);
		wake_up(lpfc_cmd->waitq);
	spin_unlock_irqrestore(shost->host_lock, flags);
	spin_unlock_irqrestore(shost->host_lock, flags);
@@ -4409,7 +4415,7 @@ lpfc_abort_handler(struct scsi_cmnd *cmnd)
	}
	}


	lpfc_cmd = (struct lpfc_scsi_buf *)cmnd->host_scribble;
	lpfc_cmd = (struct lpfc_scsi_buf *)cmnd->host_scribble;
	if (!lpfc_cmd) {
	if (!lpfc_cmd || !lpfc_cmd->pCmd) {
		spin_unlock_irq(&phba->hbalock);
		spin_unlock_irq(&phba->hbalock);
		lpfc_printf_vlog(vport, KERN_WARNING, LOG_FCP,
		lpfc_printf_vlog(vport, KERN_WARNING, LOG_FCP,
			 "2873 SCSI Layer I/O Abort Request IO CMPL Status "
			 "2873 SCSI Layer I/O Abort Request IO CMPL Status "