Commit 9be17fc4 authored by Bhanu Prakash Gollapudi's avatar Bhanu Prakash Gollapudi Committed by James Bottomley

[SCSI] bnx2fc: Reorganize cleanup code between interface_cleanup and if_destory

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: default avatarBhanu Prakash Gollapudi <bprakash@broadcom.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent 776cebca
...@@ -1384,16 +1384,10 @@ static struct fc_lport *bnx2fc_if_create(struct bnx2fc_interface *interface, ...@@ -1384,16 +1384,10 @@ static struct fc_lport *bnx2fc_if_create(struct bnx2fc_interface *interface,
static void bnx2fc_interface_cleanup(struct bnx2fc_interface *interface) static void bnx2fc_interface_cleanup(struct bnx2fc_interface *interface)
{ {
/* Dont listen for Ethernet packets anymore */ struct fc_lport *lport = interface->ctlr.lp;
__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 fcoe_port *port = lport_priv(lport); struct fcoe_port *port = lport_priv(lport);
struct bnx2fc_lport *blport, *tmp; struct bnx2fc_lport *blport, *tmp;
struct bnx2fc_hba *hba = interface->hba;
/* Stop the transmit retry timer */ /* Stop the transmit retry timer */
del_timer_sync(&port->timer); del_timer_sync(&port->timer);
...@@ -1401,6 +1395,24 @@ static void bnx2fc_if_destroy(struct fc_lport *lport, struct bnx2fc_hba *hba) ...@@ -1401,6 +1395,24 @@ static void bnx2fc_if_destroy(struct fc_lport *lport, struct bnx2fc_hba *hba)
/* Free existing transmit skbs */ /* Free existing transmit skbs */
fcoe_clean_pending_queue(lport); 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 */ /* Free queued packets for the receive thread */
bnx2fc_clean_rx_queue(lport); bnx2fc_clean_rx_queue(lport);
...@@ -1417,15 +1429,6 @@ static void bnx2fc_if_destroy(struct fc_lport *lport, struct bnx2fc_hba *hba) ...@@ -1417,15 +1429,6 @@ static void bnx2fc_if_destroy(struct fc_lport *lport, struct bnx2fc_hba *hba)
/* Free memory used by statistical counters */ /* Free memory used by statistical counters */
fc_lport_free_stats(lport); 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 */ /* Release Scsi_Host */
scsi_host_put(lport->host); scsi_host_put(lport->host);
} }
...@@ -1443,7 +1446,6 @@ static void bnx2fc_if_destroy(struct fc_lport *lport, struct bnx2fc_hba *hba) ...@@ -1443,7 +1446,6 @@ static void bnx2fc_if_destroy(struct fc_lport *lport, struct bnx2fc_hba *hba)
static int bnx2fc_destroy(struct net_device *netdev) static int bnx2fc_destroy(struct net_device *netdev)
{ {
struct bnx2fc_interface *interface = NULL; struct bnx2fc_interface *interface = NULL;
struct bnx2fc_hba *hba;
struct fc_lport *lport; struct fc_lport *lport;
int rc = 0; int rc = 0;
...@@ -1457,7 +1459,6 @@ static int bnx2fc_destroy(struct net_device *netdev) ...@@ -1457,7 +1459,6 @@ static int bnx2fc_destroy(struct net_device *netdev)
goto netdev_err; goto netdev_err;
} }
hba = interface->hba;
bnx2fc_interface_cleanup(interface); bnx2fc_interface_cleanup(interface);
lport = interface->ctlr.lp; lport = interface->ctlr.lp;
...@@ -1465,7 +1466,7 @@ static int bnx2fc_destroy(struct net_device *netdev) ...@@ -1465,7 +1466,7 @@ static int bnx2fc_destroy(struct net_device *netdev)
list_del(&interface->list); list_del(&interface->list);
destroy_workqueue(interface->timer_work_queue); destroy_workqueue(interface->timer_work_queue);
bnx2fc_interface_put(interface); bnx2fc_interface_put(interface);
bnx2fc_if_destroy(lport, hba); bnx2fc_if_destroy(lport);
netdev_err: netdev_err:
mutex_unlock(&bnx2fc_dev_lock); mutex_unlock(&bnx2fc_dev_lock);
...@@ -1478,19 +1479,17 @@ static void bnx2fc_destroy_work(struct work_struct *work) ...@@ -1478,19 +1479,17 @@ static void bnx2fc_destroy_work(struct work_struct *work)
struct fcoe_port *port; struct fcoe_port *port;
struct fc_lport *lport; struct fc_lport *lport;
struct bnx2fc_interface *interface; struct bnx2fc_interface *interface;
struct bnx2fc_hba *hba;
port = container_of(work, struct fcoe_port, destroy_work); port = container_of(work, struct fcoe_port, destroy_work);
lport = port->lport; lport = port->lport;
interface = port->priv; interface = port->priv;
hba = interface->hba;
BNX2FC_HBA_DBG(lport, "Entered bnx2fc_destroy_work\n"); BNX2FC_HBA_DBG(lport, "Entered bnx2fc_destroy_work\n");
bnx2fc_port_shutdown(lport); bnx2fc_port_shutdown(lport);
rtnl_lock(); rtnl_lock();
mutex_lock(&bnx2fc_dev_lock); mutex_lock(&bnx2fc_dev_lock);
bnx2fc_if_destroy(lport, hba); bnx2fc_if_destroy(lport);
mutex_unlock(&bnx2fc_dev_lock); mutex_unlock(&bnx2fc_dev_lock);
rtnl_unlock(); rtnl_unlock();
} }
...@@ -2063,7 +2062,7 @@ static void bnx2fc_ulp_exit(struct cnic_dev *dev) ...@@ -2063,7 +2062,7 @@ static void bnx2fc_ulp_exit(struct cnic_dev *dev)
list_del(&interface->list); list_del(&interface->list);
lport = interface->ctlr.lp; lport = interface->ctlr.lp;
bnx2fc_interface_put(interface); bnx2fc_interface_put(interface);
bnx2fc_if_destroy(lport, hba); bnx2fc_if_destroy(lport);
} }
} }
mutex_unlock(&bnx2fc_dev_lock); mutex_unlock(&bnx2fc_dev_lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment