[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: Vasu Dev <vasu.dev@intel.com> Signed-off-by: Robert Love <robert.w.love@intel.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
This commit is contained in:
parent
f31624831a
commit
72fa396bf5
|
@ -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,
|
||||||
|
|
||||||
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,
|
||||||
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)
|
||||||
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)
|
||||||
*/
|
*/
|
||||||
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)
|
||||||
|
|
||||||
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)
|
||||||
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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue