Merge tag 'rdma-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland...
[linux-2.6-microblaze.git] / fs / nfsd / nfssvc.c
index 1879e43..752d56b 100644 (file)
@@ -221,7 +221,8 @@ static int nfsd_startup_generic(int nrservs)
         */
        ret = nfsd_racache_init(2*nrservs);
        if (ret)
-               return ret;
+               goto dec_users;
+
        ret = nfs4_state_start();
        if (ret)
                goto out_racache;
@@ -229,6 +230,8 @@ static int nfsd_startup_generic(int nrservs)
 
 out_racache:
        nfsd_racache_shutdown();
+dec_users:
+       nfsd_users--;
        return ret;
 }
 
@@ -405,6 +408,7 @@ int nfsd_create_serv(struct net *net)
        if (nn->nfsd_serv == NULL)
                return -ENOMEM;
 
+       nn->nfsd_serv->sv_maxconn = nn->max_connections;
        error = svc_bind(nn->nfsd_serv, net);
        if (error < 0) {
                svc_destroy(nn->nfsd_serv);
@@ -469,8 +473,7 @@ int nfsd_set_nrthreads(int n, int *nthreads, struct net *net)
        /* enforce a global maximum number of threads */
        tot = 0;
        for (i = 0; i < n; i++) {
-               if (nthreads[i] > NFSD_MAXSERVS)
-                       nthreads[i] = NFSD_MAXSERVS;
+               nthreads[i] = min(nthreads[i], NFSD_MAXSERVS);
                tot += nthreads[i];
        }
        if (tot > NFSD_MAXSERVS) {
@@ -519,11 +522,11 @@ nfsd_svc(int nrservs, struct net *net)
 
        mutex_lock(&nfsd_mutex);
        dprintk("nfsd: creating service\n");
-       if (nrservs <= 0)
-               nrservs = 0;
-       if (nrservs > NFSD_MAXSERVS)
-               nrservs = NFSD_MAXSERVS;
+
+       nrservs = max(nrservs, 0);
+       nrservs = min(nrservs, NFSD_MAXSERVS);
        error = 0;
+
        if (nrservs == 0 && nn->nfsd_serv == NULL)
                goto out;
 
@@ -564,6 +567,7 @@ nfsd(void *vrqstp)
        struct svc_rqst *rqstp = (struct svc_rqst *) vrqstp;
        struct svc_xprt *perm_sock = list_entry(rqstp->rq_server->sv_permsocks.next, typeof(struct svc_xprt), xpt_list);
        struct net *net = perm_sock->xpt_net;
+       struct nfsd_net *nn = net_generic(net, nfsd_net_id);
        int err;
 
        /* Lock module and set up kernel thread */
@@ -597,6 +601,9 @@ nfsd(void *vrqstp)
         * The main request loop
         */
        for (;;) {
+               /* Update sv_maxconn if it has changed */
+               rqstp->rq_server->sv_maxconn = nn->max_connections;
+
                /*
                 * Find a socket with data available and call its
                 * recvfrom routine.