Commit f39dc1023d6b9933528638a0c2dd618b4fdf664e

Authored by Cong Wang
Committed by David S. Miller
1 parent e15a00aafa

ipv6: move in6_dev_finish_destroy() into core kernel

in6_dev_put() will be needed by vxlan module, so is
in6_dev_finish_destroy().

Cc: David S. Miller <davem@davemloft.net>
Signed-off-by: Cong Wang <amwang@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

Showing 2 changed files with 31 additions and 30 deletions Side-by-side Diff

... ... @@ -304,36 +304,6 @@
304 304 return -ENOMEM;
305 305 }
306 306  
307   -static void snmp6_free_dev(struct inet6_dev *idev)
308   -{
309   - kfree(idev->stats.icmpv6msgdev);
310   - kfree(idev->stats.icmpv6dev);
311   - snmp_mib_free((void __percpu **)idev->stats.ipv6);
312   -}
313   -
314   -/* Nobody refers to this device, we may destroy it. */
315   -
316   -void in6_dev_finish_destroy(struct inet6_dev *idev)
317   -{
318   - struct net_device *dev = idev->dev;
319   -
320   - WARN_ON(!list_empty(&idev->addr_list));
321   - WARN_ON(idev->mc_list != NULL);
322   - WARN_ON(timer_pending(&idev->rs_timer));
323   -
324   -#ifdef NET_REFCNT_DEBUG
325   - pr_debug("%s: %s\n", __func__, dev ? dev->name : "NIL");
326   -#endif
327   - dev_put(dev);
328   - if (!idev->dead) {
329   - pr_warn("Freeing alive inet6 device %p\n", idev);
330   - return;
331   - }
332   - snmp6_free_dev(idev);
333   - kfree_rcu(idev, rcu);
334   -}
335   -EXPORT_SYMBOL(in6_dev_finish_destroy);
336   -
337 307 static struct inet6_dev *ipv6_add_dev(struct net_device *dev)
338 308 {
339 309 struct inet6_dev *ndev;
net/ipv6/addrconf_core.c
... ... @@ -6,6 +6,7 @@
6 6 #include <linux/export.h>
7 7 #include <net/ipv6.h>
8 8 #include <net/addrconf.h>
  9 +#include <net/ip.h>
9 10  
10 11 #define IPV6_ADDR_SCOPE_TYPE(scope) ((scope) << 16)
11 12  
... ... @@ -117,4 +118,34 @@
117 118 EXPORT_SYMBOL(in6addr_interfacelocal_allrouters);
118 119 const struct in6_addr in6addr_sitelocal_allrouters = IN6ADDR_SITELOCAL_ALLROUTERS_INIT;
119 120 EXPORT_SYMBOL(in6addr_sitelocal_allrouters);
  121 +
  122 +static void snmp6_free_dev(struct inet6_dev *idev)
  123 +{
  124 + kfree(idev->stats.icmpv6msgdev);
  125 + kfree(idev->stats.icmpv6dev);
  126 + snmp_mib_free((void __percpu **)idev->stats.ipv6);
  127 +}
  128 +
  129 +/* Nobody refers to this device, we may destroy it. */
  130 +
  131 +void in6_dev_finish_destroy(struct inet6_dev *idev)
  132 +{
  133 + struct net_device *dev = idev->dev;
  134 +
  135 + WARN_ON(!list_empty(&idev->addr_list));
  136 + WARN_ON(idev->mc_list != NULL);
  137 + WARN_ON(timer_pending(&idev->rs_timer));
  138 +
  139 +#ifdef NET_REFCNT_DEBUG
  140 + pr_debug("%s: %s\n", __func__, dev ? dev->name : "NIL");
  141 +#endif
  142 + dev_put(dev);
  143 + if (!idev->dead) {
  144 + pr_warn("Freeing alive inet6 device %p\n", idev);
  145 + return;
  146 + }
  147 + snmp6_free_dev(idev);
  148 + kfree_rcu(idev, rcu);
  149 +}
  150 +EXPORT_SYMBOL(in6_dev_finish_destroy);