• James Smart's avatar
    scsi: lpfc: Fix nvmet handling of received ABTS for unmapped frames · 79d8c4ce
    James Smart authored
    The driver currently is relying on firmware to match ABTSs to existing
    exchanges. This works fine as long as an exchange has been assigned to the
    io and work posted to it. However, for unmapped frames (rxid=0xFFFF), the
    driver has yet to assign an xri. The driver was blindly saying it couldn't
    match the ABTS and sending the BA_xxx. However, the command frame may have
    been in queues waiting on xri's before posting to the nvmet_fc layer.  When
    xri's became available, the command frame would still be pushed to the
    transport and that io would execute, even though the io had been killed by
    ABTS. The initiator, seeing the io ABTS'd, would reuse the exchange for a
    different io which would be received on the target and pushed up. If the
    "zombie" io then came back down and started transmitting, the initiator
    would match the oxid and accept erroneous data. Bad things happened.
    
    Add tracking of active exchanges in the target to allow matching of a
    received ABTS against active or pending IO requests. If the ABTS is matched
    to a pending or active IO, the drive initiates cleanup and conditionally
    notifies the transport.
    Signed-off-by: default avatarDick Kennedy <dick.kennedy@broadcom.com>
    Signed-off-by: default avatarJames Smart <jsmart2021@gmail.com>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    79d8c4ce
lpfc_nvmet.c 103 KB