Commit c863df33 authored by Chris Leech's avatar Chris Leech Committed by James Bottomley

[SCSI] fcoe: move the host-list add/remove to keep out VN_Ports

We only want the FCoE create and destroy routines to deal with top level
N_Ports, the VN_Ports are tracked on the vport list (see scsi_transport_fc).
Signed-off-by: default avatarChris Leech <christopher.leech@intel.com>
Signed-off-by: default avatarRobert Love <robert.w.love@intel.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
parent dfc1d0fe
...@@ -616,9 +616,6 @@ static void fcoe_if_destroy(struct fc_lport *lport) ...@@ -616,9 +616,6 @@ static void fcoe_if_destroy(struct fc_lport *lport)
/* Logout of the fabric */ /* Logout of the fabric */
fc_fabric_logoff(lport); fc_fabric_logoff(lport);
/* Remove the instance from fcoe's list */
fcoe_hostlist_remove(lport);
/* Cleanup the fc_lport */ /* Cleanup the fc_lport */
fc_lport_destroy(lport); fc_lport_destroy(lport);
fc_fcp_destroy(lport); fc_fcp_destroy(lport);
...@@ -757,11 +754,13 @@ static struct fc_lport *fcoe_if_create(struct fcoe_interface *fcoe, ...@@ -757,11 +754,13 @@ static struct fc_lport *fcoe_if_create(struct fcoe_interface *fcoe,
/* /*
* fcoe_em_alloc() and fcoe_hostlist_add() both * fcoe_em_alloc() and fcoe_hostlist_add() both
* need to be atomic under fcoe_hostlist_lock * need to be atomic with respect to other changes to the hostlist
* since fcoe_em_alloc() looks for an existing EM * since fcoe_em_alloc() looks for an existing EM
* instance on host list updated by fcoe_hostlist_add(). * instance on host list updated by fcoe_hostlist_add().
*
* This is currently handled through the fcoe_config_mutex begin held.
*/ */
write_lock(&fcoe_hostlist_lock);
/* lport exch manager allocation */ /* lport exch manager allocation */
rc = fcoe_em_config(lport); rc = fcoe_em_config(lport);
if (rc) { if (rc) {
...@@ -770,10 +769,6 @@ static struct fc_lport *fcoe_if_create(struct fcoe_interface *fcoe, ...@@ -770,10 +769,6 @@ static struct fc_lport *fcoe_if_create(struct fcoe_interface *fcoe,
goto out_lp_destroy; goto out_lp_destroy;
} }
/* add to lports list */
fcoe_hostlist_add(lport);
write_unlock(&fcoe_hostlist_lock);
dev_hold(netdev); dev_hold(netdev);
fcoe_interface_get(fcoe); fcoe_interface_get(fcoe);
return lport; return lport;
...@@ -1713,6 +1708,8 @@ static int fcoe_destroy(const char *buffer, struct kernel_param *kp) ...@@ -1713,6 +1708,8 @@ static int fcoe_destroy(const char *buffer, struct kernel_param *kp)
rc = -ENODEV; rc = -ENODEV;
goto out_putdev; goto out_putdev;
} }
/* Remove the instance from fcoe's list */
fcoe_hostlist_remove(lport);
port = lport_priv(lport); port = lport_priv(lport);
fcoe = port->fcoe; fcoe = port->fcoe;
fcoe_if_destroy(lport); fcoe_if_destroy(lport);
...@@ -1782,6 +1779,9 @@ static int fcoe_create(const char *buffer, struct kernel_param *kp) ...@@ -1782,6 +1779,9 @@ static int fcoe_create(const char *buffer, struct kernel_param *kp)
/* Make this the "master" N_Port */ /* Make this the "master" N_Port */
fcoe->ctlr.lp = lport; fcoe->ctlr.lp = lport;
/* add to lports list */
fcoe_hostlist_add(lport);
/* start FIP Discovery and FLOGI */ /* start FIP Discovery and FLOGI */
lport->boot_time = jiffies; lport->boot_time = jiffies;
fc_fabric_login(lport); fc_fabric_login(lport);
...@@ -1954,8 +1954,6 @@ struct fc_lport *fcoe_hostlist_lookup(const struct net_device *netdev) ...@@ -1954,8 +1954,6 @@ struct fc_lport *fcoe_hostlist_lookup(const struct net_device *netdev)
* fcoe_hostlist_add() - Add a lport to lports list * fcoe_hostlist_add() - Add a lport to lports list
* @lp: ptr to the fc_lport to be added * @lp: ptr to the fc_lport to be added
* *
* Called with write fcoe_hostlist_lock held.
*
* Returns: 0 for success * Returns: 0 for success
*/ */
int fcoe_hostlist_add(const struct fc_lport *lport) int fcoe_hostlist_add(const struct fc_lport *lport)
...@@ -1963,12 +1961,14 @@ int fcoe_hostlist_add(const struct fc_lport *lport) ...@@ -1963,12 +1961,14 @@ int fcoe_hostlist_add(const struct fc_lport *lport)
struct fcoe_interface *fcoe; struct fcoe_interface *fcoe;
struct fcoe_port *port; struct fcoe_port *port;
write_lock_bh(&fcoe_hostlist_lock);
fcoe = fcoe_hostlist_lookup_port(fcoe_netdev(lport)); fcoe = fcoe_hostlist_lookup_port(fcoe_netdev(lport));
if (!fcoe) { if (!fcoe) {
port = lport_priv(lport); port = lport_priv(lport);
fcoe = port->fcoe; fcoe = port->fcoe;
list_add_tail(&fcoe->list, &fcoe_hostlist); list_add_tail(&fcoe->list, &fcoe_hostlist);
} }
write_unlock_bh(&fcoe_hostlist_lock);
return 0; return 0;
} }
...@@ -2045,14 +2045,21 @@ static void __exit fcoe_exit(void) ...@@ -2045,14 +2045,21 @@ static void __exit fcoe_exit(void)
{ {
unsigned int cpu; unsigned int cpu;
struct fcoe_interface *fcoe, *tmp; struct fcoe_interface *fcoe, *tmp;
LIST_HEAD(local_list);
mutex_lock(&fcoe_config_mutex); mutex_lock(&fcoe_config_mutex);
fcoe_dev_cleanup(); fcoe_dev_cleanup();
/* releases the associated fcoe hosts */ /* releases the associated fcoe hosts */
list_for_each_entry_safe(fcoe, tmp, &fcoe_hostlist, list) write_lock_bh(&fcoe_hostlist_lock);
list_splice_init(&fcoe_hostlist, &local_list);
write_unlock_bh(&fcoe_hostlist_lock);
list_for_each_entry_safe(fcoe, tmp, &local_list, list) {
list_del(&fcoe->list);
fcoe_if_destroy(fcoe->ctlr.lp); fcoe_if_destroy(fcoe->ctlr.lp);
}
unregister_hotcpu_notifier(&fcoe_cpu_notifier); unregister_hotcpu_notifier(&fcoe_cpu_notifier);
......
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