|
|
@@ -854,16 +854,27 @@ batadv_nc_get_nc_node(struct batadv_priv *bat_priv,
|
|
|
spinlock_t *lock; /* Used to lock list selected by "int in_coding" */
|
|
|
struct list_head *list;
|
|
|
|
|
|
+ /* Select ingoing or outgoing coding node */
|
|
|
+ if (in_coding) {
|
|
|
+ lock = &orig_neigh_node->in_coding_list_lock;
|
|
|
+ list = &orig_neigh_node->in_coding_list;
|
|
|
+ } else {
|
|
|
+ lock = &orig_neigh_node->out_coding_list_lock;
|
|
|
+ list = &orig_neigh_node->out_coding_list;
|
|
|
+ }
|
|
|
+
|
|
|
+ spin_lock_bh(lock);
|
|
|
+
|
|
|
/* Check if nc_node is already added */
|
|
|
nc_node = batadv_nc_find_nc_node(orig_node, orig_neigh_node, in_coding);
|
|
|
|
|
|
/* Node found */
|
|
|
if (nc_node)
|
|
|
- return nc_node;
|
|
|
+ goto unlock;
|
|
|
|
|
|
nc_node = kzalloc(sizeof(*nc_node), GFP_ATOMIC);
|
|
|
if (!nc_node)
|
|
|
- return NULL;
|
|
|
+ goto unlock;
|
|
|
|
|
|
/* Initialize nc_node */
|
|
|
INIT_LIST_HEAD(&nc_node->list);
|
|
|
@@ -872,22 +883,14 @@ batadv_nc_get_nc_node(struct batadv_priv *bat_priv,
|
|
|
kref_get(&orig_neigh_node->refcount);
|
|
|
nc_node->orig_node = orig_neigh_node;
|
|
|
|
|
|
- /* Select ingoing or outgoing coding node */
|
|
|
- if (in_coding) {
|
|
|
- lock = &orig_neigh_node->in_coding_list_lock;
|
|
|
- list = &orig_neigh_node->in_coding_list;
|
|
|
- } else {
|
|
|
- lock = &orig_neigh_node->out_coding_list_lock;
|
|
|
- list = &orig_neigh_node->out_coding_list;
|
|
|
- }
|
|
|
-
|
|
|
batadv_dbg(BATADV_DBG_NC, bat_priv, "Adding nc_node %pM -> %pM\n",
|
|
|
nc_node->addr, nc_node->orig_node->orig);
|
|
|
|
|
|
/* Add nc_node to orig_node */
|
|
|
- spin_lock_bh(lock);
|
|
|
kref_get(&nc_node->refcount);
|
|
|
list_add_tail_rcu(&nc_node->list, list);
|
|
|
+
|
|
|
+unlock:
|
|
|
spin_unlock_bh(lock);
|
|
|
|
|
|
return nc_node;
|