aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfsd/nfsctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nfsd/nfsctl.c')
-rw-r--r--fs/nfsd/nfsctl.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
index 2604c3e70ea5..e3591073098f 100644
--- a/fs/nfsd/nfsctl.c
+++ b/fs/nfsd/nfsctl.c
@@ -4,6 +4,7 @@
4 * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de> 4 * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
5 */ 5 */
6 6
7#include <linux/slab.h>
7#include <linux/namei.h> 8#include <linux/namei.h>
8#include <linux/ctype.h> 9#include <linux/ctype.h>
9 10
@@ -988,6 +989,7 @@ static ssize_t __write_ports_delfd(char *buf)
988static ssize_t __write_ports_addxprt(char *buf) 989static ssize_t __write_ports_addxprt(char *buf)
989{ 990{
990 char transport[16]; 991 char transport[16];
992 struct svc_xprt *xprt;
991 int port, err; 993 int port, err;
992 994
993 if (sscanf(buf, "%15s %4u", transport, &port) != 2) 995 if (sscanf(buf, "%15s %4u", transport, &port) != 2)
@@ -1002,13 +1004,24 @@ static ssize_t __write_ports_addxprt(char *buf)
1002 1004
1003 err = svc_create_xprt(nfsd_serv, transport, 1005 err = svc_create_xprt(nfsd_serv, transport,
1004 PF_INET, port, SVC_SOCK_ANONYMOUS); 1006 PF_INET, port, SVC_SOCK_ANONYMOUS);
1005 if (err < 0) { 1007 if (err < 0)
1006 /* Give a reasonable perror msg for bad transport string */ 1008 goto out_err;
1007 if (err == -ENOENT) 1009
1008 err = -EPROTONOSUPPORT; 1010 err = svc_create_xprt(nfsd_serv, transport,
1009 return err; 1011 PF_INET6, port, SVC_SOCK_ANONYMOUS);
1010 } 1012 if (err < 0 && err != -EAFNOSUPPORT)
1013 goto out_close;
1011 return 0; 1014 return 0;
1015out_close:
1016 xprt = svc_find_xprt(nfsd_serv, transport, PF_INET, port);
1017 if (xprt != NULL) {
1018 svc_close_xprt(xprt);
1019 svc_xprt_put(xprt);
1020 }
1021out_err:
1022 /* Decrease the count, but don't shut down the service */
1023 nfsd_serv->sv_nrthreads--;
1024 return err;
1012} 1025}
1013 1026
1014/* 1027/*