• J
    scsi: lpfc: Fix driver crash when re-registering NVME rports. · 93a3922d
    James Smart 提交于
    During remote port loss fault testing, the driver crashed with the
    following trace:
    
    general protection fault: 0000 [#1] SMP
    RIP: ... lpfc_nvme_register_port+0x250/0x480 [lpfc]
    Call Trace:
     lpfc_nlp_state_cleanup+0x1b3/0x7a0 [lpfc]
     lpfc_nlp_set_state+0xa6/0x1d0 [lpfc]
     lpfc_cmpl_prli_prli_issue+0x213/0x440
     lpfc_disc_state_machine+0x7e/0x1e0 [lpfc]
     lpfc_cmpl_els_prli+0x18a/0x200 [lpfc]
     lpfc_sli_sp_handle_rspiocb+0x3b5/0x6f0 [lpfc]
     lpfc_sli_handle_slow_ring_event_s4+0x161/0x240 [lpfc]
     lpfc_work_done+0x948/0x14c0 [lpfc]
     lpfc_do_work+0x16f/0x180 [lpfc]
     kthread+0xc9/0xe0
     ret_from_fork+0x55/0x80
    
    After registering a new remoteport, the driver is pulling an ndlp pointer
    from the lpfc rport associated with the private area of a newly registered
    remoteport. The private area is uninitialized, so it's garbage.
    
    Correct by pulling the the lpfc rport pointer from the entering ndlp point,
    then ndlp value from at rport. Note the entering ndlp may be replacing by
    the rport->ndlp due to an address change swap.
    Signed-off-by: NDick Kennedy <dick.kennedy@broadcom.com>
    Signed-off-by: NJames Smart <james.smart@broadcom.com>
    Signed-off-by: NMartin K. Petersen <martin.petersen@oracle.com>
    93a3922d
lpfc_nvme.c 91.1 KB