4fbf4291aa
Allow the current state of all fscache objects to be dumped by doing: cat /proc/fs/fscache/objects By default, all objects and all fields will be shown. This can be restricted by adding a suitable key to one of the caller's keyrings (such as the session keyring): keyctl add user fscache:objlist "<restrictions>" @s The <restrictions> are: K Show hexdump of object key (don't show if not given) A Show hexdump of object aux data (don't show if not given) And paired restrictions: C Show objects that have a cookie c Show objects that don't have a cookie B Show objects that are busy b Show objects that aren't busy W Show objects that have pending writes w Show objects that don't have pending writes R Show objects that have outstanding reads r Show objects that don't have outstanding reads S Show objects that have slow work queued s Show objects that don't have slow work queued If neither side of a restriction pair is given, then both are implied. For example: keyctl add user fscache:objlist KB @s shows objects that are busy, and lists their object keys, but does not dump their auxiliary data. It also implies "CcWwRrSs", but as 'B' is given, 'b' is not implied. Signed-off-by: David Howells <dhowells@redhat.com>
81 lines
1.9 KiB
C
81 lines
1.9 KiB
C
/* FS-Cache statistics viewing interface
|
|
*
|
|
* Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
|
|
* Written by David Howells (dhowells@redhat.com)
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version
|
|
* 2 of the License, or (at your option) any later version.
|
|
*/
|
|
|
|
#define FSCACHE_DEBUG_LEVEL OPERATION
|
|
#include <linux/module.h>
|
|
#include <linux/proc_fs.h>
|
|
#include <linux/seq_file.h>
|
|
#include "internal.h"
|
|
|
|
/*
|
|
* initialise the /proc/fs/fscache/ directory
|
|
*/
|
|
int __init fscache_proc_init(void)
|
|
{
|
|
_enter("");
|
|
|
|
if (!proc_mkdir("fs/fscache", NULL))
|
|
goto error_dir;
|
|
|
|
#ifdef CONFIG_FSCACHE_STATS
|
|
if (!proc_create("fs/fscache/stats", S_IFREG | 0444, NULL,
|
|
&fscache_stats_fops))
|
|
goto error_stats;
|
|
#endif
|
|
|
|
#ifdef CONFIG_FSCACHE_HISTOGRAM
|
|
if (!proc_create("fs/fscache/histogram", S_IFREG | 0444, NULL,
|
|
&fscache_histogram_fops))
|
|
goto error_histogram;
|
|
#endif
|
|
|
|
#ifdef CONFIG_FSCACHE_OBJECT_LIST
|
|
if (!proc_create("fs/fscache/objects", S_IFREG | 0444, NULL,
|
|
&fscache_objlist_fops))
|
|
goto error_objects;
|
|
#endif
|
|
|
|
_leave(" = 0");
|
|
return 0;
|
|
|
|
#ifdef CONFIG_FSCACHE_OBJECT_LIST
|
|
error_objects:
|
|
#endif
|
|
#ifdef CONFIG_FSCACHE_HISTOGRAM
|
|
remove_proc_entry("fs/fscache/histogram", NULL);
|
|
error_histogram:
|
|
#endif
|
|
#ifdef CONFIG_FSCACHE_STATS
|
|
remove_proc_entry("fs/fscache/stats", NULL);
|
|
error_stats:
|
|
#endif
|
|
remove_proc_entry("fs/fscache", NULL);
|
|
error_dir:
|
|
_leave(" = -ENOMEM");
|
|
return -ENOMEM;
|
|
}
|
|
|
|
/*
|
|
* clean up the /proc/fs/fscache/ directory
|
|
*/
|
|
void fscache_proc_cleanup(void)
|
|
{
|
|
#ifdef CONFIG_FSCACHE_OBJECT_LIST
|
|
remove_proc_entry("fs/fscache/objects", NULL);
|
|
#endif
|
|
#ifdef CONFIG_FSCACHE_HISTOGRAM
|
|
remove_proc_entry("fs/fscache/histogram", NULL);
|
|
#endif
|
|
#ifdef CONFIG_FSCACHE_STATS
|
|
remove_proc_entry("fs/fscache/stats", NULL);
|
|
#endif
|
|
remove_proc_entry("fs/fscache", NULL);
|
|
}
|