diff options
| author | Tom Tucker <tom@opengridcomputing.com> | 2007-12-30 22:08:31 -0500 |
|---|---|---|
| committer | J. Bruce Fields <bfields@citi.umich.edu> | 2008-02-01 16:42:13 -0500 |
| commit | dc9a16e49dbba3dd042e6aec5d9a7929e099a89b (patch) | |
| tree | 5aee4ec75869697350d3cebdfaaf8e10435ebbc2 | |
| parent | 260c1d1298f6703d38fdccd3dd5a310766327340 (diff) | |
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>
| -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 405281e745d1..01e71b7a2e20 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); | |||
| 79 | void svc_close_xprt(struct svc_xprt *xprt); | 79 | void svc_close_xprt(struct svc_xprt *xprt); |
| 80 | void svc_delete_xprt(struct svc_xprt *xprt); | 80 | void svc_delete_xprt(struct svc_xprt *xprt); |
| 81 | int svc_port_is_privileged(struct sockaddr *sin); | 81 | int svc_port_is_privileged(struct sockaddr *sin); |
| 82 | int svc_print_xprts(char *buf, int maxlen); | ||
| 82 | 83 | ||
| 83 | static inline void svc_xprt_get(struct svc_xprt *xprt) | 84 | static inline void svc_xprt_get(struct svc_xprt *xprt) |
| 84 | { | 85 | { |
diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c index 000c7dc3b82c..2e5b92ae24ed 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) | |||
| 112 | } | 112 | } |
| 113 | EXPORT_SYMBOL_GPL(svc_unreg_xprt_class); | 113 | EXPORT_SYMBOL_GPL(svc_unreg_xprt_class); |
| 114 | 114 | ||
| 115 | /* | ||
| 116 | * Format the transport list for printing | ||
| 117 | */ | ||
| 118 | int svc_print_xprts(char *buf, int maxlen) | ||
| 119 | { | ||
| 120 | struct list_head *le; | ||
| 121 | char tmpstr[80]; | ||
| 122 | int len = 0; | ||
| 123 | buf[0] = '\0'; | ||
| 124 | |||
| 125 | spin_lock(&svc_xprt_class_lock); | ||
| 126 | list_for_each(le, &svc_xprt_class_list) { | ||
| 127 | int slen; | ||
| 128 | struct svc_xprt_class *xcl = | ||
| 129 | list_entry(le, struct svc_xprt_class, xcl_list); | ||
| 130 | |||
| 131 | sprintf(tmpstr, "%s %d\n", xcl->xcl_name, xcl->xcl_max_payload); | ||
| 132 | slen = strlen(tmpstr); | ||
| 133 | if (len + slen > maxlen) | ||
| 134 | break; | ||
| 135 | len += slen; | ||
| 136 | strcat(buf, tmpstr); | ||
| 137 | } | ||
| 138 | spin_unlock(&svc_xprt_class_lock); | ||
| 139 | |||
| 140 | return len; | ||
| 141 | } | ||
| 142 | |||
| 115 | static void svc_xprt_free(struct kref *kref) | 143 | static void svc_xprt_free(struct kref *kref) |
| 116 | { | 144 | { |
| 117 | struct svc_xprt *xprt = | 145 | struct svc_xprt *xprt = |
diff --git a/net/sunrpc/sysctl.c b/net/sunrpc/sysctl.c index bada7de0c2fc..0f8c439b848a 100644 --- a/net/sunrpc/sysctl.c +++ b/net/sunrpc/sysctl.c | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #include <linux/sunrpc/types.h> | 18 | #include <linux/sunrpc/types.h> |
| 19 | #include <linux/sunrpc/sched.h> | 19 | #include <linux/sunrpc/sched.h> |
| 20 | #include <linux/sunrpc/stats.h> | 20 | #include <linux/sunrpc/stats.h> |
| 21 | #include <linux/sunrpc/svc_xprt.h> | ||
| 21 | 22 | ||
| 22 | /* | 23 | /* |
| 23 | * Declare the debug flags here | 24 | * Declare the debug flags here |
| @@ -55,6 +56,30 @@ rpc_unregister_sysctl(void) | |||
| 55 | } | 56 | } |
| 56 | } | 57 | } |
| 57 | 58 | ||
| 59 | static int proc_do_xprt(ctl_table *table, int write, struct file *file, | ||
| 60 | void __user *buffer, size_t *lenp, loff_t *ppos) | ||
| 61 | { | ||
| 62 | char tmpbuf[256]; | ||
| 63 | int len; | ||
| 64 | if ((*ppos && !write) || !*lenp) { | ||
| 65 | *lenp = 0; | ||
| 66 | return 0; | ||
| 67 | } | ||
| 68 | if (write) | ||
| 69 | return -EINVAL; | ||
| 70 | else { | ||
| 71 | len = svc_print_xprts(tmpbuf, sizeof(tmpbuf)); | ||
| 72 | if (!access_ok(VERIFY_WRITE, buffer, len)) | ||
| 73 | return -EFAULT; | ||
| 74 | |||
| 75 | if (__copy_to_user(buffer, tmpbuf, len)) | ||
| 76 | return -EFAULT; | ||
| 77 | } | ||
| 78 | *lenp -= len; | ||
| 79 | *ppos += len; | ||
| 80 | return 0; | ||
| 81 | } | ||
| 82 | |||
| 58 | static int | 83 | static int |
| 59 | proc_dodebug(ctl_table *table, int write, struct file *file, | 84 | proc_dodebug(ctl_table *table, int write, struct file *file, |
| 60 | void __user *buffer, size_t *lenp, loff_t *ppos) | 85 | void __user *buffer, size_t *lenp, loff_t *ppos) |
| @@ -147,6 +172,12 @@ static ctl_table debug_table[] = { | |||
| 147 | .mode = 0644, | 172 | .mode = 0644, |
| 148 | .proc_handler = &proc_dodebug | 173 | .proc_handler = &proc_dodebug |
| 149 | }, | 174 | }, |
| 175 | { | ||
| 176 | .procname = "transports", | ||
| 177 | .maxlen = 256, | ||
| 178 | .mode = 0444, | ||
| 179 | .proc_handler = &proc_do_xprt, | ||
| 180 | }, | ||
| 150 | { .ctl_name = 0 } | 181 | { .ctl_name = 0 } |
| 151 | }; | 182 | }; |
| 152 | 183 | ||
