Commit 8f40a1f9 authored by Eric W. Biederman's avatar Eric W. Biederman Committed by David S. Miller

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: default avatarEric W. Biederman <ebiederm@xmission.com>
Acked-by: default avatarPavel Emelyanov <xemul@parallels.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6dceb036
...@@ -2799,7 +2799,6 @@ enum { ...@@ -2799,7 +2799,6 @@ enum {
static struct neigh_sysctl_table { static struct neigh_sysctl_table {
struct ctl_table_header *sysctl_header; struct ctl_table_header *sysctl_header;
struct ctl_table neigh_vars[NEIGH_VAR_MAX + 1]; struct ctl_table neigh_vars[NEIGH_VAR_MAX + 1];
char *dev_name;
} neigh_sysctl_template __read_mostly = { } neigh_sysctl_template __read_mostly = {
.neigh_vars = { .neigh_vars = {
[NEIGH_VAR_MCAST_PROBE] = { [NEIGH_VAR_MCAST_PROBE] = {
...@@ -2925,19 +2924,7 @@ int neigh_sysctl_register(struct net_device *dev, struct neigh_parms *p, ...@@ -2925,19 +2924,7 @@ int neigh_sysctl_register(struct net_device *dev, struct neigh_parms *p,
{ {
struct neigh_sysctl_table *t; struct neigh_sysctl_table *t;
const char *dev_name_source = NULL; const char *dev_name_source = NULL;
char neigh_path[ sizeof("net//neigh/") + IFNAMSIZ + IFNAMSIZ ];
#define NEIGH_CTL_PATH_ROOT 0
#define NEIGH_CTL_PATH_PROTO 1
#define NEIGH_CTL_PATH_NEIGH 2
#define NEIGH_CTL_PATH_DEV 3
struct ctl_path neigh_path[] = {
{ .procname = "net", },
{ .procname = "proto", },
{ .procname = "neigh", },
{ .procname = "default", },
{ },
};
t = kmemdup(&neigh_sysctl_template, sizeof(*t), GFP_KERNEL); t = kmemdup(&neigh_sysctl_template, sizeof(*t), GFP_KERNEL);
if (!t) if (!t)
...@@ -2965,7 +2952,7 @@ int neigh_sysctl_register(struct net_device *dev, struct neigh_parms *p, ...@@ -2965,7 +2952,7 @@ int neigh_sysctl_register(struct net_device *dev, struct neigh_parms *p,
memset(&t->neigh_vars[NEIGH_VAR_GC_INTERVAL], 0, memset(&t->neigh_vars[NEIGH_VAR_GC_INTERVAL], 0,
sizeof(t->neigh_vars[NEIGH_VAR_GC_INTERVAL])); sizeof(t->neigh_vars[NEIGH_VAR_GC_INTERVAL]));
} else { } else {
dev_name_source = neigh_path[NEIGH_CTL_PATH_DEV].procname; dev_name_source = "default";
t->neigh_vars[NEIGH_VAR_GC_INTERVAL].data = (int *)(p + 1); t->neigh_vars[NEIGH_VAR_GC_INTERVAL].data = (int *)(p + 1);
t->neigh_vars[NEIGH_VAR_GC_THRESH1].data = (int *)(p + 1) + 1; t->neigh_vars[NEIGH_VAR_GC_THRESH1].data = (int *)(p + 1) + 1;
t->neigh_vars[NEIGH_VAR_GC_THRESH2].data = (int *)(p + 1) + 2; 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,23 +2975,16 @@ int neigh_sysctl_register(struct net_device *dev, struct neigh_parms *p,
t->neigh_vars[NEIGH_VAR_BASE_REACHABLE_TIME_MS].extra1 = dev; t->neigh_vars[NEIGH_VAR_BASE_REACHABLE_TIME_MS].extra1 = dev;
} }
t->dev_name = kstrdup(dev_name_source, GFP_KERNEL); snprintf(neigh_path, sizeof(neigh_path), "net/%s/neigh/%s",
if (!t->dev_name) p_name, dev_name_source);
goto free;
neigh_path[NEIGH_CTL_PATH_DEV].procname = t->dev_name;
neigh_path[NEIGH_CTL_PATH_PROTO].procname = p_name;
t->sysctl_header = t->sysctl_header =
register_net_sysctl_table(neigh_parms_net(p), neigh_path, t->neigh_vars); register_net_sysctl(neigh_parms_net(p), neigh_path, t->neigh_vars);
if (!t->sysctl_header) if (!t->sysctl_header)
goto free_procname; goto free;
p->sysctl_table = t; p->sysctl_table = t;
return 0; return 0;
free_procname:
kfree(t->dev_name);
free: free:
kfree(t); kfree(t);
err: err:
...@@ -3018,7 +2998,6 @@ void neigh_sysctl_unregister(struct neigh_parms *p) ...@@ -3018,7 +2998,6 @@ void neigh_sysctl_unregister(struct neigh_parms *p)
struct neigh_sysctl_table *t = p->sysctl_table; struct neigh_sysctl_table *t = p->sysctl_table;
p->sysctl_table = NULL; p->sysctl_table = NULL;
unregister_net_sysctl_table(t->sysctl_header); unregister_net_sysctl_table(t->sysctl_header);
kfree(t->dev_name);
kfree(t); kfree(t);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment