diff options
| author | Simon Wunderlich <simon.wunderlich@s2003.tu-chemnitz.de> | 2011-10-19 11:02:25 +0200 | 
|---|---|---|
| committer | Marek Lindner <lindner_marek@yahoo.de> | 2011-10-25 14:23:04 +0200 | 
| commit | 531027fcddbcf81c9937dd04f08a7e8f11fd47d2 (patch) | |
| tree | f8330a14de6bccb030e68cdece8e589ff5678b5a /net | |
| parent | 9d8523931f7f5eb8900077f0da0fbe6b8ad0010b (diff) | |
batman-adv: remove references for global tt entries
struct tt_global_entry holds a reference to an orig_node which must be
decremented before deallocating the structure.
Signed-off-by: Simon Wunderlich <siwu@hrz.tu-chemnitz.de>
Tested-by: Alexey Fisher <bug-track@fisher-privat.net>
Signed-off-by: Marek Lindner <lindner_marek@yahoo.de>
Diffstat (limited to 'net')
| -rw-r--r-- | net/batman-adv/translation-table.c | 14 | 
1 files changed, 13 insertions, 1 deletions
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c index ef1acfd7653c..ca537ed2dd0a 100644 --- a/net/batman-adv/translation-table.c +++ b/net/batman-adv/translation-table.c @@ -137,10 +137,22 @@ static void tt_local_entry_free_ref(struct tt_local_entry *tt_local_entry)  		kfree_rcu(tt_local_entry, rcu);  } +static void tt_global_entry_free_rcu(struct rcu_head *rcu) +{ +	struct tt_global_entry *tt_global_entry; + +	tt_global_entry = container_of(rcu, struct tt_global_entry, rcu); + +	if (tt_global_entry->orig_node) +		orig_node_free_ref(tt_global_entry->orig_node); + +	kfree(tt_global_entry); +} +  static void tt_global_entry_free_ref(struct tt_global_entry *tt_global_entry)  {  	if (atomic_dec_and_test(&tt_global_entry->refcount)) -		kfree_rcu(tt_global_entry, rcu); +		call_rcu(&tt_global_entry->rcu, tt_global_entry_free_rcu);  }  static void tt_local_event(struct bat_priv *bat_priv, const uint8_t *addr,  | 
