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>
This commit is contained in:
Tom Tucker
2007-12-30 21:08:37 -06:00
committed by J. Bruce Fields
parent a217813f90
commit 9571af18fa
3 changed files with 37 additions and 1 deletions

View File

@@ -1014,3 +1014,38 @@ struct svc_xprt *svc_find_xprt(struct svc_serv *serv, char *xcl_name,
return found;
}
EXPORT_SYMBOL_GPL(svc_find_xprt);
/*
* Format a buffer with a list of the active transports. A zero for
* the buflen parameter disables target buffer overflow checking.
*/
int svc_xprt_names(struct svc_serv *serv, char *buf, int buflen)
{
struct svc_xprt *xprt;
char xprt_str[64];
int totlen = 0;
int len;
/* Sanity check args */
if (!serv)
return 0;
spin_lock_bh(&serv->sv_lock);
list_for_each_entry(xprt, &serv->sv_permsocks, xpt_list) {
len = snprintf(xprt_str, sizeof(xprt_str),
"%s %d\n", xprt->xpt_class->xcl_name,
svc_xprt_local_port(xprt));
/* If the string was truncated, replace with error string */
if (len >= sizeof(xprt_str))
strcpy(xprt_str, "name-too-long\n");
/* Don't overflow buffer */
len = strlen(xprt_str);
if (buflen && (len + totlen >= buflen))
break;
strcpy(buf+totlen, xprt_str);
totlen += len;
}
spin_unlock_bh(&serv->sv_lock);
return totlen;
}
EXPORT_SYMBOL_GPL(svc_xprt_names);