diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2012-04-19 09:41:24 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-04-20 21:22:29 -0400 |
commit | 6105e29320f662bf2f2358e2b2ff1bbf599f387f (patch) | |
tree | 20006457ae627974d428443f68687fb435e22b42 /net/ipv6/addrconf.c | |
parent | 9bdcc88fa03a09c1f0478c0d7443d0aba7872210 (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.c | 32 |
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 | ||
4638 | free_procname: | ||
4639 | kfree(t->dev_name); | ||
4640 | free: | 4617 | free: |
4641 | kfree(t); | 4618 | kfree(t); |
4642 | out: | 4619 | out: |
@@ -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 | ||