]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
[SCSI] bnx2fc: Reorganize cleanup code between interface_cleanup and if_destory
authorBhanu Prakash Gollapudi <bprakash@broadcom.com>
Fri, 5 Aug 2011 00:38:41 +0000 (17:38 -0700)
committerJoe Jin <joe.jin@oracle.com>
Thu, 17 May 2012 01:08:33 +0000 (09:08 +0800)
Move interface specific cleanup functionality to from bnx2fc_if_destroy to
bnx2fc_interface_cleanup. Do not access interface/hba in bnx2fc_if_destroy as
by the time this function is called interface may already be destroyed. This
patch is in preparation to handle NETDEV_UNREGISTER on a vlan device.

Signed-off-by: Bhanu Prakash Gollapudi <bprakash@broadcom.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
(cherry picked from commit 9be17fc43e0121e966049a323ad38a35626525c1)

Signed-off-by: Joe Jin <joe.jin@oracle.com>
drivers/scsi/bnx2fc/bnx2fc_fcoe.c

index 7927fb77354cf022abcfc536a07121f718130270..d47dbadc50f9a6f3646060f65bc9419b1ed98729 100644 (file)
@@ -1385,16 +1385,10 @@ free_blport:
 
 static void bnx2fc_interface_cleanup(struct bnx2fc_interface *interface)
 {
-       /* Dont listen for Ethernet packets anymore */
-       __dev_remove_pack(&interface->fcoe_packet_type);
-       __dev_remove_pack(&interface->fip_packet_type);
-       synchronize_net();
-}
-
-static void bnx2fc_if_destroy(struct fc_lport *lport, struct bnx2fc_hba *hba)
-{
+       struct fc_lport *lport = interface->ctlr.lp;
        struct fcoe_port *port = lport_priv(lport);
        struct bnx2fc_lport *blport, *tmp;
+       struct bnx2fc_hba *hba = interface->hba;
 
        /* Stop the transmit retry timer */
        del_timer_sync(&port->timer);
@@ -1402,6 +1396,24 @@ static void bnx2fc_if_destroy(struct fc_lport *lport, struct bnx2fc_hba *hba)
        /* Free existing transmit skbs */
        fcoe_clean_pending_queue(lport);
 
+       /* Dont listen for Ethernet packets anymore */
+       __dev_remove_pack(&interface->fcoe_packet_type);
+       __dev_remove_pack(&interface->fip_packet_type);
+       synchronize_net();
+
+       spin_lock_bh(&hba->hba_lock);
+       list_for_each_entry_safe(blport, tmp, &hba->vports, list) {
+               if (blport->lport == lport) {
+                       list_del(&blport->list);
+                       kfree(blport);
+               }
+       }
+       spin_unlock_bh(&hba->hba_lock);
+}
+
+static void bnx2fc_if_destroy(struct fc_lport *lport)
+{
+
        /* Free queued packets for the receive thread */
        bnx2fc_clean_rx_queue(lport);
 
@@ -1418,15 +1430,6 @@ static void bnx2fc_if_destroy(struct fc_lport *lport, struct bnx2fc_hba *hba)
        /* Free memory used by statistical counters */
        fc_lport_free_stats(lport);
 
-       spin_lock_bh(&hba->hba_lock);
-       list_for_each_entry_safe(blport, tmp, &hba->vports, list) {
-               if (blport->lport == lport) {
-                       list_del(&blport->list);
-                       kfree(blport);
-               }
-       }
-       spin_unlock_bh(&hba->hba_lock);
-
        /* Release Scsi_Host */
        scsi_host_put(lport->host);
 }
@@ -1444,7 +1447,6 @@ static void bnx2fc_if_destroy(struct fc_lport *lport, struct bnx2fc_hba *hba)
 static int bnx2fc_destroy(struct net_device *netdev)
 {
        struct bnx2fc_interface *interface = NULL;
-       struct bnx2fc_hba *hba;
        struct fc_lport *lport;
        int rc = 0;
 
@@ -1458,7 +1460,6 @@ static int bnx2fc_destroy(struct net_device *netdev)
                goto netdev_err;
        }
 
-       hba = interface->hba;
 
        bnx2fc_interface_cleanup(interface);
        lport = interface->ctlr.lp;
@@ -1466,7 +1467,7 @@ static int bnx2fc_destroy(struct net_device *netdev)
        list_del(&interface->list);
        destroy_workqueue(interface->timer_work_queue);
        bnx2fc_interface_put(interface);
-       bnx2fc_if_destroy(lport, hba);
+       bnx2fc_if_destroy(lport);
 
 netdev_err:
        mutex_unlock(&bnx2fc_dev_lock);
@@ -1479,19 +1480,17 @@ static void bnx2fc_destroy_work(struct work_struct *work)
        struct fcoe_port *port;
        struct fc_lport *lport;
        struct bnx2fc_interface *interface;
-       struct bnx2fc_hba *hba;
 
        port = container_of(work, struct fcoe_port, destroy_work);
        lport = port->lport;
        interface = port->priv;
-       hba = interface->hba;
 
        BNX2FC_HBA_DBG(lport, "Entered bnx2fc_destroy_work\n");
 
        bnx2fc_port_shutdown(lport);
        rtnl_lock();
        mutex_lock(&bnx2fc_dev_lock);
-       bnx2fc_if_destroy(lport, hba);
+       bnx2fc_if_destroy(lport);
        mutex_unlock(&bnx2fc_dev_lock);
        rtnl_unlock();
 }
@@ -2064,7 +2063,7 @@ static void bnx2fc_ulp_exit(struct cnic_dev *dev)
                        list_del(&interface->list);
                        lport = interface->ctlr.lp;
                        bnx2fc_interface_put(interface);
-                       bnx2fc_if_destroy(lport, hba);
+                       bnx2fc_if_destroy(lport);
                }
        }
        mutex_unlock(&bnx2fc_dev_lock);