net: create device lookup API with reference tracking
[platform/kernel/linux-rpi.git] / net / ipv6 / route.c
index 392aaa3..e510a41 100644 (file)
@@ -3503,6 +3503,7 @@ int fib6_nh_init(struct net *net, struct fib6_nh *fib6_nh,
                 struct fib6_config *cfg, gfp_t gfp_flags,
                 struct netlink_ext_ack *extack)
 {
+       netdevice_tracker *dev_tracker = &fib6_nh->fib_nh_dev_tracker;
        struct net_device *dev = NULL;
        struct inet6_dev *idev = NULL;
        int addr_type;
@@ -3520,7 +3521,8 @@ int fib6_nh_init(struct net *net, struct fib6_nh *fib6_nh,
 
        err = -ENODEV;
        if (cfg->fc_ifindex) {
-               dev = dev_get_by_index(net, cfg->fc_ifindex);
+               dev = netdev_get_by_index(net, cfg->fc_ifindex,
+                                         dev_tracker, gfp_flags);
                if (!dev)
                        goto out;
                idev = in6_dev_get(dev);
@@ -3554,11 +3556,11 @@ int fib6_nh_init(struct net *net, struct fib6_nh *fib6_nh,
                /* hold loopback dev/idev if we haven't done so. */
                if (dev != net->loopback_dev) {
                        if (dev) {
-                               dev_put(dev);
+                               netdev_put(dev, dev_tracker);
                                in6_dev_put(idev);
                        }
                        dev = net->loopback_dev;
-                       dev_hold(dev);
+                       netdev_hold(dev, dev_tracker, gfp_flags);
                        idev = in6_dev_get(dev);
                        if (!idev) {
                                err = -ENODEV;
@@ -3610,8 +3612,6 @@ pcpu_alloc:
        }
 
        fib6_nh->fib_nh_dev = dev;
-       netdev_tracker_alloc(dev, &fib6_nh->fib_nh_dev_tracker, gfp_flags);
-
        fib6_nh->fib_nh_oif = dev->ifindex;
        err = 0;
 out:
@@ -3621,7 +3621,7 @@ out:
        if (err) {
                lwtstate_put(fib6_nh->fib_nh_lws);
                fib6_nh->fib_nh_lws = NULL;
-               dev_put(dev);
+               netdev_put(dev, dev_tracker);
        }
 
        return err;