|
|
@@ -529,15 +529,20 @@ void batadv_tvlv_handler_register(struct batadv_priv *bat_priv,
|
|
|
{
|
|
|
struct batadv_tvlv_handler *tvlv_handler;
|
|
|
|
|
|
+ spin_lock_bh(&bat_priv->tvlv.handler_list_lock);
|
|
|
+
|
|
|
tvlv_handler = batadv_tvlv_handler_get(bat_priv, type, version);
|
|
|
if (tvlv_handler) {
|
|
|
+ spin_unlock_bh(&bat_priv->tvlv.handler_list_lock);
|
|
|
batadv_tvlv_handler_put(tvlv_handler);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
tvlv_handler = kzalloc(sizeof(*tvlv_handler), GFP_ATOMIC);
|
|
|
- if (!tvlv_handler)
|
|
|
+ if (!tvlv_handler) {
|
|
|
+ spin_unlock_bh(&bat_priv->tvlv.handler_list_lock);
|
|
|
return;
|
|
|
+ }
|
|
|
|
|
|
tvlv_handler->ogm_handler = optr;
|
|
|
tvlv_handler->unicast_handler = uptr;
|
|
|
@@ -547,7 +552,6 @@ void batadv_tvlv_handler_register(struct batadv_priv *bat_priv,
|
|
|
kref_init(&tvlv_handler->refcount);
|
|
|
INIT_HLIST_NODE(&tvlv_handler->list);
|
|
|
|
|
|
- spin_lock_bh(&bat_priv->tvlv.handler_list_lock);
|
|
|
kref_get(&tvlv_handler->refcount);
|
|
|
hlist_add_head_rcu(&tvlv_handler->list, &bat_priv->tvlv.handler_list);
|
|
|
spin_unlock_bh(&bat_priv->tvlv.handler_list_lock);
|