nlm_prot_server.c revision 177685
1177633Sdfr/*-
2177633Sdfr * Copyright (c) 2008 Isilon Inc http://www.isilon.com/
3177633Sdfr * Authors: Doug Rabson <dfr@rabson.org>
4177633Sdfr * Developed with Red Inc: Alfred Perlstein <alfred@freebsd.org>
5177633Sdfr *
6177633Sdfr * Redistribution and use in source and binary forms, with or without
7177633Sdfr * modification, are permitted provided that the following conditions
8177633Sdfr * are met:
9177633Sdfr * 1. Redistributions of source code must retain the above copyright
10177633Sdfr *    notice, this list of conditions and the following disclaimer.
11177633Sdfr * 2. Redistributions in binary form must reproduce the above copyright
12177633Sdfr *    notice, this list of conditions and the following disclaimer in the
13177633Sdfr *    documentation and/or other materials provided with the distribution.
14177633Sdfr *
15177633Sdfr * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16177633Sdfr * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17177633Sdfr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18177633Sdfr * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19177633Sdfr * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20177633Sdfr * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21177633Sdfr * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22177633Sdfr * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23177633Sdfr * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24177633Sdfr * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25177633Sdfr * SUCH DAMAGE.
26177633Sdfr */
27177633Sdfr
28177633Sdfr#include <sys/cdefs.h>
29177633Sdfr#ifndef lint
30177633Sdfr/*static char sccsid[] = "from: @(#)nlm_prot.x 1.8 87/09/21 Copyr 1987 Sun Micro";*/
31177633Sdfr/*static char sccsid[] = "from: * @(#)nlm_prot.x	2.1 88/08/01 4.0 RPCSRC";*/
32177633Sdfr__RCSID("$NetBSD: nlm_prot.x,v 1.6 2000/06/07 14:30:15 bouyer Exp $");
33177633Sdfr#endif /* not lint */
34177633Sdfr__FBSDID("$FreeBSD: head/sys/nlm/nlm_prot_server.c 177685 2008-03-28 09:50:32Z dfr $");
35177633Sdfr
36177633Sdfr#include <sys/param.h>
37177633Sdfr#include <sys/malloc.h>
38177633Sdfr#include <sys/systm.h>
39177633Sdfr
40177685Sdfr#include <nlm/nlm_prot.h>
41177685Sdfr#include <nlm/nlm.h>
42177633Sdfr
43177633Sdfr/**********************************************************************/
44177633Sdfr
45177633Sdfr/*
46177633Sdfr * Convert between various versions of the protocol structures.
47177633Sdfr */
48177633Sdfr
49177633Sdfrstatic void
50177633Sdfrnlm_convert_to_nlm4_lock(struct nlm4_lock *dst, struct nlm_lock *src)
51177633Sdfr{
52177633Sdfr
53177633Sdfr	dst->caller_name = src->caller_name;
54177633Sdfr	dst->fh = src->fh;
55177633Sdfr	dst->oh = src->oh;
56177633Sdfr	dst->svid = src->svid;
57177633Sdfr	dst->l_offset = src->l_offset;
58177633Sdfr	dst->l_len = src->l_len;
59177633Sdfr}
60177633Sdfr
61177633Sdfrstatic void
62177633Sdfrnlm_convert_to_nlm4_share(struct nlm4_share *dst, struct nlm_share *src)
63177633Sdfr{
64177633Sdfr
65177633Sdfr	dst->caller_name = src->caller_name;
66177633Sdfr	dst->fh = src->fh;
67177633Sdfr	dst->oh = src->oh;
68177633Sdfr	dst->mode = src->mode;
69177633Sdfr	dst->access = src->access;
70177633Sdfr}
71177633Sdfr
72177633Sdfrstatic void
73177633Sdfrnlm_convert_to_nlm_holder(struct nlm_holder *dst, struct nlm4_holder *src)
74177633Sdfr{
75177633Sdfr
76177633Sdfr	dst->exclusive = src->exclusive;
77177633Sdfr	dst->svid = src->svid;
78177633Sdfr	dst->oh = src->oh;
79177633Sdfr	dst->l_offset = src->l_offset;
80177633Sdfr	dst->l_len = src->l_len;
81177633Sdfr}
82177633Sdfr
83177633Sdfrstatic void
84177633Sdfrnlm_convert_to_nlm4_holder(struct nlm4_holder *dst, struct nlm_holder *src)
85177633Sdfr{
86177633Sdfr
87177633Sdfr	dst->exclusive = src->exclusive;
88177633Sdfr	dst->svid = src->svid;
89177633Sdfr	dst->oh = src->oh;
90177633Sdfr	dst->l_offset = src->l_offset;
91177633Sdfr	dst->l_len = src->l_len;
92177633Sdfr}
93177633Sdfr
94177633Sdfrstatic enum nlm_stats
95177633Sdfrnlm_convert_to_nlm_stats(enum nlm4_stats src)
96177633Sdfr{
97177633Sdfr	if (src > nlm4_deadlck)
98177633Sdfr		return nlm_denied;
99177633Sdfr	return (enum nlm_stats) src;
100177633Sdfr}
101177633Sdfr
102177633Sdfrstatic void
103177633Sdfrnlm_convert_to_nlm_res(struct nlm_res *dst, struct nlm4_res *src)
104177633Sdfr{
105177633Sdfr	dst->cookie = src->cookie;
106177633Sdfr	dst->stat.stat = nlm_convert_to_nlm_stats(src->stat.stat);
107177633Sdfr}
108177633Sdfr
109177633Sdfrstatic void
110177633Sdfrnlm_convert_to_nlm4_res(struct nlm4_res *dst, struct nlm_res *src)
111177633Sdfr{
112177633Sdfr	dst->cookie = src->cookie;
113177633Sdfr	dst->stat.stat = (enum nlm4_stats) src->stat.stat;
114177633Sdfr}
115177633Sdfr
116177633Sdfr/**********************************************************************/
117177633Sdfr
118177633Sdfr/*
119177633Sdfr * RPC server stubs.
120177633Sdfr */
121177633Sdfr
122177633Sdfrbool_t
123177633Sdfrnlm_sm_notify_0_svc(struct nlm_sm_status *argp, void *result, struct svc_req *rqstp)
124177633Sdfr{
125177633Sdfr	nlm_sm_notify(argp);
126177633Sdfr
127177633Sdfr	return (TRUE);
128177633Sdfr}
129177633Sdfr
130177633Sdfrbool_t
131177633Sdfrnlm_test_1_svc(struct nlm_testargs *argp, nlm_testres *result, struct svc_req *rqstp)
132177633Sdfr{
133177633Sdfr	bool_t retval;
134177633Sdfr	nlm4_testargs args4;
135177633Sdfr	nlm4_testres res4;
136177633Sdfr
137177633Sdfr	args4.cookie = argp->cookie;
138177633Sdfr	args4.exclusive = argp->exclusive;
139177633Sdfr	nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock);
140177633Sdfr
141177633Sdfr	retval = nlm4_test_4_svc(&args4, &res4, rqstp);
142177633Sdfr	if (retval) {
143177633Sdfr		result->cookie = res4.cookie;
144177633Sdfr		result->stat.stat = nlm_convert_to_nlm_stats(res4.stat.stat);
145177633Sdfr		if (result->stat.stat == nlm_denied)
146177633Sdfr			nlm_convert_to_nlm_holder(
147177633Sdfr				&result->stat.nlm_testrply_u.holder,
148177633Sdfr				&res4.stat.nlm4_testrply_u.holder);
149177633Sdfr	}
150177633Sdfr
151177633Sdfr	return (retval);
152177633Sdfr}
153177633Sdfr
154177633Sdfrbool_t
155177633Sdfrnlm_lock_1_svc(struct nlm_lockargs *argp, nlm_res *result, struct svc_req *rqstp)
156177633Sdfr{
157177633Sdfr	bool_t retval;
158177633Sdfr	nlm4_lockargs args4;
159177633Sdfr	nlm4_res res4;
160177633Sdfr
161177633Sdfr	args4.cookie = argp->cookie;
162177633Sdfr	args4.block = argp->block;
163177633Sdfr	args4.exclusive = argp->exclusive;
164177633Sdfr	nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock);
165177633Sdfr	args4.reclaim = argp->reclaim;
166177633Sdfr	args4.state = argp->state;
167177633Sdfr
168177633Sdfr	retval = nlm4_lock_4_svc(&args4, &res4, rqstp);
169177633Sdfr	if (retval)
170177633Sdfr		nlm_convert_to_nlm_res(result, &res4);
171177633Sdfr
172177633Sdfr	return (retval);
173177633Sdfr}
174177633Sdfr
175177633Sdfrbool_t
176177633Sdfrnlm_cancel_1_svc(struct nlm_cancargs *argp, nlm_res *result, struct svc_req *rqstp)
177177633Sdfr{
178177633Sdfr	bool_t retval;
179177633Sdfr	nlm4_cancargs args4;
180177633Sdfr	nlm4_res res4;
181177633Sdfr
182177633Sdfr	args4.cookie = argp->cookie;
183177633Sdfr	args4.block = argp->block;
184177633Sdfr	args4.exclusive = argp->exclusive;
185177633Sdfr	nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock);
186177633Sdfr
187177633Sdfr	retval = nlm4_cancel_4_svc(&args4, &res4, rqstp);
188177633Sdfr	if (retval)
189177633Sdfr		nlm_convert_to_nlm_res(result, &res4);
190177633Sdfr
191177633Sdfr	return (retval);
192177633Sdfr}
193177633Sdfr
194177633Sdfrbool_t
195177633Sdfrnlm_unlock_1_svc(struct nlm_unlockargs *argp, nlm_res *result, struct svc_req *rqstp)
196177633Sdfr{
197177633Sdfr	bool_t retval;
198177633Sdfr	nlm4_unlockargs args4;
199177633Sdfr	nlm4_res res4;
200177633Sdfr
201177633Sdfr	args4.cookie = argp->cookie;
202177633Sdfr	nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock);
203177633Sdfr
204177633Sdfr	retval = nlm4_unlock_4_svc(&args4, &res4, rqstp);
205177633Sdfr	if (retval)
206177633Sdfr		nlm_convert_to_nlm_res(result, &res4);
207177633Sdfr
208177633Sdfr	return (retval);
209177633Sdfr}
210177633Sdfr
211177633Sdfrbool_t
212177633Sdfrnlm_granted_1_svc(struct nlm_testargs *argp, nlm_res *result, struct svc_req *rqstp)
213177633Sdfr{
214177633Sdfr	bool_t retval;
215177633Sdfr	nlm4_testargs args4;
216177633Sdfr	nlm4_res res4;
217177633Sdfr
218177633Sdfr	args4.cookie = argp->cookie;
219177633Sdfr	args4.exclusive = argp->exclusive;
220177633Sdfr	nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock);
221177633Sdfr
222177633Sdfr	retval = nlm4_granted_4_svc(&args4, &res4, rqstp);
223177633Sdfr	if (retval)
224177633Sdfr		nlm_convert_to_nlm_res(result, &res4);
225177633Sdfr
226177633Sdfr	return (retval);
227177633Sdfr}
228177633Sdfr
229177633Sdfrbool_t
230177633Sdfrnlm_test_msg_1_svc(struct nlm_testargs *argp, void *result, struct svc_req *rqstp)
231177633Sdfr{
232177633Sdfr	nlm4_testargs args4;
233177633Sdfr	nlm4_testres res4;
234177633Sdfr	nlm_testres res;
235177633Sdfr	struct nlm_host *host;
236177633Sdfr	CLIENT *rpc;
237177633Sdfr	char dummy;
238177633Sdfr
239177633Sdfr	args4.cookie = argp->cookie;
240177633Sdfr	args4.exclusive = argp->exclusive;
241177633Sdfr	nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock);
242177633Sdfr
243177633Sdfr	host = nlm_do_test(&args4, &res4, rqstp);
244177633Sdfr
245177633Sdfr	res.cookie = res4.cookie;
246177633Sdfr	res.stat.stat = nlm_convert_to_nlm_stats(res4.stat.stat);
247177633Sdfr	if (res.stat.stat == nlm_denied)
248177633Sdfr		nlm_convert_to_nlm_holder(
249177633Sdfr			&res.stat.nlm_testrply_u.holder,
250177633Sdfr			&res4.stat.nlm4_testrply_u.holder);
251177633Sdfr
252177633Sdfr	rpc = nlm_host_get_rpc(host);
253177633Sdfr	if (rpc)
254177633Sdfr		nlm_test_res_1(&res, &dummy, rpc);
255177633Sdfr	xdr_free((xdrproc_t) xdr_nlm_testres, &res);
256177633Sdfr
257177633Sdfr	return (FALSE);
258177633Sdfr}
259177633Sdfr
260177633Sdfrbool_t
261177633Sdfrnlm_lock_msg_1_svc(struct nlm_lockargs *argp, void *result, struct svc_req *rqstp)
262177633Sdfr{
263177633Sdfr	nlm4_lockargs args4;
264177633Sdfr	nlm4_res res4;
265177633Sdfr	nlm_res res;
266177633Sdfr	struct nlm_host *host;
267177633Sdfr	CLIENT *rpc;
268177633Sdfr	char dummy;
269177633Sdfr
270177633Sdfr	args4.cookie = argp->cookie;
271177633Sdfr	args4.block = argp->block;
272177633Sdfr	args4.exclusive = argp->exclusive;
273177633Sdfr	nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock);
274177633Sdfr	args4.reclaim = argp->reclaim;
275177633Sdfr	args4.state = argp->state;
276177633Sdfr
277177633Sdfr	host = nlm_do_lock(&args4, &res4, rqstp, TRUE);
278177633Sdfr
279177633Sdfr	nlm_convert_to_nlm_res(&res, &res4);
280177633Sdfr
281177633Sdfr	rpc = nlm_host_get_rpc(host);
282177633Sdfr	if (rpc)
283177633Sdfr		nlm_lock_res_1(&res, &dummy, rpc);
284177633Sdfr	xdr_free((xdrproc_t) xdr_nlm_res, &res);
285177633Sdfr
286177633Sdfr	return (FALSE);
287177633Sdfr}
288177633Sdfr
289177633Sdfrbool_t
290177633Sdfrnlm_cancel_msg_1_svc(struct nlm_cancargs *argp, void *result, struct svc_req *rqstp)
291177633Sdfr{
292177633Sdfr	nlm4_cancargs args4;
293177633Sdfr	nlm4_res res4;
294177633Sdfr	nlm_res res;
295177633Sdfr	struct nlm_host *host;
296177633Sdfr	CLIENT *rpc;
297177633Sdfr	char dummy;
298177633Sdfr
299177633Sdfr	args4.cookie = argp->cookie;
300177633Sdfr	args4.block = argp->block;
301177633Sdfr	args4.exclusive = argp->exclusive;
302177633Sdfr	nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock);
303177633Sdfr
304177633Sdfr	host = nlm_do_cancel(&args4, &res4, rqstp);
305177633Sdfr
306177633Sdfr	nlm_convert_to_nlm_res(&res, &res4);
307177633Sdfr
308177633Sdfr	rpc = nlm_host_get_rpc(host);
309177633Sdfr	if (rpc)
310177633Sdfr		nlm_cancel_res_1(&res, &dummy, rpc);
311177633Sdfr	xdr_free((xdrproc_t) xdr_nlm_res, &res);
312177633Sdfr
313177633Sdfr	return (FALSE);
314177633Sdfr}
315177633Sdfr
316177633Sdfrbool_t
317177633Sdfrnlm_unlock_msg_1_svc(struct nlm_unlockargs *argp, void *result, struct svc_req *rqstp)
318177633Sdfr{
319177633Sdfr	nlm4_unlockargs args4;
320177633Sdfr	nlm4_res res4;
321177633Sdfr	nlm_res res;
322177633Sdfr	struct nlm_host *host;
323177633Sdfr	CLIENT *rpc;
324177633Sdfr	char dummy;
325177633Sdfr
326177633Sdfr	args4.cookie = argp->cookie;
327177633Sdfr	nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock);
328177633Sdfr
329177633Sdfr	host = nlm_do_unlock(&args4, &res4, rqstp);
330177633Sdfr
331177633Sdfr	nlm_convert_to_nlm_res(&res, &res4);
332177633Sdfr
333177633Sdfr	rpc = nlm_host_get_rpc(host);
334177633Sdfr	if (rpc)
335177633Sdfr		nlm_unlock_res_1(&res, &dummy, rpc);
336177633Sdfr	xdr_free((xdrproc_t) xdr_nlm_res, &res);
337177633Sdfr
338177633Sdfr	return (FALSE);
339177633Sdfr}
340177633Sdfr
341177633Sdfrbool_t
342177633Sdfrnlm_granted_msg_1_svc(struct nlm_testargs *argp, void *result, struct svc_req *rqstp)
343177633Sdfr{
344177633Sdfr	nlm4_testargs args4;
345177633Sdfr	nlm4_res res4;
346177633Sdfr	nlm_res res;
347177633Sdfr	struct nlm_host *host;
348177633Sdfr	CLIENT *rpc;
349177633Sdfr	char dummy;
350177633Sdfr
351177633Sdfr	args4.cookie = argp->cookie;
352177633Sdfr	args4.exclusive = argp->exclusive;
353177633Sdfr	nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock);
354177633Sdfr
355177633Sdfr	/*
356177633Sdfr	 * We make a synchronous call to userland and send the reply
357177633Sdfr	 * back async.
358177633Sdfr	 */
359177633Sdfr	nlm4_granted_4_svc(&args4, &res4, rqstp);
360177633Sdfr
361177633Sdfr	nlm_convert_to_nlm_res(&res, &res4);
362177633Sdfr
363177633Sdfr	host = nlm_find_host_by_addr(
364177633Sdfr		(struct sockaddr *) rqstp->rq_xprt->xp_rtaddr.buf,
365177633Sdfr		rqstp->rq_vers);
366177633Sdfr	rpc = nlm_host_get_rpc(host);
367177633Sdfr	if (rpc)
368177633Sdfr		nlm_granted_res_1(&res, &dummy, rpc);
369177633Sdfr	xdr_free((xdrproc_t) xdr_nlm_res, &res);
370177633Sdfr
371177633Sdfr	return (FALSE);
372177633Sdfr}
373177633Sdfr
374177633Sdfrbool_t
375177633Sdfrnlm_test_res_1_svc(nlm_testres *argp, void *result, struct svc_req *rqstp)
376177633Sdfr{
377177633Sdfr	nlm4_testres args4;
378177633Sdfr
379177633Sdfr	args4.cookie = argp->cookie;
380177633Sdfr	if (argp->stat.stat == nlm_denied)
381177633Sdfr		nlm_convert_to_nlm4_holder(
382177633Sdfr			&args4.stat.nlm4_testrply_u.holder,
383177633Sdfr			&argp->stat.nlm_testrply_u.holder);
384177633Sdfr
385177633Sdfr	return (nlm4_test_res_4_svc(&args4, result, rqstp));
386177633Sdfr}
387177633Sdfr
388177633Sdfrbool_t
389177633Sdfrnlm_lock_res_1_svc(nlm_res *argp, void *result, struct svc_req *rqstp)
390177633Sdfr{
391177633Sdfr	nlm4_res arg4;
392177633Sdfr
393177633Sdfr	nlm_convert_to_nlm4_res(&arg4, argp);
394177633Sdfr	return (nlm4_lock_res_4_svc(&arg4, result, rqstp));
395177633Sdfr}
396177633Sdfr
397177633Sdfrbool_t
398177633Sdfrnlm_cancel_res_1_svc(nlm_res *argp, void *result, struct svc_req *rqstp)
399177633Sdfr{
400177633Sdfr	nlm4_res arg4;
401177633Sdfr
402177633Sdfr	nlm_convert_to_nlm4_res(&arg4, argp);
403177633Sdfr	return (nlm4_cancel_res_4_svc(&arg4, result, rqstp));
404177633Sdfr}
405177633Sdfr
406177633Sdfrbool_t
407177633Sdfrnlm_unlock_res_1_svc(nlm_res *argp, void *result, struct svc_req *rqstp)
408177633Sdfr{
409177633Sdfr	nlm4_res arg4;
410177633Sdfr
411177633Sdfr	nlm_convert_to_nlm4_res(&arg4, argp);
412177633Sdfr	return (nlm4_unlock_res_4_svc(&arg4, result, rqstp));
413177633Sdfr}
414177633Sdfr
415177633Sdfrbool_t
416177633Sdfrnlm_granted_res_1_svc(nlm_res *argp, void *result, struct svc_req *rqstp)
417177633Sdfr{
418177633Sdfr	nlm4_res arg4;
419177633Sdfr
420177633Sdfr	nlm_convert_to_nlm4_res(&arg4, argp);
421177633Sdfr	return (nlm4_granted_res_4_svc(&arg4, result, rqstp));
422177633Sdfr}
423177633Sdfr
424177633Sdfrint
425177633Sdfrnlm_prog_1_freeresult(SVCXPRT *transp, xdrproc_t xdr_result, caddr_t result)
426177633Sdfr{
427177633Sdfr
428177633Sdfr	(void) xdr_free(xdr_result, result);
429177633Sdfr	return (TRUE);
430177633Sdfr}
431177633Sdfr
432177633Sdfrbool_t
433177633Sdfrnlm_share_3_svc(nlm_shareargs *argp, nlm_shareres *result, struct svc_req *rqstp)
434177633Sdfr{
435177633Sdfr	bool_t retval;
436177633Sdfr	nlm4_shareargs args4;
437177633Sdfr	nlm4_shareres res4;
438177633Sdfr
439177633Sdfr	args4.cookie = argp->cookie;
440177633Sdfr	nlm_convert_to_nlm4_share(&args4.share, &argp->share);
441177633Sdfr	args4.reclaim = argp->reclaim;
442177633Sdfr
443177633Sdfr	retval = nlm4_share_4_svc(&args4, &res4, rqstp);
444177633Sdfr	if (retval) {
445177633Sdfr		result->cookie = res4.cookie;
446177633Sdfr		result->stat = nlm_convert_to_nlm_stats(res4.stat);
447177633Sdfr		result->sequence = res4.sequence;
448177633Sdfr	}
449177633Sdfr
450177633Sdfr	return (retval);
451177633Sdfr}
452177633Sdfr
453177633Sdfrbool_t
454177633Sdfrnlm_unshare_3_svc(nlm_shareargs *argp, nlm_shareres *result, struct svc_req *rqstp)
455177633Sdfr{
456177633Sdfr	bool_t retval;
457177633Sdfr	nlm4_shareargs args4;
458177633Sdfr	nlm4_shareres res4;
459177633Sdfr
460177633Sdfr	args4.cookie = argp->cookie;
461177633Sdfr	nlm_convert_to_nlm4_share(&args4.share, &argp->share);
462177633Sdfr	args4.reclaim = argp->reclaim;
463177633Sdfr
464177633Sdfr	retval = nlm4_unshare_4_svc(&args4, &res4, rqstp);
465177633Sdfr	if (retval) {
466177633Sdfr		result->cookie = res4.cookie;
467177633Sdfr		result->stat = nlm_convert_to_nlm_stats(res4.stat);
468177633Sdfr		result->sequence = res4.sequence;
469177633Sdfr	}
470177633Sdfr
471177633Sdfr	return (retval);
472177633Sdfr}
473177633Sdfr
474177633Sdfrbool_t
475177633Sdfrnlm_nm_lock_3_svc(nlm_lockargs *argp, nlm_res *result, struct svc_req *rqstp)
476177633Sdfr{
477177633Sdfr	bool_t retval;
478177633Sdfr	nlm4_lockargs args4;
479177633Sdfr	nlm4_res res4;
480177633Sdfr
481177633Sdfr	args4.cookie = argp->cookie;
482177633Sdfr	args4.block = argp->block;
483177633Sdfr	args4.exclusive = argp->exclusive;
484177633Sdfr	nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock);
485177633Sdfr	args4.reclaim = argp->reclaim;
486177633Sdfr	args4.state = argp->state;
487177633Sdfr
488177633Sdfr	retval = nlm4_nm_lock_4_svc(&args4, &res4, rqstp);
489177633Sdfr	if (retval)
490177633Sdfr		nlm_convert_to_nlm_res(result, &res4);
491177633Sdfr
492177633Sdfr	return (retval);
493177633Sdfr}
494177633Sdfr
495177633Sdfrbool_t
496177633Sdfrnlm_free_all_3_svc(nlm_notify *argp, void *result, struct svc_req *rqstp)
497177633Sdfr{
498177633Sdfr	struct nlm4_notify args4;
499177633Sdfr
500177633Sdfr	args4.name = argp->name;
501177633Sdfr	args4.state = argp->state;
502177633Sdfr
503177633Sdfr	return (nlm4_free_all_4_svc(&args4, result, rqstp));
504177633Sdfr}
505177633Sdfr
506177633Sdfrint
507177633Sdfrnlm_prog_3_freeresult(SVCXPRT *transp, xdrproc_t xdr_result, caddr_t result)
508177633Sdfr{
509177633Sdfr
510177633Sdfr	(void) xdr_free(xdr_result, result);
511177633Sdfr	return (TRUE);
512177633Sdfr}
513177633Sdfr
514177633Sdfrbool_t
515177633Sdfrnlm4_test_4_svc(nlm4_testargs *argp, nlm4_testres *result, struct svc_req *rqstp)
516177633Sdfr{
517177633Sdfr
518177633Sdfr	nlm_do_test(argp, result, rqstp);
519177633Sdfr	return (TRUE);
520177633Sdfr}
521177633Sdfr
522177633Sdfrbool_t
523177633Sdfrnlm4_lock_4_svc(nlm4_lockargs *argp, nlm4_res *result, struct svc_req *rqstp)
524177633Sdfr{
525177633Sdfr
526177633Sdfr	nlm_do_lock(argp, result, rqstp, TRUE);
527177633Sdfr	return (TRUE);
528177633Sdfr}
529177633Sdfr
530177633Sdfrbool_t
531177633Sdfrnlm4_cancel_4_svc(nlm4_cancargs *argp, nlm4_res *result, struct svc_req *rqstp)
532177633Sdfr{
533177633Sdfr
534177633Sdfr	nlm_do_cancel(argp, result, rqstp);
535177633Sdfr	return (TRUE);
536177633Sdfr}
537177633Sdfr
538177633Sdfrbool_t
539177633Sdfrnlm4_unlock_4_svc(nlm4_unlockargs *argp, nlm4_res *result, struct svc_req *rqstp)
540177633Sdfr{
541177633Sdfr
542177633Sdfr	nlm_do_unlock(argp, result, rqstp);
543177633Sdfr	return (TRUE);
544177633Sdfr}
545177633Sdfr
546177633Sdfrbool_t
547177633Sdfrnlm4_granted_4_svc(nlm4_testargs *argp, nlm4_res *result, struct svc_req *rqstp)
548177633Sdfr{
549177633Sdfr	CLIENT* lockd;
550177633Sdfr	struct timeval tv;
551177633Sdfr
552177633Sdfr	memset(result, 0, sizeof(*result));
553177633Sdfr	nlm_copy_netobj(&result->cookie, &argp->cookie, M_RPC);
554177633Sdfr
555177633Sdfr	/*
556177633Sdfr	 * Set a non-zero timeout to give the userland a chance to reply.
557177633Sdfr	 */
558177633Sdfr	lockd = nlm_user_lockd();
559177633Sdfr	if (!lockd) {
560177633Sdfr		result->stat.stat = nlm4_failed;
561177633Sdfr		return (TRUE);
562177633Sdfr	}
563177633Sdfr	tv.tv_sec = 20;
564177633Sdfr	tv.tv_usec = 0;
565177633Sdfr	CLNT_CONTROL(lockd, CLSET_TIMEOUT, &tv);
566177633Sdfr	nlm4_granted_4(argp, result, lockd);
567177633Sdfr	tv.tv_sec = 0;
568177633Sdfr	tv.tv_usec = 0;
569177633Sdfr	CLNT_CONTROL(lockd, CLSET_TIMEOUT, &tv);
570177633Sdfr
571177633Sdfr	return (TRUE);
572177633Sdfr}
573177633Sdfr
574177633Sdfrbool_t
575177633Sdfrnlm4_test_msg_4_svc(nlm4_testargs *argp, void *result, struct svc_req *rqstp)
576177633Sdfr{
577177633Sdfr	nlm4_testres res4;
578177633Sdfr	struct nlm_host *host;
579177633Sdfr	CLIENT *rpc;
580177633Sdfr	char dummy;
581177633Sdfr
582177633Sdfr	host = nlm_do_test(argp, &res4, rqstp);
583177633Sdfr	rpc = nlm_host_get_rpc(host);
584177633Sdfr	if (rpc)
585177633Sdfr		nlm4_test_res_4(&res4, &dummy, rpc);
586177633Sdfr	xdr_free((xdrproc_t) xdr_nlm4_testres, &res4);
587177633Sdfr
588177633Sdfr	return (FALSE);
589177633Sdfr}
590177633Sdfr
591177633Sdfrbool_t
592177633Sdfrnlm4_lock_msg_4_svc(nlm4_lockargs *argp, void *result, struct svc_req *rqstp)
593177633Sdfr{
594177633Sdfr	nlm4_res res4;
595177633Sdfr	struct nlm_host *host;
596177633Sdfr	CLIENT *rpc;
597177633Sdfr	char dummy;
598177633Sdfr
599177633Sdfr	host = nlm_do_lock(argp, &res4, rqstp, TRUE);
600177633Sdfr	rpc = nlm_host_get_rpc(host);
601177633Sdfr	if (rpc)
602177633Sdfr		nlm4_lock_res_4(&res4, &dummy, rpc);
603177633Sdfr	xdr_free((xdrproc_t) xdr_nlm4_res, &res4);
604177633Sdfr
605177633Sdfr	return (FALSE);
606177633Sdfr}
607177633Sdfr
608177633Sdfrbool_t
609177633Sdfrnlm4_cancel_msg_4_svc(nlm4_cancargs *argp, void *result, struct svc_req *rqstp)
610177633Sdfr{
611177633Sdfr	nlm4_res res4;
612177633Sdfr	struct nlm_host *host;
613177633Sdfr	CLIENT *rpc;
614177633Sdfr	char dummy;
615177633Sdfr
616177633Sdfr	host = nlm_do_cancel(argp, &res4, rqstp);
617177633Sdfr	rpc = nlm_host_get_rpc(host);
618177633Sdfr	if (rpc)
619177633Sdfr		nlm4_cancel_res_4(&res4, &dummy, rpc);
620177633Sdfr	xdr_free((xdrproc_t) xdr_nlm4_res, &res4);
621177633Sdfr
622177633Sdfr	return (FALSE);
623177633Sdfr}
624177633Sdfr
625177633Sdfrbool_t
626177633Sdfrnlm4_unlock_msg_4_svc(nlm4_unlockargs *argp, void *result, struct svc_req *rqstp)
627177633Sdfr{
628177633Sdfr	nlm4_res res4;
629177633Sdfr	struct nlm_host *host;
630177633Sdfr	CLIENT *rpc;
631177633Sdfr	char dummy;
632177633Sdfr
633177633Sdfr	host = nlm_do_unlock(argp, &res4, rqstp);
634177633Sdfr	rpc = nlm_host_get_rpc(host);
635177633Sdfr	if (rpc)
636177633Sdfr		nlm4_unlock_res_4(&res4, &dummy, rpc);
637177633Sdfr	xdr_free((xdrproc_t) xdr_nlm4_res, &res4);
638177633Sdfr
639177633Sdfr	return (FALSE);
640177633Sdfr}
641177633Sdfr
642177633Sdfrbool_t
643177633Sdfrnlm4_granted_msg_4_svc(nlm4_testargs *argp, void *result, struct svc_req *rqstp)
644177633Sdfr{
645177633Sdfr	struct nlm_host *host;
646177633Sdfr	CLIENT *rpc;
647177633Sdfr	nlm4_res res4;
648177633Sdfr	char dummy;
649177633Sdfr
650177633Sdfr	/*
651177633Sdfr	 * We make a synchronous call to userland and send the reply
652177633Sdfr	 * back async.
653177633Sdfr	 */
654177633Sdfr	nlm4_granted_4_svc(argp, &res4, rqstp);
655177633Sdfr
656177633Sdfr	host = nlm_find_host_by_addr(
657177633Sdfr		(struct sockaddr *) rqstp->rq_xprt->xp_rtaddr.buf,
658177633Sdfr		rqstp->rq_vers);
659177633Sdfr	rpc = nlm_host_get_rpc(host);
660177633Sdfr	if (rpc)
661177633Sdfr		nlm4_granted_res_4(&res4, &dummy, rpc);
662177633Sdfr	xdr_free((xdrproc_t) xdr_nlm4_res, &res4);
663177633Sdfr
664177633Sdfr	return (FALSE);
665177633Sdfr}
666177633Sdfr
667177633Sdfrbool_t
668177633Sdfrnlm4_test_res_4_svc(nlm4_testres *argp, void *result, struct svc_req *rqstp)
669177633Sdfr{
670177633Sdfr	CLIENT* lockd;
671177633Sdfr
672177633Sdfr	lockd = nlm_user_lockd();
673177633Sdfr	if (lockd)
674177633Sdfr		nlm4_test_res_4(argp, result, lockd);
675177633Sdfr
676177633Sdfr	return (FALSE);
677177633Sdfr}
678177633Sdfr
679177633Sdfrbool_t
680177633Sdfrnlm4_lock_res_4_svc(nlm4_res *argp, void *result, struct svc_req *rqstp)
681177633Sdfr{
682177633Sdfr	CLIENT* lockd;
683177633Sdfr
684177633Sdfr	lockd = nlm_user_lockd();
685177633Sdfr	if (lockd)
686177633Sdfr		nlm4_lock_res_4(argp, result, lockd);
687177633Sdfr
688177633Sdfr	return (FALSE);
689177633Sdfr}
690177633Sdfr
691177633Sdfrbool_t
692177633Sdfrnlm4_cancel_res_4_svc(nlm4_res *argp, void *result, struct svc_req *rqstp)
693177633Sdfr{
694177633Sdfr	CLIENT* lockd;
695177633Sdfr
696177633Sdfr	lockd = nlm_user_lockd();
697177633Sdfr	if (lockd)
698177633Sdfr		nlm4_cancel_res_4(argp, result, lockd);
699177633Sdfr
700177633Sdfr	return (FALSE);
701177633Sdfr}
702177633Sdfr
703177633Sdfrbool_t
704177633Sdfrnlm4_unlock_res_4_svc(nlm4_res *argp, void *result, struct svc_req *rqstp)
705177633Sdfr{
706177633Sdfr	CLIENT* lockd;
707177633Sdfr
708177633Sdfr	lockd = nlm_user_lockd();
709177633Sdfr	if (lockd)
710177633Sdfr		nlm4_unlock_res_4(argp, result, lockd);
711177633Sdfr
712177633Sdfr	return (FALSE);
713177633Sdfr}
714177633Sdfr
715177633Sdfrbool_t
716177633Sdfrnlm4_granted_res_4_svc(nlm4_res *argp, void *result, struct svc_req *rqstp)
717177633Sdfr{
718177633Sdfr
719177633Sdfr	return (FALSE);
720177633Sdfr}
721177633Sdfr
722177633Sdfrbool_t
723177633Sdfrnlm4_share_4_svc(nlm4_shareargs *argp, nlm4_shareres *result, struct svc_req *rqstp)
724177633Sdfr{
725177633Sdfr
726177633Sdfr	memset(result, 0, sizeof(*result));
727177633Sdfr	result->stat = nlm4_denied;
728177633Sdfr	return (TRUE);
729177633Sdfr}
730177633Sdfr
731177633Sdfrbool_t
732177633Sdfrnlm4_unshare_4_svc(nlm4_shareargs *argp, nlm4_shareres *result, struct svc_req *rqstp)
733177633Sdfr{
734177633Sdfr
735177633Sdfr	memset(result, 0, sizeof(*result));
736177633Sdfr	result->stat = nlm4_denied;
737177633Sdfr	return (TRUE);
738177633Sdfr}
739177633Sdfr
740177633Sdfrbool_t
741177633Sdfrnlm4_nm_lock_4_svc(nlm4_lockargs *argp, nlm4_res *result, struct svc_req *rqstp)
742177633Sdfr{
743177633Sdfr
744177633Sdfr	nlm_do_lock(argp, result, rqstp, FALSE);
745177633Sdfr	return (TRUE);
746177633Sdfr}
747177633Sdfr
748177633Sdfrbool_t
749177633Sdfrnlm4_free_all_4_svc(nlm4_notify *argp, void *result, struct svc_req *rqstp)
750177633Sdfr{
751177633Sdfr
752177633Sdfr	nlm_do_free_all(argp);
753177633Sdfr	return (TRUE);
754177633Sdfr}
755177633Sdfr
756177633Sdfrint
757177633Sdfrnlm_prog_4_freeresult(SVCXPRT *transp, xdrproc_t xdr_result, caddr_t result)
758177633Sdfr{
759177633Sdfr
760177633Sdfr	(void) xdr_free(xdr_result, result);
761177633Sdfr	return (TRUE);
762177633Sdfr}
763