NFSD: Remove svc_serv_ops::svo_module
[ Upstream commit f49169c97f
]
struct svc_serv_ops is about to be removed.
Neil Brown says:
> I suspect svo_module can go as well - I don't think the thread is
> ever the thing that primarily keeps a module active.
A random sample of kthread_create() callers shows sunrpc is the only
one that manages module reference count in this way.
Suggested-by: Neil Brown <neilb@suse.de>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
Родитель
7d94952cd5
Коммит
a5deac8754
|
@ -184,8 +184,7 @@ lockd(void *vrqstp)
|
||||||
dprintk("lockd_down: service stopped\n");
|
dprintk("lockd_down: service stopped\n");
|
||||||
|
|
||||||
svc_exit_thread(rqstp);
|
svc_exit_thread(rqstp);
|
||||||
|
return 0;
|
||||||
module_put_and_kthread_exit(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int create_lockd_listener(struct svc_serv *serv, const char *name,
|
static int create_lockd_listener(struct svc_serv *serv, const char *name,
|
||||||
|
@ -352,7 +351,6 @@ static struct notifier_block lockd_inet6addr_notifier = {
|
||||||
|
|
||||||
static const struct svc_serv_ops lockd_sv_ops = {
|
static const struct svc_serv_ops lockd_sv_ops = {
|
||||||
.svo_function = lockd,
|
.svo_function = lockd,
|
||||||
.svo_module = THIS_MODULE,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int lockd_get(void)
|
static int lockd_get(void)
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
#include <linux/freezer.h>
|
#include <linux/freezer.h>
|
||||||
#include <linux/kthread.h>
|
|
||||||
#include <linux/sunrpc/svcauth_gss.h>
|
#include <linux/sunrpc/svcauth_gss.h>
|
||||||
#include <linux/sunrpc/bc_xprt.h>
|
#include <linux/sunrpc/bc_xprt.h>
|
||||||
|
|
||||||
|
@ -92,8 +91,8 @@ nfs4_callback_svc(void *vrqstp)
|
||||||
continue;
|
continue;
|
||||||
svc_process(rqstp);
|
svc_process(rqstp);
|
||||||
}
|
}
|
||||||
|
|
||||||
svc_exit_thread(rqstp);
|
svc_exit_thread(rqstp);
|
||||||
module_put_and_kthread_exit(0);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -136,8 +135,8 @@ nfs41_callback_svc(void *vrqstp)
|
||||||
finish_wait(&serv->sv_cb_waitq, &wq);
|
finish_wait(&serv->sv_cb_waitq, &wq);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
svc_exit_thread(rqstp);
|
svc_exit_thread(rqstp);
|
||||||
module_put_and_kthread_exit(0);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -234,12 +233,10 @@ err_bind:
|
||||||
|
|
||||||
static const struct svc_serv_ops nfs40_cb_sv_ops = {
|
static const struct svc_serv_ops nfs40_cb_sv_ops = {
|
||||||
.svo_function = nfs4_callback_svc,
|
.svo_function = nfs4_callback_svc,
|
||||||
.svo_module = THIS_MODULE,
|
|
||||||
};
|
};
|
||||||
#if defined(CONFIG_NFS_V4_1)
|
#if defined(CONFIG_NFS_V4_1)
|
||||||
static const struct svc_serv_ops nfs41_cb_sv_ops = {
|
static const struct svc_serv_ops nfs41_cb_sv_ops = {
|
||||||
.svo_function = nfs41_callback_svc,
|
.svo_function = nfs41_callback_svc,
|
||||||
.svo_module = THIS_MODULE,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct svc_serv_ops *nfs4_cb_sv_ops[] = {
|
static const struct svc_serv_ops *nfs4_cb_sv_ops[] = {
|
||||||
|
|
|
@ -2766,6 +2766,5 @@ again:
|
||||||
goto again;
|
goto again;
|
||||||
|
|
||||||
nfs_put_client(clp);
|
nfs_put_client(clp);
|
||||||
module_put_and_kthread_exit(0);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -614,7 +614,6 @@ static int nfsd_get_default_max_blksize(void)
|
||||||
|
|
||||||
static const struct svc_serv_ops nfsd_thread_sv_ops = {
|
static const struct svc_serv_ops nfsd_thread_sv_ops = {
|
||||||
.svo_function = nfsd,
|
.svo_function = nfsd,
|
||||||
.svo_module = THIS_MODULE,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void nfsd_shutdown_threads(struct net *net)
|
void nfsd_shutdown_threads(struct net *net)
|
||||||
|
@ -1018,8 +1017,6 @@ out:
|
||||||
msleep(20);
|
msleep(20);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Release module */
|
|
||||||
module_put_and_kthread_exit(0);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -57,11 +57,6 @@ struct svc_serv;
|
||||||
struct svc_serv_ops {
|
struct svc_serv_ops {
|
||||||
/* function for service threads to run */
|
/* function for service threads to run */
|
||||||
int (*svo_function)(void *);
|
int (*svo_function)(void *);
|
||||||
|
|
||||||
/* optional module to count when adding threads.
|
|
||||||
* Thread function must call module_put_and_kthread_exit() to exit.
|
|
||||||
*/
|
|
||||||
struct module *svo_module;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -335,7 +335,7 @@ static inline void add_taint_module(struct module *mod, unsigned flag,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A thread that wants to hold a reference to a module only while it
|
* A thread that wants to hold a reference to a module only while it
|
||||||
* is running can call this to safely exit. nfsd and lockd use this.
|
* is running can call this to safely exit.
|
||||||
*/
|
*/
|
||||||
void __noreturn __module_put_and_kthread_exit(struct module *mod, long code)
|
void __noreturn __module_put_and_kthread_exit(struct module *mod, long code)
|
||||||
{
|
{
|
||||||
|
|
|
@ -736,11 +736,9 @@ svc_start_kthreads(struct svc_serv *serv, struct svc_pool *pool, int nrservs)
|
||||||
if (IS_ERR(rqstp))
|
if (IS_ERR(rqstp))
|
||||||
return PTR_ERR(rqstp);
|
return PTR_ERR(rqstp);
|
||||||
|
|
||||||
__module_get(serv->sv_ops->svo_module);
|
|
||||||
task = kthread_create_on_node(serv->sv_ops->svo_function, rqstp,
|
task = kthread_create_on_node(serv->sv_ops->svo_function, rqstp,
|
||||||
node, "%s", serv->sv_name);
|
node, "%s", serv->sv_name);
|
||||||
if (IS_ERR(task)) {
|
if (IS_ERR(task)) {
|
||||||
module_put(serv->sv_ops->svo_module);
|
|
||||||
svc_exit_thread(rqstp);
|
svc_exit_thread(rqstp);
|
||||||
return PTR_ERR(task);
|
return PTR_ERR(task);
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче