|
@@ -661,6 +661,7 @@ static ssize_t __write_ports_addfd(char *buf)
|
|
|
{
|
|
|
char *mesg = buf;
|
|
|
int fd, err;
|
|
|
+ struct net *net = &init_net;
|
|
|
|
|
|
err = get_int(&mesg, &fd);
|
|
|
if (err != 0 || fd < 0)
|
|
@@ -672,6 +673,8 @@ static ssize_t __write_ports_addfd(char *buf)
|
|
|
|
|
|
err = svc_addsock(nfsd_serv, fd, buf, SIMPLE_TRANSACTION_LIMIT);
|
|
|
if (err < 0) {
|
|
|
+ if (nfsd_serv->sv_nrthreads == 1)
|
|
|
+ svc_shutdown_net(nfsd_serv, net);
|
|
|
svc_destroy(nfsd_serv);
|
|
|
return err;
|
|
|
}
|
|
@@ -709,6 +712,7 @@ 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;
|
|
@@ -720,12 +724,12 @@ static ssize_t __write_ports_addxprt(char *buf)
|
|
|
if (err != 0)
|
|
|
return err;
|
|
|
|
|
|
- err = svc_create_xprt(nfsd_serv, transport, &init_net,
|
|
|
+ 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, &init_net,
|
|
|
+ err = svc_create_xprt(nfsd_serv, transport, net,
|
|
|
PF_INET6, port, SVC_SOCK_ANONYMOUS);
|
|
|
if (err < 0 && err != -EAFNOSUPPORT)
|
|
|
goto out_close;
|
|
@@ -734,12 +738,14 @@ static ssize_t __write_ports_addxprt(char *buf)
|
|
|
nfsd_serv->sv_nrthreads--;
|
|
|
return 0;
|
|
|
out_close:
|
|
|
- xprt = svc_find_xprt(nfsd_serv, transport, &init_net, PF_INET, port);
|
|
|
+ xprt = svc_find_xprt(nfsd_serv, transport, net, PF_INET, port);
|
|
|
if (xprt != NULL) {
|
|
|
svc_close_xprt(xprt);
|
|
|
svc_xprt_put(xprt);
|
|
|
}
|
|
|
out_err:
|
|
|
+ if (nfsd_serv->sv_nrthreads == 1)
|
|
|
+ svc_shutdown_net(nfsd_serv, net);
|
|
|
svc_destroy(nfsd_serv);
|
|
|
return err;
|
|
|
}
|