aboutsummaryrefslogtreecommitdiffstats
path: root/net/sunrpc/cache.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/sunrpc/cache.c')
-rw-r--r--net/sunrpc/cache.c99
1 files changed, 54 insertions, 45 deletions
diff --git a/net/sunrpc/cache.c b/net/sunrpc/cache.c
index 365586a999ea..f41a7cc4cf62 100644
--- a/net/sunrpc/cache.c
+++ b/net/sunrpc/cache.c
@@ -290,44 +290,63 @@ static const struct file_operations cache_flush_operations;
290static void do_cache_clean(struct work_struct *work); 290static void do_cache_clean(struct work_struct *work);
291static DECLARE_DELAYED_WORK(cache_cleaner, do_cache_clean); 291static DECLARE_DELAYED_WORK(cache_cleaner, do_cache_clean);
292 292
293void cache_register(struct cache_detail *cd) 293static void remove_cache_proc_entries(struct cache_detail *cd)
294{ 294{
295 cd->proc_ent = proc_mkdir(cd->name, proc_net_rpc); 295 if (cd->proc_ent == NULL)
296 if (cd->proc_ent) { 296 return;
297 struct proc_dir_entry *p; 297 if (cd->flush_ent)
298 cd->proc_ent->owner = cd->owner; 298 remove_proc_entry("flush", cd->proc_ent);
299 cd->channel_ent = cd->content_ent = NULL; 299 if (cd->channel_ent)
300 remove_proc_entry("channel", cd->proc_ent);
301 if (cd->content_ent)
302 remove_proc_entry("content", cd->proc_ent);
303 cd->proc_ent = NULL;
304 remove_proc_entry(cd->name, proc_net_rpc);
305}
300 306
301 p = create_proc_entry("flush", S_IFREG|S_IRUSR|S_IWUSR, 307static void create_cache_proc_entries(struct cache_detail *cd)
302 cd->proc_ent); 308{
303 cd->flush_ent = p; 309 struct proc_dir_entry *p;
304 if (p) {
305 p->proc_fops = &cache_flush_operations;
306 p->owner = cd->owner;
307 p->data = cd;
308 }
309 310
310 if (cd->cache_request || cd->cache_parse) { 311 cd->proc_ent = proc_mkdir(cd->name, proc_net_rpc);
311 p = create_proc_entry("channel", S_IFREG|S_IRUSR|S_IWUSR, 312 if (cd->proc_ent == NULL)
312 cd->proc_ent); 313 return;
313 cd->channel_ent = p; 314 cd->proc_ent->owner = cd->owner;
314 if (p) { 315 cd->channel_ent = cd->content_ent = NULL;
315 p->proc_fops = &cache_file_operations; 316
316 p->owner = cd->owner; 317 p = create_proc_entry("flush", S_IFREG|S_IRUSR|S_IWUSR, cd->proc_ent);
317 p->data = cd; 318 cd->flush_ent = p;
318 } 319 if (p == NULL)
319 } 320 return;
320 if (cd->cache_show) { 321 p->proc_fops = &cache_flush_operations;
321 p = create_proc_entry("content", S_IFREG|S_IRUSR|S_IWUSR, 322 p->owner = cd->owner;
322 cd->proc_ent); 323 p->data = cd;
323 cd->content_ent = p; 324
324 if (p) { 325 if (cd->cache_request || cd->cache_parse) {
325 p->proc_fops = &content_file_operations; 326 p = create_proc_entry("channel", S_IFREG|S_IRUSR|S_IWUSR,
326 p->owner = cd->owner; 327 cd->proc_ent);
327 p->data = cd; 328 cd->channel_ent = p;
328 } 329 if (p == NULL)
329 } 330 return;
331 p->proc_fops = &cache_file_operations;
332 p->owner = cd->owner;
333 p->data = cd;
334 }
335 if (cd->cache_show) {
336 p = create_proc_entry("content", S_IFREG|S_IRUSR|S_IWUSR,
337 cd->proc_ent);
338 cd->content_ent = p;
339 if (p == NULL)
340 return;
341 p->proc_fops = &content_file_operations;
342 p->owner = cd->owner;
343 p->data = cd;
330 } 344 }
345}
346
347void cache_register(struct cache_detail *cd)
348{
349 create_cache_proc_entries(cd);
331 rwlock_init(&cd->hash_lock); 350 rwlock_init(&cd->hash_lock);
332 INIT_LIST_HEAD(&cd->queue); 351 INIT_LIST_HEAD(&cd->queue);
333 spin_lock(&cache_list_lock); 352 spin_lock(&cache_list_lock);
@@ -358,17 +377,7 @@ void cache_unregister(struct cache_detail *cd)
358 list_del_init(&cd->others); 377 list_del_init(&cd->others);
359 write_unlock(&cd->hash_lock); 378 write_unlock(&cd->hash_lock);
360 spin_unlock(&cache_list_lock); 379 spin_unlock(&cache_list_lock);
361 if (cd->proc_ent) { 380 remove_cache_proc_entries(cd);
362 if (cd->flush_ent)
363 remove_proc_entry("flush", cd->proc_ent);
364 if (cd->channel_ent)
365 remove_proc_entry("channel", cd->proc_ent);
366 if (cd->content_ent)
367 remove_proc_entry("content", cd->proc_ent);
368
369 cd->proc_ent = NULL;
370 remove_proc_entry(cd->name, proc_net_rpc);
371 }
372 if (list_empty(&cache_list)) { 381 if (list_empty(&cache_list)) {
373 /* module must be being unloaded so its safe to kill the worker */ 382 /* module must be being unloaded so its safe to kill the worker */
374 cancel_delayed_work_sync(&cache_cleaner); 383 cancel_delayed_work_sync(&cache_cleaner);