diff options
Diffstat (limited to 'fs/nfsd/nfssvc.c')
-rw-r--r-- | fs/nfsd/nfssvc.c | 83 |
1 files changed, 57 insertions, 26 deletions
diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c index 140e3a2d1b9..5d473d8f063 100644 --- a/fs/nfsd/nfssvc.c +++ b/fs/nfsd/nfssvc.c @@ -195,6 +195,52 @@ void nfsd_reset_versions(void) } } +static int nfsd_create_serv(void) +{ + int err = 0; + lock_kernel(); + if (nfsd_serv) { + nfsd_serv->sv_nrthreads++; + unlock_kernel(); + return 0; + } + + atomic_set(&nfsd_busy, 0); + nfsd_serv = svc_create(&nfsd_program, NFSD_BUFSIZE, + nfsd_last_thread); + if (nfsd_serv == NULL) + err = -ENOMEM; + else + nfsd_serv->sv_nrthreads++; + unlock_kernel(); + do_gettimeofday(&nfssvc_boot); /* record boot time */ + return err; +} + +static int nfsd_init_socks(int port) +{ + int error; + if (!list_empty(&nfsd_serv->sv_permsocks)) + return 0; + + error = svc_makesock(nfsd_serv, IPPROTO_UDP, port); + if (error < 0) + return error; + error = lockd_up(IPPROTO_UDP); + if (error < 0) + return error; + +#ifdef CONFIG_NFSD_TCP + error = svc_makesock(nfsd_serv, IPPROTO_TCP, port); + if (error < 0) + return error; + error = lockd_up(IPPROTO_TCP); + if (error < 0) + return error; +#endif + return 0; +} + int nfsd_svc(unsigned short port, int nrservs) { @@ -216,32 +262,17 @@ nfsd_svc(unsigned short port, int nrservs) error = nfs4_state_start(); if (error<0) goto out; - if (!nfsd_serv) { - nfsd_reset_versions(); - - atomic_set(&nfsd_busy, 0); - error = -ENOMEM; - nfsd_serv = svc_create(&nfsd_program, NFSD_BUFSIZE, - nfsd_last_thread); - if (nfsd_serv == NULL) - goto out; - error = svc_makesock(nfsd_serv, IPPROTO_UDP, port); - if (error < 0) - goto failure; - error = lockd_up(IPPROTO_UDP); - if (error < 0) - goto failure; -#ifdef CONFIG_NFSD_TCP - error = svc_makesock(nfsd_serv, IPPROTO_TCP, port); - if (error < 0) - goto failure; - error = lockd_up(IPPROTO_TCP); - if (error < 0) - goto failure; -#endif - do_gettimeofday(&nfssvc_boot); /* record boot time */ - } else - nfsd_serv->sv_nrthreads++; + + nfsd_reset_versions(); + + error = nfsd_create_serv(); + + if (error) + goto out; + error = nfsd_init_socks(port); + if (error) + goto failure; + nrservs -= (nfsd_serv->sv_nrthreads-1); while (nrservs > 0) { nrservs--; |