]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - net/sysctl_net.c
net sysctl: Initialize the network sysctls sooner to avoid problems.
[mirror_ubuntu-artful-kernel.git] / net / sysctl_net.c
index c3e65aebecc08f85b3d5d471d9ce65908f7ea2d8..ce97237b653f35a1380fe8432bdfa3df6535d60e 100644 (file)
@@ -88,9 +88,18 @@ static struct pernet_operations sysctl_pernet_ops = {
        .exit = sysctl_net_exit,
 };
 
-static __init int net_sysctl_init(void)
+static struct ctl_table_header *net_header;
+__init int net_sysctl_init(void)
 {
-       int ret;
+       static struct ctl_table empty[1];
+       int ret = -ENOMEM;
+       /* Avoid limitations in the sysctl implementation by
+        * registering "/proc/sys/net" as an empty directory not in a
+        * network namespace.
+        */
+       net_header = register_sysctl("net", empty);
+       if (!net_header)
+               goto out;
        ret = register_pernet_subsys(&sysctl_pernet_ops);
        if (ret)
                goto out;
@@ -100,7 +109,6 @@ static __init int net_sysctl_init(void)
 out:
        return ret;
 }
-subsys_initcall(net_sysctl_init);
 
 struct ctl_table_header *register_net_sysctl_table(struct net *net,
        const struct ctl_path *path, struct ctl_table *table)
@@ -117,6 +125,13 @@ struct ctl_table_header *register_net_sysctl_rotable(const
 }
 EXPORT_SYMBOL_GPL(register_net_sysctl_rotable);
 
+struct ctl_table_header *register_net_sysctl(struct net *net,
+       const char *path, struct ctl_table *table)
+{
+       return __register_sysctl_table(&net->sysctls, path, table);
+}
+EXPORT_SYMBOL_GPL(register_net_sysctl);
+
 void unregister_net_sysctl_table(struct ctl_table_header *header)
 {
        unregister_sysctl_table(header);