Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Just several instances of overlapping changes. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -469,6 +469,29 @@ static int batadv_check_unicast_packet(struct batadv_priv *bat_priv,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_last_bonding_replace - Replace last_bonding_candidate of orig_node
|
||||
* @orig_node: originator node whose bonding candidates should be replaced
|
||||
* @new_candidate: new bonding candidate or NULL
|
||||
*/
|
||||
static void
|
||||
batadv_last_bonding_replace(struct batadv_orig_node *orig_node,
|
||||
struct batadv_orig_ifinfo *new_candidate)
|
||||
{
|
||||
struct batadv_orig_ifinfo *old_candidate;
|
||||
|
||||
spin_lock_bh(&orig_node->neigh_list_lock);
|
||||
old_candidate = orig_node->last_bonding_candidate;
|
||||
|
||||
if (new_candidate)
|
||||
kref_get(&new_candidate->refcount);
|
||||
orig_node->last_bonding_candidate = new_candidate;
|
||||
spin_unlock_bh(&orig_node->neigh_list_lock);
|
||||
|
||||
if (old_candidate)
|
||||
batadv_orig_ifinfo_put(old_candidate);
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_find_router - find a suitable router for this originator
|
||||
* @bat_priv: the bat priv with all the soft interface information
|
||||
@@ -576,10 +599,6 @@ next:
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
/* last_bonding_candidate is reset below, remove the old reference. */
|
||||
if (orig_node->last_bonding_candidate)
|
||||
batadv_orig_ifinfo_put(orig_node->last_bonding_candidate);
|
||||
|
||||
/* After finding candidates, handle the three cases:
|
||||
* 1) there is a next candidate, use that
|
||||
* 2) there is no next candidate, use the first of the list
|
||||
@@ -588,21 +607,28 @@ next:
|
||||
if (next_candidate) {
|
||||
batadv_neigh_node_put(router);
|
||||
|
||||
/* remove references to first candidate, we don't need it. */
|
||||
if (first_candidate) {
|
||||
batadv_neigh_node_put(first_candidate_router);
|
||||
batadv_orig_ifinfo_put(first_candidate);
|
||||
}
|
||||
kref_get(&next_candidate_router->refcount);
|
||||
router = next_candidate_router;
|
||||
orig_node->last_bonding_candidate = next_candidate;
|
||||
batadv_last_bonding_replace(orig_node, next_candidate);
|
||||
} else if (first_candidate) {
|
||||
batadv_neigh_node_put(router);
|
||||
|
||||
/* refcounting has already been done in the loop above. */
|
||||
kref_get(&first_candidate_router->refcount);
|
||||
router = first_candidate_router;
|
||||
orig_node->last_bonding_candidate = first_candidate;
|
||||
batadv_last_bonding_replace(orig_node, first_candidate);
|
||||
} else {
|
||||
orig_node->last_bonding_candidate = NULL;
|
||||
batadv_last_bonding_replace(orig_node, NULL);
|
||||
}
|
||||
|
||||
/* cleanup of candidates */
|
||||
if (first_candidate) {
|
||||
batadv_neigh_node_put(first_candidate_router);
|
||||
batadv_orig_ifinfo_put(first_candidate);
|
||||
}
|
||||
|
||||
if (next_candidate) {
|
||||
batadv_neigh_node_put(next_candidate_router);
|
||||
batadv_orig_ifinfo_put(next_candidate);
|
||||
}
|
||||
|
||||
return router;
|
||||
|
||||
Reference in New Issue
Block a user