-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;
-}