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: Florian Westphal <fw@strlen.de> t di# Last commands done (6 commands done): Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
b8d1957236
commit
cd5a411dba
@ -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)
|
|||||||
*
|
*
|
||||||
* 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)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
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
|
|||||||
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
|
|||||||
|
|
||||||
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,
|
|||||||
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)
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user