|
@@ -2175,15 +2175,13 @@ static void fcoe_ctlr_disc_stop_locked(struct fc_lport *lport)
|
|
{
|
|
{
|
|
struct fc_rport_priv *rdata;
|
|
struct fc_rport_priv *rdata;
|
|
|
|
|
|
- rcu_read_lock();
|
|
|
|
|
|
+ mutex_lock(&lport->disc.disc_mutex);
|
|
list_for_each_entry_rcu(rdata, &lport->disc.rports, peers) {
|
|
list_for_each_entry_rcu(rdata, &lport->disc.rports, peers) {
|
|
if (kref_get_unless_zero(&rdata->kref)) {
|
|
if (kref_get_unless_zero(&rdata->kref)) {
|
|
fc_rport_logoff(rdata);
|
|
fc_rport_logoff(rdata);
|
|
kref_put(&rdata->kref, fc_rport_destroy);
|
|
kref_put(&rdata->kref, fc_rport_destroy);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- rcu_read_unlock();
|
|
|
|
- mutex_lock(&lport->disc.disc_mutex);
|
|
|
|
lport->disc.disc_callback = NULL;
|
|
lport->disc.disc_callback = NULL;
|
|
mutex_unlock(&lport->disc.disc_mutex);
|
|
mutex_unlock(&lport->disc.disc_mutex);
|
|
}
|
|
}
|
|
@@ -2712,7 +2710,7 @@ static unsigned long fcoe_ctlr_vn_age(struct fcoe_ctlr *fip)
|
|
unsigned long deadline;
|
|
unsigned long deadline;
|
|
|
|
|
|
next_time = jiffies + msecs_to_jiffies(FIP_VN_BEACON_INT * 10);
|
|
next_time = jiffies + msecs_to_jiffies(FIP_VN_BEACON_INT * 10);
|
|
- rcu_read_lock();
|
|
|
|
|
|
+ mutex_lock(&lport->disc.disc_mutex);
|
|
list_for_each_entry_rcu(rdata, &lport->disc.rports, peers) {
|
|
list_for_each_entry_rcu(rdata, &lport->disc.rports, peers) {
|
|
if (!kref_get_unless_zero(&rdata->kref))
|
|
if (!kref_get_unless_zero(&rdata->kref))
|
|
continue;
|
|
continue;
|
|
@@ -2733,7 +2731,7 @@ static unsigned long fcoe_ctlr_vn_age(struct fcoe_ctlr *fip)
|
|
next_time = deadline;
|
|
next_time = deadline;
|
|
kref_put(&rdata->kref, fc_rport_destroy);
|
|
kref_put(&rdata->kref, fc_rport_destroy);
|
|
}
|
|
}
|
|
- rcu_read_unlock();
|
|
|
|
|
|
+ mutex_unlock(&lport->disc.disc_mutex);
|
|
return next_time;
|
|
return next_time;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -3080,8 +3078,6 @@ static void fcoe_ctlr_vn_disc(struct fcoe_ctlr *fip)
|
|
mutex_lock(&disc->disc_mutex);
|
|
mutex_lock(&disc->disc_mutex);
|
|
callback = disc->pending ? disc->disc_callback : NULL;
|
|
callback = disc->pending ? disc->disc_callback : NULL;
|
|
disc->pending = 0;
|
|
disc->pending = 0;
|
|
- mutex_unlock(&disc->disc_mutex);
|
|
|
|
- rcu_read_lock();
|
|
|
|
list_for_each_entry_rcu(rdata, &disc->rports, peers) {
|
|
list_for_each_entry_rcu(rdata, &disc->rports, peers) {
|
|
if (!kref_get_unless_zero(&rdata->kref))
|
|
if (!kref_get_unless_zero(&rdata->kref))
|
|
continue;
|
|
continue;
|
|
@@ -3090,7 +3086,7 @@ static void fcoe_ctlr_vn_disc(struct fcoe_ctlr *fip)
|
|
fc_rport_login(rdata);
|
|
fc_rport_login(rdata);
|
|
kref_put(&rdata->kref, fc_rport_destroy);
|
|
kref_put(&rdata->kref, fc_rport_destroy);
|
|
}
|
|
}
|
|
- rcu_read_unlock();
|
|
|
|
|
|
+ mutex_unlock(&disc->disc_mutex);
|
|
if (callback)
|
|
if (callback)
|
|
callback(lport, DISC_EV_SUCCESS);
|
|
callback(lport, DISC_EV_SUCCESS);
|
|
}
|
|
}
|