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

Reply via email to