Commit 37902c63 authored by Chuck Lever's avatar Chuck Lever

NFSD: Move svc_serv_ops::svo_function into struct svc_serv

Hoist svo_function back into svc_serv and remove struct
svc_serv_ops, since the struct is now devoid of fields.
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent f49169c9
...@@ -349,10 +349,6 @@ static struct notifier_block lockd_inet6addr_notifier = { ...@@ -349,10 +349,6 @@ static struct notifier_block lockd_inet6addr_notifier = {
}; };
#endif #endif
static const struct svc_serv_ops lockd_sv_ops = {
.svo_function = lockd,
};
static int lockd_get(void) static int lockd_get(void)
{ {
struct svc_serv *serv; struct svc_serv *serv;
...@@ -376,7 +372,7 @@ static int lockd_get(void) ...@@ -376,7 +372,7 @@ static int lockd_get(void)
nlm_timeout = LOCKD_DFLT_TIMEO; nlm_timeout = LOCKD_DFLT_TIMEO;
nlmsvc_timeout = nlm_timeout * HZ; nlmsvc_timeout = nlm_timeout * HZ;
serv = svc_create(&nlmsvc_program, LOCKD_BUFSIZE, &lockd_sv_ops); serv = svc_create(&nlmsvc_program, LOCKD_BUFSIZE, lockd);
if (!serv) { if (!serv) {
printk(KERN_WARNING "lockd_up: create service failed\n"); printk(KERN_WARNING "lockd_up: create service failed\n");
return -ENOMEM; return -ENOMEM;
......
...@@ -231,29 +231,10 @@ static int nfs_callback_up_net(int minorversion, struct svc_serv *serv, ...@@ -231,29 +231,10 @@ static int nfs_callback_up_net(int minorversion, struct svc_serv *serv,
return ret; return ret;
} }
static const struct svc_serv_ops nfs40_cb_sv_ops = {
.svo_function = nfs4_callback_svc,
};
#if defined(CONFIG_NFS_V4_1)
static const struct svc_serv_ops nfs41_cb_sv_ops = {
.svo_function = nfs41_callback_svc,
};
static const struct svc_serv_ops *nfs4_cb_sv_ops[] = {
[0] = &nfs40_cb_sv_ops,
[1] = &nfs41_cb_sv_ops,
};
#else
static const struct svc_serv_ops *nfs4_cb_sv_ops[] = {
[0] = &nfs40_cb_sv_ops,
[1] = NULL,
};
#endif
static struct svc_serv *nfs_callback_create_svc(int minorversion) static struct svc_serv *nfs_callback_create_svc(int minorversion)
{ {
struct nfs_callback_data *cb_info = &nfs_callback_info[minorversion]; struct nfs_callback_data *cb_info = &nfs_callback_info[minorversion];
const struct svc_serv_ops *sv_ops; int (*threadfn)(void *data);
struct svc_serv *serv; struct svc_serv *serv;
/* /*
...@@ -262,17 +243,6 @@ static struct svc_serv *nfs_callback_create_svc(int minorversion) ...@@ -262,17 +243,6 @@ static struct svc_serv *nfs_callback_create_svc(int minorversion)
if (cb_info->serv) if (cb_info->serv)
return svc_get(cb_info->serv); return svc_get(cb_info->serv);
switch (minorversion) {
case 0:
sv_ops = nfs4_cb_sv_ops[0];
break;
default:
sv_ops = nfs4_cb_sv_ops[1];
}
if (sv_ops == NULL)
return ERR_PTR(-ENOTSUPP);
/* /*
* Sanity check: if there's no task, * Sanity check: if there's no task,
* we should be the first user ... * we should be the first user ...
...@@ -281,7 +251,16 @@ static struct svc_serv *nfs_callback_create_svc(int minorversion) ...@@ -281,7 +251,16 @@ static struct svc_serv *nfs_callback_create_svc(int minorversion)
printk(KERN_WARNING "nfs_callback_create_svc: no kthread, %d users??\n", printk(KERN_WARNING "nfs_callback_create_svc: no kthread, %d users??\n",
cb_info->users); cb_info->users);
serv = svc_create(&nfs4_callback_program, NFS4_CALLBACK_BUFSIZE, sv_ops); threadfn = nfs4_callback_svc;
#if defined(CONFIG_NFS_V4_1)
if (minorversion)
threadfn = nfs41_callback_svc;
#else
if (minorversion)
return ERR_PTR(-ENOTSUPP);
#endif
serv = svc_create(&nfs4_callback_program, NFS4_CALLBACK_BUFSIZE,
threadfn);
if (!serv) { if (!serv) {
printk(KERN_ERR "nfs_callback_create_svc: create service failed\n"); printk(KERN_ERR "nfs_callback_create_svc: create service failed\n");
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
......
...@@ -612,10 +612,6 @@ static int nfsd_get_default_max_blksize(void) ...@@ -612,10 +612,6 @@ static int nfsd_get_default_max_blksize(void)
return ret; return ret;
} }
static const struct svc_serv_ops nfsd_thread_sv_ops = {
.svo_function = nfsd,
};
void nfsd_shutdown_threads(struct net *net) void nfsd_shutdown_threads(struct net *net)
{ {
struct nfsd_net *nn = net_generic(net, nfsd_net_id); struct nfsd_net *nn = net_generic(net, nfsd_net_id);
...@@ -654,8 +650,7 @@ int nfsd_create_serv(struct net *net) ...@@ -654,8 +650,7 @@ int nfsd_create_serv(struct net *net)
if (nfsd_max_blksize == 0) if (nfsd_max_blksize == 0)
nfsd_max_blksize = nfsd_get_default_max_blksize(); nfsd_max_blksize = nfsd_get_default_max_blksize();
nfsd_reset_versions(nn); nfsd_reset_versions(nn);
serv = svc_create_pooled(&nfsd_program, nfsd_max_blksize, serv = svc_create_pooled(&nfsd_program, nfsd_max_blksize, nfsd);
&nfsd_thread_sv_ops);
if (serv == NULL) if (serv == NULL)
return -ENOMEM; return -ENOMEM;
......
...@@ -52,13 +52,6 @@ struct svc_pool { ...@@ -52,13 +52,6 @@ struct svc_pool {
unsigned long sp_flags; unsigned long sp_flags;
} ____cacheline_aligned_in_smp; } ____cacheline_aligned_in_smp;
struct svc_serv;
struct svc_serv_ops {
/* function for service threads to run */
int (*svo_function)(void *);
};
/* /*
* RPC service. * RPC service.
* *
...@@ -91,7 +84,8 @@ struct svc_serv { ...@@ -91,7 +84,8 @@ struct svc_serv {
unsigned int sv_nrpools; /* number of thread pools */ unsigned int sv_nrpools; /* number of thread pools */
struct svc_pool * sv_pools; /* array of thread pools */ struct svc_pool * sv_pools; /* array of thread pools */
const struct svc_serv_ops *sv_ops; /* server operations */ int (*sv_threadfn)(void *data);
#if defined(CONFIG_SUNRPC_BACKCHANNEL) #if defined(CONFIG_SUNRPC_BACKCHANNEL)
struct list_head sv_cb_list; /* queue for callback requests struct list_head sv_cb_list; /* queue for callback requests
* that arrive over the same * that arrive over the same
...@@ -492,7 +486,7 @@ int svc_rpcb_setup(struct svc_serv *serv, struct net *net); ...@@ -492,7 +486,7 @@ int svc_rpcb_setup(struct svc_serv *serv, struct net *net);
void svc_rpcb_cleanup(struct svc_serv *serv, struct net *net); void svc_rpcb_cleanup(struct svc_serv *serv, struct net *net);
int svc_bind(struct svc_serv *serv, struct net *net); int svc_bind(struct svc_serv *serv, struct net *net);
struct svc_serv *svc_create(struct svc_program *, unsigned int, struct svc_serv *svc_create(struct svc_program *, unsigned int,
const struct svc_serv_ops *); int (*threadfn)(void *data));
struct svc_rqst *svc_rqst_alloc(struct svc_serv *serv, struct svc_rqst *svc_rqst_alloc(struct svc_serv *serv,
struct svc_pool *pool, int node); struct svc_pool *pool, int node);
void svc_rqst_replace_page(struct svc_rqst *rqstp, void svc_rqst_replace_page(struct svc_rqst *rqstp,
...@@ -500,7 +494,7 @@ void svc_rqst_replace_page(struct svc_rqst *rqstp, ...@@ -500,7 +494,7 @@ void svc_rqst_replace_page(struct svc_rqst *rqstp,
void svc_rqst_free(struct svc_rqst *); void svc_rqst_free(struct svc_rqst *);
void svc_exit_thread(struct svc_rqst *); void svc_exit_thread(struct svc_rqst *);
struct svc_serv * svc_create_pooled(struct svc_program *, unsigned int, struct svc_serv * svc_create_pooled(struct svc_program *, unsigned int,
const struct svc_serv_ops *); int (*threadfn)(void *data));
int svc_set_num_threads(struct svc_serv *, struct svc_pool *, int); int svc_set_num_threads(struct svc_serv *, struct svc_pool *, int);
int svc_pool_stats_open(struct svc_serv *serv, struct file *file); int svc_pool_stats_open(struct svc_serv *serv, struct file *file);
int svc_process(struct svc_rqst *); int svc_process(struct svc_rqst *);
......
...@@ -448,7 +448,7 @@ __svc_init_bc(struct svc_serv *serv) ...@@ -448,7 +448,7 @@ __svc_init_bc(struct svc_serv *serv)
*/ */
static struct svc_serv * static struct svc_serv *
__svc_create(struct svc_program *prog, unsigned int bufsize, int npools, __svc_create(struct svc_program *prog, unsigned int bufsize, int npools,
const struct svc_serv_ops *ops) int (*threadfn)(void *data))
{ {
struct svc_serv *serv; struct svc_serv *serv;
unsigned int vers; unsigned int vers;
...@@ -465,7 +465,7 @@ __svc_create(struct svc_program *prog, unsigned int bufsize, int npools, ...@@ -465,7 +465,7 @@ __svc_create(struct svc_program *prog, unsigned int bufsize, int npools,
bufsize = RPCSVC_MAXPAYLOAD; bufsize = RPCSVC_MAXPAYLOAD;
serv->sv_max_payload = bufsize? bufsize : 4096; serv->sv_max_payload = bufsize? bufsize : 4096;
serv->sv_max_mesg = roundup(serv->sv_max_payload + PAGE_SIZE, PAGE_SIZE); serv->sv_max_mesg = roundup(serv->sv_max_payload + PAGE_SIZE, PAGE_SIZE);
serv->sv_ops = ops; serv->sv_threadfn = threadfn;
xdrsize = 0; xdrsize = 0;
while (prog) { while (prog) {
prog->pg_lovers = prog->pg_nvers-1; prog->pg_lovers = prog->pg_nvers-1;
...@@ -511,22 +511,37 @@ __svc_create(struct svc_program *prog, unsigned int bufsize, int npools, ...@@ -511,22 +511,37 @@ __svc_create(struct svc_program *prog, unsigned int bufsize, int npools,
return serv; return serv;
} }
struct svc_serv * /**
svc_create(struct svc_program *prog, unsigned int bufsize, * svc_create - Create an RPC service
const struct svc_serv_ops *ops) * @prog: the RPC program the new service will handle
* @bufsize: maximum message size for @prog
* @threadfn: a function to service RPC requests for @prog
*
* Returns an instantiated struct svc_serv object or NULL.
*/
struct svc_serv *svc_create(struct svc_program *prog, unsigned int bufsize,
int (*threadfn)(void *data))
{ {
return __svc_create(prog, bufsize, /*npools*/1, ops); return __svc_create(prog, bufsize, 1, threadfn);
} }
EXPORT_SYMBOL_GPL(svc_create); EXPORT_SYMBOL_GPL(svc_create);
struct svc_serv * /**
svc_create_pooled(struct svc_program *prog, unsigned int bufsize, * svc_create_pooled - Create an RPC service with pooled threads
const struct svc_serv_ops *ops) * @prog: the RPC program the new service will handle
* @bufsize: maximum message size for @prog
* @threadfn: a function to service RPC requests for @prog
*
* Returns an instantiated struct svc_serv object or NULL.
*/
struct svc_serv *svc_create_pooled(struct svc_program *prog,
unsigned int bufsize,
int (*threadfn)(void *data))
{ {
struct svc_serv *serv; struct svc_serv *serv;
unsigned int npools = svc_pool_map_get(); unsigned int npools = svc_pool_map_get();
serv = __svc_create(prog, bufsize, npools, ops); serv = __svc_create(prog, bufsize, npools, threadfn);
if (!serv) if (!serv)
goto out_err; goto out_err;
return serv; return serv;
...@@ -736,7 +751,7 @@ svc_start_kthreads(struct svc_serv *serv, struct svc_pool *pool, int nrservs) ...@@ -736,7 +751,7 @@ 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);
task = kthread_create_on_node(serv->sv_ops->svo_function, rqstp, task = kthread_create_on_node(serv->sv_threadfn, rqstp,
node, "%s", serv->sv_name); node, "%s", serv->sv_name);
if (IS_ERR(task)) { if (IS_ERR(task)) {
svc_exit_thread(rqstp); svc_exit_thread(rqstp);
......
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