]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
ipv4: Convert devinet_ioctl to per-netns RTNL.
authorKuniyuki Iwashima <kuniyu@amazon.com>
Mon, 21 Oct 2024 18:32:39 +0000 (11:32 -0700)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 29 Oct 2024 10:54:58 +0000 (11:54 +0100)
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>
net/core/dev_ioctl.c
net/ipv4/devinet.c

index 473c437b6b5386bd7ff4ff2256ef84ad800ce7fc..46d43b9504713202ea63cfee8042566ae5988b7f 100644 (file)
@@ -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);
 }
index fb4bc63b8fa29d09b2f3fe4baf433d77a379cff1..f58f39a9ee874fead1b159ad08a68254c310be31 100644 (file)
@@ -1314,7 +1314,7 @@ out:
 
 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;