static int create_lockd_listener(struct svc_serv *serv, const char *name, const int family, const unsigned short port) { struct svc_xprt *xprt; xprt = svc_find_xprt(serv, name, family, 0); if (xprt == NULL) return svc_create_xprt(serv, name, family, port, SVC_SOCK_DEFAULTS); svc_xprt_put(xprt); return 0; }
/* * A transport listener is removed by writing a "-", it's transport * name, and it's port number. */ static ssize_t __write_ports_delxprt(char *buf) { struct svc_xprt *xprt; char transport[16]; int port; if (sscanf(&buf[1], "%15s %4u", transport, &port) != 2) return -EINVAL; if (port < 1 || port > USHRT_MAX || nfsd_serv == NULL) return -EINVAL; xprt = svc_find_xprt(nfsd_serv, transport, AF_UNSPEC, port); if (xprt == NULL) return -ENOTCONN; svc_close_xprt(xprt); svc_xprt_put(xprt); return 0; }
static ssize_t __write_ports_addxprt(char *buf) { char transport[16]; struct svc_xprt *xprt; int port, err; struct net *net = &init_net; if (sscanf(buf, "%15s %4u", transport, &port) != 2) return -EINVAL; if (port < 1 || port > USHRT_MAX) return -EINVAL; err = nfsd_create_serv(); if (err != 0) return err; err = svc_create_xprt(nfsd_serv, transport, net, PF_INET, port, SVC_SOCK_ANONYMOUS); if (err < 0) goto out_err; err = svc_create_xprt(nfsd_serv, transport, net, PF_INET6, port, SVC_SOCK_ANONYMOUS); if (err < 0 && err != -EAFNOSUPPORT) goto out_close; nfsd_serv->sv_nrthreads--; return 0; out_close: xprt = svc_find_xprt(nfsd_serv, transport, net, PF_INET, port); if (xprt != NULL) { svc_close_xprt(xprt); svc_xprt_put(xprt); } out_err: nfsd_destroy(net); return err; }