This patch prohibits sysctl's registrations for devices, initialized in non-init
network namespace. This is required due to absense of the sysctl virtualization.

Signed-off-by: Dmitry Mishin <[EMAIL PROTECTED]>

---
 net/ipv4/devinet.c |   26 ++++++++++++++++----------
 1 file changed, 16 insertions(+), 10 deletions(-)

--- linux-2.6.20-rc4-mm1.net_ns.orig/net/ipv4/devinet.c
+++ linux-2.6.20-rc4-mm1.net_ns/net/ipv4/devinet.c
@@ -160,15 +160,17 @@ struct in_device *inetdev_init(struct ne
        /* Reference in_dev->dev */
        dev_hold(dev);
 #ifdef CONFIG_SYSCTL
-       neigh_sysctl_register(dev, in_dev->arp_parms, NET_IPV4,
-                             NET_IPV4_NEIGH, "ipv4", NULL, NULL);
+       if (current_net_ns == &init_net_ns)
+               neigh_sysctl_register(dev, in_dev->arp_parms, NET_IPV4,
+                               NET_IPV4_NEIGH, "ipv4", NULL, NULL);
 #endif
 
        /* Account for reference dev->ip_ptr (below) */
        in_dev_hold(in_dev);
 
 #ifdef CONFIG_SYSCTL
-       devinet_sysctl_register(in_dev, &in_dev->cnf);
+       if (current_net_ns == &init_net_ns)
+               devinet_sysctl_register(in_dev, &in_dev->cnf);
 #endif
        ip_mc_init_dev(in_dev);
        if (dev->flags & IFF_UP)
@@ -211,13 +213,15 @@ static void inetdev_destroy(struct in_de
        }
 
 #ifdef CONFIG_SYSCTL
-       devinet_sysctl_unregister(&in_dev->cnf);
+       if (current_net_ns == &init_net_ns)
+               devinet_sysctl_unregister(&in_dev->cnf);
 #endif
 
        dev->ip_ptr = NULL;
 
 #ifdef CONFIG_SYSCTL
-       neigh_sysctl_unregister(in_dev->arp_parms);
+       if (current_net_ns == &init_net_ns)
+               neigh_sysctl_unregister(in_dev->arp_parms);
 #endif
        neigh_parms_release(&arp_tbl, in_dev->arp_parms);
        arp_ifdown(dev);
@@ -1105,11 +1109,13 @@ static int inetdev_event(struct notifier
                inetdev_changename(dev, in_dev);
 
 #ifdef CONFIG_SYSCTL
-               devinet_sysctl_unregister(&in_dev->cnf);
-               neigh_sysctl_unregister(in_dev->arp_parms);
-               neigh_sysctl_register(dev, in_dev->arp_parms, NET_IPV4,
-                                     NET_IPV4_NEIGH, "ipv4", NULL, NULL);
-               devinet_sysctl_register(in_dev, &in_dev->cnf);
+               if (current_net_ns == &init_net_ns) {
+                       devinet_sysctl_unregister(&in_dev->cnf);
+                       neigh_sysctl_unregister(in_dev->arp_parms);
+                       neigh_sysctl_register(dev, in_dev->arp_parms, NET_IPV4,
+                                             NET_IPV4_NEIGH, "ipv4", NULL, 
NULL);
+                       devinet_sysctl_register(in_dev, &in_dev->cnf);
+               }
 #endif
                break;
        }
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to