static int nfsd_startup_generic(int nrservs) { int ret; if (nfsd_users++) return 0; /* * Readahead param cache - will no-op if it already exists. * (Note therefore results will be suboptimal if number of * threads is modified after nfsd start.) */ ret = nfsd_racache_init(2*nrservs); if (ret) goto dec_users; ret = nfs4_state_start(); if (ret) goto out_racache; return 0; out_racache: nfsd_racache_shutdown(); dec_users: nfsd_users--; return ret; }
static int nfsd_startup(unsigned short port, int nrservs) { int ret; if (nfsd_up) return 0; /* * Readahead param cache - will no-op if it already exists. * (Note therefore results will be suboptimal if number of * threads is modified after nfsd start.) */ ret = nfsd_racache_init(2*nrservs); if (ret) return ret; ret = nfsd_init_socks(port); if (ret) goto out_racache; ret = lockd_up(); if (ret) goto out_racache; ret = nfs4_state_start(); if (ret) goto out_lockd; nfsd_up = true; return 0; out_lockd: lockd_down(); out_racache: nfsd_racache_shutdown(); return ret; }
static int nfsd_startup(unsigned short port, int nrservs) { int ret; if (nfsd_up) return 0; /* */ ret = nfsd_racache_init(2*nrservs); if (ret) return ret; ret = nfsd_init_socks(port); if (ret) goto out_racache; ret = lockd_up(); if (ret) goto out_racache; ret = nfs4_state_start(); if (ret) goto out_lockd; nfsd_up = true; return 0; out_lockd: lockd_down(); out_racache: nfsd_racache_shutdown(); return ret; }
int nfsd_svc(unsigned short port, int nrservs) { int error; int none_left; struct list_head *victim; lock_kernel(); dprintk("nfsd: creating service\n"); error = -EINVAL; if (nrservs <= 0) nrservs = 0; if (nrservs > NFSD_MAXSERVS) nrservs = NFSD_MAXSERVS; /* Readahead param cache - will no-op if it already exists */ error = nfsd_racache_init(2*nrservs); nfs4_state_init(); if (error<0) goto out; if (!nfsd_serv) { atomic_set(&nfsd_busy, 0); error = -ENOMEM; nfsd_serv = svc_create(&nfsd_program, NFSD_BUFSIZE); if (nfsd_serv == NULL) goto out; error = svc_makesock(nfsd_serv, IPPROTO_UDP, port); if (error < 0) goto failure; #ifdef CONFIG_NFSD_TCP error = svc_makesock(nfsd_serv, IPPROTO_TCP, port); if (error < 0) goto failure; #endif do_gettimeofday(&nfssvc_boot); /* record boot time */ } else nfsd_serv->sv_nrthreads++; nrservs -= (nfsd_serv->sv_nrthreads-1); while (nrservs > 0) { nrservs--; __module_get(THIS_MODULE); error = svc_create_thread(nfsd, nfsd_serv); if (error < 0) { module_put(THIS_MODULE); break; } } victim = nfsd_list.next; while (nrservs < 0 && victim != &nfsd_list) { struct nfsd_list *nl = list_entry(victim,struct nfsd_list, list); victim = victim->next; send_sig(SIG_NOCLEAN, nl->task, 1); nrservs++; } failure: none_left = (nfsd_serv->sv_nrthreads == 1); svc_destroy(nfsd_serv); /* Release server */ if (none_left) { nfsd_serv = NULL; nfsd_racache_shutdown(); nfs4_state_shutdown(); } out: unlock_kernel(); return error; }