• J
    scsi: lpfc: Fix hang when downloading fw on port enabled for nvme · 84f2ddf8
    James Smart 提交于
    As part of firmware download, the adapter is reset. On the adapter the
    reset causes the function to stop and all outstanding io is terminated
    (without responses). The reset path then starts teardown of the adapter,
    starting with deregistration of the remote ports with the nvme-fc
    transport. The local port is then deregistered and the driver waits for
    local port deregistration. This never finishes.
    
    The remote port deregistrations terminated the nvme controllers, causing
    them to send aborts for all the outstanding io. The aborts were serviced in
    the driver, but stalled due to its state. The nvme layer then stops to
    reclaim it's outstanding io before continuing.  The io must be returned
    before the reset on the controller is deemed complete and the controller
    delete performed.  The remote port deregistration won't complete until all
    the controllers are terminated. And the local port deregistration won't
    complete until all controllers and remote ports are terminated. Thus things
    hang.
    
    The issue is the reset which stopped the adapter also stopped all the
    responses that would drive i/o completions, and the aborts were also
    stopped that stopped i/o completions. The driver, when resetting the
    adapter like this, needs to be generating the completions as part of the
    adapter reset so that I/O complete (in error), and any aborts are not
    queued.
    
    Fix by adding flush routines whenever the adapter port has been reset or
    discovered in error. The flush routines will generate the completions for
    the scsi and nvme outstanding io. The abort ios, if waiting, will be caught
    and flushed as well.
    Signed-off-by: NDick Kennedy <dick.kennedy@broadcom.com>
    Signed-off-by: NJames Smart <jsmart2021@gmail.com>
    Signed-off-by: NMartin K. Petersen <martin.petersen@oracle.com>
    84f2ddf8
lpfc_crtn.h 29.5 KB