fn_free_alias(fa); 
fib_release_info(fa->fa_info); alias_free_mem_rcu(fa); 
fn_trie_delete(struct fib_table *tb, struct rtmsg *r, struct kern_rta *rta,		struct nlmsghdr *nlhdr, struct netlink_skb_parms *req){	struct trie *t = (struct trie *) tb->tb_data;	u32 key, mask;	int plen = r->rtm_dst_len;	u8 tos = r->rtm_tos;	struct fib_alias *fa, *fa_to_delete;	struct list_head *fa_head;	struct leaf *l;	int kill_li = 0;	struct leaf_info *li;	if (plen > 32)		return -EINVAL;	key = 0;	if (rta->rta_dst)		memcpy(&key, rta->rta_dst, 4);	key = ntohl(key);	mask = ntohl(inet_make_mask(plen));	if (key & ~mask)		return -EINVAL;	key = key & mask;	l = fib_find_node(t, key);	if (!l)		return -ESRCH;	fa_head = get_fa_head(l, plen);	fa = fib_find_alias(fa_head, tos, 0);	if (!fa)		return -ESRCH;	pr_debug("Deleting %08x/%d tos=%d t=%p\n", key, plen, tos, t);	fa_to_delete = NULL;	fa_head = fa->fa_list.prev;	list_for_each_entry(fa, fa_head, fa_list) {		struct fib_info *fi = fa->fa_info;		if (fa->fa_tos != tos)			break;		if ((!r->rtm_type ||		     fa->fa_type == r->rtm_type) &&		    (r->rtm_scope == RT_SCOPE_NOWHERE ||		     fa->fa_scope == r->rtm_scope) &&		    (!r->rtm_protocol ||		     fi->fib_protocol == r->rtm_protocol) &&		    fib_nh_match(r, nlhdr, rta, fi) == 0) {			fa_to_delete = fa;			break;		}	}	if (!fa_to_delete)		return -ESRCH;	fa = fa_to_delete;	rtmsg_fib(RTM_DELROUTE, htonl(key), fa, plen, tb->tb_id, nlhdr, req);	l = fib_find_node(t, key);	li = find_leaf_info(&l->list, plen);	write_lock_bh(&fib_lock);	list_del(&fa->fa_list);	if (list_empty(fa_head)) {		hlist_del(&li->hlist);		kill_li = 1;	}	write_unlock_bh(&fib_lock);	if (kill_li)		free_leaf_info(li);	if (hlist_empty(&l->list))		trie_leaf_remove(t, key);	if (fa->fa_state & FA_S_ACCESSED)		rt_cache_flush(-1);	fn_free_alias(fa);	return 0;}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/2373ce1ca04dd46bf2b8b0f9a799eb2a90da92fb/fib_trie.c/buggy/net/ipv4/fib_trie.c