aboutsummaryrefslogtreecommitdiffstats
path: root/net/core/neighbour.c
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2012-04-19 09:38:03 -0400
committerDavid S. Miller <davem@davemloft.net>2012-04-20 21:22:29 -0400
commit8f40a1f9821a4ccb2a237f14d4eb6d6e0e665c14 (patch)
tree7b60e0ecca749ae0ef826e335621e194f93f9436 /net/core/neighbour.c
parent6dceb03687124b6ee392eb1d9921bd463eab3190 (diff)
net neighbour: Convert 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/core/neighbour.c')
-rw-r--r--net/core/neighbour.c33
1 files changed, 6 insertions, 27 deletions
diff --git a/net/core/neighbour.c b/net/core/neighbour.c
index 0c2df3d3cfbf..fadaa819b854 100644
--- a/net/core/neighbour.c
+++ b/net/core/neighbour.c
@@ -2799,7 +2799,6 @@ enum {
2799static struct neigh_sysctl_table { 2799static struct neigh_sysctl_table {
2800 struct ctl_table_header *sysctl_header; 2800 struct ctl_table_header *sysctl_header;
2801 struct ctl_table neigh_vars[NEIGH_VAR_MAX + 1]; 2801 struct ctl_table neigh_vars[NEIGH_VAR_MAX + 1];
2802 char *dev_name;
2803} neigh_sysctl_template __read_mostly = { 2802} neigh_sysctl_template __read_mostly = {
2804 .neigh_vars = { 2803 .neigh_vars = {
2805 [NEIGH_VAR_MCAST_PROBE] = { 2804 [NEIGH_VAR_MCAST_PROBE] = {
@@ -2925,19 +2924,7 @@ int neigh_sysctl_register(struct net_device *dev, struct neigh_parms *p,
2925{ 2924{
2926 struct neigh_sysctl_table *t; 2925 struct neigh_sysctl_table *t;
2927 const char *dev_name_source = NULL; 2926 const char *dev_name_source = NULL;
2928 2927 char neigh_path[ sizeof("net//neigh/") + IFNAMSIZ + IFNAMSIZ ];
2929#define NEIGH_CTL_PATH_ROOT 0
2930#define NEIGH_CTL_PATH_PROTO 1
2931#define NEIGH_CTL_PATH_NEIGH 2
2932#define NEIGH_CTL_PATH_DEV 3
2933
2934 struct ctl_path neigh_path[] = {
2935 { .procname = "net", },
2936 { .procname = "proto", },
2937 { .procname = "neigh", },
2938 { .procname = "default", },
2939 { },
2940 };
2941 2928
2942 t = kmemdup(&neigh_sysctl_template, sizeof(*t), GFP_KERNEL); 2929 t = kmemdup(&neigh_sysctl_template, sizeof(*t), GFP_KERNEL);
2943 if (!t) 2930 if (!t)
@@ -2965,7 +2952,7 @@ int neigh_sysctl_register(struct net_device *dev, struct neigh_parms *p,
2965 memset(&t->neigh_vars[NEIGH_VAR_GC_INTERVAL], 0, 2952 memset(&t->neigh_vars[NEIGH_VAR_GC_INTERVAL], 0,
2966 sizeof(t->neigh_vars[NEIGH_VAR_GC_INTERVAL])); 2953 sizeof(t->neigh_vars[NEIGH_VAR_GC_INTERVAL]));
2967 } else { 2954 } else {
2968 dev_name_source = neigh_path[NEIGH_CTL_PATH_DEV].procname; 2955 dev_name_source = "default";
2969 t->neigh_vars[NEIGH_VAR_GC_INTERVAL].data = (int *)(p + 1); 2956 t->neigh_vars[NEIGH_VAR_GC_INTERVAL].data = (int *)(p + 1);
2970 t->neigh_vars[NEIGH_VAR_GC_THRESH1].data = (int *)(p + 1) + 1; 2957 t->neigh_vars[NEIGH_VAR_GC_THRESH1].data = (int *)(p + 1) + 1;
2971 t->neigh_vars[NEIGH_VAR_GC_THRESH2].data = (int *)(p + 1) + 2; 2958 t->neigh_vars[NEIGH_VAR_GC_THRESH2].data = (int *)(p + 1) + 2;
@@ -2988,23 +2975,16 @@ int neigh_sysctl_register(struct net_device *dev, struct neigh_parms *p,
2988 t->neigh_vars[NEIGH_VAR_BASE_REACHABLE_TIME_MS].extra1 = dev; 2975 t->neigh_vars[NEIGH_VAR_BASE_REACHABLE_TIME_MS].extra1 = dev;
2989 } 2976 }
2990 2977
2991 t->dev_name = kstrdup(dev_name_source, GFP_KERNEL); 2978 snprintf(neigh_path, sizeof(neigh_path), "net/%s/neigh/%s",
2992 if (!t->dev_name) 2979 p_name, dev_name_source);
2993 goto free;
2994
2995 neigh_path[NEIGH_CTL_PATH_DEV].procname = t->dev_name;
2996 neigh_path[NEIGH_CTL_PATH_PROTO].procname = p_name;
2997
2998 t->sysctl_header = 2980 t->sysctl_header =
2999 register_net_sysctl_table(neigh_parms_net(p), neigh_path, t->neigh_vars); 2981 register_net_sysctl(neigh_parms_net(p), neigh_path, t->neigh_vars);
3000 if (!t->sysctl_header) 2982 if (!t->sysctl_header)
3001 goto free_procname; 2983 goto free;
3002 2984
3003 p->sysctl_table = t; 2985 p->sysctl_table = t;
3004 return 0; 2986 return 0;
3005 2987
3006free_procname:
3007 kfree(t->dev_name);
3008free: 2988free:
3009 kfree(t); 2989 kfree(t);
3010err: 2990err:
@@ -3018,7 +2998,6 @@ void neigh_sysctl_unregister(struct neigh_parms *p)
3018 struct neigh_sysctl_table *t = p->sysctl_table; 2998 struct neigh_sysctl_table *t = p->sysctl_table;
3019 p->sysctl_table = NULL; 2999 p->sysctl_table = NULL;
3020 unregister_net_sysctl_table(t->sysctl_header); 3000 unregister_net_sysctl_table(t->sysctl_header);
3021 kfree(t->dev_name);
3022 kfree(t); 3001 kfree(t);
3023 } 3002 }
3024} 3003}