mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 20:51:44 +00:00
ipv4: Use per-netns RTNL helpers in inet_rtm_newaddr().
inet_rtm_to_ifa() and find_matching_ifa() are called under rtnl_net_lock(). __in_dev_get_rtnl() and in_dev_for_each_ifa_rtnl() there can use per-netns RTNL helpers. Let's define and use __in_dev_get_rtnl_net() and in_dev_for_each_ifa_rtnl_net(). Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com> Reviewed-by: Eric Dumazet <edumazet@google.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
487257786b
commit
d4b483208b
@ -226,6 +226,10 @@ static __inline__ bool bad_mask(__be32 mask, __be32 addr)
|
||||
for (ifa = rtnl_dereference((in_dev)->ifa_list); ifa; \
|
||||
ifa = rtnl_dereference(ifa->ifa_next))
|
||||
|
||||
#define in_dev_for_each_ifa_rtnl_net(net, ifa, in_dev) \
|
||||
for (ifa = rtnl_net_dereference(net, (in_dev)->ifa_list); ifa; \
|
||||
ifa = rtnl_net_dereference(net, ifa->ifa_next))
|
||||
|
||||
#define in_dev_for_each_ifa_rcu(ifa, in_dev) \
|
||||
for (ifa = rcu_dereference((in_dev)->ifa_list); ifa; \
|
||||
ifa = rcu_dereference(ifa->ifa_next))
|
||||
@ -252,6 +256,11 @@ static inline struct in_device *__in_dev_get_rtnl(const struct net_device *dev)
|
||||
return rtnl_dereference(dev->ip_ptr);
|
||||
}
|
||||
|
||||
static inline struct in_device *__in_dev_get_rtnl_net(const struct net_device *dev)
|
||||
{
|
||||
return rtnl_net_dereference(dev_net(dev), dev->ip_ptr);
|
||||
}
|
||||
|
||||
/* called with rcu_read_lock or rtnl held */
|
||||
static inline bool ip_ignore_linkdown(const struct net_device *dev)
|
||||
{
|
||||
|
@ -901,7 +901,7 @@ static struct in_ifaddr *inet_rtm_to_ifa(struct net *net, struct nlmsghdr *nlh,
|
||||
goto errout;
|
||||
}
|
||||
|
||||
in_dev = __in_dev_get_rtnl(dev);
|
||||
in_dev = __in_dev_get_rtnl_net(dev);
|
||||
err = -ENOBUFS;
|
||||
if (!in_dev)
|
||||
goto errout;
|
||||
@ -948,12 +948,12 @@ errout:
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
static struct in_ifaddr *find_matching_ifa(struct in_ifaddr *ifa)
|
||||
static struct in_ifaddr *find_matching_ifa(struct net *net, struct in_ifaddr *ifa)
|
||||
{
|
||||
struct in_device *in_dev = ifa->ifa_dev;
|
||||
struct in_ifaddr *ifa1;
|
||||
|
||||
in_dev_for_each_ifa_rtnl(ifa1, in_dev) {
|
||||
in_dev_for_each_ifa_rtnl_net(net, ifa1, in_dev) {
|
||||
if (ifa1->ifa_mask == ifa->ifa_mask &&
|
||||
inet_ifa_match(ifa1->ifa_address, ifa) &&
|
||||
ifa1->ifa_local == ifa->ifa_local)
|
||||
@ -989,7 +989,7 @@ static int inet_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh,
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
ifa_existing = find_matching_ifa(ifa);
|
||||
ifa_existing = find_matching_ifa(net, ifa);
|
||||
if (!ifa_existing) {
|
||||
/* It would be best to check for !NLM_F_CREATE here but
|
||||
* userspace already relies on not having to provide this.
|
||||
|
Loading…
Reference in New Issue
Block a user