diff options
-rw-r--r-- | include/net/ax25.h | 10 | ||||
-rw-r--r-- | net/ax25/af_ax25.c | 2 | ||||
-rw-r--r-- | net/ax25/ax25_dev.c | 10 | ||||
-rw-r--r-- | net/ax25/sysctl_net_ax25.c | 82 |
4 files changed, 35 insertions, 69 deletions
diff --git a/include/net/ax25.h b/include/net/ax25.h index 94e09d361bb1..8a7a1220e678 100644 --- a/include/net/ax25.h +++ b/include/net/ax25.h | |||
@@ -215,7 +215,7 @@ typedef struct ax25_dev { | |||
215 | struct ax25_dev *next; | 215 | struct ax25_dev *next; |
216 | struct net_device *dev; | 216 | struct net_device *dev; |
217 | struct net_device *forward; | 217 | struct net_device *forward; |
218 | struct ctl_table *systable; | 218 | struct ctl_table_header *sysheader; |
219 | int values[AX25_MAX_VALUES]; | 219 | int values[AX25_MAX_VALUES]; |
220 | #if defined(CONFIG_AX25_DAMA_SLAVE) || defined(CONFIG_AX25_DAMA_MASTER) | 220 | #if defined(CONFIG_AX25_DAMA_SLAVE) || defined(CONFIG_AX25_DAMA_MASTER) |
221 | ax25_dama_info dama; | 221 | ax25_dama_info dama; |
@@ -441,11 +441,11 @@ extern void ax25_uid_free(void); | |||
441 | 441 | ||
442 | /* sysctl_net_ax25.c */ | 442 | /* sysctl_net_ax25.c */ |
443 | #ifdef CONFIG_SYSCTL | 443 | #ifdef CONFIG_SYSCTL |
444 | extern void ax25_register_sysctl(void); | 444 | extern int ax25_register_dev_sysctl(ax25_dev *ax25_dev); |
445 | extern void ax25_unregister_sysctl(void); | 445 | extern void ax25_unregister_dev_sysctl(ax25_dev *ax25_dev); |
446 | #else | 446 | #else |
447 | static inline void ax25_register_sysctl(void) {}; | 447 | static inline int ax25_register_dev_sysctl(ax25_dev *ax25_dev) { return 0 }; |
448 | static inline void ax25_unregister_sysctl(void) {}; | 448 | static inline void ax25_unregister_dev_sysctl(ax25_dev *ax25_dev) {}; |
449 | #endif /* CONFIG_SYSCTL */ | 449 | #endif /* CONFIG_SYSCTL */ |
450 | 450 | ||
451 | #endif | 451 | #endif |
diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c index 0906c194a413..282eb76bc7d6 100644 --- a/net/ax25/af_ax25.c +++ b/net/ax25/af_ax25.c | |||
@@ -1990,7 +1990,6 @@ static int __init ax25_init(void) | |||
1990 | sock_register(&ax25_family_ops); | 1990 | sock_register(&ax25_family_ops); |
1991 | dev_add_pack(&ax25_packet_type); | 1991 | dev_add_pack(&ax25_packet_type); |
1992 | register_netdevice_notifier(&ax25_dev_notifier); | 1992 | register_netdevice_notifier(&ax25_dev_notifier); |
1993 | ax25_register_sysctl(); | ||
1994 | 1993 | ||
1995 | proc_net_fops_create(&init_net, "ax25_route", S_IRUGO, &ax25_route_fops); | 1994 | proc_net_fops_create(&init_net, "ax25_route", S_IRUGO, &ax25_route_fops); |
1996 | proc_net_fops_create(&init_net, "ax25", S_IRUGO, &ax25_info_fops); | 1995 | proc_net_fops_create(&init_net, "ax25", S_IRUGO, &ax25_info_fops); |
@@ -2015,7 +2014,6 @@ static void __exit ax25_exit(void) | |||
2015 | ax25_uid_free(); | 2014 | ax25_uid_free(); |
2016 | ax25_dev_free(); | 2015 | ax25_dev_free(); |
2017 | 2016 | ||
2018 | ax25_unregister_sysctl(); | ||
2019 | unregister_netdevice_notifier(&ax25_dev_notifier); | 2017 | unregister_netdevice_notifier(&ax25_dev_notifier); |
2020 | 2018 | ||
2021 | dev_remove_pack(&ax25_packet_type); | 2019 | dev_remove_pack(&ax25_packet_type); |
diff --git a/net/ax25/ax25_dev.c b/net/ax25/ax25_dev.c index d0de30e89591..3d106767b272 100644 --- a/net/ax25/ax25_dev.c +++ b/net/ax25/ax25_dev.c | |||
@@ -59,8 +59,6 @@ void ax25_dev_device_up(struct net_device *dev) | |||
59 | return; | 59 | return; |
60 | } | 60 | } |
61 | 61 | ||
62 | ax25_unregister_sysctl(); | ||
63 | |||
64 | dev->ax25_ptr = ax25_dev; | 62 | dev->ax25_ptr = ax25_dev; |
65 | ax25_dev->dev = dev; | 63 | ax25_dev->dev = dev; |
66 | dev_hold(dev); | 64 | dev_hold(dev); |
@@ -90,7 +88,7 @@ void ax25_dev_device_up(struct net_device *dev) | |||
90 | ax25_dev_list = ax25_dev; | 88 | ax25_dev_list = ax25_dev; |
91 | spin_unlock_bh(&ax25_dev_lock); | 89 | spin_unlock_bh(&ax25_dev_lock); |
92 | 90 | ||
93 | ax25_register_sysctl(); | 91 | ax25_register_dev_sysctl(ax25_dev); |
94 | } | 92 | } |
95 | 93 | ||
96 | void ax25_dev_device_down(struct net_device *dev) | 94 | void ax25_dev_device_down(struct net_device *dev) |
@@ -100,7 +98,7 @@ void ax25_dev_device_down(struct net_device *dev) | |||
100 | if ((ax25_dev = ax25_dev_ax25dev(dev)) == NULL) | 98 | if ((ax25_dev = ax25_dev_ax25dev(dev)) == NULL) |
101 | return; | 99 | return; |
102 | 100 | ||
103 | ax25_unregister_sysctl(); | 101 | ax25_unregister_dev_sysctl(ax25_dev); |
104 | 102 | ||
105 | spin_lock_bh(&ax25_dev_lock); | 103 | spin_lock_bh(&ax25_dev_lock); |
106 | 104 | ||
@@ -120,7 +118,6 @@ void ax25_dev_device_down(struct net_device *dev) | |||
120 | spin_unlock_bh(&ax25_dev_lock); | 118 | spin_unlock_bh(&ax25_dev_lock); |
121 | dev_put(dev); | 119 | dev_put(dev); |
122 | kfree(ax25_dev); | 120 | kfree(ax25_dev); |
123 | ax25_register_sysctl(); | ||
124 | return; | 121 | return; |
125 | } | 122 | } |
126 | 123 | ||
@@ -130,7 +127,6 @@ void ax25_dev_device_down(struct net_device *dev) | |||
130 | spin_unlock_bh(&ax25_dev_lock); | 127 | spin_unlock_bh(&ax25_dev_lock); |
131 | dev_put(dev); | 128 | dev_put(dev); |
132 | kfree(ax25_dev); | 129 | kfree(ax25_dev); |
133 | ax25_register_sysctl(); | ||
134 | return; | 130 | return; |
135 | } | 131 | } |
136 | 132 | ||
@@ -138,8 +134,6 @@ void ax25_dev_device_down(struct net_device *dev) | |||
138 | } | 134 | } |
139 | spin_unlock_bh(&ax25_dev_lock); | 135 | spin_unlock_bh(&ax25_dev_lock); |
140 | dev->ax25_ptr = NULL; | 136 | dev->ax25_ptr = NULL; |
141 | |||
142 | ax25_register_sysctl(); | ||
143 | } | 137 | } |
144 | 138 | ||
145 | int ax25_fwd_ioctl(unsigned int cmd, struct ax25_fwd_struct *fwd) | 139 | int ax25_fwd_ioctl(unsigned int cmd, struct ax25_fwd_struct *fwd) |
diff --git a/net/ax25/sysctl_net_ax25.c b/net/ax25/sysctl_net_ax25.c index 7ba381b6f074..d5744b752511 100644 --- a/net/ax25/sysctl_net_ax25.c +++ b/net/ax25/sysctl_net_ax25.c | |||
@@ -29,17 +29,6 @@ static int min_proto[1], max_proto[] = { AX25_PROTO_MAX }; | |||
29 | static int min_ds_timeout[1], max_ds_timeout[] = {65535000}; | 29 | static int min_ds_timeout[1], max_ds_timeout[] = {65535000}; |
30 | #endif | 30 | #endif |
31 | 31 | ||
32 | static struct ctl_table_header *ax25_table_header; | ||
33 | |||
34 | static ctl_table *ax25_table; | ||
35 | static int ax25_table_size; | ||
36 | |||
37 | static struct ctl_path ax25_path[] = { | ||
38 | { .procname = "net", }, | ||
39 | { .procname = "ax25", }, | ||
40 | { } | ||
41 | }; | ||
42 | |||
43 | static const ctl_table ax25_param_table[] = { | 32 | static const ctl_table ax25_param_table[] = { |
44 | { | 33 | { |
45 | .procname = "ip_default_mode", | 34 | .procname = "ip_default_mode", |
@@ -159,52 +148,37 @@ static const ctl_table ax25_param_table[] = { | |||
159 | { } /* that's all, folks! */ | 148 | { } /* that's all, folks! */ |
160 | }; | 149 | }; |
161 | 150 | ||
162 | void ax25_register_sysctl(void) | 151 | int ax25_register_dev_sysctl(ax25_dev *ax25_dev) |
163 | { | 152 | { |
164 | ax25_dev *ax25_dev; | 153 | char path[sizeof("net/ax25/") + IFNAMSIZ]; |
165 | int n, k; | 154 | int k; |
166 | 155 | struct ctl_table *table; | |
167 | spin_lock_bh(&ax25_dev_lock); | 156 | |
168 | for (ax25_table_size = sizeof(ctl_table), ax25_dev = ax25_dev_list; ax25_dev != NULL; ax25_dev = ax25_dev->next) | 157 | table = kmemdup(ax25_param_table, sizeof(ax25_param_table), GFP_KERNEL); |
169 | ax25_table_size += sizeof(ctl_table); | 158 | if (!table) |
170 | 159 | return -ENOMEM; | |
171 | if ((ax25_table = kzalloc(ax25_table_size, GFP_ATOMIC)) == NULL) { | 160 | |
172 | spin_unlock_bh(&ax25_dev_lock); | 161 | for (k = 0; k < AX25_MAX_VALUES; k++) |
173 | return; | 162 | table[k].data = &ax25_dev->values[k]; |
174 | } | 163 | |
175 | 164 | snprintf(path, sizeof(path), "net/ax25/%s", ax25_dev->dev->name); | |
176 | for (n = 0, ax25_dev = ax25_dev_list; ax25_dev != NULL; ax25_dev = ax25_dev->next) { | 165 | ax25_dev->sysheader = register_net_sysctl(&init_net, path, table); |
177 | struct ctl_table *child = kmemdup(ax25_param_table, | 166 | if (!ax25_dev->sysheader) { |
178 | sizeof(ax25_param_table), | 167 | kfree(table); |
179 | GFP_ATOMIC); | 168 | return -ENOMEM; |
180 | if (!child) { | ||
181 | while (n--) | ||
182 | kfree(ax25_table[n].child); | ||
183 | kfree(ax25_table); | ||
184 | spin_unlock_bh(&ax25_dev_lock); | ||
185 | return; | ||
186 | } | ||
187 | ax25_table[n].child = ax25_dev->systable = child; | ||
188 | ax25_table[n].procname = ax25_dev->dev->name; | ||
189 | ax25_table[n].mode = 0555; | ||
190 | |||
191 | |||
192 | for (k = 0; k < AX25_MAX_VALUES; k++) | ||
193 | child[k].data = &ax25_dev->values[k]; | ||
194 | |||
195 | n++; | ||
196 | } | 169 | } |
197 | spin_unlock_bh(&ax25_dev_lock); | 170 | return 0; |
198 | |||
199 | ax25_table_header = register_net_sysctl_table(&init_net, ax25_path, ax25_table); | ||
200 | } | 171 | } |
201 | 172 | ||
202 | void ax25_unregister_sysctl(void) | 173 | void ax25_unregister_dev_sysctl(ax25_dev *ax25_dev) |
203 | { | 174 | { |
204 | ctl_table *p; | 175 | struct ctl_table_header *header = ax25_dev->sysheader; |
205 | unregister_net_sysctl_table(ax25_table_header); | 176 | struct ctl_table *table; |
206 | 177 | ||
207 | for (p = ax25_table; p->procname; p++) | 178 | if (header) { |
208 | kfree(p->child); | 179 | ax25_dev->sysheader = NULL; |
209 | kfree(ax25_table); | 180 | table = header->ctl_table_arg; |
181 | unregister_net_sysctl_table(header); | ||
182 | kfree(table); | ||
183 | } | ||
210 | } | 184 | } |