[NETNS][FRAGS]: Duplicate sysctl tables for new namespaces.

Each namespace has to have own tables to tune their
different parameters, so duplicate the tables and
register them.

All the tables in sub-namespaces are temporarily made
read-only.

Signed-off-by: Pavel Emelyanov <xemul@openvz.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Pavel Emelyanov
2008-01-22 06:08:36 -08:00
committed by David S. Miller
parent 6ddc082223
commit e4a2d5c2bc
4 changed files with 79 additions and 6 deletions

View File

@@ -661,17 +661,53 @@ static struct ctl_table ip4_frags_ctl_table[] = {
static int ip4_frags_ctl_register(struct net *net)
{
struct ctl_table *table;
struct ctl_table_header *hdr;
hdr = register_net_sysctl_table(net, net_ipv4_ctl_path,
ip4_frags_ctl_table);
return hdr == NULL ? -ENOMEM : 0;
table = ip4_frags_ctl_table;
if (net != &init_net) {
table = kmemdup(table, sizeof(ip4_frags_ctl_table), GFP_KERNEL);
if (table == NULL)
goto err_alloc;
table[0].mode &= ~0222;
table[1].mode &= ~0222;
table[2].mode &= ~0222;
table[3].mode &= ~0222;
table[4].mode &= ~0222;
}
hdr = register_net_sysctl_table(net, net_ipv4_ctl_path, table);
if (hdr == NULL)
goto err_reg;
net->ipv4.frags_hdr = hdr;
return 0;
err_reg:
if (net != &init_net)
kfree(table);
err_alloc:
return -ENOMEM;
}
static void ip4_frags_ctl_unregister(struct net *net)
{
struct ctl_table *table;
table = net->ipv4.frags_hdr->ctl_table_arg;
unregister_net_sysctl_table(net->ipv4.frags_hdr);
kfree(table);
}
#else
static inline int ip4_frags_ctl_register(struct net *net)
{
return 0;
}
static inline void ip4_frags_ctl_unregister(struct net *net)
{
}
#endif
static int ipv4_frags_init_net(struct net *net)