diff options
Diffstat (limited to 'fs/nfsd/nfssvc.c')
-rw-r--r-- | fs/nfsd/nfssvc.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c index 1879e43f2868..752d56bbe0ba 100644 --- a/fs/nfsd/nfssvc.c +++ b/fs/nfsd/nfssvc.c | |||
@@ -221,7 +221,8 @@ static int nfsd_startup_generic(int nrservs) | |||
221 | */ | 221 | */ |
222 | ret = nfsd_racache_init(2*nrservs); | 222 | ret = nfsd_racache_init(2*nrservs); |
223 | if (ret) | 223 | if (ret) |
224 | return ret; | 224 | goto dec_users; |
225 | |||
225 | ret = nfs4_state_start(); | 226 | ret = nfs4_state_start(); |
226 | if (ret) | 227 | if (ret) |
227 | goto out_racache; | 228 | goto out_racache; |
@@ -229,6 +230,8 @@ static int nfsd_startup_generic(int nrservs) | |||
229 | 230 | ||
230 | out_racache: | 231 | out_racache: |
231 | nfsd_racache_shutdown(); | 232 | nfsd_racache_shutdown(); |
233 | dec_users: | ||
234 | nfsd_users--; | ||
232 | return ret; | 235 | return ret; |
233 | } | 236 | } |
234 | 237 | ||
@@ -405,6 +408,7 @@ int nfsd_create_serv(struct net *net) | |||
405 | if (nn->nfsd_serv == NULL) | 408 | if (nn->nfsd_serv == NULL) |
406 | return -ENOMEM; | 409 | return -ENOMEM; |
407 | 410 | ||
411 | nn->nfsd_serv->sv_maxconn = nn->max_connections; | ||
408 | error = svc_bind(nn->nfsd_serv, net); | 412 | error = svc_bind(nn->nfsd_serv, net); |
409 | if (error < 0) { | 413 | if (error < 0) { |
410 | svc_destroy(nn->nfsd_serv); | 414 | svc_destroy(nn->nfsd_serv); |
@@ -469,8 +473,7 @@ int nfsd_set_nrthreads(int n, int *nthreads, struct net *net) | |||
469 | /* enforce a global maximum number of threads */ | 473 | /* enforce a global maximum number of threads */ |
470 | tot = 0; | 474 | tot = 0; |
471 | for (i = 0; i < n; i++) { | 475 | for (i = 0; i < n; i++) { |
472 | if (nthreads[i] > NFSD_MAXSERVS) | 476 | nthreads[i] = min(nthreads[i], NFSD_MAXSERVS); |
473 | nthreads[i] = NFSD_MAXSERVS; | ||
474 | tot += nthreads[i]; | 477 | tot += nthreads[i]; |
475 | } | 478 | } |
476 | if (tot > NFSD_MAXSERVS) { | 479 | if (tot > NFSD_MAXSERVS) { |
@@ -519,11 +522,11 @@ nfsd_svc(int nrservs, struct net *net) | |||
519 | 522 | ||
520 | mutex_lock(&nfsd_mutex); | 523 | mutex_lock(&nfsd_mutex); |
521 | dprintk("nfsd: creating service\n"); | 524 | dprintk("nfsd: creating service\n"); |
522 | if (nrservs <= 0) | 525 | |
523 | nrservs = 0; | 526 | nrservs = max(nrservs, 0); |
524 | if (nrservs > NFSD_MAXSERVS) | 527 | nrservs = min(nrservs, NFSD_MAXSERVS); |
525 | nrservs = NFSD_MAXSERVS; | ||
526 | error = 0; | 528 | error = 0; |
529 | |||
527 | if (nrservs == 0 && nn->nfsd_serv == NULL) | 530 | if (nrservs == 0 && nn->nfsd_serv == NULL) |
528 | goto out; | 531 | goto out; |
529 | 532 | ||
@@ -564,6 +567,7 @@ nfsd(void *vrqstp) | |||
564 | struct svc_rqst *rqstp = (struct svc_rqst *) vrqstp; | 567 | struct svc_rqst *rqstp = (struct svc_rqst *) vrqstp; |
565 | struct svc_xprt *perm_sock = list_entry(rqstp->rq_server->sv_permsocks.next, typeof(struct svc_xprt), xpt_list); | 568 | struct svc_xprt *perm_sock = list_entry(rqstp->rq_server->sv_permsocks.next, typeof(struct svc_xprt), xpt_list); |
566 | struct net *net = perm_sock->xpt_net; | 569 | struct net *net = perm_sock->xpt_net; |
570 | struct nfsd_net *nn = net_generic(net, nfsd_net_id); | ||
567 | int err; | 571 | int err; |
568 | 572 | ||
569 | /* Lock module and set up kernel thread */ | 573 | /* Lock module and set up kernel thread */ |
@@ -597,6 +601,9 @@ nfsd(void *vrqstp) | |||
597 | * The main request loop | 601 | * The main request loop |
598 | */ | 602 | */ |
599 | for (;;) { | 603 | for (;;) { |
604 | /* Update sv_maxconn if it has changed */ | ||
605 | rqstp->rq_server->sv_maxconn = nn->max_connections; | ||
606 | |||
600 | /* | 607 | /* |
601 | * Find a socket with data available and call its | 608 | * Find a socket with data available and call its |
602 | * recvfrom routine. | 609 | * recvfrom routine. |