|
@@ -2396,10 +2396,13 @@ void bond_loadbalance_arp_mon(struct work_struct *work)
|
|
struct list_head *iter;
|
|
struct list_head *iter;
|
|
int do_failover = 0;
|
|
int do_failover = 0;
|
|
|
|
|
|
- read_lock(&bond->lock);
|
|
|
|
|
|
+ if (!rtnl_trylock())
|
|
|
|
+ goto re_arm;
|
|
|
|
|
|
- if (!bond_has_slaves(bond))
|
|
|
|
|
|
+ if (!bond_has_slaves(bond)) {
|
|
|
|
+ rtnl_unlock();
|
|
goto re_arm;
|
|
goto re_arm;
|
|
|
|
+ }
|
|
|
|
|
|
oldcurrent = bond->curr_active_slave;
|
|
oldcurrent = bond->curr_active_slave;
|
|
/* see if any of the previous devices are up now (i.e. they have
|
|
/* see if any of the previous devices are up now (i.e. they have
|
|
@@ -2481,13 +2484,12 @@ void bond_loadbalance_arp_mon(struct work_struct *work)
|
|
write_unlock_bh(&bond->curr_slave_lock);
|
|
write_unlock_bh(&bond->curr_slave_lock);
|
|
unblock_netpoll_tx();
|
|
unblock_netpoll_tx();
|
|
}
|
|
}
|
|
|
|
+ rtnl_unlock();
|
|
|
|
|
|
re_arm:
|
|
re_arm:
|
|
if (bond->params.arp_interval)
|
|
if (bond->params.arp_interval)
|
|
queue_delayed_work(bond->wq, &bond->arp_work,
|
|
queue_delayed_work(bond->wq, &bond->arp_work,
|
|
msecs_to_jiffies(bond->params.arp_interval));
|
|
msecs_to_jiffies(bond->params.arp_interval));
|
|
-
|
|
|
|
- read_unlock(&bond->lock);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|