diff options
| -rw-r--r-- | include/linux/sunrpc/svc_xprt.h | 1 | ||||
| -rw-r--r-- | net/sunrpc/svc_xprt.c | 28 | ||||
| -rw-r--r-- | net/sunrpc/sysctl.c | 31 | 
3 files changed, 60 insertions, 0 deletions
diff --git a/include/linux/sunrpc/svc_xprt.h b/include/linux/sunrpc/svc_xprt.h index 405281e745d..01e71b7a2e2 100644 --- a/include/linux/sunrpc/svc_xprt.h +++ b/include/linux/sunrpc/svc_xprt.h @@ -79,6 +79,7 @@ void	svc_xprt_copy_addrs(struct svc_rqst *rqstp, struct svc_xprt *xprt);  void	svc_close_xprt(struct svc_xprt *xprt);  void	svc_delete_xprt(struct svc_xprt *xprt);  int	svc_port_is_privileged(struct sockaddr *sin); +int	svc_print_xprts(char *buf, int maxlen);  static inline void svc_xprt_get(struct svc_xprt *xprt)  { diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c index 000c7dc3b82..2e5b92ae24e 100644 --- a/net/sunrpc/svc_xprt.c +++ b/net/sunrpc/svc_xprt.c @@ -112,6 +112,34 @@ void svc_unreg_xprt_class(struct svc_xprt_class *xcl)  }  EXPORT_SYMBOL_GPL(svc_unreg_xprt_class); +/* + * Format the transport list for printing + */ +int svc_print_xprts(char *buf, int maxlen) +{ +	struct list_head *le; +	char tmpstr[80]; +	int len = 0; +	buf[0] = '\0'; + +	spin_lock(&svc_xprt_class_lock); +	list_for_each(le, &svc_xprt_class_list) { +		int slen; +		struct svc_xprt_class *xcl = +			list_entry(le, struct svc_xprt_class, xcl_list); + +		sprintf(tmpstr, "%s %d\n", xcl->xcl_name, xcl->xcl_max_payload); +		slen = strlen(tmpstr); +		if (len + slen > maxlen) +			break; +		len += slen; +		strcat(buf, tmpstr); +	} +	spin_unlock(&svc_xprt_class_lock); + +	return len; +} +  static void svc_xprt_free(struct kref *kref)  {  	struct svc_xprt *xprt = diff --git a/net/sunrpc/sysctl.c b/net/sunrpc/sysctl.c index bada7de0c2f..0f8c439b848 100644 --- a/net/sunrpc/sysctl.c +++ b/net/sunrpc/sysctl.c @@ -18,6 +18,7 @@  #include <linux/sunrpc/types.h>  #include <linux/sunrpc/sched.h>  #include <linux/sunrpc/stats.h> +#include <linux/sunrpc/svc_xprt.h>  /*   * Declare the debug flags here @@ -55,6 +56,30 @@ rpc_unregister_sysctl(void)  	}  } +static int proc_do_xprt(ctl_table *table, int write, struct file *file, +			void __user *buffer, size_t *lenp, loff_t *ppos) +{ +	char tmpbuf[256]; +	int len; +	if ((*ppos && !write) || !*lenp) { +		*lenp = 0; +		return 0; +	} +	if (write) +		return -EINVAL; +	else { +		len = svc_print_xprts(tmpbuf, sizeof(tmpbuf)); +		if (!access_ok(VERIFY_WRITE, buffer, len)) +			return -EFAULT; + +		if (__copy_to_user(buffer, tmpbuf, len)) +			return -EFAULT; +	} +	*lenp -= len; +	*ppos += len; +	return 0; +} +  static int  proc_dodebug(ctl_table *table, int write, struct file *file,  				void __user *buffer, size_t *lenp, loff_t *ppos) @@ -147,6 +172,12 @@ static ctl_table debug_table[] = {  		.mode		= 0644,  		.proc_handler	= &proc_dodebug  	}, +	{ +		.procname	= "transports", +		.maxlen		= 256, +		.mode		= 0444, +		.proc_handler	= &proc_do_xprt, +	},  	{ .ctl_name = 0 }  };  |