aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorJeff Layton <jlayton@redhat.com>2010-07-19 16:50:05 -0400
committerJ. Bruce Fields <bfields@redhat.com>2010-07-23 08:51:23 -0400
commit78a8d7c8ca3f0cb5cd2a276c6fc17c8c006d0b3c (patch)
tree852f2db0fe35f7e88bedd9b4a182cb8b045b3c27 /fs
parent4ad9a344be2291b1e594a4a5aee25c5a5df34a97 (diff)
nfsd: fix error handling when starting nfsd with rpcbind down
The refcounting for nfsd is a little goofy. What happens is that we create the nfsd RPC service, attach sockets to it but don't actually start the threads until someone writes to the "threads" procfile. To do this, __write_ports_addfd will create the nfsd service and then will decrement the refcount when exiting but won't actually destroy the service. This is fine when there aren't errors, but when there are this can cause later attempts to start nfsd to fail. nfsd_serv will be set, and that causes __write_versions to return EBUSY. Fix this by calling svc_destroy on nfsd_serv when this function is going to return error. Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/nfsd/nfsctl.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
index 508941c23af7..af7469efc61c 100644
--- a/fs/nfsd/nfsctl.c
+++ b/fs/nfsd/nfsctl.c
@@ -950,14 +950,18 @@ static ssize_t __write_ports_addfd(char *buf)
950 return err; 950 return err;
951 951
952 err = lockd_up(); 952 err = lockd_up();
953 if (err != 0) 953 if (err != 0) {
954 goto out; 954 svc_destroy(nfsd_serv);
955 return err;
956 }
955 957
956 err = svc_addsock(nfsd_serv, fd, buf, SIMPLE_TRANSACTION_LIMIT); 958 err = svc_addsock(nfsd_serv, fd, buf, SIMPLE_TRANSACTION_LIMIT);
957 if (err < 0) 959 if (err < 0) {
958 lockd_down(); 960 lockd_down();
961 svc_destroy(nfsd_serv);
962 return err;
963 }
959 964
960out:
961 /* Decrease the count, but don't shut down the service */ 965 /* Decrease the count, but don't shut down the service */
962 nfsd_serv->sv_nrthreads--; 966 nfsd_serv->sv_nrthreads--;
963 return err; 967 return err;