diff options
Diffstat (limited to 'fs/nfsd/nfsctl.c')
| -rw-r--r-- | fs/nfsd/nfsctl.c | 24 | 
1 files changed, 18 insertions, 6 deletions
| diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c index 2604c3e70ea5..0f0e77f2012f 100644 --- a/fs/nfsd/nfsctl.c +++ b/fs/nfsd/nfsctl.c | |||
| @@ -988,6 +988,7 @@ static ssize_t __write_ports_delfd(char *buf) | |||
| 988 | static ssize_t __write_ports_addxprt(char *buf) | 988 | static ssize_t __write_ports_addxprt(char *buf) | 
| 989 | { | 989 | { | 
| 990 | char transport[16]; | 990 | char transport[16]; | 
| 991 | struct svc_xprt *xprt; | ||
| 991 | int port, err; | 992 | int port, err; | 
| 992 | 993 | ||
| 993 | if (sscanf(buf, "%15s %4u", transport, &port) != 2) | 994 | if (sscanf(buf, "%15s %4u", transport, &port) != 2) | 
| @@ -1002,13 +1003,24 @@ static ssize_t __write_ports_addxprt(char *buf) | |||
| 1002 | 1003 | ||
| 1003 | err = svc_create_xprt(nfsd_serv, transport, | 1004 | err = svc_create_xprt(nfsd_serv, transport, | 
| 1004 | PF_INET, port, SVC_SOCK_ANONYMOUS); | 1005 | PF_INET, port, SVC_SOCK_ANONYMOUS); | 
| 1005 | if (err < 0) { | 1006 | if (err < 0) | 
| 1006 | /* Give a reasonable perror msg for bad transport string */ | 1007 | goto out_err; | 
| 1007 | if (err == -ENOENT) | 1008 | |
| 1008 | err = -EPROTONOSUPPORT; | 1009 | err = svc_create_xprt(nfsd_serv, transport, | 
| 1009 | return err; | 1010 | PF_INET6, port, SVC_SOCK_ANONYMOUS); | 
| 1010 | } | 1011 | if (err < 0 && err != -EAFNOSUPPORT) | 
| 1012 | goto out_close; | ||
| 1011 | return 0; | 1013 | return 0; | 
| 1014 | out_close: | ||
| 1015 | xprt = svc_find_xprt(nfsd_serv, transport, PF_INET, port); | ||
| 1016 | if (xprt != NULL) { | ||
| 1017 | svc_close_xprt(xprt); | ||
| 1018 | svc_xprt_put(xprt); | ||
| 1019 | } | ||
| 1020 | out_err: | ||
| 1021 | /* Decrease the count, but don't shut down the service */ | ||
| 1022 | nfsd_serv->sv_nrthreads--; | ||
| 1023 | return err; | ||
| 1012 | } | 1024 | } | 
| 1013 | 1025 | ||
| 1014 | /* | 1026 | /* | 
