[SCSI] qla2xxx: Properly delete rports attached to a vport.
authorAndrew Vasquez <andrew.vasquez@qlogic.com>
Tue, 25 Aug 2009 18:36:20 +0000 (11:36 -0700)
committerJames Bottomley <James.Bottomley@suse.de>
Sat, 12 Sep 2009 14:35:23 +0000 (09:35 -0500)
Original code would inadvertently skip the deferred
fc_remote_port_delete() call for rports hanging off any vport.

Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: Giridhar Malavali <giridhar.malavali@qlogic.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
drivers/scsi/qla2xxx/qla_init.c
drivers/scsi/qla2xxx/qla_os.c

index f74d07a..9e3eaac 100644 (file)
@@ -3495,15 +3495,17 @@ qla2x00_loop_resync(scsi_qla_host_t *vha)
 }
 
 void
-qla2x00_update_fcports(scsi_qla_host_t *vha)
+qla2x00_update_fcports(scsi_qla_host_t *base_vha)
 {
        fc_port_t *fcport;
+       struct scsi_qla_host *tvp, *vha;
 
        /* Go with deferred removal of rport references. */
-       list_for_each_entry(fcport, &vha->vp_fcports, list)
-               if (fcport && fcport->drport &&
-                   atomic_read(&fcport->state) != FCS_UNCONFIGURED)
-                       qla2x00_rport_del(fcport);
+       list_for_each_entry_safe(vha, tvp, &base_vha->hw->vp_list, list)
+               list_for_each_entry(fcport, &vha->vp_fcports, list)
+                       if (fcport && fcport->drport &&
+                           atomic_read(&fcport->state) != FCS_UNCONFIGURED)
+                               qla2x00_rport_del(fcport);
 }
 
 /*
index 2102290..b79fca7 100644 (file)
@@ -2181,17 +2181,19 @@ qla2x00_schedule_rport_del(struct scsi_qla_host *vha, fc_port_t *fcport,
     int defer)
 {
        struct fc_rport *rport;
+       scsi_qla_host_t *base_vha;
 
        if (!fcport->rport)
                return;
 
        rport = fcport->rport;
        if (defer) {
+               base_vha = pci_get_drvdata(vha->hw->pdev);
                spin_lock_irq(vha->host->host_lock);
                fcport->drport = rport;
                spin_unlock_irq(vha->host->host_lock);
-               set_bit(FCPORT_UPDATE_NEEDED, &vha->dpc_flags);
-               qla2xxx_wake_dpc(vha);
+               set_bit(FCPORT_UPDATE_NEEDED, &base_vha->dpc_flags);
+               qla2xxx_wake_dpc(base_vha);
        } else
                fc_remote_port_delete(rport);
 }