[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: Bhanu Prakash Gollapudi <bprakash@broadcom.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
Родитель
776cebcac6
Коммит
9be17fc43e
|
@ -1384,16 +1384,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);
|
||||
|
@ -1401,6 +1395,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);
|
||||
|
||||
|
@ -1417,15 +1429,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);
|
||||
}
|
||||
|
@ -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)
|
||||
{
|
||||
struct bnx2fc_interface *interface = NULL;
|
||||
struct bnx2fc_hba *hba;
|
||||
struct fc_lport *lport;
|
||||
int rc = 0;
|
||||
|
||||
|
@ -1457,7 +1459,6 @@ static int bnx2fc_destroy(struct net_device *netdev)
|
|||
goto netdev_err;
|
||||
}
|
||||
|
||||
hba = interface->hba;
|
||||
|
||||
bnx2fc_interface_cleanup(interface);
|
||||
lport = interface->ctlr.lp;
|
||||
|
@ -1465,7 +1466,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);
|
||||
|
@ -1478,19 +1479,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();
|
||||
}
|
||||
|
@ -2063,7 +2062,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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче