[SCSI] qla2xxx: Add qla2x00_free_fcports() function
Chad Dupuis [Fri, 23 Jul 2010 10:28:30 +0000 (15:28 +0500)]
This function was added to encapsulate freeing the memory for all the fcports
associated with a particular vha.  Also added a call to qla2x00_free_fcports()
to qla2x00_free_device() to free the memory for all the fcports associated with
a vha during device removal.

Signed-off-by: Giridhar Malavali <giridhar.malavali@qlogic.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>

drivers/scsi/qla2xxx/qla_attr.c
drivers/scsi/qla2xxx/qla_gbl.h
drivers/scsi/qla2xxx/qla_os.c

index 7ebf365..93a4c20 100644 (file)
@@ -1827,7 +1827,6 @@ static int
 qla24xx_vport_delete(struct fc_vport *fc_vport)
 {
        scsi_qla_host_t *vha = fc_vport->dd_data;
-       fc_port_t *fcport, *tfcport;
        struct qla_hw_data *ha = vha->hw;
        uint16_t id = vha->vp_idx;
 
@@ -1841,11 +1840,7 @@ qla24xx_vport_delete(struct fc_vport *fc_vport)
 
        scsi_remove_host(vha->host);
 
-       list_for_each_entry_safe(fcport, tfcport, &vha->vp_fcports, list) {
-               list_del(&fcport->list);
-               kfree(fcport);
-               fcport = NULL;
-       }
+       qla2x00_free_fcports(vha);
 
        qla24xx_deallocate_vp_id(vha);
 
index 55f4599..84441e8 100644 (file)
@@ -122,6 +122,7 @@ extern struct scsi_qla_host *qla2x00_create_host(struct scsi_host_template *,
 extern void qla2x00_free_host(struct scsi_qla_host *);
 extern void qla2x00_relogin(struct scsi_qla_host *);
 extern void qla2x00_do_work(struct scsi_qla_host *);
+extern void qla2x00_free_fcports(struct scsi_qla_host *);
 
 /*
  * Global Functions in qla_mid.c source file.
index 5be8db7..fcdbf7a 100644 (file)
@@ -2487,11 +2487,24 @@ qla2x00_free_device(scsi_qla_host_t *vha)
 
        qla2x00_free_irqs(vha);
 
+       qla2x00_free_fcports(vha);
+
        qla2x00_mem_free(ha);
 
        qla2x00_free_queues(ha);
 }
 
+void qla2x00_free_fcports(struct scsi_qla_host *vha)
+{
+       fc_port_t *fcport, *tfcport;
+
+       list_for_each_entry_safe(fcport, tfcport, &vha->vp_fcports, list) {
+               list_del(&fcport->list);
+               kfree(fcport);
+               fcport = NULL;
+       }
+}
+
 static inline void
 qla2x00_schedule_rport_del(struct scsi_qla_host *vha, fc_port_t *fcport,
     int defer)