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>
This commit is contained in:
Robert Olsson 2006-04-04 12:53:35 -07:00 коммит произвёл David S. Miller
Родитель 8bf4b8a108
Коммит 550e29bc96
1 изменённых файлов: 7 добавлений и 7 удалений

Просмотреть файл

@ -50,7 +50,7 @@
* Patrick McHardy <kaber@trash.net> * Patrick McHardy <kaber@trash.net>
*/ */
#define VERSION "0.406" #define VERSION "0.407"
#include <linux/config.h> #include <linux/config.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
@ -314,11 +314,6 @@ static void __leaf_free_rcu(struct rcu_head *head)
kfree(container_of(head, struct leaf, rcu)); 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) static void __leaf_info_free_rcu(struct rcu_head *head)
{ {
kfree(container_of(head, struct leaf_info, rcu)); 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) 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) static struct leaf *leaf_new(void)