1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
/*
* linux/fs/nfsd/stats.c
*
* procfs-based user access to knfsd statistics
*
* /proc/net/rpc/nfsd
*
* Format:
* rc <hits> <misses> <nocache>
* Statistsics for the reply cache
* plus generic RPC stats (see net/sunrpc/stats.c)
*
* Copyright (C) 1995, 1996, 1997 Olaf Kirch <okir@monad.swb.de>
*/
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/proc_fs.h>
#include <linux/stat.h>
#include <linux/sunrpc/svc.h>
#include <linux/sunrpc/stats.h>
#include <linux/nfsd/nfsd.h>
#include <linux/nfsd/stats.h>
struct nfsd_stats nfsdstats;
struct svc_stat nfsd_svcstats = { &nfsd_program, };
static int
nfsd_proc_read(char *buffer, char **start, off_t offset, int count,
int *eof, void *data)
{
int len;
len = sprintf(buffer, "rc %d %d %d %d %d %d %d %d\n",
nfsdstats.rchits,
nfsdstats.rcmisses,
nfsdstats.rcnocache,
nfsdstats.fh_cached,
nfsdstats.fh_valid,
nfsdstats.fh_fixup,
nfsdstats.fh_lookup,
nfsdstats.fh_stale);
/* Assume we haven't hit EOF yet. Will be set by svc_proc_read. */
*eof = 0;
/*
* Append generic nfsd RPC statistics if there's room for it.
*/
if (len <= offset) {
len = svc_proc_read(buffer, start, offset - len, count,
eof, data);
return len;
}
if (len < count) {
len += svc_proc_read(buffer + len, start, 0, count - len,
eof, data);
}
if (offset >= len) {
*start = buffer;
return 0;
}
*start = buffer + offset;
if ((len -= offset) > count)
return count;
return len;
}
void
nfsd_stat_init(void)
{
struct proc_dir_entry *ent;
if ((ent = svc_proc_register(&nfsd_svcstats)) != 0)
ent->read_proc = nfsd_proc_read;
}
void
nfsd_stat_shutdown(void)
{
svc_proc_unregister("nfsd");
}
|