Commit 72fa396b authored by Vasu Dev's avatar Vasu Dev Committed by James Bottomley

[SCSI] fcoe, libfc: initialize EM anchors list and then update npiv EMs

EM anchors list initialization for only master port was not enough to
keep npiv working as described here:-
https://lists.open-fcoe.org/pipermail/devel/2011-January/011063.html

So this patch moves fc_exch_mgr_list_clone to update npiv ports
EMs once EM anchors list initialized.

Also some cleanup, no need to set lport = NULL as that always
get initialized later.
Signed-off-by: default avatarVasu Dev <vasu.dev@intel.com>
Signed-off-by: default avatarRobert Love <robert.w.love@intel.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
parent f3162483
...@@ -928,8 +928,9 @@ static struct fc_lport *fcoe_if_create(struct fcoe_interface *fcoe, ...@@ -928,8 +928,9 @@ static struct fc_lport *fcoe_if_create(struct fcoe_interface *fcoe,
struct device *parent, int npiv) struct device *parent, int npiv)
{ {
struct net_device *netdev = fcoe->netdev; struct net_device *netdev = fcoe->netdev;
struct fc_lport *lport = NULL; struct fc_lport *lport, *n_port;
struct fcoe_port *port; struct fcoe_port *port;
struct Scsi_Host *shost;
int rc; int rc;
/* /*
* parent is only a vport if npiv is 1, * parent is only a vport if npiv is 1,
...@@ -939,13 +940,11 @@ static struct fc_lport *fcoe_if_create(struct fcoe_interface *fcoe, ...@@ -939,13 +940,11 @@ static struct fc_lport *fcoe_if_create(struct fcoe_interface *fcoe,
FCOE_NETDEV_DBG(netdev, "Create Interface\n"); FCOE_NETDEV_DBG(netdev, "Create Interface\n");
if (!npiv) { if (!npiv)
lport = libfc_host_alloc(&fcoe_shost_template, lport = libfc_host_alloc(&fcoe_shost_template, sizeof(*port));
sizeof(struct fcoe_port)); else
} else { lport = libfc_vport_create(vport, sizeof(*port));
lport = libfc_vport_create(vport,
sizeof(struct fcoe_port));
}
if (!lport) { if (!lport) {
FCOE_NETDEV_DBG(netdev, "Could not allocate host structure\n"); FCOE_NETDEV_DBG(netdev, "Could not allocate host structure\n");
rc = -ENOMEM; rc = -ENOMEM;
...@@ -998,24 +997,27 @@ static struct fc_lport *fcoe_if_create(struct fcoe_interface *fcoe, ...@@ -998,24 +997,27 @@ static struct fc_lport *fcoe_if_create(struct fcoe_interface *fcoe,
goto out_lp_destroy; goto out_lp_destroy;
} }
if (!npiv) { /*
/* * fcoe_em_alloc() and fcoe_hostlist_add() both
* fcoe_em_alloc() and fcoe_hostlist_add() both * need to be atomic with respect to other changes to the
* need to be atomic with respect to other changes to the * hostlist since fcoe_em_alloc() looks for an existing EM
* hostlist 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
* This is currently handled through the fcoe_config_mutex * begin held.
* begin held. */
*/ if (!npiv)
/* lport exch manager allocation */ /* lport exch manager allocation */
rc = fcoe_em_config(lport); rc = fcoe_em_config(lport);
if (rc) { else {
FCOE_NETDEV_DBG(netdev, "Could not configure the EM " shost = vport_to_shost(vport);
"for the interface\n"); n_port = shost_priv(shost);
goto out_lp_destroy; rc = fc_exch_mgr_list_clone(n_port, lport);
} }
if (rc) {
FCOE_NETDEV_DBG(netdev, "Could not configure the EM\n");
goto out_lp_destroy;
} }
fcoe_interface_get(fcoe); fcoe_interface_get(fcoe);
......
...@@ -2175,6 +2175,7 @@ int fc_exch_mgr_list_clone(struct fc_lport *src, struct fc_lport *dst) ...@@ -2175,6 +2175,7 @@ int fc_exch_mgr_list_clone(struct fc_lport *src, struct fc_lport *dst)
fc_exch_mgr_del(ema); fc_exch_mgr_del(ema);
return -ENOMEM; return -ENOMEM;
} }
EXPORT_SYMBOL(fc_exch_mgr_list_clone);
/** /**
* fc_exch_mgr_alloc() - Allocate an exchange manager * fc_exch_mgr_alloc() - Allocate an exchange manager
......
...@@ -1590,6 +1590,7 @@ void fc_lport_enter_flogi(struct fc_lport *lport) ...@@ -1590,6 +1590,7 @@ void fc_lport_enter_flogi(struct fc_lport *lport)
*/ */
int fc_lport_config(struct fc_lport *lport) int fc_lport_config(struct fc_lport *lport)
{ {
INIT_LIST_HEAD(&lport->ema_list);
INIT_DELAYED_WORK(&lport->retry_work, fc_lport_timeout); INIT_DELAYED_WORK(&lport->retry_work, fc_lport_timeout);
mutex_init(&lport->lp_mutex); mutex_init(&lport->lp_mutex);
......
...@@ -37,9 +37,7 @@ struct fc_lport *libfc_vport_create(struct fc_vport *vport, int privsize) ...@@ -37,9 +37,7 @@ struct fc_lport *libfc_vport_create(struct fc_vport *vport, int privsize)
vn_port = libfc_host_alloc(shost->hostt, privsize); vn_port = libfc_host_alloc(shost->hostt, privsize);
if (!vn_port) if (!vn_port)
goto err_out; return vn_port;
if (fc_exch_mgr_list_clone(n_port, vn_port))
goto err_put;
vn_port->vport = vport; vn_port->vport = vport;
vport->dd_data = vn_port; vport->dd_data = vn_port;
...@@ -49,11 +47,6 @@ struct fc_lport *libfc_vport_create(struct fc_vport *vport, int privsize) ...@@ -49,11 +47,6 @@ struct fc_lport *libfc_vport_create(struct fc_vport *vport, int privsize)
mutex_unlock(&n_port->lp_mutex); mutex_unlock(&n_port->lp_mutex);
return vn_port; return vn_port;
err_put:
scsi_host_put(vn_port->host);
err_out:
return NULL;
} }
EXPORT_SYMBOL(libfc_vport_create); EXPORT_SYMBOL(libfc_vport_create);
......
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