• James Smart's avatar
    scsi: lpfc: Fix refcounting around SCSI and NVMe transport APIs · e9b11083
    James Smart authored
    Due to bug history and code review, the node reference counting approach in
    the driver isn't implemented consistently with how the scsi and nvme
    transport perform registrations and unregistrations and their callbacks.
    This resulted in many bad/stale node pointers.
    
    Reword the driver so that reference handling is performed as follows:
    
     - The initial node reference is taken on structure allocation
    
     - Take a reference on any add/register call to the transport
    
     - Remove a reference on any delete/unregister call to the transport
    
     - After the node has fully removed from both the SCSI and NVMEe transports
       (dev_loss_callbacks have called back) call the discovery engine
       DEVICE_RM event which will remove the final reference and release the
       node structure.
    
     - Alter dev_loss handling when a vport or base port is unloading.
    
     - Remove the put_node handling - no longer needed.
    
     - Rewrite the vport_delete handling on reference counts.  Part of this
       effort was driven from the FDISC not registering with the transport and
       disrupting the model for node reference counting.
    
     - Deleted lpfc_nlp_remove.  Pushed it's remaining ops into
       lpfc_nlp_release.
    
     - Several other small code cleanups.
    
    Link: https://lore.kernel.org/r/20201115192646.12977-5-james.smart@broadcom.comCo-developed-by: default avatarDick Kennedy <dick.kennedy@broadcom.com>
    Signed-off-by: default avatarDick Kennedy <dick.kennedy@broadcom.com>
    Signed-off-by: default avatarJames Smart <james.smart@broadcom.com>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    e9b11083
lpfc_els.c 317 KB