Commit cd5a411d authored by Florian Westphal's avatar Florian Westphal Committed by David S. Miller

net: use new in_dev_ifa iterators

Use in_dev_for_each_ifa_rcu/rtnl instead.
This prevents sparse warnings once proper __rcu annotations are added.
Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>

t di# Last commands done (6 commands done):
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b8d19572
...@@ -540,14 +540,22 @@ static int rtentry_to_fib_config(struct net *net, int cmd, struct rtentry *rt, ...@@ -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_oif = dev->ifindex;
cfg->fc_table = l3mdev_fib_table(dev); cfg->fc_table = l3mdev_fib_table(dev);
if (colon) { if (colon) {
struct in_ifaddr *ifa; const struct in_ifaddr *ifa;
struct in_device *in_dev = __in_dev_get_rtnl(dev); struct in_device *in_dev;
in_dev = __in_dev_get_rtnl(dev);
if (!in_dev) if (!in_dev)
return -ENODEV; return -ENODEV;
*colon = ':'; *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) if (strcmp(ifa->ifa_label, devname) == 0)
break; break;
}
rcu_read_unlock();
if (!ifa) if (!ifa)
return -ENODEV; return -ENODEV;
cfg->fc_prefsrc = ifa->ifa_local; cfg->fc_prefsrc = ifa->ifa_local;
...@@ -1177,8 +1185,8 @@ void fib_del_ifaddr(struct in_ifaddr *ifa, struct in_ifaddr *iprim) ...@@ -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. * Scan address list to be sure that addresses are really gone.
*/ */
rcu_read_lock();
for (ifa1 = in_dev->ifa_list; ifa1; ifa1 = ifa1->ifa_next) { in_dev_for_each_ifa_rcu(ifa1, in_dev) {
if (ifa1 == ifa) { if (ifa1 == ifa) {
/* promotion, keep the IP */ /* promotion, keep the IP */
gone = 0; gone = 0;
...@@ -1246,6 +1254,7 @@ void fib_del_ifaddr(struct in_ifaddr *ifa, struct in_ifaddr *iprim) ...@@ -1246,6 +1254,7 @@ void fib_del_ifaddr(struct in_ifaddr *ifa, struct in_ifaddr *iprim)
} }
} }
} }
rcu_read_unlock();
no_promotions: no_promotions:
if (!(ok & BRD_OK)) if (!(ok & BRD_OK))
...@@ -1415,6 +1424,7 @@ static int fib_netdev_event(struct notifier_block *this, unsigned long event, vo ...@@ -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 netdev_notifier_info_ext *info_ext = ptr;
struct in_device *in_dev; struct in_device *in_dev;
struct net *net = dev_net(dev); struct net *net = dev_net(dev);
struct in_ifaddr *ifa;
unsigned int flags; unsigned int flags;
if (event == NETDEV_UNREGISTER) { if (event == NETDEV_UNREGISTER) {
...@@ -1429,9 +1439,9 @@ static int fib_netdev_event(struct notifier_block *this, unsigned long event, vo ...@@ -1429,9 +1439,9 @@ static int fib_netdev_event(struct notifier_block *this, unsigned long event, vo
switch (event) { switch (event) {
case NETDEV_UP: case NETDEV_UP:
for_ifa(in_dev) { in_dev_for_each_ifa_rtnl(ifa, in_dev) {
fib_add_ifaddr(ifa); fib_add_ifaddr(ifa);
} endfor_ifa(in_dev); }
#ifdef CONFIG_IP_ROUTE_MULTIPATH #ifdef CONFIG_IP_ROUTE_MULTIPATH
fib_sync_up(dev, RTNH_F_DEAD); fib_sync_up(dev, RTNH_F_DEAD);
#endif #endif
......
...@@ -336,14 +336,15 @@ static __be32 igmpv3_get_srcaddr(struct net_device *dev, ...@@ -336,14 +336,15 @@ static __be32 igmpv3_get_srcaddr(struct net_device *dev,
const struct flowi4 *fl4) const struct flowi4 *fl4)
{ {
struct in_device *in_dev = __in_dev_get_rcu(dev); struct in_device *in_dev = __in_dev_get_rcu(dev);
const struct in_ifaddr *ifa;
if (!in_dev) if (!in_dev)
return htonl(INADDR_ANY); return htonl(INADDR_ANY);
for_ifa(in_dev) { in_dev_for_each_ifa_rcu(ifa, in_dev) {
if (fl4->saddr == ifa->ifa_local) if (fl4->saddr == ifa->ifa_local)
return fl4->saddr; return fl4->saddr;
} endfor_ifa(in_dev); }
return htonl(INADDR_ANY); return htonl(INADDR_ANY);
} }
......
...@@ -3127,11 +3127,9 @@ static void sit_add_v4_addrs(struct inet6_dev *idev) ...@@ -3127,11 +3127,9 @@ static void sit_add_v4_addrs(struct inet6_dev *idev)
struct in_device *in_dev = __in_dev_get_rtnl(dev); struct in_device *in_dev = __in_dev_get_rtnl(dev);
if (in_dev && (dev->flags & IFF_UP)) { if (in_dev && (dev->flags & IFF_UP)) {
struct in_ifaddr *ifa; struct in_ifaddr *ifa;
int flag = scope; 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; addr.s6_addr32[3] = ifa->ifa_local;
if (ifa->ifa_scope == RT_SCOPE_LINK) if (ifa->ifa_scope == RT_SCOPE_LINK)
......
...@@ -81,7 +81,7 @@ static void sctp_v4_copy_addrlist(struct list_head *addrlist, ...@@ -81,7 +81,7 @@ static void sctp_v4_copy_addrlist(struct list_head *addrlist,
return; 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. */ /* Add the address to the local list. */
addr = kzalloc(sizeof(*addr), GFP_ATOMIC); addr = kzalloc(sizeof(*addr), GFP_ATOMIC);
if (addr) { if (addr) {
......
...@@ -97,17 +97,19 @@ static int smc_clc_prfx_set4_rcu(struct dst_entry *dst, __be32 ipv4, ...@@ -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 smc_clc_msg_proposal_prefix *prop)
{ {
struct in_device *in_dev = __in_dev_get_rcu(dst->dev); struct in_device *in_dev = __in_dev_get_rcu(dst->dev);
const struct in_ifaddr *ifa;
if (!in_dev) if (!in_dev)
return -ENODEV; return -ENODEV;
for_ifa(in_dev) {
in_dev_for_each_ifa_rcu(ifa, in_dev) {
if (!inet_ifa_match(ipv4, ifa)) if (!inet_ifa_match(ipv4, ifa))
continue; continue;
prop->prefix_len = inet_mask_len(ifa->ifa_mask); prop->prefix_len = inet_mask_len(ifa->ifa_mask);
prop->outgoing_subnet = ifa->ifa_address & ifa->ifa_mask; prop->outgoing_subnet = ifa->ifa_address & ifa->ifa_mask;
/* prop->ipv6_prefixes_cnt = 0; already done by memset before */ /* prop->ipv6_prefixes_cnt = 0; already done by memset before */
return 0; return 0;
} endfor_ifa(in_dev); }
return -ENOENT; return -ENOENT;
} }
...@@ -190,14 +192,15 @@ static int smc_clc_prfx_match4_rcu(struct net_device *dev, ...@@ -190,14 +192,15 @@ static int smc_clc_prfx_match4_rcu(struct net_device *dev,
struct smc_clc_msg_proposal_prefix *prop) struct smc_clc_msg_proposal_prefix *prop)
{ {
struct in_device *in_dev = __in_dev_get_rcu(dev); struct in_device *in_dev = __in_dev_get_rcu(dev);
const struct in_ifaddr *ifa;
if (!in_dev) if (!in_dev)
return -ENODEV; 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) && if (prop->prefix_len == inet_mask_len(ifa->ifa_mask) &&
inet_ifa_match(prop->outgoing_subnet, ifa)) inet_ifa_match(prop->outgoing_subnet, ifa))
return 0; return 0;
} endfor_ifa(in_dev); }
return -ENOENT; return -ENOENT;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment