int ip6_del_rt(struct rt6_info *rt, struct nlmsghdr *nlh) { int err; write_lock_bh(&rt6_lock); spin_lock_bh(&rt6_dflt_lock); rt6_dflt_pointer = NULL; spin_unlock_bh(&rt6_dflt_lock); dst_release(&rt->u.dst); err = fib6_del(rt, nlh); write_unlock_bh(&rt6_lock); return err; }
static int fib6_clean_node(struct fib6_walker_t *w) { int res; struct rt6_info *rt; struct fib6_cleaner_t *c = (struct fib6_cleaner_t*)w; for (rt = w->leaf; rt; rt = rt->u.next) { res = c->func(rt, c->arg); if (res < 0) { w->leaf = rt; res = fib6_del(rt); if (res) { #if RT6_DEBUG >= 2 printk(KERN_DEBUG "fib6_clean_node: del failed: rt=%p@%p err=%d\n", rt, rt->rt6i_node, res); #endif continue; } return 0; } BUG_TRAP(res==0); } w->leaf = rt; return 0; }