diff options
| author | Robert Olsson <robert.olsson@its.uu.se> | 2006-04-04 15:53:35 -0400 |
|---|---|---|
| committer | David S. Miller <davem@sunset.davemloft.net> | 2006-04-10 01:25:23 -0400 |
| commit | 550e29bc96e6f1ced2bca82dace197b009434367 (patch) | |
| tree | 423cb5460e1a25eff3d578003252b2de1b8ccaf5 | |
| parent | 8bf4b8a1083694d5aac292f92705ddd3aec29be6 (diff) | |
[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>
| -rw-r--r-- | net/ipv4/fib_trie.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index ccd3efc6a1..95a639f2e3 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c | |||
| @@ -50,7 +50,7 @@ | |||
| 50 | * Patrick McHardy <kaber@trash.net> | 50 | * Patrick McHardy <kaber@trash.net> |
| 51 | */ | 51 | */ |
| 52 | 52 | ||
| 53 | #define VERSION "0.406" | 53 | #define VERSION "0.407" |
| 54 | 54 | ||
| 55 | #include <linux/config.h> | 55 | #include <linux/config.h> |
| 56 | #include <asm/uaccess.h> | 56 | #include <asm/uaccess.h> |
| @@ -314,11 +314,6 @@ static void __leaf_free_rcu(struct rcu_head *head) | |||
| 314 | kfree(container_of(head, struct leaf, rcu)); | 314 | kfree(container_of(head, struct leaf, rcu)); |
| 315 | } | 315 | } |
| 316 | 316 | ||
| 317 | static inline void free_leaf(struct leaf *leaf) | ||
| 318 | { | ||
| 319 | call_rcu(&leaf->rcu, __leaf_free_rcu); | ||
| 320 | } | ||
| 321 | |||
| 322 | static void __leaf_info_free_rcu(struct rcu_head *head) | 317 | static void __leaf_info_free_rcu(struct rcu_head *head) |
| 323 | { | 318 | { |
| 324 | kfree(container_of(head, struct leaf_info, rcu)); | 319 | kfree(container_of(head, struct leaf_info, rcu)); |
| @@ -357,7 +352,12 @@ static void __tnode_free_rcu(struct rcu_head *head) | |||
| 357 | 352 | ||
| 358 | static inline void tnode_free(struct tnode *tn) | 353 | static inline void tnode_free(struct tnode *tn) |
| 359 | { | 354 | { |
| 360 | call_rcu(&tn->rcu, __tnode_free_rcu); | 355 | if(IS_LEAF(tn)) { |
| 356 | struct leaf *l = (struct leaf *) tn; | ||
| 357 | call_rcu_bh(&l->rcu, __leaf_free_rcu); | ||
| 358 | } | ||
| 359 | else | ||
| 360 | call_rcu(&tn->rcu, __tnode_free_rcu); | ||
| 361 | } | 361 | } |
| 362 | 362 | ||
| 363 | static struct leaf *leaf_new(void) | 363 | static struct leaf *leaf_new(void) |
