Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dc9a16e4 authored by Tom Tucker's avatar Tom Tucker Committed by J. Bruce Fields
Browse files

svc: Add /proc/sys/sunrpc/transport files



Add a file that when read lists the set of registered svc
transports.

Signed-off-by: default avatarTom Tucker <tom@opengridcomputing.com>
Acked-by: default avatarNeil Brown <neilb@suse.de>
Reviewed-by: default avatarChuck Lever <chuck.lever@oracle.com>
Reviewed-by: default avatarGreg Banks <gnb@sgi.com>
Signed-off-by: default avatarJ. Bruce Fields <bfields@citi.umich.edu>
parent 260c1d12
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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)
{
+28 −0
Original line number Diff line number Diff line
@@ -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 =
+31 −0
Original line number Diff line number Diff line
@@ -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 }
};