NFSD: Move svc_serv_ops::svo_function into struct svc_serv
authorChuck Lever <chuck.lever@oracle.com>
Wed, 16 Feb 2022 17:16:27 +0000 (12:16 -0500)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 28 Feb 2022 15:26:40 +0000 (10:26 -0500)
Hoist svo_function back into svc_serv and remove struct
svc_serv_ops, since the struct is now devoid of fields.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/lockd/svc.c
fs/nfs/callback.c
fs/nfsd/nfssvc.c
include/linux/sunrpc/svc.h
net/sunrpc/svc.c

index bfde311..59ef8a1 100644 (file)
@@ -349,10 +349,6 @@ static struct notifier_block lockd_inet6addr_notifier = {
 };
 #endif
 
-static const struct svc_serv_ops lockd_sv_ops = {
-       .svo_function           = lockd,
-};
-
 static int lockd_get(void)
 {
        struct svc_serv *serv;
@@ -376,7 +372,7 @@ static int lockd_get(void)
                nlm_timeout = LOCKD_DFLT_TIMEO;
        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) {
                printk(KERN_WARNING "lockd_up: create service failed\n");
                return -ENOMEM;
index a494f9e..456af7d 100644 (file)
@@ -231,29 +231,10 @@ err_bind:
        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)
 {
        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;
 
        /*
@@ -262,17 +243,6 @@ static struct svc_serv *nfs_callback_create_svc(int minorversion)
        if (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,
         * we should be the first user ...
@@ -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",
                        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) {
                printk(KERN_ERR "nfs_callback_create_svc: create service failed\n");
                return ERR_PTR(-ENOMEM);
index 544187a..5abbe5d 100644 (file)
@@ -612,10 +612,6 @@ static int nfsd_get_default_max_blksize(void)
        return ret;
 }
 
-static const struct svc_serv_ops nfsd_thread_sv_ops = {
-       .svo_function           = nfsd,
-};
-
 void nfsd_shutdown_threads(struct net *net)
 {
        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
@@ -654,8 +650,7 @@ int nfsd_create_serv(struct net *net)
        if (nfsd_max_blksize == 0)
                nfsd_max_blksize = nfsd_get_default_max_blksize();
        nfsd_reset_versions(nn);
-       serv = svc_create_pooled(&nfsd_program, nfsd_max_blksize,
-                                &nfsd_thread_sv_ops);
+       serv = svc_create_pooled(&nfsd_program, nfsd_max_blksize, nfsd);
        if (serv == NULL)
                return -ENOMEM;
 
index dfc9283..a5dda49 100644 (file)
@@ -52,13 +52,6 @@ struct svc_pool {
        unsigned long           sp_flags;
 } ____cacheline_aligned_in_smp;
 
-struct svc_serv;
-
-struct svc_serv_ops {
-       /* function for service threads to run */
-       int             (*svo_function)(void *);
-};
-
 /*
  * RPC service.
  *
@@ -91,7 +84,8 @@ struct svc_serv {
 
        unsigned int            sv_nrpools;     /* number 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)
        struct list_head        sv_cb_list;     /* queue for callback requests
                                                 * that arrive over the same
@@ -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);
 int svc_bind(struct svc_serv *serv, struct net *net);
 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_pool *pool, int node);
 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_exit_thread(struct svc_rqst *);
 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_pool_stats_open(struct svc_serv *serv, struct file *file);
 int               svc_process(struct svc_rqst *);
index a90d555..5570040 100644 (file)
@@ -448,7 +448,7 @@ __svc_init_bc(struct svc_serv *serv)
  */
 static struct svc_serv *
 __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;
        unsigned int vers;
@@ -465,7 +465,7 @@ __svc_create(struct svc_program *prog, unsigned int bufsize, int npools,
                bufsize = RPCSVC_MAXPAYLOAD;
        serv->sv_max_payload = bufsize? bufsize : 4096;
        serv->sv_max_mesg  = roundup(serv->sv_max_payload + PAGE_SIZE, PAGE_SIZE);
-       serv->sv_ops = ops;
+       serv->sv_threadfn = threadfn;
        xdrsize = 0;
        while (prog) {
                prog->pg_lovers = prog->pg_nvers-1;
@@ -511,22 +511,37 @@ __svc_create(struct svc_program *prog, unsigned int bufsize, int npools,
        return serv;
 }
 
-struct svc_serv *
-svc_create(struct svc_program *prog, unsigned int bufsize,
-          const struct svc_serv_ops *ops)
+/**
+ * svc_create - Create an RPC service
+ * @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);
 
-struct svc_serv *
-svc_create_pooled(struct svc_program *prog, unsigned int bufsize,
-                 const struct svc_serv_ops *ops)
+/**
+ * svc_create_pooled - Create an RPC service with pooled threads
+ * @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;
        unsigned int npools = svc_pool_map_get();
 
-       serv = __svc_create(prog, bufsize, npools, ops);
+       serv = __svc_create(prog, bufsize, npools, threadfn);
        if (!serv)
                goto out_err;
        return serv;
@@ -736,7 +751,7 @@ svc_start_kthreads(struct svc_serv *serv, struct svc_pool *pool, int nrservs)
                if (IS_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);
                if (IS_ERR(task)) {
                        svc_exit_thread(rqstp);