diff options
author | Greg Banks <gnb@melbourne.sgi.com> | 2006-10-02 02:18:00 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-02 07:57:20 -0700 |
commit | eec09661dc82e90a31051d045a94026a91aceb82 (patch) | |
tree | 2d487c532ce0fc0535709b599a034838e142ce75 /fs/nfsd/nfssvc.c | |
parent | a74554429eada89a7ddb47317e6a2968d03e41a2 (diff) | |
download | lwn-eec09661dc82e90a31051d045a94026a91aceb82.tar.gz lwn-eec09661dc82e90a31051d045a94026a91aceb82.zip |
[PATCH] knfsd: use svc_set_num_threads to manage threads in knfsd
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>
Diffstat (limited to 'fs/nfsd/nfssvc.c')
-rw-r--r-- | fs/nfsd/nfssvc.c | 36 |
1 files changed, 5 insertions, 31 deletions
diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c index 9773f593b3ff..0029cb290f18 100644 --- a/fs/nfsd/nfssvc.c +++ b/fs/nfsd/nfssvc.c @@ -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: |