diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2012-04-19 09:38:03 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-04-20 21:22:29 -0400 |
commit | 8f40a1f9821a4ccb2a237f14d4eb6d6e0e665c14 (patch) | |
tree | 7b60e0ecca749ae0ef826e335621e194f93f9436 /net/core/neighbour.c | |
parent | 6dceb03687124b6ee392eb1d9921bd463eab3190 (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.c | 33 |
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 { | |||
2799 | static struct neigh_sysctl_table { | 2799 | static 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 | ||
3006 | free_procname: | ||
3007 | kfree(t->dev_name); | ||
3008 | free: | 2988 | free: |
3009 | kfree(t); | 2989 | kfree(t); |
3010 | err: | 2990 | err: |
@@ -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 | } |