aboutsummaryrefslogtreecommitdiffstats
path: root/arch/ia64
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2013-03-31 22:50:16 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2013-04-09 14:13:34 -0400
commit6ea1511ec4ed477aeb5846275b52c89204d47089 (patch)
tree4925c4a00bc013370fd771176c6b341cc4cef61f /arch/ia64
parent1c1ec6c6255cce0fa48391e36b419cf951800b50 (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.c42
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);
216module_init(prominfo_init); 216module_init(prominfo_init);
217module_exit(prominfo_exit); 217module_exit(prominfo_exit);
218 218
219static struct proc_dir_entry **proc_entries;
220static struct proc_dir_entry *sgi_prominfo_entry; 219static struct proc_dir_entry *sgi_prominfo_entry;
221 220
222#define NODE_NAME_LEN 11 221#define NODE_NAME_LEN 11
223 222
224int __init prominfo_init(void) 223int __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
257void __exit prominfo_exit(void) 252void __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}