net sysctl: Initialize the network sysctls sooner to avoid problems.

If the netfilter code is modified to use register_net_sysctl_table the
kernel fails to boot because the per net sysctl infrasturce is not setup
soon enough.  So to avoid races call net_sysctl_init from sock_init().

Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Acked-by: Pavel Emelyanov <xemul@parallels.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Eric W. Biederman 2012-04-19 13:20:32 +00:00 коммит произвёл David S. Miller
Родитель bc8a36942a
Коммит 2ca794e5e8
3 изменённых файлов: 12 добавлений и 2 удалений

Просмотреть файл

@ -283,6 +283,11 @@ struct ctl_path;
struct ctl_table;
struct ctl_table_header;
#ifdef CONFIG_SYSCTL
extern int net_sysctl_init(void);
#else
static inline int net_sysctl_init(void) { return 0; }
#endif
extern struct ctl_table_header *register_net_sysctl_table(struct net *net,
const struct ctl_path *path, struct ctl_table *table);
extern struct ctl_table_header *register_net_sysctl_rotable(

Просмотреть файл

@ -2524,6 +2524,12 @@ EXPORT_SYMBOL(sock_unregister);
static int __init sock_init(void)
{
int err;
/*
* Initialize the network sysctl infrastructure.
*/
err = net_sysctl_init();
if (err)
goto out;
/*
* Initialize sock SLAB cache.

Просмотреть файл

@ -89,7 +89,7 @@ static struct pernet_operations sysctl_pernet_ops = {
};
static struct ctl_table_header *net_header;
static __init int net_sysctl_init(void)
__init int net_sysctl_init(void)
{
static struct ctl_table empty[1];
int ret = -ENOMEM;
@ -109,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)