svc: Add svc_xprt_names service to replace svc_sock_names

Create a transport independent version of the svc_sock_names function.

The toclose capability of the svc_sock_names service can be implemented
using the svc_xprt_find and svc_xprt_close services.

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>

authored by Tom Tucker and committed by J. Bruce Fields 9571af18 a217813f

+37 -1
+1 -1
fs/nfsd/nfsctl.c
··· 503 int len = 0; 504 lock_kernel(); 505 if (nfsd_serv) 506 - len = svc_sock_names(buf, nfsd_serv, NULL); 507 unlock_kernel(); 508 return len; 509 }
··· 503 int len = 0; 504 lock_kernel(); 505 if (nfsd_serv) 506 + len = svc_xprt_names(nfsd_serv, buf, 0); 507 unlock_kernel(); 508 return len; 509 }
+1
include/linux/sunrpc/svc_xprt.h
··· 81 int svc_port_is_privileged(struct sockaddr *sin); 82 int svc_print_xprts(char *buf, int maxlen); 83 struct svc_xprt *svc_find_xprt(struct svc_serv *, char *, int, int); 84 85 static inline void svc_xprt_get(struct svc_xprt *xprt) 86 {
··· 81 int svc_port_is_privileged(struct sockaddr *sin); 82 int svc_print_xprts(char *buf, int maxlen); 83 struct svc_xprt *svc_find_xprt(struct svc_serv *, char *, int, int); 84 + int svc_xprt_names(struct svc_serv *serv, char *buf, int buflen); 85 86 static inline void svc_xprt_get(struct svc_xprt *xprt) 87 {
+35
net/sunrpc/svc_xprt.c
··· 1014 return found; 1015 } 1016 EXPORT_SYMBOL_GPL(svc_find_xprt);
··· 1014 return found; 1015 } 1016 EXPORT_SYMBOL_GPL(svc_find_xprt); 1017 + 1018 + /* 1019 + * Format a buffer with a list of the active transports. A zero for 1020 + * the buflen parameter disables target buffer overflow checking. 1021 + */ 1022 + int svc_xprt_names(struct svc_serv *serv, char *buf, int buflen) 1023 + { 1024 + struct svc_xprt *xprt; 1025 + char xprt_str[64]; 1026 + int totlen = 0; 1027 + int len; 1028 + 1029 + /* Sanity check args */ 1030 + if (!serv) 1031 + return 0; 1032 + 1033 + spin_lock_bh(&serv->sv_lock); 1034 + list_for_each_entry(xprt, &serv->sv_permsocks, xpt_list) { 1035 + len = snprintf(xprt_str, sizeof(xprt_str), 1036 + "%s %d\n", xprt->xpt_class->xcl_name, 1037 + svc_xprt_local_port(xprt)); 1038 + /* If the string was truncated, replace with error string */ 1039 + if (len >= sizeof(xprt_str)) 1040 + strcpy(xprt_str, "name-too-long\n"); 1041 + /* Don't overflow buffer */ 1042 + len = strlen(xprt_str); 1043 + if (buflen && (len + totlen >= buflen)) 1044 + break; 1045 + strcpy(buf+totlen, xprt_str); 1046 + totlen += len; 1047 + } 1048 + spin_unlock_bh(&serv->sv_lock); 1049 + return totlen; 1050 + } 1051 + EXPORT_SYMBOL_GPL(svc_xprt_names);