sysctl: Register the base sysctl table like any other sysctl table.
authorEric W. Biederman <ebiederm@xmission.com>
Fri, 6 Jan 2012 11:34:20 +0000 (03:34 -0800)
committerEric W. Biederman <ebiederm@xmission.com>
Wed, 25 Jan 2012 00:37:54 +0000 (16:37 -0800)
Simplify the code by treating the base sysctl table like any other
sysctl table and register it with register_sysctl_table.

To ensure this table is registered early enough to avoid problems
call sysctl_init from proc_sys_init.

Rename sysctl_net.c:sysctl_init() to net_sysctl_init() to avoid
name conflicts now that kernel/sysctl.c:sysctl_init() is no longer
static.

Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
fs/proc/proc_sysctl.c
include/linux/sysctl.h
kernel/sysctl.c
net/sysctl_net.c

index d82f4a8b4b80c1209a80bb150d2e81d8299b78fc..9d29d28af577c38b2a844a15478b8e381445dfae 100644 (file)
@@ -468,5 +468,6 @@ int __init proc_sys_init(void)
        proc_sys_root->proc_iops = &proc_sys_dir_operations;
        proc_sys_root->proc_fops = &proc_sys_dir_file_operations;
        proc_sys_root->nlink = 0;
-       return 0;
+
+       return sysctl_init();
 }
index cf3ee7f246d6c91abd492c236d6cc0d42e9d4ad8..5e3532e9599f8be12fdbcfb1dd70e35b64c29f8a 100644 (file)
@@ -1095,6 +1095,7 @@ struct ctl_table_header *register_sysctl_paths(const struct ctl_path *path,
 void unregister_sysctl_table(struct ctl_table_header * table);
 int sysctl_check_table(struct nsproxy *namespaces, struct ctl_table *table);
 
+extern int sysctl_init(void);
 #else /* CONFIG_SYSCTL */
 static inline struct ctl_table_header *register_sysctl_table(struct ctl_table * table)
 {
index d5bbddd0de24017dc473d3648f5b7d3069693aa0..ad460248acc797cead25c386de00718608b091de 100644 (file)
@@ -192,7 +192,7 @@ static int sysrq_sysctl_handler(ctl_table *table, int write,
 
 #endif
 
-static struct ctl_table root_table[];
+static struct ctl_table root_table[1];
 static struct ctl_table_root sysctl_table_root;
 static struct ctl_table_header root_table_header = {
        {{.count = 1,
@@ -222,7 +222,7 @@ int sysctl_legacy_va_layout;
 
 /* The default sysctl tables: */
 
-static struct ctl_table root_table[] = {
+static struct ctl_table sysctl_base_table[] = {
        {
                .procname       = "kernel",
                .mode           = 0555,
@@ -1747,17 +1747,12 @@ static void sysctl_set_parent(struct ctl_table *parent, struct ctl_table *table)
        }
 }
 
-static __init int sysctl_init(void)
+int __init sysctl_init(void)
 {
-       sysctl_set_parent(NULL, root_table);
-#ifdef CONFIG_SYSCTL_SYSCALL_CHECK
-       sysctl_check_table(current->nsproxy, root_table);
-#endif
+       register_sysctl_table(sysctl_base_table);
        return 0;
 }
 
-core_initcall(sysctl_init);
-
 static struct ctl_table *is_branch_in(struct ctl_table *branch,
                                      struct ctl_table *table)
 {
index e75813904f266e158a3df4649ed3813d14f47539..a6bbee2bc710e482e02ed0c2bf9380d0ae2f2a48 100644 (file)
@@ -90,7 +90,7 @@ static struct pernet_operations sysctl_pernet_ops = {
        .exit = sysctl_net_exit,
 };
 
-static __init int sysctl_init(void)
+static __init int net_sysctl_init(void)
 {
        int ret;
        ret = register_pernet_subsys(&sysctl_pernet_ops);
@@ -102,7 +102,7 @@ static __init int sysctl_init(void)
 out:
        return ret;
 }
-subsys_initcall(sysctl_init);
+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)