|
@@ -22,10 +22,6 @@
|
|
|
|
|
|
#define NLMDBG_FACILITY NLMDBG_CLIENT
|
|
#define NLMDBG_FACILITY NLMDBG_CLIENT
|
|
|
|
|
|
-static u32 nlmsvc_callback(struct svc_rqst *, u32, struct nlm_res *);
|
|
|
|
-
|
|
|
|
-static const struct rpc_call_ops nlmsvc_callback_ops;
|
|
|
|
-
|
|
|
|
#ifdef CONFIG_LOCKD_V4
|
|
#ifdef CONFIG_LOCKD_V4
|
|
static u32
|
|
static u32
|
|
cast_to_nlm(u32 status, u32 vers)
|
|
cast_to_nlm(u32 status, u32 vers)
|
|
@@ -261,84 +257,92 @@ nlmsvc_proc_granted(struct svc_rqst *rqstp, struct nlm_args *argp,
|
|
return rpc_success;
|
|
return rpc_success;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * This is the generic lockd callback for async RPC calls
|
|
|
|
+ */
|
|
|
|
+static void nlmsvc_callback_exit(struct rpc_task *task, void *data)
|
|
|
|
+{
|
|
|
|
+ dprintk("lockd: %4d callback returned %d\n", task->tk_pid,
|
|
|
|
+ -task->tk_status);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void nlmsvc_callback_release(void *data)
|
|
|
|
+{
|
|
|
|
+ nlm_release_call(data);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static const struct rpc_call_ops nlmsvc_callback_ops = {
|
|
|
|
+ .rpc_call_done = nlmsvc_callback_exit,
|
|
|
|
+ .rpc_release = nlmsvc_callback_release,
|
|
|
|
+};
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* `Async' versions of the above service routines. They aren't really,
|
|
* `Async' versions of the above service routines. They aren't really,
|
|
* because we send the callback before the reply proper. I hope this
|
|
* because we send the callback before the reply proper. I hope this
|
|
* doesn't break any clients.
|
|
* doesn't break any clients.
|
|
*/
|
|
*/
|
|
-static int
|
|
|
|
-nlmsvc_proc_test_msg(struct svc_rqst *rqstp, struct nlm_args *argp,
|
|
|
|
- void *resp)
|
|
|
|
|
|
+static int nlmsvc_callback(struct svc_rqst *rqstp, u32 proc, struct nlm_args *argp,
|
|
|
|
+ int (*func)(struct svc_rqst *, struct nlm_args *, struct nlm_res *))
|
|
{
|
|
{
|
|
- struct nlm_res res;
|
|
|
|
- u32 stat;
|
|
|
|
|
|
+ struct nlm_host *host;
|
|
|
|
+ struct nlm_rqst *call;
|
|
|
|
+ int stat;
|
|
|
|
|
|
- dprintk("lockd: TEST_MSG called\n");
|
|
|
|
- memset(&res, 0, sizeof(res));
|
|
|
|
|
|
+ host = nlmsvc_lookup_host(rqstp);
|
|
|
|
+ if (host == NULL)
|
|
|
|
+ return rpc_system_err;
|
|
|
|
+
|
|
|
|
+ call = nlm_alloc_call(host);
|
|
|
|
+ if (call == NULL)
|
|
|
|
+ return rpc_system_err;
|
|
|
|
+
|
|
|
|
+ stat = func(rqstp, argp, &call->a_res);
|
|
|
|
+ if (stat != 0) {
|
|
|
|
+ nlm_release_call(call);
|
|
|
|
+ return stat;
|
|
|
|
+ }
|
|
|
|
|
|
- if ((stat = nlmsvc_proc_test(rqstp, argp, &res)) == 0)
|
|
|
|
- stat = nlmsvc_callback(rqstp, NLMPROC_TEST_RES, &res);
|
|
|
|
- return stat;
|
|
|
|
|
|
+ call->a_flags = RPC_TASK_ASYNC;
|
|
|
|
+ if (nlm_async_reply(call, proc, &nlmsvc_callback_ops) < 0)
|
|
|
|
+ return rpc_system_err;
|
|
|
|
+ return rpc_success;
|
|
}
|
|
}
|
|
|
|
|
|
-static int
|
|
|
|
-nlmsvc_proc_lock_msg(struct svc_rqst *rqstp, struct nlm_args *argp,
|
|
|
|
|
|
+static int nlmsvc_proc_test_msg(struct svc_rqst *rqstp, struct nlm_args *argp,
|
|
void *resp)
|
|
void *resp)
|
|
{
|
|
{
|
|
- struct nlm_res res;
|
|
|
|
- u32 stat;
|
|
|
|
|
|
+ dprintk("lockd: TEST_MSG called\n");
|
|
|
|
+ return nlmsvc_callback(rqstp, NLMPROC_TEST_RES, argp, nlmsvc_proc_test);
|
|
|
|
+}
|
|
|
|
|
|
|
|
+static int nlmsvc_proc_lock_msg(struct svc_rqst *rqstp, struct nlm_args *argp,
|
|
|
|
+ void *resp)
|
|
|
|
+{
|
|
dprintk("lockd: LOCK_MSG called\n");
|
|
dprintk("lockd: LOCK_MSG called\n");
|
|
- memset(&res, 0, sizeof(res));
|
|
|
|
-
|
|
|
|
- if ((stat = nlmsvc_proc_lock(rqstp, argp, &res)) == 0)
|
|
|
|
- stat = nlmsvc_callback(rqstp, NLMPROC_LOCK_RES, &res);
|
|
|
|
- return stat;
|
|
|
|
|
|
+ return nlmsvc_callback(rqstp, NLMPROC_LOCK_RES, argp, nlmsvc_proc_lock);
|
|
}
|
|
}
|
|
|
|
|
|
-static int
|
|
|
|
-nlmsvc_proc_cancel_msg(struct svc_rqst *rqstp, struct nlm_args *argp,
|
|
|
|
|
|
+static int nlmsvc_proc_cancel_msg(struct svc_rqst *rqstp, struct nlm_args *argp,
|
|
void *resp)
|
|
void *resp)
|
|
{
|
|
{
|
|
- struct nlm_res res;
|
|
|
|
- u32 stat;
|
|
|
|
-
|
|
|
|
dprintk("lockd: CANCEL_MSG called\n");
|
|
dprintk("lockd: CANCEL_MSG called\n");
|
|
- memset(&res, 0, sizeof(res));
|
|
|
|
-
|
|
|
|
- if ((stat = nlmsvc_proc_cancel(rqstp, argp, &res)) == 0)
|
|
|
|
- stat = nlmsvc_callback(rqstp, NLMPROC_CANCEL_RES, &res);
|
|
|
|
- return stat;
|
|
|
|
|
|
+ return nlmsvc_callback(rqstp, NLMPROC_CANCEL_RES, argp, nlmsvc_proc_cancel);
|
|
}
|
|
}
|
|
|
|
|
|
static int
|
|
static int
|
|
nlmsvc_proc_unlock_msg(struct svc_rqst *rqstp, struct nlm_args *argp,
|
|
nlmsvc_proc_unlock_msg(struct svc_rqst *rqstp, struct nlm_args *argp,
|
|
void *resp)
|
|
void *resp)
|
|
{
|
|
{
|
|
- struct nlm_res res;
|
|
|
|
- u32 stat;
|
|
|
|
-
|
|
|
|
dprintk("lockd: UNLOCK_MSG called\n");
|
|
dprintk("lockd: UNLOCK_MSG called\n");
|
|
- memset(&res, 0, sizeof(res));
|
|
|
|
-
|
|
|
|
- if ((stat = nlmsvc_proc_unlock(rqstp, argp, &res)) == 0)
|
|
|
|
- stat = nlmsvc_callback(rqstp, NLMPROC_UNLOCK_RES, &res);
|
|
|
|
- return stat;
|
|
|
|
|
|
+ return nlmsvc_callback(rqstp, NLMPROC_UNLOCK_RES, argp, nlmsvc_proc_unlock);
|
|
}
|
|
}
|
|
|
|
|
|
static int
|
|
static int
|
|
nlmsvc_proc_granted_msg(struct svc_rqst *rqstp, struct nlm_args *argp,
|
|
nlmsvc_proc_granted_msg(struct svc_rqst *rqstp, struct nlm_args *argp,
|
|
void *resp)
|
|
void *resp)
|
|
{
|
|
{
|
|
- struct nlm_res res;
|
|
|
|
- u32 stat;
|
|
|
|
-
|
|
|
|
dprintk("lockd: GRANTED_MSG called\n");
|
|
dprintk("lockd: GRANTED_MSG called\n");
|
|
- memset(&res, 0, sizeof(res));
|
|
|
|
-
|
|
|
|
- if ((stat = nlmsvc_proc_granted(rqstp, argp, &res)) == 0)
|
|
|
|
- stat = nlmsvc_callback(rqstp, NLMPROC_GRANTED_RES, &res);
|
|
|
|
- return stat;
|
|
|
|
|
|
+ return nlmsvc_callback(rqstp, NLMPROC_GRANTED_RES, argp, nlmsvc_proc_granted);
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -496,47 +500,6 @@ nlmsvc_proc_granted_res(struct svc_rqst *rqstp, struct nlm_res *argp,
|
|
return rpc_success;
|
|
return rpc_success;
|
|
}
|
|
}
|
|
|
|
|
|
-/*
|
|
|
|
- * This is the generic lockd callback for async RPC calls
|
|
|
|
- */
|
|
|
|
-static u32
|
|
|
|
-nlmsvc_callback(struct svc_rqst *rqstp, u32 proc, struct nlm_res *resp)
|
|
|
|
-{
|
|
|
|
- struct nlm_host *host;
|
|
|
|
- struct nlm_rqst *call;
|
|
|
|
-
|
|
|
|
- host = nlmsvc_lookup_host(rqstp);
|
|
|
|
- if (host == NULL)
|
|
|
|
- return rpc_system_err;
|
|
|
|
-
|
|
|
|
- call = nlm_alloc_call(host);
|
|
|
|
- if (call == NULL)
|
|
|
|
- return rpc_system_err;
|
|
|
|
-
|
|
|
|
- call->a_flags = RPC_TASK_ASYNC;
|
|
|
|
- memcpy(&call->a_args, resp, sizeof(*resp));
|
|
|
|
-
|
|
|
|
- if (nlm_async_call(call, proc, &nlmsvc_callback_ops) < 0)
|
|
|
|
- return rpc_system_err;
|
|
|
|
- return rpc_success;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static void nlmsvc_callback_exit(struct rpc_task *task, void *data)
|
|
|
|
-{
|
|
|
|
- dprintk("lockd: %4d callback returned %d\n", task->tk_pid,
|
|
|
|
- -task->tk_status);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static void nlmsvc_callback_release(void *data)
|
|
|
|
-{
|
|
|
|
- nlm_release_call(data);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static const struct rpc_call_ops nlmsvc_callback_ops = {
|
|
|
|
- .rpc_call_done = nlmsvc_callback_exit,
|
|
|
|
- .rpc_release = nlmsvc_callback_release,
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
/*
|
|
/*
|
|
* NLM Server procedures.
|
|
* NLM Server procedures.
|
|
*/
|
|
*/
|