[SCSI] libfc: make rport module maintain the rport list
The list of remote ports (struct fc_rport_priv) has been maintained by the discovery module. In preparation for having lport->tt.rport_create() do a lookup first, maintain the rports list in the rport module. It will still be protected by the disc_mutex. The DNS rport is an exception for until after further patches. For now, do not add it to the list. The point-to-point rport will be in the discovery list. So at shutdown, it doesn't need to be separately logged out. Signed-off-by: Joe Eykholt <jeykholt@cisco.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
b5cbf08373
commit
48f00902ba
@ -115,9 +115,6 @@ static void fc_disc_rport_callback(struct fc_lport *lport,
|
|||||||
case RPORT_EV_LOGO:
|
case RPORT_EV_LOGO:
|
||||||
case RPORT_EV_FAILED:
|
case RPORT_EV_FAILED:
|
||||||
case RPORT_EV_STOP:
|
case RPORT_EV_STOP:
|
||||||
mutex_lock(&disc->disc_mutex);
|
|
||||||
list_del(&rdata->peers);
|
|
||||||
mutex_unlock(&disc->disc_mutex);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -385,9 +382,6 @@ static int fc_disc_new_target(struct fc_disc *disc,
|
|||||||
rdata = lport->tt.rport_create(lport, ids);
|
rdata = lport->tt.rport_create(lport, ids);
|
||||||
if (!rdata)
|
if (!rdata)
|
||||||
error = -ENOMEM;
|
error = -ENOMEM;
|
||||||
else
|
|
||||||
list_add_tail(&rdata->peers,
|
|
||||||
&disc->rports);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (rdata) {
|
if (rdata) {
|
||||||
@ -562,7 +556,6 @@ static int fc_disc_gpn_ft_parse(struct fc_disc *disc, void *buf, size_t len)
|
|||||||
rdata = lport->tt.rport_create(lport, &ids);
|
rdata = lport->tt.rport_create(lport, &ids);
|
||||||
if (rdata) {
|
if (rdata) {
|
||||||
rdata->ops = &fc_disc_rport_ops;
|
rdata->ops = &fc_disc_rport_ops;
|
||||||
list_add_tail(&rdata->peers, &disc->rports);
|
|
||||||
lport->tt.rport_login(rdata);
|
lport->tt.rport_login(rdata);
|
||||||
} else
|
} else
|
||||||
printk(KERN_WARNING "libfc: Failed to allocate "
|
printk(KERN_WARNING "libfc: Failed to allocate "
|
||||||
@ -709,7 +702,6 @@ static void fc_disc_single(struct fc_disc *disc, struct fc_disc_port *dp)
|
|||||||
if (rdata) {
|
if (rdata) {
|
||||||
rdata->ops = &fc_disc_rport_ops;
|
rdata->ops = &fc_disc_rport_ops;
|
||||||
kfree(dp);
|
kfree(dp);
|
||||||
list_add_tail(&rdata->peers, &disc->rports);
|
|
||||||
lport->tt.rport_login(rdata);
|
lport->tt.rport_login(rdata);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
@ -205,12 +205,11 @@ static void fc_lport_ptp_setup(struct fc_lport *lport,
|
|||||||
ids.node_name = remote_wwnn;
|
ids.node_name = remote_wwnn;
|
||||||
ids.roles = FC_RPORT_ROLE_UNKNOWN;
|
ids.roles = FC_RPORT_ROLE_UNKNOWN;
|
||||||
|
|
||||||
if (lport->ptp_rp) {
|
mutex_lock(&lport->disc.disc_mutex);
|
||||||
|
if (lport->ptp_rp)
|
||||||
lport->tt.rport_logoff(lport->ptp_rp);
|
lport->tt.rport_logoff(lport->ptp_rp);
|
||||||
lport->ptp_rp = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
lport->ptp_rp = lport->tt.rport_create(lport, &ids);
|
lport->ptp_rp = lport->tt.rport_create(lport, &ids);
|
||||||
|
mutex_unlock(&lport->disc.disc_mutex);
|
||||||
|
|
||||||
lport->tt.rport_login(lport->ptp_rp);
|
lport->tt.rport_login(lport->ptp_rp);
|
||||||
|
|
||||||
@ -931,10 +930,7 @@ static void fc_lport_reset_locked(struct fc_lport *lport)
|
|||||||
if (lport->dns_rp)
|
if (lport->dns_rp)
|
||||||
lport->tt.rport_logoff(lport->dns_rp);
|
lport->tt.rport_logoff(lport->dns_rp);
|
||||||
|
|
||||||
if (lport->ptp_rp) {
|
lport->ptp_rp = NULL;
|
||||||
lport->tt.rport_logoff(lport->ptp_rp);
|
|
||||||
lport->ptp_rp = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
lport->tt.disc_stop(lport);
|
lport->tt.disc_stop(lport);
|
||||||
|
|
||||||
@ -1304,7 +1300,9 @@ static void fc_lport_enter_dns(struct fc_lport *lport)
|
|||||||
|
|
||||||
fc_lport_state_enter(lport, LPORT_ST_DNS);
|
fc_lport_state_enter(lport, LPORT_ST_DNS);
|
||||||
|
|
||||||
|
mutex_lock(&lport->disc.disc_mutex);
|
||||||
rdata = lport->tt.rport_create(lport, &ids);
|
rdata = lport->tt.rport_create(lport, &ids);
|
||||||
|
mutex_unlock(&lport->disc.disc_mutex);
|
||||||
if (!rdata)
|
if (!rdata)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
@ -91,8 +91,7 @@ static const char *fc_rport_state_names[] = {
|
|||||||
* @lport: local port.
|
* @lport: local port.
|
||||||
* @ids: remote port identifiers.
|
* @ids: remote port identifiers.
|
||||||
*
|
*
|
||||||
* Locking note: this may be called without locks held, but
|
* Locking note: must be called with the disc_mutex held.
|
||||||
* is usually called from discovery with the disc_mutex held.
|
|
||||||
*/
|
*/
|
||||||
static struct fc_rport_priv *fc_rport_create(struct fc_lport *lport,
|
static struct fc_rport_priv *fc_rport_create(struct fc_lport *lport,
|
||||||
struct fc_rport_identifiers *ids)
|
struct fc_rport_identifiers *ids)
|
||||||
@ -115,6 +114,8 @@ static struct fc_rport_priv *fc_rport_create(struct fc_lport *lport,
|
|||||||
rdata->maxframe_size = FC_MIN_MAX_PAYLOAD;
|
rdata->maxframe_size = FC_MIN_MAX_PAYLOAD;
|
||||||
INIT_DELAYED_WORK(&rdata->retry_work, fc_rport_timeout);
|
INIT_DELAYED_WORK(&rdata->retry_work, fc_rport_timeout);
|
||||||
INIT_WORK(&rdata->event_work, fc_rport_work);
|
INIT_WORK(&rdata->event_work, fc_rport_work);
|
||||||
|
if (ids->port_id != FC_FID_DIR_SERV)
|
||||||
|
list_add(&rdata->peers, &lport->disc.rports);
|
||||||
return rdata;
|
return rdata;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -258,6 +259,12 @@ static void fc_rport_work(struct work_struct *work)
|
|||||||
port_id = rdata->ids.port_id;
|
port_id = rdata->ids.port_id;
|
||||||
mutex_unlock(&rdata->rp_mutex);
|
mutex_unlock(&rdata->rp_mutex);
|
||||||
|
|
||||||
|
if (port_id != FC_FID_DIR_SERV) {
|
||||||
|
mutex_lock(&lport->disc.disc_mutex);
|
||||||
|
list_del(&rdata->peers);
|
||||||
|
mutex_unlock(&lport->disc.disc_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
if (rport_ops->event_callback) {
|
if (rport_ops->event_callback) {
|
||||||
FC_RPORT_DBG(rdata, "callback ev %d\n", event);
|
FC_RPORT_DBG(rdata, "callback ev %d\n", event);
|
||||||
rport_ops->event_callback(lport, rdata, event);
|
rport_ops->event_callback(lport, rdata, event);
|
||||||
|
Loading…
Reference in New Issue
Block a user