diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2012-04-19 09:42:09 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-04-20 21:22:30 -0400 |
commit | 8607ddb86711df4504a028cc88299d334b786bf3 (patch) | |
tree | fd00eeef53049f1ae1928ba9b06253ab343b3c77 /net/ipv4/devinet.c | |
parent | 6105e29320f662bf2f2358e2b2ff1bbf599f387f (diff) |
net ipv4: Convert devinet 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/ipv4/devinet.c')
-rw-r--r-- | net/ipv4/devinet.c | 39 |
1 files changed, 5 insertions, 34 deletions
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index 8a01bfb7c873..88c9e3f68c78 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c | |||
@@ -1585,7 +1585,6 @@ static int ipv4_doint_and_flush(ctl_table *ctl, int write, | |||
1585 | static struct devinet_sysctl_table { | 1585 | static struct devinet_sysctl_table { |
1586 | struct ctl_table_header *sysctl_header; | 1586 | struct ctl_table_header *sysctl_header; |
1587 | struct ctl_table devinet_vars[__IPV4_DEVCONF_MAX]; | 1587 | struct ctl_table devinet_vars[__IPV4_DEVCONF_MAX]; |
1588 | char *dev_name; | ||
1589 | } devinet_sysctl = { | 1588 | } devinet_sysctl = { |
1590 | .devinet_vars = { | 1589 | .devinet_vars = { |
1591 | DEVINET_SYSCTL_COMPLEX_ENTRY(FORWARDING, "forwarding", | 1590 | DEVINET_SYSCTL_COMPLEX_ENTRY(FORWARDING, "forwarding", |
@@ -1627,16 +1626,7 @@ static int __devinet_sysctl_register(struct net *net, char *dev_name, | |||
1627 | { | 1626 | { |
1628 | int i; | 1627 | int i; |
1629 | struct devinet_sysctl_table *t; | 1628 | struct devinet_sysctl_table *t; |
1630 | 1629 | char path[sizeof("net/ipv4/conf/") + IFNAMSIZ]; | |
1631 | #define DEVINET_CTL_PATH_DEV 3 | ||
1632 | |||
1633 | struct ctl_path devinet_ctl_path[] = { | ||
1634 | { .procname = "net", }, | ||
1635 | { .procname = "ipv4", }, | ||
1636 | { .procname = "conf", }, | ||
1637 | { /* to be set */ }, | ||
1638 | { }, | ||
1639 | }; | ||
1640 | 1630 | ||
1641 | t = kmemdup(&devinet_sysctl, sizeof(*t), GFP_KERNEL); | 1631 | t = kmemdup(&devinet_sysctl, sizeof(*t), GFP_KERNEL); |
1642 | if (!t) | 1632 | if (!t) |
@@ -1648,27 +1638,15 @@ static int __devinet_sysctl_register(struct net *net, char *dev_name, | |||
1648 | t->devinet_vars[i].extra2 = net; | 1638 | t->devinet_vars[i].extra2 = net; |
1649 | } | 1639 | } |
1650 | 1640 | ||
1651 | /* | 1641 | snprintf(path, sizeof(path), "net/ipv4/conf/%s", dev_name); |
1652 | * Make a copy of dev_name, because '.procname' is regarded as const | ||
1653 | * by sysctl and we wouldn't want anyone to change it under our feet | ||
1654 | * (see SIOCSIFNAME). | ||
1655 | */ | ||
1656 | t->dev_name = kstrdup(dev_name, GFP_KERNEL); | ||
1657 | if (!t->dev_name) | ||
1658 | goto free; | ||
1659 | |||
1660 | devinet_ctl_path[DEVINET_CTL_PATH_DEV].procname = t->dev_name; | ||
1661 | 1642 | ||
1662 | t->sysctl_header = register_net_sysctl_table(net, devinet_ctl_path, | 1643 | t->sysctl_header = register_net_sysctl(net, path, t->devinet_vars); |
1663 | t->devinet_vars); | ||
1664 | if (!t->sysctl_header) | 1644 | if (!t->sysctl_header) |
1665 | goto free_procname; | 1645 | goto free; |
1666 | 1646 | ||
1667 | p->sysctl = t; | 1647 | p->sysctl = t; |
1668 | return 0; | 1648 | return 0; |
1669 | 1649 | ||
1670 | free_procname: | ||
1671 | kfree(t->dev_name); | ||
1672 | free: | 1650 | free: |
1673 | kfree(t); | 1651 | kfree(t); |
1674 | out: | 1652 | out: |
@@ -1684,7 +1662,6 @@ static void __devinet_sysctl_unregister(struct ipv4_devconf *cnf) | |||
1684 | 1662 | ||
1685 | cnf->sysctl = NULL; | 1663 | cnf->sysctl = NULL; |
1686 | unregister_net_sysctl_table(t->sysctl_header); | 1664 | unregister_net_sysctl_table(t->sysctl_header); |
1687 | kfree(t->dev_name); | ||
1688 | kfree(t); | 1665 | kfree(t); |
1689 | } | 1666 | } |
1690 | 1667 | ||
@@ -1714,12 +1691,6 @@ static struct ctl_table ctl_forward_entry[] = { | |||
1714 | }, | 1691 | }, |
1715 | { }, | 1692 | { }, |
1716 | }; | 1693 | }; |
1717 | |||
1718 | static __net_initdata struct ctl_path net_ipv4_path[] = { | ||
1719 | { .procname = "net", }, | ||
1720 | { .procname = "ipv4", }, | ||
1721 | { }, | ||
1722 | }; | ||
1723 | #endif | 1694 | #endif |
1724 | 1695 | ||
1725 | static __net_init int devinet_init_net(struct net *net) | 1696 | static __net_init int devinet_init_net(struct net *net) |
@@ -1765,7 +1736,7 @@ static __net_init int devinet_init_net(struct net *net) | |||
1765 | goto err_reg_dflt; | 1736 | goto err_reg_dflt; |
1766 | 1737 | ||
1767 | err = -ENOMEM; | 1738 | err = -ENOMEM; |
1768 | forw_hdr = register_net_sysctl_table(net, net_ipv4_path, tbl); | 1739 | forw_hdr = register_net_sysctl(net, "net/ipv4", tbl); |
1769 | if (forw_hdr == NULL) | 1740 | if (forw_hdr == NULL) |
1770 | goto err_reg_ctl; | 1741 | goto err_reg_ctl; |
1771 | net->ipv4.forw_hdr = forw_hdr; | 1742 | net->ipv4.forw_hdr = forw_hdr; |