On Thu, Aug 11, 2016 at 11:35:49AM -0700, James Smart wrote:
>
> Fix sg_reset on SCSI device causing kernel crash
>
> Driver could reference stale node pointers in task mgmt call.
> Changed to use resetting cmd and look up node pointer in task mgmt
> function.
>
> Signed-off-by: Dick Kennedy <[email protected]>
> Signed-off-by: James Smart <[email protected]>
> ---
> drivers/scsi/lpfc/lpfc_scsi.c | 18 +++++++++++-------
> 1 file changed, 11 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c
> index d197aa1..c100477 100644
> --- a/drivers/scsi/lpfc/lpfc_scsi.c
> +++ b/drivers/scsi/lpfc/lpfc_scsi.c
> @@ -4945,18 +4945,21 @@ lpfc_check_fcp_rsp(struct lpfc_vport *vport, struct
> lpfc_scsi_buf *lpfc_cmd)
> * 0x2002 - Success.
> **/
> static int
> -lpfc_send_taskmgmt(struct lpfc_vport *vport, struct lpfc_rport_data *rdata,
> - unsigned tgt_id, uint64_t lun_id,
> - uint8_t task_mgmt_cmd)
> +lpfc_send_taskmgmt(struct lpfc_vport *vport, struct scsi_cmnd *cmnd,
> + unsigned int tgt_id, uint64_t lun_id,
> + uint8_t task_mgmt_cmd)
> {
> struct lpfc_hba *phba = vport->phba;
> struct lpfc_scsi_buf *lpfc_cmd;
> struct lpfc_iocbq *iocbq;
> struct lpfc_iocbq *iocbqrsp;
> - struct lpfc_nodelist *pnode = rdata->pnode;
> + struct lpfc_rport_data *rdata;
> + struct lpfc_nodelist *pnode;
> int ret;
> int status;
>
> + rdata = lpfc_rport_data_from_scsi_device(cmnd->device);
if (!rdata || !rdata->pnode)
return FAILED;
As you do it in lpfc_chk_tgt_mapped() and lpfc_device_reset_handler()?
> + pnode = rdata->pnode;
> if (!pnode || !NLP_CHK_NODE_ACT(pnode))
> return FAILED;
>
> @@ -4965,6 +4968,7 @@ lpfc_send_taskmgmt(struct lpfc_vport *vport, struct
> lpfc_rport_data *rdata,
> return FAILED;
> lpfc_cmd->timeout = phba->cfg_task_mgmt_tmo;
> lpfc_cmd->rdata = rdata;
> + lpfc_cmd->pCmd = cmnd;
>
> status = lpfc_scsi_prep_task_mgmt_cmd(vport, lpfc_cmd, lun_id,
> task_mgmt_cmd);
> @@ -5171,7 +5175,7 @@ lpfc_device_reset_handler(struct scsi_cmnd *cmnd)
> fc_host_post_vendor_event(shost, fc_get_event_number(),
> sizeof(scsi_event), (char *)&scsi_event, LPFC_NL_VENDOR_ID);
>
> - status = lpfc_send_taskmgmt(vport, rdata, tgt_id, lun_id,
> + status = lpfc_send_taskmgmt(vport, cmnd, tgt_id, lun_id,
> FCP_LUN_RESET);
>
> lpfc_printf_vlog(vport, KERN_ERR, LOG_FCP,
> @@ -5249,7 +5253,7 @@ lpfc_target_reset_handler(struct scsi_cmnd *cmnd)
> fc_host_post_vendor_event(shost, fc_get_event_number(),
> sizeof(scsi_event), (char *)&scsi_event, LPFC_NL_VENDOR_ID);
>
> - status = lpfc_send_taskmgmt(vport, rdata, tgt_id, lun_id,
> + status = lpfc_send_taskmgmt(vport, cmnd, tgt_id, lun_id,
> FCP_TARGET_RESET);
>
> lpfc_printf_vlog(vport, KERN_ERR, LOG_FCP,
> @@ -5328,7 +5332,7 @@ lpfc_bus_reset_handler(struct scsi_cmnd *cmnd)
> if (!match)
> continue;
>
> - status = lpfc_send_taskmgmt(vport, ndlp->rport->dd_data,
> + status = lpfc_send_taskmgmt(vport, cmnd,
> i, 0, FCP_TARGET_RESET);
>
> if (status != SUCCESS) {
> --
> 2.5.0
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
Johannes Thumshirn Storage
[email protected] +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: Felix Imendörffer, Jane Smithard, Graham Norton
HRB 21284 (AG Nürnberg)
Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html