[PATCH] fib_trie.c node freeing fix
Please apply to 2.6.{14,15,16} -stable, thanks a lot.
From: Robert Olsson <robert.olsson@its.uu.se>
[FIB_TRIE]: Fix leaf freeing.
Seems like leaf (end-nodes) has been freed by __tnode_free_rcu and not
by __leaf_free_rcu. This fixes the problem. Only tnode_free is now
used which checks for appropriate node type. free_leaf can be removed.
Signed-off-by: Robert Olsson <robert.olsson@its.uu.se>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
097189fd24
commit
41ccbdde2b
+6
-6
@@ -314,11 +314,6 @@ static void __leaf_free_rcu(struct rcu_head *head)
|
||||
kfree(container_of(head, struct leaf, rcu));
|
||||
}
|
||||
|
||||
static inline void free_leaf(struct leaf *leaf)
|
||||
{
|
||||
call_rcu(&leaf->rcu, __leaf_free_rcu);
|
||||
}
|
||||
|
||||
static void __leaf_info_free_rcu(struct rcu_head *head)
|
||||
{
|
||||
kfree(container_of(head, struct leaf_info, rcu));
|
||||
@@ -357,7 +352,12 @@ static void __tnode_free_rcu(struct rcu_head *head)
|
||||
|
||||
static inline void tnode_free(struct tnode *tn)
|
||||
{
|
||||
call_rcu(&tn->rcu, __tnode_free_rcu);
|
||||
if(IS_LEAF(tn)) {
|
||||
struct leaf *l = (struct leaf *) tn;
|
||||
call_rcu_bh(&l->rcu, __leaf_free_rcu);
|
||||
}
|
||||
else
|
||||
call_rcu(&tn->rcu, __tnode_free_rcu);
|
||||
}
|
||||
|
||||
static struct leaf *leaf_new(void)
|
||||
|
||||
Reference in New Issue
Block a user