OSDN Git Service

lpfc: correct device removal deadlock after link bounce
authorJames Smart <james.smart@emulex.com>
Tue, 30 Dec 2014 17:08:58 +0000 (12:08 -0500)
committerChristoph Hellwig <hch@lst.de>
Fri, 9 Jan 2015 14:44:24 +0000 (15:44 +0100)
This patch, applicable to 8G/4G/2G adapters, adds a call that
resumes transmit operations after a link bounce. Without it, targets
that tried to suspend exchanges after a link bounce (such as tape devices
using sequence level error recovery) would never resume io operation,
causing scan failures, and eventually deadlocks if a device removal
request is made.

Signed-off-by: James Smart <james.smart@emulex.com>
Signed-off-by: Dick Kennedy <dick.kennedy@emulex.com>
Reviewed-by: Ewan D. Milne <emilne@redhat.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/scsi/lpfc/lpfc_els.c

index 4c25485..c66088d 100644 (file)
@@ -2225,6 +2225,15 @@ lpfc_adisc_done(struct lpfc_vport *vport)
        if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) &&
            !(vport->fc_flag & FC_RSCN_MODE) &&
            (phba->sli_rev < LPFC_SLI_REV4)) {
+               /* The ADISCs are complete.  Doesn't matter if they
+                * succeeded or failed because the ADISC completion
+                * routine guarantees to call the state machine and
+                * the RPI is either unregistered (failed ADISC response)
+                * or the RPI is still valid and the node is marked
+                * mapped for a target.  The exchanges should be in the
+                * correct state. This code is specific to SLI3.
+                */
+               lpfc_issue_clear_la(phba, vport);
                lpfc_issue_reg_vpi(phba, vport);
                return;
        }