aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/devinet.c
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2012-04-19 09:42:09 -0400
committerDavid S. Miller <davem@davemloft.net>2012-04-20 21:22:30 -0400
commit8607ddb86711df4504a028cc88299d334b786bf3 (patch)
treefd00eeef53049f1ae1928ba9b06253ab343b3c77 /net/ipv4/devinet.c
parent6105e29320f662bf2f2358e2b2ff1bbf599f387f (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.c39
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,
1585static struct devinet_sysctl_table { 1585static 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
1670free_procname:
1671 kfree(t->dev_name);
1672free: 1650free:
1673 kfree(t); 1651 kfree(t);
1674out: 1652out:
@@ -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
1718static __net_initdata struct ctl_path net_ipv4_path[] = {
1719 { .procname = "net", },
1720 { .procname = "ipv4", },
1721 { },
1722};
1723#endif 1694#endif
1724 1695
1725static __net_init int devinet_init_net(struct net *net) 1696static __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;