|
@@ -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:
|