All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] nfsstat zeroing RPC statistics 2/2
@ 2003-12-30 18:32 Steve Dickson
  0 siblings, 0 replies; only message in thread
From: Steve Dickson @ 2003-12-30 18:32 UTC (permalink / raw)
  To: nfs

[-- Attachment #1: Type: text/plain, Size: 461 bytes --]

Attached is the 2.4 patch need to support the  zeroing of RPC stats.
The 2.6 patch is  on people.redhat.com/steved/NFS/nfszerostats

I basically reused  tux's hex_write_proc() routine to
read a bit field from user land. Parts or all of the
rpc_stat or svc_stat structures will be zero depending
on which bit is set.

Also the permission modes on /proc/net/rpc/nfs[d] are
changed from 0444 to 0644 which signals to nfsstat
that zeroing is supported.

SteveD.




[-- Attachment #2: linux-2.4.22-nfs-zerostats.patch --]
[-- Type: text/plain, Size: 3820 bytes --]

--- linux-2.4.22/net/sunrpc/stats.c.orig	2003-12-30 09:33:40.000000000 -0500
+++ linux-2.4.22/net/sunrpc/stats.c	2003-12-30 09:39:44.000000000 -0500
@@ -21,6 +21,7 @@
 #include <linux/sunrpc/clnt.h>
 #include <linux/sunrpc/svcsock.h>
 #include <linux/init.h>
+#include <asm/uaccess.h>
 
 #define RPCDBG_FACILITY	RPCDBG_MISC
 
@@ -121,17 +122,146 @@ svc_proc_read(char *buffer, char **start
 	return len;
 }
 
+#define PRNT_CALLS  0x0001
+#define PRNT_RPC    0x0002
+#define PRNT_NET    0x0004
+#define PRNT_FH     0x0008
+#define PRNT_RC     0x0010
+#define PRNT_ALL    0xffff
+
+#define HEX_DIGITS 8
+/*
+ * Get hex value from userland
+ */
+static inline unsigned int
+rpc_proc_getval(char *val, int vallen, 
+	const char *buf, unsigned long cnt)
+{
+	unsigned int new_value = 0;
+	int i;
+
+	if (!cnt)
+		return -EINVAL;
+	if (cnt > vallen)
+		cnt = vallen;
+	if (copy_from_user(val, buf, cnt))
+		return -EFAULT;
+
+	new_value = 0;
+	for (i = 0; i < cnt; i++) {
+		unsigned int c = val[i];
+
+		switch (c) {
+			case '0' ... '9': c -= '0'; break;
+			case 'a' ... 'f': c -= 'a'-10; break;
+			case 'A' ... 'F': c -= 'A'-10; break;
+		default:
+			goto out;
+		}
+		new_value = (new_value << 4) | c;
+	}
+out:
+	return new_value;
+}
+/*
+ *  Zero out the SVC stats
+ */
+static int
+svc_proc_write(struct file *file, const char *buffer, 
+	unsigned long count, void *data)
+{
+	struct svc_stat *statp	= (struct svc_stat *) data;
+	struct svc_program *prog = statp->program;
+	struct svc_procedure *proc;
+	struct svc_version *vers;
+	char hexnum [HEX_DIGITS];
+	unsigned int opt_prt;
+	int i, j;
+
+	opt_prt = rpc_proc_getval(hexnum, HEX_DIGITS, buffer, count);
+	if (opt_prt < 0) 
+		return opt_prt;
+
+	if (opt_prt & PRNT_NET) { 
+		statp->netcnt = 0,
+		statp->netudpcnt = 0,
+		statp->nettcpcnt = 0,
+		statp->nettcpconn = 0;
+	}
+	if (opt_prt & PRNT_RPC) {
+			statp->rpccnt = 0,
+			statp->rpcbadfmt=statp->rpcbadauth=statp->rpcbadclnt = 0,
+			statp->rpcbadfmt = 0,
+			statp->rpcbadauth = 0,
+			statp->rpcbadclnt =0;
+	}
+	if (opt_prt & PRNT_CALLS) {
+		for (i = 0; i < prog->pg_nvers; i++) {
+			if (!(vers = prog->pg_vers[i]) || !(proc = vers->vs_proc))
+				continue;
+		for (j = 0; j < vers->vs_nproc; j++, proc++)
+			proc->pc_count = 0;
+		}
+	}
+	return opt_prt;
+}
+/*
+ * Zero out the RPC stats
+ */
+static  int
+rpc_proc_write(struct file *file, const char *buffer, 
+	unsigned long count, void *data)
+{
+	struct rpc_stat	*statp = (struct rpc_stat *) data;
+	struct rpc_program *prog = statp->program;
+	struct rpc_version *vers;
+	char hexnum [HEX_DIGITS];
+	unsigned int opt_prt;
+	int i, j;
+
+	opt_prt = rpc_proc_getval(hexnum, HEX_DIGITS, buffer, count);
+	if (opt_prt < 0) 
+		return opt_prt;
+
+	if (opt_prt & PRNT_NET) {
+		statp->netcnt = 0,
+		statp->netudpcnt = 0,
+		statp->nettcpcnt = 0,
+		statp->nettcpconn = 0;
+	}
+	if (opt_prt & PRNT_RPC) {
+		statp->rpccnt = 0,
+		statp->rpcretrans = 0,
+		statp->rpcauthrefresh = 0;
+	}
+	if (opt_prt & PRNT_CALLS) {
+		for (i = 0; i < prog->nrvers; i++) {
+			if (!(vers = prog->version[i]))
+				continue;
+			for (j = 0; j < vers->nrprocs; j++)
+				vers->procs[j].p_count = 0;
+		}
+	}
+	return opt_prt;
+}
+
 /*
  * Register/unregister RPC proc files
  */
 static inline struct proc_dir_entry *
 do_register(const char *name, void *data, int issvc)
 {
+	struct proc_dir_entry *res;
 	rpc_proc_init();
 	dprintk("RPC: registering /proc/net/rpc/%s\n", name);
-	return create_proc_read_entry(name, 0, proc_net_rpc, 
-				      issvc? svc_proc_read : rpc_proc_read,
-				      data);
+
+	res = create_proc_entry(name, 0644 , proc_net_rpc);
+	if (res) {
+		res->read_proc=  issvc ? svc_proc_read : rpc_proc_read;
+		res->write_proc= issvc ? svc_proc_write : rpc_proc_write;
+		res->data= data;
+	}
+	return res;
 }
 
 struct proc_dir_entry *

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2003-12-30 18:33 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-12-30 18:32 [PATCH] nfsstat zeroing RPC statistics 2/2 Steve Dickson

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.