|
|
@@ -268,6 +268,7 @@ static void batadv_v_elp_periodic_work(struct work_struct *work)
|
|
|
struct batadv_priv *bat_priv;
|
|
|
struct sk_buff *skb;
|
|
|
u32 elp_interval;
|
|
|
+ bool ret;
|
|
|
|
|
|
bat_v = container_of(work, struct batadv_hard_iface_bat_v, elp_wq.work);
|
|
|
hard_iface = container_of(bat_v, struct batadv_hard_iface, bat_v);
|
|
|
@@ -329,8 +330,11 @@ static void batadv_v_elp_periodic_work(struct work_struct *work)
|
|
|
* may sleep and that is not allowed in an rcu protected
|
|
|
* context. Therefore schedule a task for that.
|
|
|
*/
|
|
|
- queue_work(batadv_event_workqueue,
|
|
|
- &hardif_neigh->bat_v.metric_work);
|
|
|
+ ret = queue_work(batadv_event_workqueue,
|
|
|
+ &hardif_neigh->bat_v.metric_work);
|
|
|
+
|
|
|
+ if (!ret)
|
|
|
+ batadv_hardif_neigh_put(hardif_neigh);
|
|
|
}
|
|
|
rcu_read_unlock();
|
|
|
|