mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-09-04 20:19:47 +08:00 
			
		
		
		
	svc: Add /proc/sys/sunrpc/transport files
Add a file that when read lists the set of registered svc transports. Signed-off-by: Tom Tucker <tom@opengridcomputing.com> Acked-by: Neil Brown <neilb@suse.de> Reviewed-by: Chuck Lever <chuck.lever@oracle.com> Reviewed-by: Greg Banks <gnb@sgi.com> Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
This commit is contained in:
		
							parent
							
								
									260c1d1298
								
							
						
					
					
						commit
						dc9a16e49d
					
				| @ -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_close_xprt(struct svc_xprt *xprt); | ||||||
| void	svc_delete_xprt(struct svc_xprt *xprt); | void	svc_delete_xprt(struct svc_xprt *xprt); | ||||||
| int	svc_port_is_privileged(struct sockaddr *sin); | 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) | static inline void svc_xprt_get(struct svc_xprt *xprt) | ||||||
| { | { | ||||||
|  | |||||||
| @ -112,6 +112,34 @@ void svc_unreg_xprt_class(struct svc_xprt_class *xcl) | |||||||
| } | } | ||||||
| EXPORT_SYMBOL_GPL(svc_unreg_xprt_class); | 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) | static void svc_xprt_free(struct kref *kref) | ||||||
| { | { | ||||||
| 	struct svc_xprt *xprt = | 	struct svc_xprt *xprt = | ||||||
|  | |||||||
| @ -18,6 +18,7 @@ | |||||||
| #include <linux/sunrpc/types.h> | #include <linux/sunrpc/types.h> | ||||||
| #include <linux/sunrpc/sched.h> | #include <linux/sunrpc/sched.h> | ||||||
| #include <linux/sunrpc/stats.h> | #include <linux/sunrpc/stats.h> | ||||||
|  | #include <linux/sunrpc/svc_xprt.h> | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Declare the debug flags here |  * 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 | static int | ||||||
| proc_dodebug(ctl_table *table, int write, struct file *file, | proc_dodebug(ctl_table *table, int write, struct file *file, | ||||||
| 				void __user *buffer, size_t *lenp, loff_t *ppos) | 				void __user *buffer, size_t *lenp, loff_t *ppos) | ||||||
| @ -147,6 +172,12 @@ static ctl_table debug_table[] = { | |||||||
| 		.mode		= 0644, | 		.mode		= 0644, | ||||||
| 		.proc_handler	= &proc_dodebug | 		.proc_handler	= &proc_dodebug | ||||||
| 	}, | 	}, | ||||||
|  | 	{ | ||||||
|  | 		.procname	= "transports", | ||||||
|  | 		.maxlen		= 256, | ||||||
|  | 		.mode		= 0444, | ||||||
|  | 		.proc_handler	= &proc_do_xprt, | ||||||
|  | 	}, | ||||||
| 	{ .ctl_name = 0 } | 	{ .ctl_name = 0 } | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Tom Tucker
						Tom Tucker