[UNIX]: Make the unix sysctl tables per-namespace
[safe/jmp/linux-2.6] / net / unix / sysctl_net_unix.c
index b2e0407..553ef6a 100644 (file)
@@ -18,7 +18,7 @@ static ctl_table unix_table[] = {
        {
                .ctl_name       = NET_UNIX_MAX_DGRAM_QLEN,
                .procname       = "max_dgram_qlen",
-               .data           = &sysctl_unix_max_dgram_qlen,
+               .data           = &init_net.sysctl_unix_max_dgram_qlen,
                .maxlen         = sizeof(int),
                .mode           = 0644,
                .proc_handler   = &proc_dointvec
@@ -26,36 +26,39 @@ static ctl_table unix_table[] = {
        { .ctl_name = 0 }
 };
 
-static ctl_table unix_net_table[] = {
-       {
-               .ctl_name       = NET_UNIX,
-               .procname       = "unix",
-               .mode           = 0555,
-               .child          = unix_table
-       },
-       { .ctl_name = 0 }
-};
-
-static ctl_table unix_root_table[] = {
-       {
-               .ctl_name       = CTL_NET,
-               .procname       = "net",
-               .mode           = 0555,
-               .child          = unix_net_table
-       },
-       { .ctl_name = 0 }
+static struct ctl_path unix_path[] = {
+       { .procname = "net", .ctl_name = CTL_NET, },
+       { .procname = "unix", .ctl_name = NET_UNIX, },
+       { },
 };
 
-static struct ctl_table_header * unix_sysctl_header;
-
 int unix_sysctl_register(struct net *net)
 {
-       unix_sysctl_header = register_sysctl_table(unix_root_table);
-       return unix_sysctl_header == NULL ? -ENOMEM : 0;
+       struct ctl_table *table;
+
+       table = kmemdup(unix_table, sizeof(unix_table), GFP_KERNEL);
+       if (table == NULL)
+               goto err_alloc;
+
+       table[0].data = &net->sysctl_unix_max_dgram_qlen;
+       net->unix_ctl = register_net_sysctl_table(net, unix_path, table);
+       if (net->unix_ctl == NULL)
+               goto err_reg;
+
+       return 0;
+
+err_reg:
+       kfree(table);
+err_alloc:
+       return -ENOMEM;
 }
 
 void unix_sysctl_unregister(struct net *net)
 {
-       unregister_sysctl_table(unix_sysctl_header);
+       struct ctl_table *table;
+
+       table = net->unix_ctl->ctl_table_arg;
+       unregister_sysctl_table(net->unix_ctl);
+       kfree(table);
 }