nfsd: Add custom rpcbind callbacks for knfsd
authorTrond Myklebust <trondmy@gmail.com>
Tue, 9 Apr 2019 15:46:18 +0000 (11:46 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Wed, 24 Apr 2019 13:46:35 +0000 (09:46 -0400)
Add custom rpcbind callbacks in preparation for the knfsd
per-container version feature.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/nfssvc.c

index 6a52400..378edcf 100644 (file)
 
 extern struct svc_program      nfsd_program;
 static int                     nfsd(void *vrqstp);
+#if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL)
+static int                     nfsd_acl_rpcbind_set(struct net *,
+                                                    const struct svc_program *,
+                                                    u32, int,
+                                                    unsigned short,
+                                                    unsigned short);
+#endif
+static int                     nfsd_rpcbind_set(struct net *,
+                                                const struct svc_program *,
+                                                u32, int,
+                                                unsigned short,
+                                                unsigned short);
 
 /*
  * nfsd_mutex protects nn->nfsd_serv -- both the pointer itself and the members
@@ -87,7 +99,7 @@ static struct svc_program     nfsd_acl_program = {
        .pg_stats               = &nfsd_acl_svcstats,
        .pg_authenticate        = &svc_set_client,
        .pg_init_request        = svc_generic_init_request,
-       .pg_rpcbind_set         = svc_generic_rpcbind_set,
+       .pg_rpcbind_set         = nfsd_acl_rpcbind_set,
 };
 
 static struct svc_stat nfsd_acl_svcstats = {
@@ -121,7 +133,7 @@ struct svc_program          nfsd_program = {
        .pg_stats               = &nfsd_svcstats,       /* version table */
        .pg_authenticate        = &svc_set_client,      /* export authentication */
        .pg_init_request        = svc_generic_init_request,
-       .pg_rpcbind_set         = svc_generic_rpcbind_set,
+       .pg_rpcbind_set         = nfsd_rpcbind_set,
 };
 
 static bool nfsd_supported_minorversions[NFSD_SUPPORTED_MINOR_VERSION + 1] = {
@@ -670,6 +682,38 @@ out:
        return error;
 }
 
+#if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL)
+static bool
+nfsd_support_acl_version(int vers)
+{
+       if (vers >= NFSD_ACL_MINVERS && vers < NFSD_ACL_NRVERS)
+               return nfsd_acl_version[vers] != NULL;
+       return false;
+}
+
+static int
+nfsd_acl_rpcbind_set(struct net *net, const struct svc_program *progp,
+                    u32 version, int family, unsigned short proto,
+                    unsigned short port)
+{
+       if (!nfsd_support_acl_version(version) ||
+           !nfsd_vers(version, NFSD_TEST))
+               return 0;
+       return svc_generic_rpcbind_set(net, progp, version, family,
+                       proto, port);
+}
+#endif
+
+static int
+nfsd_rpcbind_set(struct net *net, const struct svc_program *progp,
+                u32 version, int family, unsigned short proto,
+                unsigned short port)
+{
+       if (!nfsd_vers(version, NFSD_TEST))
+               return 0;
+       return svc_generic_rpcbind_set(net, progp, version, family,
+                       proto, port);
+}
 
 /*
  * This is the NFS server kernel thread