mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-12-28 16:56:26 +00:00
ipv4: Convert devinet_ioctl to per-netns RTNL.
ioctl(SIOCGIFCONF) calls dev_ifconf() that operates on the current netns. Let's use per-netns RTNL helpers in dev_ifconf() and inet_gifconf(). 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
88d1f87706
commit
7ed8da17bf
@ -64,7 +64,7 @@ int dev_ifconf(struct net *net, struct ifconf __user *uifc)
|
||||
}
|
||||
|
||||
/* Loop over the interfaces, and write an info block for each. */
|
||||
rtnl_lock();
|
||||
rtnl_net_lock(net);
|
||||
for_each_netdev(net, dev) {
|
||||
if (!pos)
|
||||
done = inet_gifconf(dev, NULL, 0, size);
|
||||
@ -72,12 +72,12 @@ int dev_ifconf(struct net *net, struct ifconf __user *uifc)
|
||||
done = inet_gifconf(dev, pos + total,
|
||||
len - total, size);
|
||||
if (done < 0) {
|
||||
rtnl_unlock();
|
||||
rtnl_net_unlock(net);
|
||||
return -EFAULT;
|
||||
}
|
||||
total += done;
|
||||
}
|
||||
rtnl_unlock();
|
||||
rtnl_net_unlock(net);
|
||||
|
||||
return put_user(total, &uifc->ifc_len);
|
||||
}
|
||||
|
@ -1314,7 +1314,7 @@ int devinet_ioctl(struct net *net, unsigned int cmd, struct ifreq *ifr)
|
||||
|
||||
int inet_gifconf(struct net_device *dev, char __user *buf, int len, int size)
|
||||
{
|
||||
struct in_device *in_dev = __in_dev_get_rtnl(dev);
|
||||
struct in_device *in_dev = __in_dev_get_rtnl_net(dev);
|
||||
const struct in_ifaddr *ifa;
|
||||
struct ifreq ifr;
|
||||
int done = 0;
|
||||
@ -1325,7 +1325,7 @@ int inet_gifconf(struct net_device *dev, char __user *buf, int len, int size)
|
||||
if (!in_dev)
|
||||
goto out;
|
||||
|
||||
in_dev_for_each_ifa_rtnl(ifa, in_dev) {
|
||||
in_dev_for_each_ifa_rtnl_net(dev_net(dev), ifa, in_dev) {
|
||||
if (!buf) {
|
||||
done += size;
|
||||
continue;
|
||||
|
Loading…
Reference in New Issue
Block a user