===== net/ipv6/addrconf.c 1.120 vs edited ===== --- 1.120/net/ipv6/addrconf.c 2004-11-16 09:08:09 +11:00 +++ edited/net/ipv6/addrconf.c 2004-11-19 20:43:45 +11:00 @@ -2987,8 +2987,13 @@ switch (event) { case RTM_NEWADDR: dst_hold(&ifp->rt->u.dst); - if (ip6_ins_rt(ifp->rt, NULL, NULL)) + spin_lock_bh(&ifp->lock); + + if (ifp->dead || ip6_ins_rt(ifp->rt, NULL, NULL)) dst_release(&ifp->rt->u.dst); + + spin_unlock_bh(&ifp->lock); + if (ifp->idev->cnf.forwarding) addrconf_join_anycast(ifp); break; @@ -2996,11 +3001,16 @@ if (ifp->idev->cnf.forwarding) addrconf_leave_anycast(ifp); addrconf_leave_solict(ifp->idev, &ifp->addr); + dst_hold(&ifp->rt->u.dst); + spin_lock_bh(&ifp->lock); + if (ip6_del_rt(ifp->rt, NULL, NULL)) dst_free(&ifp->rt->u.dst); else dst_release(&ifp->rt->u.dst); + + spin_unlock_bh(&ifp->lock); break; } }