diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c index 3fdff9a3b..a68e99042 100755 --- a/fs/nfsd/nfssvc.c +++ b/fs/nfsd/nfssvc.c @@ -567,6 +567,7 @@ void nfsd_last_thread(struct net *net) return; nfsd_shutdown_net(net); + pr_info("nfsd: last server has exited, flushing export cache\n"); nfsd_export_flush(net); } @@ -781,6 +782,7 @@ int nfsd_svc(int nrservs, struct net *net, const struct cred *cred) { int error; + bool nfsd_up_before; struct nfsd_net *nn = net_generic(net, nfsd_net_id); struct svc_serv *serv; @@ -800,6 +802,8 @@ nfsd_svc(int nrservs, struct net *net, const struct cred *cred) error = nfsd_create_serv(net); if (error) goto out; + + nfsd_up_before = nn->nfsd_net_up; serv = nn->nfsd_serv; error = nfsd_startup_net(net, cred); @@ -807,15 +811,17 @@ nfsd_svc(int nrservs, struct net *net, const struct cred *cred) goto out_put; error = svc_set_num_threads(serv, NULL, nrservs); if (error) - goto out_put; + goto out_shutdown; error = serv->sv_nrthreads; + if (error == 0) + nfsd_last_thread(net); +out_shutdown: + if (error < 0 && !nfsd_up_before) + nfsd_shutdown_net(net); out_put: /* Threads now hold service active */ if (xchg(&nn->keep_active, 0)) svc_put(serv); - - if (serv->sv_nrthreads == 0) - nfsd_last_thread(net); svc_put(serv); out: mutex_unlock(&nfsd_mutex);