aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Layton <jlayton@redhat.com>2010-07-19 16:50:06 -0400
committerJ. Bruce Fields <bfields@redhat.com>2010-07-23 08:51:24 -0400
commit0cd14a061e32d4ddaadad24d86d06cc860010591 (patch)
treedb6a42968f9069b17ad64200f7e7cd7c90c303bb
parent78a8d7c8ca3f0cb5cd2a276c6fc17c8c006d0b3c (diff)
nfsd: fix error handling in __write_ports_addxprt
__write_ports_addxprt calls nfsd_create_serv. That increases the refcount of nfsd_serv (which is tracked in sv_nrthreads). The service only decrements the thread count on error, not on success like __write_ports_addfd does, so using this interface leaves the nfsd thread count high. Fix this by having this function call svc_destroy() on error to release the reference (and possibly to tear down the service) and simply decrement the refcount without tearing down the service on success. This makes the sv_threads handling work basically the same in both __write_ports_addxprt and __write_ports_addfd. Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
-rw-r--r--fs/nfsd/nfsctl.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
index af7469efc61c..9e8645a07fca 100644
--- a/fs/nfsd/nfsctl.c
+++ b/fs/nfsd/nfsctl.c
@@ -1018,6 +1018,9 @@ static ssize_t __write_ports_addxprt(char *buf)
1018 PF_INET6, port, SVC_SOCK_ANONYMOUS); 1018 PF_INET6, port, SVC_SOCK_ANONYMOUS);
1019 if (err < 0 && err != -EAFNOSUPPORT) 1019 if (err < 0 && err != -EAFNOSUPPORT)
1020 goto out_close; 1020 goto out_close;
1021
1022 /* Decrease the count, but don't shut down the service */
1023 nfsd_serv->sv_nrthreads--;
1021 return 0; 1024 return 0;
1022out_close: 1025out_close:
1023 xprt = svc_find_xprt(nfsd_serv, transport, PF_INET, port); 1026 xprt = svc_find_xprt(nfsd_serv, transport, PF_INET, port);
@@ -1026,8 +1029,7 @@ out_close:
1026 svc_xprt_put(xprt); 1029 svc_xprt_put(xprt);
1027 } 1030 }
1028out_err: 1031out_err:
1029 /* Decrease the count, but don't shut down the service */ 1032 svc_destroy(nfsd_serv);
1030 nfsd_serv->sv_nrthreads--;
1031 return err; 1033 return err;
1032} 1034}
1033 1035