|
@@ -594,7 +594,7 @@ static unsigned long fcoe_ctlr_age_fcfs(struct fcoe_ctlr *fip)
|
|
|
}
|
|
|
|
|
|
deadline += fcf->fka_period;
|
|
|
- if (time_after(jiffies, deadline)) {
|
|
|
+ if (time_after_eq(jiffies, deadline)) {
|
|
|
if (fip->sel_fcf == fcf)
|
|
|
fip->sel_fcf = NULL;
|
|
|
list_del(&fcf->list);
|
|
@@ -612,12 +612,11 @@ static unsigned long fcoe_ctlr_age_fcfs(struct fcoe_ctlr *fip)
|
|
|
sel_time = fcf->time;
|
|
|
}
|
|
|
}
|
|
|
- if (sel_time) {
|
|
|
+ if (sel_time && !fip->sel_fcf && !fip->sel_time) {
|
|
|
sel_time += msecs_to_jiffies(FCOE_CTLR_START_DELAY);
|
|
|
fip->sel_time = sel_time;
|
|
|
- } else {
|
|
|
- fip->sel_time = 0;
|
|
|
}
|
|
|
+
|
|
|
return next_timer;
|
|
|
}
|
|
|
|
|
@@ -775,7 +774,7 @@ static void fcoe_ctlr_recv_adv(struct fcoe_ctlr *fip, struct sk_buff *skb)
|
|
|
* ignored after a usable solicited advertisement
|
|
|
* has been received.
|
|
|
*/
|
|
|
- if (fcf == fip->sel_fcf) {
|
|
|
+ if (fcf == fip->sel_fcf && !fcf->fd_flags) {
|
|
|
fip->ctlr_ka_time -= fcf->fka_period;
|
|
|
fip->ctlr_ka_time += new.fka_period;
|
|
|
if (time_before(fip->ctlr_ka_time, fip->timer.expires))
|
|
@@ -813,7 +812,7 @@ static void fcoe_ctlr_recv_adv(struct fcoe_ctlr *fip, struct sk_buff *skb)
|
|
|
* If this is the first validated FCF, note the time and
|
|
|
* set a timer to trigger selection.
|
|
|
*/
|
|
|
- if (mtu_valid && !fip->sel_time && fcoe_ctlr_fcf_usable(fcf)) {
|
|
|
+ if (mtu_valid && !fip->sel_fcf && fcoe_ctlr_fcf_usable(fcf)) {
|
|
|
fip->sel_time = jiffies +
|
|
|
msecs_to_jiffies(FCOE_CTLR_START_DELAY);
|
|
|
if (!timer_pending(&fip->timer) ||
|
|
@@ -1187,6 +1186,8 @@ static void fcoe_ctlr_timeout(unsigned long arg)
|
|
|
fip->port_ka_time = jiffies +
|
|
|
msecs_to_jiffies(FIP_VN_KA_PERIOD);
|
|
|
fip->ctlr_ka_time = jiffies + sel->fka_period;
|
|
|
+ if (time_after(next_timer, fip->ctlr_ka_time))
|
|
|
+ next_timer = fip->ctlr_ka_time;
|
|
|
} else {
|
|
|
printk(KERN_NOTICE "libfcoe: host%d: "
|
|
|
"FIP Fibre-Channel Forwarder timed out. "
|