Commit eec09661 authored by Greg Banks's avatar Greg Banks Committed by Linus Torvalds

[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: default avatarGreg Banks <gnb@melbourne.sgi.com>
Signed-off-by: default avatarNeil Brown <neilb@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent a7455442
...@@ -57,12 +57,6 @@ static atomic_t nfsd_busy; ...@@ -57,12 +57,6 @@ static atomic_t nfsd_busy;
static unsigned long nfsd_last_call; static unsigned long nfsd_last_call;
static DEFINE_SPINLOCK(nfsd_call_lock); 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) #if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL)
static struct svc_stat nfsd_acl_svcstats; static struct svc_stat nfsd_acl_svcstats;
static struct svc_version * nfsd_acl_version[] = { static struct svc_version * nfsd_acl_version[] = {
...@@ -206,8 +200,9 @@ int nfsd_create_serv(void) ...@@ -206,8 +200,9 @@ int nfsd_create_serv(void)
} }
atomic_set(&nfsd_busy, 0); atomic_set(&nfsd_busy, 0);
nfsd_serv = svc_create(&nfsd_program, NFSD_BUFSIZE, nfsd_serv = svc_create_pooled(&nfsd_program, NFSD_BUFSIZE,
nfsd_last_thread); nfsd_last_thread,
nfsd, SIG_NOCLEAN, THIS_MODULE);
if (nfsd_serv == NULL) if (nfsd_serv == NULL)
err = -ENOMEM; err = -ENOMEM;
unlock_kernel(); unlock_kernel();
...@@ -247,7 +242,6 @@ int ...@@ -247,7 +242,6 @@ int
nfsd_svc(unsigned short port, int nrservs) nfsd_svc(unsigned short port, int nrservs)
{ {
int error; int error;
struct list_head *victim;
lock_kernel(); lock_kernel();
dprintk("nfsd: creating service\n"); dprintk("nfsd: creating service\n");
...@@ -275,24 +269,7 @@ nfsd_svc(unsigned short port, int nrservs) ...@@ -275,24 +269,7 @@ nfsd_svc(unsigned short port, int nrservs)
if (error) if (error)
goto failure; goto failure;
nrservs -= (nfsd_serv->sv_nrthreads-1); error = svc_set_num_threads(nfsd_serv, NULL, nrservs);
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++;
}
failure: failure:
svc_destroy(nfsd_serv); /* Release server */ svc_destroy(nfsd_serv); /* Release server */
out: out:
...@@ -329,7 +306,6 @@ nfsd(struct svc_rqst *rqstp) ...@@ -329,7 +306,6 @@ nfsd(struct svc_rqst *rqstp)
{ {
struct fs_struct *fsp; struct fs_struct *fsp;
int err; int err;
struct nfsd_list me;
sigset_t shutdown_mask, allowed_mask; sigset_t shutdown_mask, allowed_mask;
/* Lock module and set up kernel thread */ /* Lock module and set up kernel thread */
...@@ -353,8 +329,7 @@ nfsd(struct svc_rqst *rqstp) ...@@ -353,8 +329,7 @@ nfsd(struct svc_rqst *rqstp)
nfsdstats.th_cnt++; nfsdstats.th_cnt++;
me.task = current; rqstp->rq_task = current;
list_add(&me.list, &nfsd_list);
unlock_kernel(); unlock_kernel();
...@@ -413,7 +388,6 @@ nfsd(struct svc_rqst *rqstp) ...@@ -413,7 +388,6 @@ nfsd(struct svc_rqst *rqstp)
lock_kernel(); lock_kernel();
list_del(&me.list);
nfsdstats.th_cnt --; nfsdstats.th_cnt --;
out: out:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment