+int
+nlmsvc_dispatch(struct svc_rqst *rqstp, u32 *statp)
+{
+ struct svc_procedure *procp;
+ kxdrproc_t xdr;
+ struct kvec *argv;
+ struct kvec *resv;
+
+ dprintk("nlmsvc_dispatch: vers %d proc %d\n",
+ rqstp->rq_vers, rqstp->rq_proc);
+
+ procp = rqstp->rq_procinfo;
+ argv = &rqstp->rq_arg.head[0];
+ resv = &rqstp->rq_res.head[0];
+
+ /* Decode arguments */
+ xdr = procp->pc_decode;
+ if (xdr && !xdr(rqstp, argv->iov_base, rqstp->rq_argp)) {
+ dprintk("nlmsvc_dispatch: failed to decode arguments!\n");
+ *statp = rpc_garbage_args;
+ return 1;
+ }
+ *statp = procp->pc_func(rqstp, rqstp->rq_argp, rqstp->rq_resp);
+ if (*statp == nlm_lck_dropit) {
+ dprintk("nlmsvc_dispatch: dropping request\n");
+ return 0;
+ }
+
+ /* Encode reply */
+ if (*statp == rpc_success && (xdr = procp->pc_encode)
+ && !xdr(rqstp, resv->iov_base+resv->iov_len, rqstp->rq_resp)) {
+ dprintk("nlmsvc_dispatch: failed to encode reply\n");
+ *statp = rpc_system_err;
+ return 1;
+ }
+
+ dprintk("nlmsvc_dispatch: statp %d\n", ntohl(*statp));
+
+ return 1;
+}