ipv6: Avoid double dst_free
authorMartin KaFai Lau <kafai@fb.com>
Tue, 15 Sep 2015 21:30:08 +0000 (14:30 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 15 Sep 2015 21:53:05 +0000 (14:53 -0700)
commit8e3d5be7368107f0c27a1f8126d79b01a47e9567
tree9930ab62052124ba2e56db04cdbab518a533f4bc
parentcdf3464e6c6bd764277cbbe992cd12da735b92fb
ipv6: Avoid double dst_free

It is a prep work to get dst freeing from fib tree undergo
a rcu grace period.

The following is a common paradigm:
if (ip6_del_rt(rt))
dst_free(rt)

which means, if rt cannot be deleted from the fib tree, dst_free(rt) now.
1. We don't know the ip6_del_rt(rt) failure is because it
   was not managed by fib tree (e.g. DST_NOCACHE) or it had already been
   removed from the fib tree.
2. If rt had been managed by the fib tree, ip6_del_rt(rt) failure means
   dst_free(rt) has been called already.  A second
   dst_free(rt) is not always obviously safe.  The rt may have
   been destroyed already.
3. If rt is a DST_NOCACHE, dst_free(rt) should not be called.
4. It is a stopper to make dst freeing from fib tree undergo a
   rcu grace period.

This patch is to use a DST_NOCACHE flag to indicate a rt is
not managed by the fib tree.

Signed-off-by: Martin KaFai Lau <kafai@fb.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv6/addrconf.c
net/ipv6/ip6_fib.c
net/ipv6/route.c