• James Smart's avatar
    scsi: lpfc: Unsolicited ELS leaves node in incorrect state while dropping it · 9d76d467
    James Smart authored
    When a target swap happens, under certain conditions the node sends a
    LOGO. The unsolicited ELS logic responds with a reject. The logic may
    allocate a new node to handle this. Afterward, the new nodes are dropped
    incorrectly leaving them in a mis-matched state and refcounting causes a
    use-after-free situation leading to a crash.
    
    It is also possible that the unsolicited els handling finds a node which is
    in an UNUSED state. The handling moves these nodes to NPR state with a
    refcount of 1. Although the end of the discovery logic assumes a final put
    will free such a node, there are codes paths which could increment the
    reference count, thus the node is in NPR state and not released.
    Eventually this mismatch in state and refcount leads to premature release
    of the node causing a crash.
    
    Fix by always using the discovery engine DEVICE RM event to decrement and
    release the nodes (rather than explicit code that tried to do it before).
    This will take care of moving the node to the UNUSED state and then removes
    the final ref count. If there is a trigger to reuse this node, the
    transition from the UNUSED state clearly indicates that the initial
    reference is then incremented and use can continue.
    
    Link: https://lore.kernel.org/r/20201115192646.12977-8-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>
    9d76d467
lpfc_els.c 319 KB