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>
This commit is contained in:
parent
78a8d7c8ca
commit
0cd14a061e
|
@ -1018,6 +1018,9 @@ static ssize_t __write_ports_addxprt(char *buf)
|
||||||
PF_INET6, port, SVC_SOCK_ANONYMOUS);
|
PF_INET6, port, SVC_SOCK_ANONYMOUS);
|
||||||
if (err < 0 && err != -EAFNOSUPPORT)
|
if (err < 0 && err != -EAFNOSUPPORT)
|
||||||
goto out_close;
|
goto out_close;
|
||||||
|
|
||||||
|
/* Decrease the count, but don't shut down the service */
|
||||||
|
nfsd_serv->sv_nrthreads--;
|
||||||
return 0;
|
return 0;
|
||||||
out_close:
|
out_close:
|
||||||
xprt = svc_find_xprt(nfsd_serv, transport, PF_INET, port);
|
xprt = svc_find_xprt(nfsd_serv, transport, PF_INET, port);
|
||||||
|
@ -1026,8 +1029,7 @@ out_close:
|
||||||
svc_xprt_put(xprt);
|
svc_xprt_put(xprt);
|
||||||
}
|
}
|
||||||
out_err:
|
out_err:
|
||||||
/* Decrease the count, but don't shut down the service */
|
svc_destroy(nfsd_serv);
|
||||||
nfsd_serv->sv_nrthreads--;
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue