diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2013-03-31 22:50:16 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2013-04-09 14:13:34 -0400 |
commit | 6ea1511ec4ed477aeb5846275b52c89204d47089 (patch) | |
tree | 4925c4a00bc013370fd771176c6b341cc4cef61f /arch/ia64 | |
parent | 1c1ec6c6255cce0fa48391e36b419cf951800b50 (diff) |
prominfo_proc fixes
* check for proc_mkdir() failures
* use remove_proc_subtree()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'arch/ia64')
-rw-r--r-- | arch/ia64/sn/kernel/sn2/prominfo_proc.c | 42 |
1 files changed, 12 insertions, 30 deletions
diff --git a/arch/ia64/sn/kernel/sn2/prominfo_proc.c b/arch/ia64/sn/kernel/sn2/prominfo_proc.c index 20b88cb1881a..90298bda936a 100644 --- a/arch/ia64/sn/kernel/sn2/prominfo_proc.c +++ b/arch/ia64/sn/kernel/sn2/prominfo_proc.c | |||
@@ -216,58 +216,40 @@ void __exit prominfo_exit(void); | |||
216 | module_init(prominfo_init); | 216 | module_init(prominfo_init); |
217 | module_exit(prominfo_exit); | 217 | module_exit(prominfo_exit); |
218 | 218 | ||
219 | static struct proc_dir_entry **proc_entries; | ||
220 | static struct proc_dir_entry *sgi_prominfo_entry; | 219 | static struct proc_dir_entry *sgi_prominfo_entry; |
221 | 220 | ||
222 | #define NODE_NAME_LEN 11 | 221 | #define NODE_NAME_LEN 11 |
223 | 222 | ||
224 | int __init prominfo_init(void) | 223 | int __init prominfo_init(void) |
225 | { | 224 | { |
226 | struct proc_dir_entry **entp; | ||
227 | cnodeid_t cnodeid; | 225 | cnodeid_t cnodeid; |
228 | unsigned long nasid; | ||
229 | int size; | ||
230 | char name[NODE_NAME_LEN]; | ||
231 | 226 | ||
232 | if (!ia64_platform_is("sn2")) | 227 | if (!ia64_platform_is("sn2")) |
233 | return 0; | 228 | return 0; |
234 | 229 | ||
235 | size = num_online_nodes() * sizeof(struct proc_dir_entry *); | ||
236 | proc_entries = kzalloc(size, GFP_KERNEL); | ||
237 | if (!proc_entries) | ||
238 | return -ENOMEM; | ||
239 | |||
240 | sgi_prominfo_entry = proc_mkdir("sgi_prominfo", NULL); | 230 | sgi_prominfo_entry = proc_mkdir("sgi_prominfo", NULL); |
231 | if (!sgi_prominfo_entry) | ||
232 | return -ENOMEM; | ||
241 | 233 | ||
242 | entp = proc_entries; | ||
243 | for_each_online_node(cnodeid) { | 234 | for_each_online_node(cnodeid) { |
235 | struct proc_dir_entry *dir; | ||
236 | unsigned long nasid; | ||
237 | char name[NODE_NAME_LEN]; | ||
238 | |||
244 | sprintf(name, "node%d", cnodeid); | 239 | sprintf(name, "node%d", cnodeid); |
245 | *entp = proc_mkdir(name, sgi_prominfo_entry); | 240 | dir = proc_mkdir(name, sgi_prominfo_entry); |
241 | if (!dir) | ||
242 | continue; | ||
246 | nasid = cnodeid_to_nasid(cnodeid); | 243 | nasid = cnodeid_to_nasid(cnodeid); |
247 | create_proc_read_entry("fit", 0, *entp, read_fit_entry, | 244 | create_proc_read_entry("fit", 0, dir, read_fit_entry, |
248 | (void *)nasid); | 245 | (void *)nasid); |
249 | create_proc_read_entry("version", 0, *entp, | 246 | create_proc_read_entry("version", 0, dir, |
250 | read_version_entry, (void *)nasid); | 247 | read_version_entry, (void *)nasid); |
251 | entp++; | ||
252 | } | 248 | } |
253 | |||
254 | return 0; | 249 | return 0; |
255 | } | 250 | } |
256 | 251 | ||
257 | void __exit prominfo_exit(void) | 252 | void __exit prominfo_exit(void) |
258 | { | 253 | { |
259 | struct proc_dir_entry **entp; | 254 | remove_proc_subtree("sgi_prominfo", NULL); |
260 | unsigned int cnodeid; | ||
261 | char name[NODE_NAME_LEN]; | ||
262 | |||
263 | entp = proc_entries; | ||
264 | for_each_online_node(cnodeid) { | ||
265 | remove_proc_entry("fit", *entp); | ||
266 | remove_proc_entry("version", *entp); | ||
267 | sprintf(name, "node%d", cnodeid); | ||
268 | remove_proc_entry(name, sgi_prominfo_entry); | ||
269 | entp++; | ||
270 | } | ||
271 | remove_proc_entry("sgi_prominfo", NULL); | ||
272 | kfree(proc_entries); | ||
273 | } | 255 | } |