net: use new in_dev_ifa iterators
authorFlorian Westphal <fw@strlen.de>
Fri, 31 May 2019 16:27:07 +0000 (18:27 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 3 Jun 2019 01:06:26 +0000 (18:06 -0700)
Use in_dev_for_each_ifa_rcu/rtnl instead.
This prevents sparse warnings once proper __rcu annotations are added.

Signed-off-by: Florian Westphal <fw@strlen.de>
t di# Last commands done (6 commands done):

Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/fib_frontend.c
net/ipv4/igmp.c
net/ipv6/addrconf.c
net/sctp/protocol.c
net/smc/smc_clc.c

index 76055c66326a6da45f531dfb784c0c14b9b6500d..c7cdb8d0d164fb5f5cb500725f03bcc4b87de758 100644 (file)
@@ -540,14 +540,22 @@ static int rtentry_to_fib_config(struct net *net, int cmd, struct rtentry *rt,
                cfg->fc_oif = dev->ifindex;
                cfg->fc_table = l3mdev_fib_table(dev);
                if (colon) {
-                       struct in_ifaddr *ifa;
-                       struct in_device *in_dev = __in_dev_get_rtnl(dev);
+                       const struct in_ifaddr *ifa;
+                       struct in_device *in_dev;
+
+                       in_dev = __in_dev_get_rtnl(dev);
                        if (!in_dev)
                                return -ENODEV;
+
                        *colon = ':';
-                       for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next)
+
+                       rcu_read_lock();
+                       in_dev_for_each_ifa_rcu(ifa, in_dev) {
                                if (strcmp(ifa->ifa_label, devname) == 0)
                                        break;
+                       }
+                       rcu_read_unlock();
+
                        if (!ifa)
                                return -ENODEV;
                        cfg->fc_prefsrc = ifa->ifa_local;
@@ -1177,8 +1185,8 @@ void fib_del_ifaddr(struct in_ifaddr *ifa, struct in_ifaddr *iprim)
         *
         * Scan address list to be sure that addresses are really gone.
         */
-
-       for (ifa1 = in_dev->ifa_list; ifa1; ifa1 = ifa1->ifa_next) {
+       rcu_read_lock();
+       in_dev_for_each_ifa_rcu(ifa1, in_dev) {
                if (ifa1 == ifa) {
                        /* promotion, keep the IP */
                        gone = 0;
@@ -1246,6 +1254,7 @@ void fib_del_ifaddr(struct in_ifaddr *ifa, struct in_ifaddr *iprim)
                        }
                }
        }
+       rcu_read_unlock();
 
 no_promotions:
        if (!(ok & BRD_OK))
@@ -1415,6 +1424,7 @@ static int fib_netdev_event(struct notifier_block *this, unsigned long event, vo
        struct netdev_notifier_info_ext *info_ext = ptr;
        struct in_device *in_dev;
        struct net *net = dev_net(dev);
+       struct in_ifaddr *ifa;
        unsigned int flags;
 
        if (event == NETDEV_UNREGISTER) {
@@ -1429,9 +1439,9 @@ static int fib_netdev_event(struct notifier_block *this, unsigned long event, vo
 
        switch (event) {
        case NETDEV_UP:
-               for_ifa(in_dev) {
+               in_dev_for_each_ifa_rtnl(ifa, in_dev) {
                        fib_add_ifaddr(ifa);
-               } endfor_ifa(in_dev);
+               }
 #ifdef CONFIG_IP_ROUTE_MULTIPATH
                fib_sync_up(dev, RTNH_F_DEAD);
 #endif
index eb03153dfe12b23b86d24bd08882354656ccf152..fa5732bcfc7672c6b1b6add380e39051e80bafa0 100644 (file)
@@ -336,14 +336,15 @@ static __be32 igmpv3_get_srcaddr(struct net_device *dev,
                                 const struct flowi4 *fl4)
 {
        struct in_device *in_dev = __in_dev_get_rcu(dev);
+       const struct in_ifaddr *ifa;
 
        if (!in_dev)
                return htonl(INADDR_ANY);
 
-       for_ifa(in_dev) {
+       in_dev_for_each_ifa_rcu(ifa, in_dev) {
                if (fl4->saddr == ifa->ifa_local)
                        return fl4->saddr;
-       } endfor_ifa(in_dev);
+       }
 
        return htonl(INADDR_ANY);
 }
index 6b673d4f5ca91782a38f5f626d704a36fe10568a..4c30726fa7c7246f3b7f00ba4e3c459c1cd3df55 100644 (file)
@@ -3127,11 +3127,9 @@ static void sit_add_v4_addrs(struct inet6_dev *idev)
                struct in_device *in_dev = __in_dev_get_rtnl(dev);
                if (in_dev && (dev->flags & IFF_UP)) {
                        struct in_ifaddr *ifa;
-
                        int flag = scope;
 
-                       for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) {
-
+                       in_dev_for_each_ifa_rtnl(ifa, in_dev) {
                                addr.s6_addr32[3] = ifa->ifa_local;
 
                                if (ifa->ifa_scope == RT_SCOPE_LINK)
index 23af232c0a256a6c45d875cfbf85fa6e297a441f..2d47adcb4cbe002f655a937ab89ffc0c603d3015 100644 (file)
@@ -81,7 +81,7 @@ static void sctp_v4_copy_addrlist(struct list_head *addrlist,
                return;
        }
 
-       for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) {
+       in_dev_for_each_ifa_rcu(ifa, in_dev) {
                /* Add the address to the local list.  */
                addr = kzalloc(sizeof(*addr), GFP_ATOMIC);
                if (addr) {
index 745afd82f281186f2ca1b580081714893507595f..49bcebff637899f8e5200691723f09447a41af2c 100644 (file)
@@ -97,17 +97,19 @@ static int smc_clc_prfx_set4_rcu(struct dst_entry *dst, __be32 ipv4,
                                 struct smc_clc_msg_proposal_prefix *prop)
 {
        struct in_device *in_dev = __in_dev_get_rcu(dst->dev);
+       const struct in_ifaddr *ifa;
 
        if (!in_dev)
                return -ENODEV;
-       for_ifa(in_dev) {
+
+       in_dev_for_each_ifa_rcu(ifa, in_dev) {
                if (!inet_ifa_match(ipv4, ifa))
                        continue;
                prop->prefix_len = inet_mask_len(ifa->ifa_mask);
                prop->outgoing_subnet = ifa->ifa_address & ifa->ifa_mask;
                /* prop->ipv6_prefixes_cnt = 0; already done by memset before */
                return 0;
-       } endfor_ifa(in_dev);
+       }
        return -ENOENT;
 }
 
@@ -190,14 +192,15 @@ static int smc_clc_prfx_match4_rcu(struct net_device *dev,
                                   struct smc_clc_msg_proposal_prefix *prop)
 {
        struct in_device *in_dev = __in_dev_get_rcu(dev);
+       const struct in_ifaddr *ifa;
 
        if (!in_dev)
                return -ENODEV;
-       for_ifa(in_dev) {
+       in_dev_for_each_ifa_rcu(ifa, in_dev) {
                if (prop->prefix_len == inet_mask_len(ifa->ifa_mask) &&
                    inet_ifa_match(prop->outgoing_subnet, ifa))
                        return 0;
-       } endfor_ifa(in_dev);
+       }
 
        return -ENOENT;
 }