* Global variables
*/
extern const struct rpc_program nlm_program;
-extern const struct svc_procedure nlmsvc_procedures[24];
+extern const struct svc_version nlmsvc_version1;
+extern const struct svc_version nlmsvc_version3;
#ifdef CONFIG_LOCKD_V4
-extern const struct svc_procedure nlmsvc_procedures4[24];
+extern const struct svc_version nlmsvc_version4;
#endif
extern int nlmsvc_grace_period;
extern unsigned long nlm_timeout;
void nlmsvc_grant_reply(struct nlm_cookie *, __be32);
void nlmsvc_release_call(struct nlm_rqst *);
void nlmsvc_locks_init_private(struct file_lock *, struct nlm_host *, pid_t);
+int nlmsvc_dispatch(struct svc_rqst *rqstp);
/*
* File handling for the server personality
#include "netlink.h"
#define NLMDBG_FACILITY NLMDBG_SVC
-#define LOCKD_BUFSIZE (1024 + NLMSVC_XDRSIZE)
static struct svc_program nlmsvc_program;
static int lockd_get(void)
{
struct svc_serv *serv;
+ unsigned int bufsize;
int error;
if (nlmsvc_serv) {
printk(KERN_WARNING
"lockd_up: no pid, %d users??\n", nlmsvc_users);
- serv = svc_create(&nlmsvc_program, LOCKD_BUFSIZE, lockd);
+#ifdef CONFIG_LOCKD_V4
+ bufsize = 1024 + max3(nlmsvc_version1.vs_xdrsize,
+ nlmsvc_version3.vs_xdrsize,
+ nlmsvc_version4.vs_xdrsize);
+#else
+ bufsize = 1024 + max(nlmsvc_version1.vs_xdrsize,
+ nlmsvc_version3.vs_xdrsize);
+#endif
+ serv = svc_create(&nlmsvc_program, bufsize, lockd);
if (!serv) {
printk(KERN_WARNING "lockd_up: create service failed\n");
return -ENOMEM;
* %0: Processing complete; do not send a Reply
* %1: Processing complete; send Reply in rqstp->rq_res
*/
-static int nlmsvc_dispatch(struct svc_rqst *rqstp)
+int nlmsvc_dispatch(struct svc_rqst *rqstp)
{
const struct svc_procedure *procp = rqstp->rq_procinfo;
__be32 *statp = rqstp->rq_accept_statp;
/*
* Define NLM program and procedures
*/
-static DEFINE_PER_CPU_ALIGNED(unsigned long, nlmsvc_version1_count[17]);
-static const struct svc_version nlmsvc_version1 = {
- .vs_vers = 1,
- .vs_nproc = 17,
- .vs_proc = nlmsvc_procedures,
- .vs_count = nlmsvc_version1_count,
- .vs_dispatch = nlmsvc_dispatch,
- .vs_xdrsize = NLMSVC_XDRSIZE,
-};
-
-static DEFINE_PER_CPU_ALIGNED(unsigned long,
- nlmsvc_version3_count[ARRAY_SIZE(nlmsvc_procedures)]);
-static const struct svc_version nlmsvc_version3 = {
- .vs_vers = 3,
- .vs_nproc = ARRAY_SIZE(nlmsvc_procedures),
- .vs_proc = nlmsvc_procedures,
- .vs_count = nlmsvc_version3_count,
- .vs_dispatch = nlmsvc_dispatch,
- .vs_xdrsize = NLMSVC_XDRSIZE,
-};
-
-#ifdef CONFIG_LOCKD_V4
-static DEFINE_PER_CPU_ALIGNED(unsigned long,
- nlmsvc_version4_count[ARRAY_SIZE(nlmsvc_procedures4)]);
-static const struct svc_version nlmsvc_version4 = {
- .vs_vers = 4,
- .vs_nproc = ARRAY_SIZE(nlmsvc_procedures4),
- .vs_proc = nlmsvc_procedures4,
- .vs_count = nlmsvc_version4_count,
- .vs_dispatch = nlmsvc_dispatch,
- .vs_xdrsize = NLMSVC_XDRSIZE,
-};
-#endif
-
static const struct svc_version *nlmsvc_version[] = {
[1] = &nlmsvc_version1,
[3] = &nlmsvc_version3,
#define St 1 /* status */
#define Rg 4 /* range (offset + length) */
-const struct svc_procedure nlmsvc_procedures4[24] = {
+static const struct svc_procedure nlm4svc_procedures[24] = {
[NLMPROC_NULL] = {
.pc_func = nlm4svc_proc_null,
.pc_decode = nlm4svc_decode_void,
.pc_name = "FREE_ALL",
},
};
+
+/*
+ * Storage requirements for XDR arguments and results
+ */
+union nlm4svc_xdrstore {
+ struct nlm_args args;
+ struct nlm_res res;
+ struct nlm_reboot reboot;
+};
+
+static DEFINE_PER_CPU_ALIGNED(unsigned long,
+ nlm4svc_call_counters[ARRAY_SIZE(nlm4svc_procedures)]);
+
+const struct svc_version nlmsvc_version4 = {
+ .vs_vers = 4,
+ .vs_nproc = ARRAY_SIZE(nlm4svc_procedures),
+ .vs_proc = nlm4svc_procedures,
+ .vs_count = nlm4svc_call_counters,
+ .vs_dispatch = nlmsvc_dispatch,
+ .vs_xdrsize = sizeof(union nlm4svc_xdrstore),
+};
#define No (1+1024/4) /* Net Obj */
#define Rg 2 /* range - offset + size */
-const struct svc_procedure nlmsvc_procedures[24] = {
+static const struct svc_procedure nlmsvc_procedures[24] = {
[NLMPROC_NULL] = {
.pc_func = nlmsvc_proc_null,
.pc_decode = nlmsvc_decode_void,
.pc_name = "FREE_ALL",
},
};
+
+/*
+ * Storage requirements for XDR arguments and results
+ */
+union nlmsvc_xdrstore {
+ struct nlm_args args;
+ struct nlm_res res;
+ struct nlm_reboot reboot;
+};
+
+/*
+ * NLMv1 defines only procedures 1 - 15. Linux lockd also implements
+ * procedures 0 (NULL) and 16 (SM_NOTIFY).
+ */
+static DEFINE_PER_CPU_ALIGNED(unsigned long, nlm1svc_call_counters[17]);
+
+const struct svc_version nlmsvc_version1 = {
+ .vs_vers = 1,
+ .vs_nproc = 17,
+ .vs_proc = nlmsvc_procedures,
+ .vs_count = nlm1svc_call_counters,
+ .vs_dispatch = nlmsvc_dispatch,
+ .vs_xdrsize = sizeof(union nlmsvc_xdrstore),
+};
+
+static DEFINE_PER_CPU_ALIGNED(unsigned long,
+ nlm3svc_call_counters[ARRAY_SIZE(nlmsvc_procedures)]);
+
+const struct svc_version nlmsvc_version3 = {
+ .vs_vers = 3,
+ .vs_nproc = ARRAY_SIZE(nlmsvc_procedures),
+ .vs_proc = nlmsvc_procedures,
+ .vs_count = nlm3svc_call_counters,
+ .vs_dispatch = nlmsvc_dispatch,
+ .vs_xdrsize = sizeof(union nlmsvc_xdrstore),
+};
struct nsm_private priv;
};
-/*
- * Contents of statd callback when monitored host rebooted
- */
-#define NLMSVC_XDRSIZE sizeof(struct nlm_args)
-
bool nlmsvc_decode_void(struct svc_rqst *rqstp, struct xdr_stream *xdr);
bool nlmsvc_decode_testargs(struct svc_rqst *rqstp, struct xdr_stream *xdr);
bool nlmsvc_decode_lockargs(struct svc_rqst *rqstp, struct xdr_stream *xdr);