mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-22 23:04:43 +00:00
net/ipv6: separate handling of FIB entries from dst based routes
Last step before flipping the data type for FIB entries: - use fib6_info_alloc to create FIB entries in ip6_route_info_create and addrconf_dst_alloc - use fib6_info_release in place of dst_release, ip6_rt_put and rt6_release - remove the dst_hold before calling __ip6_ins_rt or ip6_del_rt - when purging routes, drop per-cpu routes - replace inc and dec of rt6i_ref with fib6_info_hold and fib6_info_release - use rt->from since it points to the FIB entry - drop references to exception bucket, fib6_metrics and per-cpu from dst entries (those are relevant for fib entries only) Signed-off-by: David Ahern <dsahern@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
a64efe142f
commit
93531c6743
8 changed files with 115 additions and 152 deletions
|
@ -213,7 +213,7 @@ static void aca_put(struct ifacaddr6 *ac)
|
|||
{
|
||||
if (refcount_dec_and_test(&ac->aca_refcnt)) {
|
||||
in6_dev_put(ac->aca_idev);
|
||||
dst_release(&ac->aca_rt->dst);
|
||||
fib6_info_release(ac->aca_rt);
|
||||
kfree(ac);
|
||||
}
|
||||
}
|
||||
|
@ -231,6 +231,7 @@ static struct ifacaddr6 *aca_alloc(struct rt6_info *rt,
|
|||
aca->aca_addr = *addr;
|
||||
in6_dev_hold(idev);
|
||||
aca->aca_idev = idev;
|
||||
fib6_info_hold(rt);
|
||||
aca->aca_rt = rt;
|
||||
aca->aca_users = 1;
|
||||
/* aca_tstamp should be updated upon changes */
|
||||
|
@ -274,7 +275,7 @@ int __ipv6_dev_ac_inc(struct inet6_dev *idev, const struct in6_addr *addr)
|
|||
}
|
||||
aca = aca_alloc(rt, addr);
|
||||
if (!aca) {
|
||||
ip6_rt_put(rt);
|
||||
fib6_info_release(rt);
|
||||
err = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
@ -330,7 +331,6 @@ int __ipv6_dev_ac_dec(struct inet6_dev *idev, const struct in6_addr *addr)
|
|||
write_unlock_bh(&idev->lock);
|
||||
addrconf_leave_solict(idev, &aca->aca_addr);
|
||||
|
||||
dst_hold(&aca->aca_rt->dst);
|
||||
ip6_del_rt(dev_net(idev->dev), aca->aca_rt);
|
||||
|
||||
aca_put(aca);
|
||||
|
@ -358,7 +358,6 @@ void ipv6_ac_destroy_dev(struct inet6_dev *idev)
|
|||
|
||||
addrconf_leave_solict(idev, &aca->aca_addr);
|
||||
|
||||
dst_hold(&aca->aca_rt->dst);
|
||||
ip6_del_rt(dev_net(idev->dev), aca->aca_rt);
|
||||
|
||||
aca_put(aca);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue