};
/*
- * `Async' versions of the above service routines. They aren't really,
- * because we send the callback before the reply proper. I hope this
- * doesn't break any clients.
+ * Dispatch an async callback RPC to a client with a pre-resolved host.
+ * Caller provides a reference to @host; this function takes ownership
+ * and releases it via nlmsvc_release_host() before returning.
*/
-static __be32 nlm4svc_callback(struct svc_rqst *rqstp, u32 proc,
- __be32 (*func)(struct svc_rqst *, struct nlm_res *))
+static __be32
+nlm4svc_callback(struct svc_rqst *rqstp, struct nlm_host *host, u32 proc,
+ __be32 (*func)(struct svc_rqst *, struct nlm_res *))
{
- struct nlm_args *argp = rqstp->rq_argp;
- struct nlm_host *host;
struct nlm_rqst *call;
__be32 stat;
- host = nlmsvc_lookup_host(rqstp,
- argp->lock.caller,
- argp->lock.len);
- if (host == NULL)
- return rpc_system_err;
-
call = nlm_alloc_call(host);
nlmsvc_release_host(host);
if (call == NULL)
return rpc_success;
}
+/*
+ * 'Async' versions of the above service routines. They aren't really,
+ * because we send the callback before the reply proper. I hope this
+ * doesn't break any clients.
+ */
+
static __be32 nlm4svc_proc_test_msg(struct svc_rqst *rqstp)
{
+ struct nlm_args *argp = rqstp->rq_argp;
+ struct nlm_host *host;
+
dprintk("lockd: TEST_MSG called\n");
- return nlm4svc_callback(rqstp, NLMPROC_TEST_RES, __nlm4svc_proc_test);
+
+ host = nlmsvc_lookup_host(rqstp, argp->lock.caller, argp->lock.len);
+ if (!host)
+ return rpc_system_err;
+
+ return nlm4svc_callback(rqstp, host, NLMPROC_TEST_RES,
+ __nlm4svc_proc_test);
}
static __be32 nlm4svc_proc_lock_msg(struct svc_rqst *rqstp)
{
+ struct nlm_args *argp = rqstp->rq_argp;
+ struct nlm_host *host;
+
dprintk("lockd: LOCK_MSG called\n");
- return nlm4svc_callback(rqstp, NLMPROC_LOCK_RES, __nlm4svc_proc_lock);
+
+ host = nlmsvc_lookup_host(rqstp, argp->lock.caller, argp->lock.len);
+ if (!host)
+ return rpc_system_err;
+
+ return nlm4svc_callback(rqstp, host, NLMPROC_LOCK_RES,
+ __nlm4svc_proc_lock);
}
static __be32 nlm4svc_proc_cancel_msg(struct svc_rqst *rqstp)
{
+ struct nlm_args *argp = rqstp->rq_argp;
+ struct nlm_host *host;
+
dprintk("lockd: CANCEL_MSG called\n");
- return nlm4svc_callback(rqstp, NLMPROC_CANCEL_RES, __nlm4svc_proc_cancel);
+
+ host = nlmsvc_lookup_host(rqstp, argp->lock.caller, argp->lock.len);
+ if (!host)
+ return rpc_system_err;
+
+ return nlm4svc_callback(rqstp, host, NLMPROC_CANCEL_RES,
+ __nlm4svc_proc_cancel);
}
static __be32 nlm4svc_proc_unlock_msg(struct svc_rqst *rqstp)
{
+ struct nlm_args *argp = rqstp->rq_argp;
+ struct nlm_host *host;
+
dprintk("lockd: UNLOCK_MSG called\n");
- return nlm4svc_callback(rqstp, NLMPROC_UNLOCK_RES, __nlm4svc_proc_unlock);
+
+ host = nlmsvc_lookup_host(rqstp, argp->lock.caller, argp->lock.len);
+ if (!host)
+ return rpc_system_err;
+
+ return nlm4svc_callback(rqstp, host, NLMPROC_UNLOCK_RES,
+ __nlm4svc_proc_unlock);
}
static __be32 nlm4svc_proc_granted_msg(struct svc_rqst *rqstp)
{
+ struct nlm_args *argp = rqstp->rq_argp;
+ struct nlm_host *host;
+
dprintk("lockd: GRANTED_MSG called\n");
- return nlm4svc_callback(rqstp, NLMPROC_GRANTED_RES, __nlm4svc_proc_granted);
+
+ host = nlmsvc_lookup_host(rqstp, argp->lock.caller, argp->lock.len);
+ if (!host)
+ return rpc_system_err;
+
+ return nlm4svc_callback(rqstp, host, NLMPROC_GRANTED_RES,
+ __nlm4svc_proc_granted);
}
/*