aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6/addrconf.c
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2012-04-19 09:41:24 -0400
committerDavid S. Miller <davem@davemloft.net>2012-04-20 21:22:29 -0400
commit6105e29320f662bf2f2358e2b2ff1bbf599f387f (patch)
tree20006457ae627974d428443f68687fb435e22b42 /net/ipv6/addrconf.c
parent9bdcc88fa03a09c1f0478c0d7443d0aba7872210 (diff)
net ipv6: Convert addrconf to use register_net_sysctl
Using an ascii path to register_net_sysctl as opposed to the slightly awkward ctl_path allows for much simpler code. We no longer need to malloc dev_name to keep it alive the length of our sysctl register instead we can use a small temporary buffer on the stack. 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>
Diffstat (limited to 'net/ipv6/addrconf.c')
-rw-r--r--net/ipv6/addrconf.c32
1 files changed, 4 insertions, 28 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 4a839836e59c..e3b3421f8dad 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -4365,7 +4365,6 @@ static struct addrconf_sysctl_table
4365{ 4365{
4366 struct ctl_table_header *sysctl_header; 4366 struct ctl_table_header *sysctl_header;
4367 ctl_table addrconf_vars[DEVCONF_MAX+1]; 4367 ctl_table addrconf_vars[DEVCONF_MAX+1];
4368 char *dev_name;
4369} addrconf_sysctl __read_mostly = { 4368} addrconf_sysctl __read_mostly = {
4370 .sysctl_header = NULL, 4369 .sysctl_header = NULL,
4371 .addrconf_vars = { 4370 .addrconf_vars = {
@@ -4594,17 +4593,7 @@ static int __addrconf_sysctl_register(struct net *net, char *dev_name,
4594{ 4593{
4595 int i; 4594 int i;
4596 struct addrconf_sysctl_table *t; 4595 struct addrconf_sysctl_table *t;
4597 4596 char path[sizeof("net/ipv6/conf/") + IFNAMSIZ];
4598#define ADDRCONF_CTL_PATH_DEV 3
4599
4600 struct ctl_path addrconf_ctl_path[] = {
4601 { .procname = "net", },
4602 { .procname = "ipv6", },
4603 { .procname = "conf", },
4604 { /* to be set */ },
4605 { },
4606 };
4607
4608 4597
4609 t = kmemdup(&addrconf_sysctl, sizeof(*t), GFP_KERNEL); 4598 t = kmemdup(&addrconf_sysctl, sizeof(*t), GFP_KERNEL);
4610 if (t == NULL) 4599 if (t == NULL)
@@ -4616,27 +4605,15 @@ static int __addrconf_sysctl_register(struct net *net, char *dev_name,
4616 t->addrconf_vars[i].extra2 = net; 4605 t->addrconf_vars[i].extra2 = net;
4617 } 4606 }
4618 4607
4619 /* 4608 snprintf(path, sizeof(path), "net/ipv6/conf/%s", dev_name);
4620 * Make a copy of dev_name, because '.procname' is regarded as const
4621 * by sysctl and we wouldn't want anyone to change it under our feet
4622 * (see SIOCSIFNAME).
4623 */
4624 t->dev_name = kstrdup(dev_name, GFP_KERNEL);
4625 if (!t->dev_name)
4626 goto free;
4627 4609
4628 addrconf_ctl_path[ADDRCONF_CTL_PATH_DEV].procname = t->dev_name; 4610 t->sysctl_header = register_net_sysctl(net, path, t->addrconf_vars);
4629
4630 t->sysctl_header = register_net_sysctl_table(net, addrconf_ctl_path,
4631 t->addrconf_vars);
4632 if (t->sysctl_header == NULL) 4611 if (t->sysctl_header == NULL)
4633 goto free_procname; 4612 goto free;
4634 4613
4635 p->sysctl = t; 4614 p->sysctl = t;
4636 return 0; 4615 return 0;
4637 4616
4638free_procname:
4639 kfree(t->dev_name);
4640free: 4617free:
4641 kfree(t); 4618 kfree(t);
4642out: 4619out:
@@ -4653,7 +4630,6 @@ static void __addrconf_sysctl_unregister(struct ipv6_devconf *p)
4653 t = p->sysctl; 4630 t = p->sysctl;
4654 p->sysctl = NULL; 4631 p->sysctl = NULL;
4655 unregister_net_sysctl_table(t->sysctl_header); 4632 unregister_net_sysctl_table(t->sysctl_header);
4656 kfree(t->dev_name);
4657 kfree(t); 4633 kfree(t);
4658} 4634}
4659 4635