[PATCH] knfsd: use svc_set_num_threads to manage threads in knfsd
authorGreg Banks <gnb@melbourne.sgi.com>
Mon, 2 Oct 2006 09:18:00 +0000 (02:18 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Mon, 2 Oct 2006 14:57:20 +0000 (07:57 -0700)
Replace the existing list of all nfsd threads with new code using
svc_create_pooled().

Signed-off-by: Greg Banks <gnb@melbourne.sgi.com>
Signed-off-by: Neil Brown <neilb@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
fs/nfsd/nfssvc.c

index 9773f593b3ff97e5a8cfd5d71d2142b3df31fdfb..0029cb290f18c0fb746e6a3449a0375c28900c94 100644 (file)
@@ -57,12 +57,6 @@ static atomic_t                      nfsd_busy;
 static unsigned long           nfsd_last_call;
 static DEFINE_SPINLOCK(nfsd_call_lock);
 
-struct nfsd_list {
-       struct list_head        list;
-       struct task_struct      *task;
-};
-static struct list_head nfsd_list = LIST_HEAD_INIT(nfsd_list);
-
 #if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL)
 static struct svc_stat nfsd_acl_svcstats;
 static struct svc_version *    nfsd_acl_version[] = {
@@ -206,8 +200,9 @@ int nfsd_create_serv(void)
        }
 
        atomic_set(&nfsd_busy, 0);
-       nfsd_serv = svc_create(&nfsd_program, NFSD_BUFSIZE,
-                              nfsd_last_thread);
+       nfsd_serv = svc_create_pooled(&nfsd_program, NFSD_BUFSIZE,
+                                     nfsd_last_thread,
+                                     nfsd, SIG_NOCLEAN, THIS_MODULE);
        if (nfsd_serv == NULL)
                err = -ENOMEM;
        unlock_kernel();
@@ -247,7 +242,6 @@ int
 nfsd_svc(unsigned short port, int nrservs)
 {
        int     error;
-       struct list_head *victim;
        
        lock_kernel();
        dprintk("nfsd: creating service\n");
@@ -275,24 +269,7 @@ nfsd_svc(unsigned short port, int nrservs)
        if (error)
                goto failure;
 
-       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++;
-       }
+       error = svc_set_num_threads(nfsd_serv, NULL, nrservs);
  failure:
        svc_destroy(nfsd_serv);         /* Release server */
  out:
@@ -329,7 +306,6 @@ nfsd(struct svc_rqst *rqstp)
 {
        struct fs_struct *fsp;
        int             err;
-       struct nfsd_list me;
        sigset_t shutdown_mask, allowed_mask;
 
        /* Lock module and set up kernel thread */
@@ -353,8 +329,7 @@ nfsd(struct svc_rqst *rqstp)
 
        nfsdstats.th_cnt++;
 
-       me.task = current;
-       list_add(&me.list, &nfsd_list);
+       rqstp->rq_task = current;
 
        unlock_kernel();
 
@@ -413,7 +388,6 @@ nfsd(struct svc_rqst *rqstp)
 
        lock_kernel();
 
-       list_del(&me.list);
        nfsdstats.th_cnt --;
 
 out: