1*bbaa8b60SDan Kruchinin /*
2*bbaa8b60SDan Kruchinin  * Copyright (c) 2008 Isilon Inc http://www.isilon.com/
3*bbaa8b60SDan Kruchinin  * Authors: Doug Rabson <dfr@rabson.org>
4*bbaa8b60SDan Kruchinin  * Developed with Red Inc: Alfred Perlstein <alfred@freebsd.org>
5*bbaa8b60SDan Kruchinin  *
6*bbaa8b60SDan Kruchinin  * Redistribution and use in source and binary forms, with or without
7*bbaa8b60SDan Kruchinin  * modification, are permitted provided that the following conditions
8*bbaa8b60SDan Kruchinin  * are met:
9*bbaa8b60SDan Kruchinin  * 1. Redistributions of source code must retain the above copyright
10*bbaa8b60SDan Kruchinin  *    notice, this list of conditions and the following disclaimer.
11*bbaa8b60SDan Kruchinin  * 2. Redistributions in binary form must reproduce the above copyright
12*bbaa8b60SDan Kruchinin  *    notice, this list of conditions and the following disclaimer in the
13*bbaa8b60SDan Kruchinin  *    documentation and/or other materials provided with the distribution.
14*bbaa8b60SDan Kruchinin  *
15*bbaa8b60SDan Kruchinin  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16*bbaa8b60SDan Kruchinin  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17*bbaa8b60SDan Kruchinin  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18*bbaa8b60SDan Kruchinin  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19*bbaa8b60SDan Kruchinin  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20*bbaa8b60SDan Kruchinin  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21*bbaa8b60SDan Kruchinin  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22*bbaa8b60SDan Kruchinin  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23*bbaa8b60SDan Kruchinin  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24*bbaa8b60SDan Kruchinin  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25*bbaa8b60SDan Kruchinin  * SUCH DAMAGE.
26*bbaa8b60SDan Kruchinin  */
27*bbaa8b60SDan Kruchinin 
28*bbaa8b60SDan Kruchinin /*
29*bbaa8b60SDan Kruchinin  * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
30*bbaa8b60SDan Kruchinin  * Copyright (c) 2012 by Delphix. All rights reserved.
31*bbaa8b60SDan Kruchinin  */
32*bbaa8b60SDan Kruchinin 
33*bbaa8b60SDan Kruchinin /*
34*bbaa8b60SDan Kruchinin  * NFS Lock Manager, RPC service functions (nlm_..._svc)
35*bbaa8b60SDan Kruchinin  * Called via nlm_dispatch.c tables.
36*bbaa8b60SDan Kruchinin  *
37*bbaa8b60SDan Kruchinin  * Source code derived from FreeBSD nlm_prot_server.c
38*bbaa8b60SDan Kruchinin  *
39*bbaa8b60SDan Kruchinin  * The real service functions all use nlm4_... args and return
40*bbaa8b60SDan Kruchinin  * data types.  These wrappers convert older forms to and from
41*bbaa8b60SDan Kruchinin  * the new forms and call the nlm_do_... service functions.
42*bbaa8b60SDan Kruchinin  */
43*bbaa8b60SDan Kruchinin 
44*bbaa8b60SDan Kruchinin #include <sys/param.h>
45*bbaa8b60SDan Kruchinin #include <sys/systm.h>
46*bbaa8b60SDan Kruchinin 
47*bbaa8b60SDan Kruchinin #include <rpcsvc/nlm_prot.h>
48*bbaa8b60SDan Kruchinin #include "nlm_impl.h"
49*bbaa8b60SDan Kruchinin 
50*bbaa8b60SDan Kruchinin /*
51*bbaa8b60SDan Kruchinin  * Convert between various versions of the protocol structures.
52*bbaa8b60SDan Kruchinin  */
53*bbaa8b60SDan Kruchinin 
54*bbaa8b60SDan Kruchinin /*
55*bbaa8b60SDan Kruchinin  * Down-convert, for granted_1 call
56*bbaa8b60SDan Kruchinin  *
57*bbaa8b60SDan Kruchinin  * This converts a 64-bit lock to 32-bit form for our granted
58*bbaa8b60SDan Kruchinin  * call-back when we're dealing with a 32-bit NLM client.
59*bbaa8b60SDan Kruchinin  * Our NLM_LOCK handler ensures that any lock we grant to a
60*bbaa8b60SDan Kruchinin  * 32-bit client can be represented in 32-bits.  If the
61*bbaa8b60SDan Kruchinin  * ASSERTs here fire, then the call to nlm_init_flock in
62*bbaa8b60SDan Kruchinin  * nlm_do_lock has failed to restrict a 32-bit client to
63*bbaa8b60SDan Kruchinin  * 32-bit lock ranges.
64*bbaa8b60SDan Kruchinin  */
65*bbaa8b60SDan Kruchinin static void
66*bbaa8b60SDan Kruchinin nlm_convert_to_nlm_lock(struct nlm_lock *dst, struct nlm4_lock *src)
67*bbaa8b60SDan Kruchinin {
68*bbaa8b60SDan Kruchinin 	dst->caller_name = src->caller_name;
69*bbaa8b60SDan Kruchinin 	dst->fh = src->fh;
70*bbaa8b60SDan Kruchinin 	dst->oh = src->oh;
71*bbaa8b60SDan Kruchinin 	dst->svid = src->svid;
72*bbaa8b60SDan Kruchinin 	ASSERT(src->l_offset <= MAX_UOFF32);
73*bbaa8b60SDan Kruchinin 	dst->l_offset = (uint32_t)src->l_offset;
74*bbaa8b60SDan Kruchinin 	ASSERT(src->l_len <= MAX_UOFF32);
75*bbaa8b60SDan Kruchinin 	dst->l_len = (uint32_t)src->l_len;
76*bbaa8b60SDan Kruchinin }
77*bbaa8b60SDan Kruchinin 
78*bbaa8b60SDan Kruchinin /*
79*bbaa8b60SDan Kruchinin  * Up-convert for v1 svc functions with a 32-bit lock range arg.
80*bbaa8b60SDan Kruchinin  * Note that lock range checks (like overflow) are done later,
81*bbaa8b60SDan Kruchinin  * in nlm_init_flock().
82*bbaa8b60SDan Kruchinin  */
83*bbaa8b60SDan Kruchinin static void
84*bbaa8b60SDan Kruchinin nlm_convert_to_nlm4_lock(struct nlm4_lock *dst, struct nlm_lock *src)
85*bbaa8b60SDan Kruchinin {
86*bbaa8b60SDan Kruchinin 
87*bbaa8b60SDan Kruchinin 	dst->caller_name = src->caller_name;
88*bbaa8b60SDan Kruchinin 	dst->fh = src->fh;
89*bbaa8b60SDan Kruchinin 	dst->oh = src->oh;
90*bbaa8b60SDan Kruchinin 	dst->svid = src->svid;
91*bbaa8b60SDan Kruchinin 	dst->l_offset = src->l_offset;
92*bbaa8b60SDan Kruchinin 	dst->l_len = src->l_len;
93*bbaa8b60SDan Kruchinin }
94*bbaa8b60SDan Kruchinin 
95*bbaa8b60SDan Kruchinin static void
96*bbaa8b60SDan Kruchinin nlm_convert_to_nlm4_share(struct nlm4_share *dst, struct nlm_share *src)
97*bbaa8b60SDan Kruchinin {
98*bbaa8b60SDan Kruchinin 
99*bbaa8b60SDan Kruchinin 	dst->caller_name = src->caller_name;
100*bbaa8b60SDan Kruchinin 	dst->fh = src->fh;
101*bbaa8b60SDan Kruchinin 	dst->oh = src->oh;
102*bbaa8b60SDan Kruchinin 	dst->mode = src->mode;
103*bbaa8b60SDan Kruchinin 	dst->access = src->access;
104*bbaa8b60SDan Kruchinin }
105*bbaa8b60SDan Kruchinin 
106*bbaa8b60SDan Kruchinin /*
107*bbaa8b60SDan Kruchinin  * Down-convert for v1 NLM_TEST or NLM_TEST_MSG response.
108*bbaa8b60SDan Kruchinin  * Note that nlm_do_test is careful to give us lock ranges
109*bbaa8b60SDan Kruchinin  * that can be represented with 32-bit values.  If the
110*bbaa8b60SDan Kruchinin  * ASSERTs here fire, then the code in nlm_do_test that
111*bbaa8b60SDan Kruchinin  * builds an nlm4_holder for a 32-bit client has failed to
112*bbaa8b60SDan Kruchinin  * restrict the reported conflicting lock range so it's a
113*bbaa8b60SDan Kruchinin  * valid 32-bit lock range.
114*bbaa8b60SDan Kruchinin  */
115*bbaa8b60SDan Kruchinin static void
116*bbaa8b60SDan Kruchinin nlm_convert_to_nlm_holder(struct nlm_holder *dst, struct nlm4_holder *src)
117*bbaa8b60SDan Kruchinin {
118*bbaa8b60SDan Kruchinin 	dst->exclusive = src->exclusive;
119*bbaa8b60SDan Kruchinin 	dst->svid = src->svid;
120*bbaa8b60SDan Kruchinin 	dst->oh = src->oh;
121*bbaa8b60SDan Kruchinin 	ASSERT(src->l_offset <= MAX_UOFF32);
122*bbaa8b60SDan Kruchinin 	dst->l_offset = (uint32_t)src->l_offset;
123*bbaa8b60SDan Kruchinin 	ASSERT(src->l_len <= MAX_UOFF32);
124*bbaa8b60SDan Kruchinin 	dst->l_len = (uint32_t)src->l_len;
125*bbaa8b60SDan Kruchinin }
126*bbaa8b60SDan Kruchinin 
127*bbaa8b60SDan Kruchinin static enum nlm_stats
128*bbaa8b60SDan Kruchinin nlm_convert_to_nlm_stats(enum nlm4_stats src)
129*bbaa8b60SDan Kruchinin {
130*bbaa8b60SDan Kruchinin 	if (src > nlm4_deadlck)
131*bbaa8b60SDan Kruchinin 		return (nlm_denied);
132*bbaa8b60SDan Kruchinin 	return ((enum nlm_stats)src);
133*bbaa8b60SDan Kruchinin }
134*bbaa8b60SDan Kruchinin 
135*bbaa8b60SDan Kruchinin static void
136*bbaa8b60SDan Kruchinin nlm_convert_to_nlm_res(struct nlm_res *dst, struct nlm4_res *src)
137*bbaa8b60SDan Kruchinin {
138*bbaa8b60SDan Kruchinin 	dst->cookie = src->cookie;
139*bbaa8b60SDan Kruchinin 	dst->stat.stat = nlm_convert_to_nlm_stats(src->stat.stat);
140*bbaa8b60SDan Kruchinin }
141*bbaa8b60SDan Kruchinin 
142*bbaa8b60SDan Kruchinin /* ******************************************************************** */
143*bbaa8b60SDan Kruchinin 
144*bbaa8b60SDan Kruchinin /*
145*bbaa8b60SDan Kruchinin  * Version 1 svc functions
146*bbaa8b60SDan Kruchinin  */
147*bbaa8b60SDan Kruchinin 
148*bbaa8b60SDan Kruchinin bool_t
149*bbaa8b60SDan Kruchinin nlm_test_1_svc(struct nlm_testargs *argp, nlm_testres *resp,
150*bbaa8b60SDan Kruchinin     struct svc_req *sr)
151*bbaa8b60SDan Kruchinin {
152*bbaa8b60SDan Kruchinin 	nlm4_testargs args4;
153*bbaa8b60SDan Kruchinin 	nlm4_testres res4;
154*bbaa8b60SDan Kruchinin 
155*bbaa8b60SDan Kruchinin 	bzero(&args4, sizeof (args4));
156*bbaa8b60SDan Kruchinin 	bzero(&res4, sizeof (res4));
157*bbaa8b60SDan Kruchinin 
158*bbaa8b60SDan Kruchinin 	args4.cookie = argp->cookie;
159*bbaa8b60SDan Kruchinin 	args4.exclusive = argp->exclusive;
160*bbaa8b60SDan Kruchinin 	nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock);
161*bbaa8b60SDan Kruchinin 
162*bbaa8b60SDan Kruchinin 	nlm_do_test(&args4, &res4, sr, NULL);
163*bbaa8b60SDan Kruchinin 
164*bbaa8b60SDan Kruchinin 	resp->cookie = res4.cookie;
165*bbaa8b60SDan Kruchinin 	resp->stat.stat = nlm_convert_to_nlm_stats(res4.stat.stat);
166*bbaa8b60SDan Kruchinin 	if (resp->stat.stat == nlm_denied)
167*bbaa8b60SDan Kruchinin 		nlm_convert_to_nlm_holder(
168*bbaa8b60SDan Kruchinin 		    &resp->stat.nlm_testrply_u.holder,
169*bbaa8b60SDan Kruchinin 		    &res4.stat.nlm4_testrply_u.holder);
170*bbaa8b60SDan Kruchinin 
171*bbaa8b60SDan Kruchinin 	return (TRUE);
172*bbaa8b60SDan Kruchinin }
173*bbaa8b60SDan Kruchinin 
174*bbaa8b60SDan Kruchinin /*
175*bbaa8b60SDan Kruchinin  * Callback functions for nlm_lock_1_svc
176*bbaa8b60SDan Kruchinin  */
177*bbaa8b60SDan Kruchinin static bool_t nlm_lock_1_reply(SVCXPRT *, nlm4_res *);
178*bbaa8b60SDan Kruchinin static enum clnt_stat nlm_granted_1_cb(nlm4_testargs *, void *, CLIENT *);
179*bbaa8b60SDan Kruchinin 
180*bbaa8b60SDan Kruchinin bool_t
181*bbaa8b60SDan Kruchinin nlm_lock_1_svc(nlm_lockargs *argp, nlm_res *resp,
182*bbaa8b60SDan Kruchinin     struct svc_req *sr)
183*bbaa8b60SDan Kruchinin {
184*bbaa8b60SDan Kruchinin 	nlm4_lockargs args4;
185*bbaa8b60SDan Kruchinin 	nlm4_res res4;
186*bbaa8b60SDan Kruchinin 
187*bbaa8b60SDan Kruchinin 	bzero(&res4, sizeof (res4));
188*bbaa8b60SDan Kruchinin 
189*bbaa8b60SDan Kruchinin 	args4.cookie = argp->cookie;
190*bbaa8b60SDan Kruchinin 	args4.block = argp->block;
191*bbaa8b60SDan Kruchinin 	args4.exclusive = argp->exclusive;
192*bbaa8b60SDan Kruchinin 	nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock);
193*bbaa8b60SDan Kruchinin 	args4.reclaim = argp->reclaim;
194*bbaa8b60SDan Kruchinin 	args4.state = argp->state;
195*bbaa8b60SDan Kruchinin 
196*bbaa8b60SDan Kruchinin 	/* NLM_LOCK */
197*bbaa8b60SDan Kruchinin 	nlm_do_lock(&args4, &res4, sr,
198*bbaa8b60SDan Kruchinin 	    nlm_lock_1_reply, NULL,
199*bbaa8b60SDan Kruchinin 	    nlm_granted_1_cb);
200*bbaa8b60SDan Kruchinin 
201*bbaa8b60SDan Kruchinin 	/* for freeresult */
202*bbaa8b60SDan Kruchinin 	nlm_convert_to_nlm_res(resp, &res4);
203*bbaa8b60SDan Kruchinin 
204*bbaa8b60SDan Kruchinin 	/* above does its own reply */
205*bbaa8b60SDan Kruchinin 	return (FALSE);
206*bbaa8b60SDan Kruchinin }
207*bbaa8b60SDan Kruchinin 
208*bbaa8b60SDan Kruchinin static bool_t
209*bbaa8b60SDan Kruchinin nlm_lock_1_reply(SVCXPRT *transp, nlm4_res *resp)
210*bbaa8b60SDan Kruchinin {
211*bbaa8b60SDan Kruchinin 	nlm_res res1;
212*bbaa8b60SDan Kruchinin 
213*bbaa8b60SDan Kruchinin 	nlm_convert_to_nlm_res(&res1, resp);
214*bbaa8b60SDan Kruchinin 	return (svc_sendreply(transp, xdr_nlm_res, (char *)&res1));
215*bbaa8b60SDan Kruchinin }
216*bbaa8b60SDan Kruchinin 
217*bbaa8b60SDan Kruchinin static enum clnt_stat
218*bbaa8b60SDan Kruchinin nlm_granted_1_cb(nlm4_testargs *argp, void *resp, CLIENT *clnt)
219*bbaa8b60SDan Kruchinin {
220*bbaa8b60SDan Kruchinin 	nlm_testargs args1;
221*bbaa8b60SDan Kruchinin 	nlm_res res1;
222*bbaa8b60SDan Kruchinin 	int rv;
223*bbaa8b60SDan Kruchinin 
224*bbaa8b60SDan Kruchinin 	bzero(&res1, sizeof (res1));
225*bbaa8b60SDan Kruchinin 
226*bbaa8b60SDan Kruchinin 	args1.cookie = argp->cookie;
227*bbaa8b60SDan Kruchinin 	args1.exclusive = argp->exclusive;
228*bbaa8b60SDan Kruchinin 	nlm_convert_to_nlm_lock(&args1.alock, &argp->alock);
229*bbaa8b60SDan Kruchinin 
230*bbaa8b60SDan Kruchinin 	rv = nlm_granted_1(&args1, &res1, clnt);
231*bbaa8b60SDan Kruchinin 
232*bbaa8b60SDan Kruchinin 	/* NB: We have a result our caller will not free. */
233*bbaa8b60SDan Kruchinin 	xdr_free((xdrproc_t)xdr_nlm_res, (void *)&res1);
234*bbaa8b60SDan Kruchinin 	(void) resp;
235*bbaa8b60SDan Kruchinin 
236*bbaa8b60SDan Kruchinin 	return (rv);
237*bbaa8b60SDan Kruchinin }
238*bbaa8b60SDan Kruchinin 
239*bbaa8b60SDan Kruchinin bool_t
240*bbaa8b60SDan Kruchinin nlm_cancel_1_svc(struct nlm_cancargs *argp, nlm_res *resp,
241*bbaa8b60SDan Kruchinin     struct svc_req *sr)
242*bbaa8b60SDan Kruchinin {
243*bbaa8b60SDan Kruchinin 	nlm4_cancargs args4;
244*bbaa8b60SDan Kruchinin 	nlm4_res res4;
245*bbaa8b60SDan Kruchinin 
246*bbaa8b60SDan Kruchinin 	bzero(&res4, sizeof (res4));
247*bbaa8b60SDan Kruchinin 
248*bbaa8b60SDan Kruchinin 	args4.cookie = argp->cookie;
249*bbaa8b60SDan Kruchinin 	args4.block = argp->block;
250*bbaa8b60SDan Kruchinin 	args4.exclusive = argp->exclusive;
251*bbaa8b60SDan Kruchinin 	nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock);
252*bbaa8b60SDan Kruchinin 
253*bbaa8b60SDan Kruchinin 	nlm_do_cancel(&args4, &res4, sr, NULL);
254*bbaa8b60SDan Kruchinin 
255*bbaa8b60SDan Kruchinin 	nlm_convert_to_nlm_res(resp, &res4);
256*bbaa8b60SDan Kruchinin 
257*bbaa8b60SDan Kruchinin 	return (TRUE);
258*bbaa8b60SDan Kruchinin }
259*bbaa8b60SDan Kruchinin 
260*bbaa8b60SDan Kruchinin bool_t
261*bbaa8b60SDan Kruchinin nlm_unlock_1_svc(struct nlm_unlockargs *argp, nlm_res *resp,
262*bbaa8b60SDan Kruchinin     struct svc_req *sr)
263*bbaa8b60SDan Kruchinin {
264*bbaa8b60SDan Kruchinin 	nlm4_unlockargs args4;
265*bbaa8b60SDan Kruchinin 	nlm4_res res4;
266*bbaa8b60SDan Kruchinin 
267*bbaa8b60SDan Kruchinin 	bzero(&res4, sizeof (res4));
268*bbaa8b60SDan Kruchinin 
269*bbaa8b60SDan Kruchinin 	args4.cookie = argp->cookie;
270*bbaa8b60SDan Kruchinin 	nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock);
271*bbaa8b60SDan Kruchinin 
272*bbaa8b60SDan Kruchinin 	nlm_do_unlock(&args4, &res4, sr, NULL);
273*bbaa8b60SDan Kruchinin 
274*bbaa8b60SDan Kruchinin 	nlm_convert_to_nlm_res(resp, &res4);
275*bbaa8b60SDan Kruchinin 
276*bbaa8b60SDan Kruchinin 	return (TRUE);
277*bbaa8b60SDan Kruchinin }
278*bbaa8b60SDan Kruchinin 
279*bbaa8b60SDan Kruchinin bool_t
280*bbaa8b60SDan Kruchinin nlm_granted_1_svc(struct nlm_testargs *argp, nlm_res *resp,
281*bbaa8b60SDan Kruchinin     struct svc_req *sr)
282*bbaa8b60SDan Kruchinin {
283*bbaa8b60SDan Kruchinin 	nlm4_testargs args4;
284*bbaa8b60SDan Kruchinin 	nlm4_res res4;
285*bbaa8b60SDan Kruchinin 
286*bbaa8b60SDan Kruchinin 	bzero(&res4, sizeof (res4));
287*bbaa8b60SDan Kruchinin 
288*bbaa8b60SDan Kruchinin 	args4.cookie = argp->cookie;
289*bbaa8b60SDan Kruchinin 	args4.exclusive = argp->exclusive;
290*bbaa8b60SDan Kruchinin 	nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock);
291*bbaa8b60SDan Kruchinin 
292*bbaa8b60SDan Kruchinin 	nlm_do_granted(&args4, &res4, sr, NULL);
293*bbaa8b60SDan Kruchinin 
294*bbaa8b60SDan Kruchinin 	nlm_convert_to_nlm_res(resp, &res4);
295*bbaa8b60SDan Kruchinin 
296*bbaa8b60SDan Kruchinin 	return (TRUE);
297*bbaa8b60SDan Kruchinin }
298*bbaa8b60SDan Kruchinin 
299*bbaa8b60SDan Kruchinin /*
300*bbaa8b60SDan Kruchinin  * The _msg_ calls get no reply.  Instead, these callers
301*bbaa8b60SDan Kruchinin  * expect an RPC call to the corresponding _res function.
302*bbaa8b60SDan Kruchinin  * We pass this callback function to nlm_do_test so it will
303*bbaa8b60SDan Kruchinin  * use it to do the RPC callback, with the correct res type.
304*bbaa8b60SDan Kruchinin  *
305*bbaa8b60SDan Kruchinin  * The callback functions have nearly the same arg signature
306*bbaa8b60SDan Kruchinin  * as the client call functions so that many of those can be
307*bbaa8b60SDan Kruchinin  * optimized to nothing by the compiler.  Also, passing the
308*bbaa8b60SDan Kruchinin  * null result arg for these just to reduce warnings.
309*bbaa8b60SDan Kruchinin  *
310*bbaa8b60SDan Kruchinin  * See similar callbacks for other _msg functions below.
311*bbaa8b60SDan Kruchinin  */
312*bbaa8b60SDan Kruchinin 
313*bbaa8b60SDan Kruchinin static enum clnt_stat nlm_test_res_1_cb(nlm4_testres *, void *, CLIENT *);
314*bbaa8b60SDan Kruchinin 
315*bbaa8b60SDan Kruchinin bool_t
316*bbaa8b60SDan Kruchinin nlm_test_msg_1_svc(struct nlm_testargs *argp, void *resp,
317*bbaa8b60SDan Kruchinin     struct svc_req *sr)
318*bbaa8b60SDan Kruchinin {
319*bbaa8b60SDan Kruchinin 	nlm4_testargs args4;
320*bbaa8b60SDan Kruchinin 	nlm4_testres res4;
321*bbaa8b60SDan Kruchinin 
322*bbaa8b60SDan Kruchinin 	bzero(&res4, sizeof (res4));
323*bbaa8b60SDan Kruchinin 
324*bbaa8b60SDan Kruchinin 	args4.cookie = argp->cookie;
325*bbaa8b60SDan Kruchinin 	args4.exclusive = argp->exclusive;
326*bbaa8b60SDan Kruchinin 	nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock);
327*bbaa8b60SDan Kruchinin 
328*bbaa8b60SDan Kruchinin 	nlm_do_test(&args4, &res4, sr,
329*bbaa8b60SDan Kruchinin 	    nlm_test_res_1_cb);
330*bbaa8b60SDan Kruchinin 
331*bbaa8b60SDan Kruchinin 	/* NB: We have a result our caller will not free. */
332*bbaa8b60SDan Kruchinin 	xdr_free((xdrproc_t)xdr_nlm4_testres, (void *)&res4);
333*bbaa8b60SDan Kruchinin 	(void) resp;
334*bbaa8b60SDan Kruchinin 
335*bbaa8b60SDan Kruchinin 	/* The _msg_ calls get no reply. */
336*bbaa8b60SDan Kruchinin 	return (FALSE);
337*bbaa8b60SDan Kruchinin }
338*bbaa8b60SDan Kruchinin 
339*bbaa8b60SDan Kruchinin static enum clnt_stat
340*bbaa8b60SDan Kruchinin nlm_test_res_1_cb(nlm4_testres *res4, void *null, CLIENT *clnt)
341*bbaa8b60SDan Kruchinin {
342*bbaa8b60SDan Kruchinin 	nlm_testres res1;
343*bbaa8b60SDan Kruchinin 
344*bbaa8b60SDan Kruchinin 	res1.cookie = res4->cookie;
345*bbaa8b60SDan Kruchinin 	res1.stat.stat = nlm_convert_to_nlm_stats(res4->stat.stat);
346*bbaa8b60SDan Kruchinin 	if (res1.stat.stat == nlm_denied)
347*bbaa8b60SDan Kruchinin 		nlm_convert_to_nlm_holder(
348*bbaa8b60SDan Kruchinin 		    &res1.stat.nlm_testrply_u.holder,
349*bbaa8b60SDan Kruchinin 		    &res4->stat.nlm4_testrply_u.holder);
350*bbaa8b60SDan Kruchinin 
351*bbaa8b60SDan Kruchinin 	return (nlm_test_res_1(&res1, null, clnt));
352*bbaa8b60SDan Kruchinin }
353*bbaa8b60SDan Kruchinin 
354*bbaa8b60SDan Kruchinin /*
355*bbaa8b60SDan Kruchinin  * Callback functions for nlm_lock_msg_1_svc
356*bbaa8b60SDan Kruchinin  */
357*bbaa8b60SDan Kruchinin static enum clnt_stat nlm_lock_res_1_cb(nlm4_res *, void *, CLIENT *);
358*bbaa8b60SDan Kruchinin static enum clnt_stat nlm_granted_msg_1_cb(nlm4_testargs *, void *, CLIENT *);
359*bbaa8b60SDan Kruchinin 
360*bbaa8b60SDan Kruchinin bool_t
361*bbaa8b60SDan Kruchinin nlm_lock_msg_1_svc(nlm_lockargs *argp, void *resp,
362*bbaa8b60SDan Kruchinin     struct svc_req *sr)
363*bbaa8b60SDan Kruchinin {
364*bbaa8b60SDan Kruchinin 	nlm4_lockargs args4;
365*bbaa8b60SDan Kruchinin 	nlm4_res res4;
366*bbaa8b60SDan Kruchinin 
367*bbaa8b60SDan Kruchinin 	bzero(&res4, sizeof (res4));
368*bbaa8b60SDan Kruchinin 
369*bbaa8b60SDan Kruchinin 	args4.cookie = argp->cookie;
370*bbaa8b60SDan Kruchinin 	args4.block = argp->block;
371*bbaa8b60SDan Kruchinin 	args4.exclusive = argp->exclusive;
372*bbaa8b60SDan Kruchinin 	nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock);
373*bbaa8b60SDan Kruchinin 	args4.reclaim = argp->reclaim;
374*bbaa8b60SDan Kruchinin 	args4.state = argp->state;
375*bbaa8b60SDan Kruchinin 
376*bbaa8b60SDan Kruchinin 	/* NLM_LOCK_MSG */
377*bbaa8b60SDan Kruchinin 	nlm_do_lock(&args4, &res4, sr,
378*bbaa8b60SDan Kruchinin 	    NULL, nlm_lock_res_1_cb,
379*bbaa8b60SDan Kruchinin 	    nlm_granted_msg_1_cb);
380*bbaa8b60SDan Kruchinin 
381*bbaa8b60SDan Kruchinin 	/* NB: We have a result our caller will not free. */
382*bbaa8b60SDan Kruchinin 	xdr_free((xdrproc_t)xdr_nlm4_res, (void *)&res4);
383*bbaa8b60SDan Kruchinin 	(void) resp;
384*bbaa8b60SDan Kruchinin 
385*bbaa8b60SDan Kruchinin 	/* The _msg_ calls get no reply. */
386*bbaa8b60SDan Kruchinin 	return (FALSE);
387*bbaa8b60SDan Kruchinin }
388*bbaa8b60SDan Kruchinin 
389*bbaa8b60SDan Kruchinin static enum clnt_stat
390*bbaa8b60SDan Kruchinin nlm_lock_res_1_cb(nlm4_res *resp, void *null, CLIENT *clnt)
391*bbaa8b60SDan Kruchinin {
392*bbaa8b60SDan Kruchinin 	nlm_res res1;
393*bbaa8b60SDan Kruchinin 
394*bbaa8b60SDan Kruchinin 	nlm_convert_to_nlm_res(&res1, resp);
395*bbaa8b60SDan Kruchinin 	return (nlm_lock_res_1(&res1, null, clnt));
396*bbaa8b60SDan Kruchinin }
397*bbaa8b60SDan Kruchinin 
398*bbaa8b60SDan Kruchinin static enum clnt_stat
399*bbaa8b60SDan Kruchinin nlm_granted_msg_1_cb(nlm4_testargs *argp, void *null, CLIENT *clnt)
400*bbaa8b60SDan Kruchinin {
401*bbaa8b60SDan Kruchinin 	nlm_testargs args1;
402*bbaa8b60SDan Kruchinin 
403*bbaa8b60SDan Kruchinin 	args1.cookie = argp->cookie;
404*bbaa8b60SDan Kruchinin 	args1.exclusive = argp->exclusive;
405*bbaa8b60SDan Kruchinin 	nlm_convert_to_nlm_lock(&args1.alock, &argp->alock);
406*bbaa8b60SDan Kruchinin 
407*bbaa8b60SDan Kruchinin 	return (nlm_granted_msg_1(&args1, null, clnt));
408*bbaa8b60SDan Kruchinin 
409*bbaa8b60SDan Kruchinin }
410*bbaa8b60SDan Kruchinin 
411*bbaa8b60SDan Kruchinin 
412*bbaa8b60SDan Kruchinin static enum clnt_stat nlm_cancel_res_1_cb(nlm4_res *, void *, CLIENT *);
413*bbaa8b60SDan Kruchinin 
414*bbaa8b60SDan Kruchinin bool_t
415*bbaa8b60SDan Kruchinin nlm_cancel_msg_1_svc(struct nlm_cancargs *argp, void *resp,
416*bbaa8b60SDan Kruchinin     struct svc_req *sr)
417*bbaa8b60SDan Kruchinin {
418*bbaa8b60SDan Kruchinin 	nlm4_cancargs args4;
419*bbaa8b60SDan Kruchinin 	nlm4_res res4;
420*bbaa8b60SDan Kruchinin 
421*bbaa8b60SDan Kruchinin 	bzero(&res4, sizeof (res4));
422*bbaa8b60SDan Kruchinin 
423*bbaa8b60SDan Kruchinin 	args4.cookie = argp->cookie;
424*bbaa8b60SDan Kruchinin 	args4.block = argp->block;
425*bbaa8b60SDan Kruchinin 	args4.exclusive = argp->exclusive;
426*bbaa8b60SDan Kruchinin 	nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock);
427*bbaa8b60SDan Kruchinin 
428*bbaa8b60SDan Kruchinin 	nlm_do_cancel(&args4, &res4, sr,
429*bbaa8b60SDan Kruchinin 	    nlm_cancel_res_1_cb);
430*bbaa8b60SDan Kruchinin 
431*bbaa8b60SDan Kruchinin 	/* NB: We have a result our caller will not free. */
432*bbaa8b60SDan Kruchinin 	xdr_free((xdrproc_t)xdr_nlm4_res, (void *)&res4);
433*bbaa8b60SDan Kruchinin 	(void) resp;
434*bbaa8b60SDan Kruchinin 
435*bbaa8b60SDan Kruchinin 	/* The _msg_ calls get no reply. */
436*bbaa8b60SDan Kruchinin 	return (FALSE);
437*bbaa8b60SDan Kruchinin }
438*bbaa8b60SDan Kruchinin 
439*bbaa8b60SDan Kruchinin static enum clnt_stat
440*bbaa8b60SDan Kruchinin nlm_cancel_res_1_cb(nlm4_res *res4, void *null, CLIENT *clnt)
441*bbaa8b60SDan Kruchinin {
442*bbaa8b60SDan Kruchinin 	nlm_res res1;
443*bbaa8b60SDan Kruchinin 
444*bbaa8b60SDan Kruchinin 	nlm_convert_to_nlm_res(&res1, res4);
445*bbaa8b60SDan Kruchinin 	return (nlm_cancel_res_1(&res1, null, clnt));
446*bbaa8b60SDan Kruchinin }
447*bbaa8b60SDan Kruchinin 
448*bbaa8b60SDan Kruchinin 
449*bbaa8b60SDan Kruchinin static enum clnt_stat nlm_unlock_res_1_cb(nlm4_res *, void *, CLIENT *);
450*bbaa8b60SDan Kruchinin 
451*bbaa8b60SDan Kruchinin bool_t
452*bbaa8b60SDan Kruchinin nlm_unlock_msg_1_svc(struct nlm_unlockargs *argp, void *resp,
453*bbaa8b60SDan Kruchinin     struct svc_req *sr)
454*bbaa8b60SDan Kruchinin {
455*bbaa8b60SDan Kruchinin 	nlm4_unlockargs args4;
456*bbaa8b60SDan Kruchinin 	nlm4_res res4;
457*bbaa8b60SDan Kruchinin 
458*bbaa8b60SDan Kruchinin 	bzero(&res4, sizeof (res4));
459*bbaa8b60SDan Kruchinin 
460*bbaa8b60SDan Kruchinin 	args4.cookie = argp->cookie;
461*bbaa8b60SDan Kruchinin 	nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock);
462*bbaa8b60SDan Kruchinin 
463*bbaa8b60SDan Kruchinin 	nlm_do_unlock(&args4, &res4, sr,
464*bbaa8b60SDan Kruchinin 	    nlm_unlock_res_1_cb);
465*bbaa8b60SDan Kruchinin 
466*bbaa8b60SDan Kruchinin 	/* NB: We have a result our caller will not free. */
467*bbaa8b60SDan Kruchinin 	xdr_free((xdrproc_t)xdr_nlm4_res, (void *)&res4);
468*bbaa8b60SDan Kruchinin 	(void) resp;
469*bbaa8b60SDan Kruchinin 
470*bbaa8b60SDan Kruchinin 	/* The _msg_ calls get no reply. */
471*bbaa8b60SDan Kruchinin 	return (FALSE);
472*bbaa8b60SDan Kruchinin }
473*bbaa8b60SDan Kruchinin 
474*bbaa8b60SDan Kruchinin static enum clnt_stat
475*bbaa8b60SDan Kruchinin nlm_unlock_res_1_cb(nlm4_res *res4, void *null, CLIENT *clnt)
476*bbaa8b60SDan Kruchinin {
477*bbaa8b60SDan Kruchinin 	nlm_res res1;
478*bbaa8b60SDan Kruchinin 
479*bbaa8b60SDan Kruchinin 	nlm_convert_to_nlm_res(&res1, res4);
480*bbaa8b60SDan Kruchinin 	return (nlm_unlock_res_1(&res1, null, clnt));
481*bbaa8b60SDan Kruchinin }
482*bbaa8b60SDan Kruchinin 
483*bbaa8b60SDan Kruchinin 
484*bbaa8b60SDan Kruchinin static enum clnt_stat nlm_granted_res_1_cb(nlm4_res *, void *, CLIENT *);
485*bbaa8b60SDan Kruchinin 
486*bbaa8b60SDan Kruchinin bool_t
487*bbaa8b60SDan Kruchinin nlm_granted_msg_1_svc(struct nlm_testargs *argp, void *resp,
488*bbaa8b60SDan Kruchinin     struct svc_req *sr)
489*bbaa8b60SDan Kruchinin {
490*bbaa8b60SDan Kruchinin 	nlm4_testargs args4;
491*bbaa8b60SDan Kruchinin 	nlm4_res res4;
492*bbaa8b60SDan Kruchinin 
493*bbaa8b60SDan Kruchinin 	bzero(&res4, sizeof (res4));
494*bbaa8b60SDan Kruchinin 
495*bbaa8b60SDan Kruchinin 	args4.cookie = argp->cookie;
496*bbaa8b60SDan Kruchinin 	args4.exclusive = argp->exclusive;
497*bbaa8b60SDan Kruchinin 	nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock);
498*bbaa8b60SDan Kruchinin 
499*bbaa8b60SDan Kruchinin 	nlm_do_granted(&args4, &res4, sr,
500*bbaa8b60SDan Kruchinin 	    nlm_granted_res_1_cb);
501*bbaa8b60SDan Kruchinin 
502*bbaa8b60SDan Kruchinin 	/* NB: We have a result our caller will not free. */
503*bbaa8b60SDan Kruchinin 	xdr_free((xdrproc_t)xdr_nlm4_res, (void *)&res4);
504*bbaa8b60SDan Kruchinin 	(void) resp;
505*bbaa8b60SDan Kruchinin 
506*bbaa8b60SDan Kruchinin 	/* The _msg_ calls get no reply. */
507*bbaa8b60SDan Kruchinin 	return (FALSE);
508*bbaa8b60SDan Kruchinin }
509*bbaa8b60SDan Kruchinin 
510*bbaa8b60SDan Kruchinin static enum clnt_stat
511*bbaa8b60SDan Kruchinin nlm_granted_res_1_cb(nlm4_res *res4, void *null, CLIENT *clnt)
512*bbaa8b60SDan Kruchinin {
513*bbaa8b60SDan Kruchinin 	nlm_res res1;
514*bbaa8b60SDan Kruchinin 
515*bbaa8b60SDan Kruchinin 	nlm_convert_to_nlm_res(&res1, res4);
516*bbaa8b60SDan Kruchinin 	return (nlm_granted_res_1(&res1, null, clnt));
517*bbaa8b60SDan Kruchinin }
518*bbaa8b60SDan Kruchinin 
519*bbaa8b60SDan Kruchinin /*
520*bbaa8b60SDan Kruchinin  * The _res_ calls get no reply.  These RPC calls are
521*bbaa8b60SDan Kruchinin  * "call backs" in response to RPC _msg_ calls.
522*bbaa8b60SDan Kruchinin  * We don't care about these responses.
523*bbaa8b60SDan Kruchinin  */
524*bbaa8b60SDan Kruchinin 
525*bbaa8b60SDan Kruchinin /* ARGSUSED */
526*bbaa8b60SDan Kruchinin bool_t
527*bbaa8b60SDan Kruchinin nlm_test_res_1_svc(nlm_testres *argp, void *resp, struct svc_req *sr)
528*bbaa8b60SDan Kruchinin {
529*bbaa8b60SDan Kruchinin 	/* The _res_ calls get no reply. */
530*bbaa8b60SDan Kruchinin 	return (FALSE);
531*bbaa8b60SDan Kruchinin }
532*bbaa8b60SDan Kruchinin 
533*bbaa8b60SDan Kruchinin /* ARGSUSED */
534*bbaa8b60SDan Kruchinin bool_t
535*bbaa8b60SDan Kruchinin nlm_lock_res_1_svc(nlm_res *argp, void *resp, struct svc_req *sr)
536*bbaa8b60SDan Kruchinin {
537*bbaa8b60SDan Kruchinin 	/* The _res_ calls get no reply. */
538*bbaa8b60SDan Kruchinin 	return (FALSE);
539*bbaa8b60SDan Kruchinin }
540*bbaa8b60SDan Kruchinin 
541*bbaa8b60SDan Kruchinin /* ARGSUSED */
542*bbaa8b60SDan Kruchinin bool_t
543*bbaa8b60SDan Kruchinin nlm_cancel_res_1_svc(nlm_res *argp, void *resp, struct svc_req *sr)
544*bbaa8b60SDan Kruchinin {
545*bbaa8b60SDan Kruchinin 	/* The _res_ calls get no reply. */
546*bbaa8b60SDan Kruchinin 	return (FALSE);
547*bbaa8b60SDan Kruchinin }
548*bbaa8b60SDan Kruchinin 
549*bbaa8b60SDan Kruchinin /* ARGSUSED */
550*bbaa8b60SDan Kruchinin bool_t
551*bbaa8b60SDan Kruchinin nlm_unlock_res_1_svc(nlm_res *argp, void *resp, struct svc_req *sr)
552*bbaa8b60SDan Kruchinin {
553*bbaa8b60SDan Kruchinin 	/* The _res_ calls get no reply. */
554*bbaa8b60SDan Kruchinin 	return (FALSE);
555*bbaa8b60SDan Kruchinin }
556*bbaa8b60SDan Kruchinin 
557*bbaa8b60SDan Kruchinin /* ARGSUSED */
558*bbaa8b60SDan Kruchinin bool_t
559*bbaa8b60SDan Kruchinin nlm_granted_res_1_svc(nlm_res *argp, void *resp, struct svc_req *sr)
560*bbaa8b60SDan Kruchinin {
561*bbaa8b60SDan Kruchinin 	/* The _res_ calls get no reply. */
562*bbaa8b60SDan Kruchinin 	return (FALSE);
563*bbaa8b60SDan Kruchinin }
564*bbaa8b60SDan Kruchinin 
565*bbaa8b60SDan Kruchinin /*
566*bbaa8b60SDan Kruchinin  * Version 2 svc functions (used by local statd)
567*bbaa8b60SDan Kruchinin  */
568*bbaa8b60SDan Kruchinin 
569*bbaa8b60SDan Kruchinin bool_t
570*bbaa8b60SDan Kruchinin nlm_sm_notify1_2_svc(struct nlm_sm_status *argp, void *resp,
571*bbaa8b60SDan Kruchinin     struct svc_req *sr)
572*bbaa8b60SDan Kruchinin {
573*bbaa8b60SDan Kruchinin 	nlm_do_notify1(argp, resp, sr);
574*bbaa8b60SDan Kruchinin 	return (TRUE);
575*bbaa8b60SDan Kruchinin }
576*bbaa8b60SDan Kruchinin 
577*bbaa8b60SDan Kruchinin bool_t
578*bbaa8b60SDan Kruchinin nlm_sm_notify2_2_svc(struct nlm_sm_status *argp, void *resp,
579*bbaa8b60SDan Kruchinin     struct svc_req *sr)
580*bbaa8b60SDan Kruchinin {
581*bbaa8b60SDan Kruchinin 	nlm_do_notify2(argp, resp, sr);
582*bbaa8b60SDan Kruchinin 	return (TRUE);
583*bbaa8b60SDan Kruchinin }
584*bbaa8b60SDan Kruchinin 
585*bbaa8b60SDan Kruchinin /*
586*bbaa8b60SDan Kruchinin  * Version 3 svc functions
587*bbaa8b60SDan Kruchinin  */
588*bbaa8b60SDan Kruchinin 
589*bbaa8b60SDan Kruchinin bool_t
590*bbaa8b60SDan Kruchinin nlm_share_3_svc(nlm_shareargs *argp, nlm_shareres *resp,
591*bbaa8b60SDan Kruchinin     struct svc_req *sr)
592*bbaa8b60SDan Kruchinin {
593*bbaa8b60SDan Kruchinin 	nlm4_shareargs args4;
594*bbaa8b60SDan Kruchinin 	nlm4_shareres res4;
595*bbaa8b60SDan Kruchinin 
596*bbaa8b60SDan Kruchinin 	bzero(&res4, sizeof (res4));
597*bbaa8b60SDan Kruchinin 
598*bbaa8b60SDan Kruchinin 	args4.cookie = argp->cookie;
599*bbaa8b60SDan Kruchinin 	nlm_convert_to_nlm4_share(&args4.share, &argp->share);
600*bbaa8b60SDan Kruchinin 	args4.reclaim = argp->reclaim;
601*bbaa8b60SDan Kruchinin 
602*bbaa8b60SDan Kruchinin 	nlm_do_share(&args4, &res4, sr);
603*bbaa8b60SDan Kruchinin 
604*bbaa8b60SDan Kruchinin 	resp->cookie = res4.cookie;
605*bbaa8b60SDan Kruchinin 	resp->stat = nlm_convert_to_nlm_stats(res4.stat);
606*bbaa8b60SDan Kruchinin 	resp->sequence = res4.sequence;
607*bbaa8b60SDan Kruchinin 
608*bbaa8b60SDan Kruchinin 	return (TRUE);
609*bbaa8b60SDan Kruchinin }
610*bbaa8b60SDan Kruchinin 
611*bbaa8b60SDan Kruchinin bool_t
612*bbaa8b60SDan Kruchinin nlm_unshare_3_svc(nlm_shareargs *argp, nlm_shareres *resp,
613*bbaa8b60SDan Kruchinin     struct svc_req *sr)
614*bbaa8b60SDan Kruchinin {
615*bbaa8b60SDan Kruchinin 	nlm4_shareargs args4;
616*bbaa8b60SDan Kruchinin 	nlm4_shareres res4;
617*bbaa8b60SDan Kruchinin 
618*bbaa8b60SDan Kruchinin 	bzero(&res4, sizeof (res4));
619*bbaa8b60SDan Kruchinin 
620*bbaa8b60SDan Kruchinin 	args4.cookie = argp->cookie;
621*bbaa8b60SDan Kruchinin 	nlm_convert_to_nlm4_share(&args4.share, &argp->share);
622*bbaa8b60SDan Kruchinin 	args4.reclaim = argp->reclaim;
623*bbaa8b60SDan Kruchinin 
624*bbaa8b60SDan Kruchinin 	nlm_do_unshare(&args4, &res4, sr);
625*bbaa8b60SDan Kruchinin 
626*bbaa8b60SDan Kruchinin 	resp->cookie = res4.cookie;
627*bbaa8b60SDan Kruchinin 	resp->stat = nlm_convert_to_nlm_stats(res4.stat);
628*bbaa8b60SDan Kruchinin 	resp->sequence = res4.sequence;
629*bbaa8b60SDan Kruchinin 
630*bbaa8b60SDan Kruchinin 	return (TRUE);
631*bbaa8b60SDan Kruchinin }
632*bbaa8b60SDan Kruchinin 
633*bbaa8b60SDan Kruchinin bool_t
634*bbaa8b60SDan Kruchinin nlm_nm_lock_3_svc(nlm_lockargs *argp, nlm_res *resp, struct svc_req *sr)
635*bbaa8b60SDan Kruchinin {
636*bbaa8b60SDan Kruchinin 	nlm4_lockargs args4;
637*bbaa8b60SDan Kruchinin 	nlm4_res res4;
638*bbaa8b60SDan Kruchinin 
639*bbaa8b60SDan Kruchinin 	bzero(&res4, sizeof (res4));
640*bbaa8b60SDan Kruchinin 
641*bbaa8b60SDan Kruchinin 	args4.cookie = argp->cookie;
642*bbaa8b60SDan Kruchinin 	args4.block = argp->block;
643*bbaa8b60SDan Kruchinin 	args4.exclusive = argp->exclusive;
644*bbaa8b60SDan Kruchinin 	nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock);
645*bbaa8b60SDan Kruchinin 	args4.reclaim = argp->reclaim;
646*bbaa8b60SDan Kruchinin 	args4.state = argp->state;
647*bbaa8b60SDan Kruchinin 
648*bbaa8b60SDan Kruchinin 	/*
649*bbaa8b60SDan Kruchinin 	 * Don't allow blocking for non-monitored (nm_lock) calls.
650*bbaa8b60SDan Kruchinin 	 * These clients don't handle any callbacks, including
651*bbaa8b60SDan Kruchinin 	 * the granted call we make after a blocking lock.
652*bbaa8b60SDan Kruchinin 	 * Same reply callback as nlm_lock_1_svc
653*bbaa8b60SDan Kruchinin 	 */
654*bbaa8b60SDan Kruchinin 	args4.block = FALSE;
655*bbaa8b60SDan Kruchinin 
656*bbaa8b60SDan Kruchinin 	/* NLM_NM_LOCK */
657*bbaa8b60SDan Kruchinin 	nlm_do_lock(&args4, &res4, sr,
658*bbaa8b60SDan Kruchinin 	    nlm_lock_1_reply, NULL,
659*bbaa8b60SDan Kruchinin 	    NULL); /* indicates non-monitored */
660*bbaa8b60SDan Kruchinin 
661*bbaa8b60SDan Kruchinin 	/* for freeresult */
662*bbaa8b60SDan Kruchinin 	nlm_convert_to_nlm_res(resp, &res4);
663*bbaa8b60SDan Kruchinin 
664*bbaa8b60SDan Kruchinin 	/* above does its own reply */
665*bbaa8b60SDan Kruchinin 	return (FALSE);
666*bbaa8b60SDan Kruchinin }
667*bbaa8b60SDan Kruchinin 
668*bbaa8b60SDan Kruchinin bool_t
669*bbaa8b60SDan Kruchinin nlm_free_all_3_svc(nlm_notify *argp, void *resp, struct svc_req *sr)
670*bbaa8b60SDan Kruchinin {
671*bbaa8b60SDan Kruchinin 	struct nlm4_notify args4;
672*bbaa8b60SDan Kruchinin 
673*bbaa8b60SDan Kruchinin 	args4.name = argp->name;
674*bbaa8b60SDan Kruchinin 	args4.state = argp->state;
675*bbaa8b60SDan Kruchinin 
676*bbaa8b60SDan Kruchinin 	nlm_do_free_all(&args4, resp, sr);
677*bbaa8b60SDan Kruchinin 
678*bbaa8b60SDan Kruchinin 	return (TRUE);
679*bbaa8b60SDan Kruchinin }
680*bbaa8b60SDan Kruchinin 
681*bbaa8b60SDan Kruchinin /*
682*bbaa8b60SDan Kruchinin  * Version 4 svc functions
683*bbaa8b60SDan Kruchinin  */
684*bbaa8b60SDan Kruchinin 
685*bbaa8b60SDan Kruchinin bool_t
686*bbaa8b60SDan Kruchinin nlm4_test_4_svc(nlm4_testargs *argp, nlm4_testres *resp, struct svc_req *sr)
687*bbaa8b60SDan Kruchinin {
688*bbaa8b60SDan Kruchinin 	nlm_do_test(argp, resp, sr, NULL);
689*bbaa8b60SDan Kruchinin 	return (TRUE);
690*bbaa8b60SDan Kruchinin }
691*bbaa8b60SDan Kruchinin 
692*bbaa8b60SDan Kruchinin /*
693*bbaa8b60SDan Kruchinin  * Callback functions for nlm4_lock_4_svc
694*bbaa8b60SDan Kruchinin  */
695*bbaa8b60SDan Kruchinin static bool_t nlm4_lock_4_reply(SVCXPRT *, nlm4_res *);
696*bbaa8b60SDan Kruchinin static enum clnt_stat nlm4_granted_4_cb(nlm4_testargs *, void *, CLIENT *);
697*bbaa8b60SDan Kruchinin 
698*bbaa8b60SDan Kruchinin bool_t
699*bbaa8b60SDan Kruchinin nlm4_lock_4_svc(nlm4_lockargs *argp, nlm4_res *resp,
700*bbaa8b60SDan Kruchinin     struct svc_req *sr)
701*bbaa8b60SDan Kruchinin {
702*bbaa8b60SDan Kruchinin 
703*bbaa8b60SDan Kruchinin 	/* NLM4_LOCK */
704*bbaa8b60SDan Kruchinin 	nlm_do_lock(argp, resp, sr,
705*bbaa8b60SDan Kruchinin 	    nlm4_lock_4_reply, NULL,
706*bbaa8b60SDan Kruchinin 	    nlm4_granted_4_cb);
707*bbaa8b60SDan Kruchinin 
708*bbaa8b60SDan Kruchinin 	/* above does its own reply */
709*bbaa8b60SDan Kruchinin 	return (FALSE);
710*bbaa8b60SDan Kruchinin }
711*bbaa8b60SDan Kruchinin 
712*bbaa8b60SDan Kruchinin static bool_t
713*bbaa8b60SDan Kruchinin nlm4_lock_4_reply(SVCXPRT *transp, nlm4_res *resp)
714*bbaa8b60SDan Kruchinin {
715*bbaa8b60SDan Kruchinin 	return (svc_sendreply(transp, xdr_nlm4_res, (char *)resp));
716*bbaa8b60SDan Kruchinin }
717*bbaa8b60SDan Kruchinin 
718*bbaa8b60SDan Kruchinin static enum clnt_stat
719*bbaa8b60SDan Kruchinin nlm4_granted_4_cb(nlm4_testargs *argp, void *resp, CLIENT *clnt)
720*bbaa8b60SDan Kruchinin {
721*bbaa8b60SDan Kruchinin 	nlm4_res res4;
722*bbaa8b60SDan Kruchinin 	int rv;
723*bbaa8b60SDan Kruchinin 
724*bbaa8b60SDan Kruchinin 	bzero(&res4, sizeof (res4));
725*bbaa8b60SDan Kruchinin 	rv = nlm4_granted_4(argp, &res4, clnt);
726*bbaa8b60SDan Kruchinin 
727*bbaa8b60SDan Kruchinin 	/* NB: We have a result our caller will not free. */
728*bbaa8b60SDan Kruchinin 	xdr_free((xdrproc_t)xdr_nlm4_res, (void *)&res4);
729*bbaa8b60SDan Kruchinin 	(void) resp;
730*bbaa8b60SDan Kruchinin 
731*bbaa8b60SDan Kruchinin 	return (rv);
732*bbaa8b60SDan Kruchinin }
733*bbaa8b60SDan Kruchinin 
734*bbaa8b60SDan Kruchinin bool_t
735*bbaa8b60SDan Kruchinin nlm4_cancel_4_svc(nlm4_cancargs *argp, nlm4_res *resp, struct svc_req *sr)
736*bbaa8b60SDan Kruchinin {
737*bbaa8b60SDan Kruchinin 	nlm_do_cancel(argp, resp, sr, NULL);
738*bbaa8b60SDan Kruchinin 	return (TRUE);
739*bbaa8b60SDan Kruchinin }
740*bbaa8b60SDan Kruchinin 
741*bbaa8b60SDan Kruchinin bool_t
742*bbaa8b60SDan Kruchinin nlm4_unlock_4_svc(nlm4_unlockargs *argp, nlm4_res *resp, struct svc_req *sr)
743*bbaa8b60SDan Kruchinin {
744*bbaa8b60SDan Kruchinin 	nlm_do_unlock(argp, resp, sr, NULL);
745*bbaa8b60SDan Kruchinin 	return (TRUE);
746*bbaa8b60SDan Kruchinin }
747*bbaa8b60SDan Kruchinin 
748*bbaa8b60SDan Kruchinin bool_t
749*bbaa8b60SDan Kruchinin nlm4_granted_4_svc(nlm4_testargs *argp, nlm4_res *resp, struct svc_req *sr)
750*bbaa8b60SDan Kruchinin {
751*bbaa8b60SDan Kruchinin 	nlm_do_granted(argp, resp, sr, NULL);
752*bbaa8b60SDan Kruchinin 	return (TRUE);
753*bbaa8b60SDan Kruchinin }
754*bbaa8b60SDan Kruchinin 
755*bbaa8b60SDan Kruchinin bool_t
756*bbaa8b60SDan Kruchinin nlm4_test_msg_4_svc(nlm4_testargs *argp, void *resp, struct svc_req *sr)
757*bbaa8b60SDan Kruchinin {
758*bbaa8b60SDan Kruchinin 	nlm4_testres res4;
759*bbaa8b60SDan Kruchinin 
760*bbaa8b60SDan Kruchinin 	bzero(&res4, sizeof (res4));
761*bbaa8b60SDan Kruchinin 	nlm_do_test(argp, &res4, sr,
762*bbaa8b60SDan Kruchinin 	    nlm4_test_res_4);
763*bbaa8b60SDan Kruchinin 
764*bbaa8b60SDan Kruchinin 	/* NB: We have a result our caller will not free. */
765*bbaa8b60SDan Kruchinin 	xdr_free((xdrproc_t)xdr_nlm4_testres, (void *)&res4);
766*bbaa8b60SDan Kruchinin 	(void) resp;
767*bbaa8b60SDan Kruchinin 
768*bbaa8b60SDan Kruchinin 	/* The _msg_ calls get no reply. */
769*bbaa8b60SDan Kruchinin 	return (FALSE);
770*bbaa8b60SDan Kruchinin }
771*bbaa8b60SDan Kruchinin 
772*bbaa8b60SDan Kruchinin /*
773*bbaa8b60SDan Kruchinin  * Callback functions for nlm4_lock_msg_4_svc
774*bbaa8b60SDan Kruchinin  * (using the RPC client stubs directly)
775*bbaa8b60SDan Kruchinin  */
776*bbaa8b60SDan Kruchinin 
777*bbaa8b60SDan Kruchinin bool_t
778*bbaa8b60SDan Kruchinin nlm4_lock_msg_4_svc(nlm4_lockargs *argp, void *resp,
779*bbaa8b60SDan Kruchinin     struct svc_req *sr)
780*bbaa8b60SDan Kruchinin {
781*bbaa8b60SDan Kruchinin 	nlm4_res res4;
782*bbaa8b60SDan Kruchinin 
783*bbaa8b60SDan Kruchinin 	/* NLM4_LOCK_MSG */
784*bbaa8b60SDan Kruchinin 	bzero(&res4, sizeof (res4));
785*bbaa8b60SDan Kruchinin 	nlm_do_lock(argp, &res4, sr,
786*bbaa8b60SDan Kruchinin 	    NULL, nlm4_lock_res_4,
787*bbaa8b60SDan Kruchinin 	    nlm4_granted_msg_4);
788*bbaa8b60SDan Kruchinin 
789*bbaa8b60SDan Kruchinin 	/* NB: We have a result our caller will not free. */
790*bbaa8b60SDan Kruchinin 	xdr_free((xdrproc_t)xdr_nlm4_res, (void *)&res4);
791*bbaa8b60SDan Kruchinin 	(void) resp;
792*bbaa8b60SDan Kruchinin 
793*bbaa8b60SDan Kruchinin 	/* The _msg_ calls get no reply. */
794*bbaa8b60SDan Kruchinin 	return (FALSE);
795*bbaa8b60SDan Kruchinin }
796*bbaa8b60SDan Kruchinin 
797*bbaa8b60SDan Kruchinin bool_t
798*bbaa8b60SDan Kruchinin nlm4_cancel_msg_4_svc(nlm4_cancargs *argp, void *resp, struct svc_req *sr)
799*bbaa8b60SDan Kruchinin {
800*bbaa8b60SDan Kruchinin 	nlm4_res res4;
801*bbaa8b60SDan Kruchinin 
802*bbaa8b60SDan Kruchinin 	bzero(&res4, sizeof (res4));
803*bbaa8b60SDan Kruchinin 	nlm_do_cancel(argp, &res4, sr,
804*bbaa8b60SDan Kruchinin 	    nlm4_cancel_res_4);
805*bbaa8b60SDan Kruchinin 
806*bbaa8b60SDan Kruchinin 	/* NB: We have a result our caller will not free. */
807*bbaa8b60SDan Kruchinin 	xdr_free((xdrproc_t)xdr_nlm4_res, (void *)&res4);
808*bbaa8b60SDan Kruchinin 	(void) resp;
809*bbaa8b60SDan Kruchinin 
810*bbaa8b60SDan Kruchinin 	/* The _msg_ calls get no reply. */
811*bbaa8b60SDan Kruchinin 	return (FALSE);
812*bbaa8b60SDan Kruchinin }
813*bbaa8b60SDan Kruchinin 
814*bbaa8b60SDan Kruchinin bool_t
815*bbaa8b60SDan Kruchinin nlm4_unlock_msg_4_svc(nlm4_unlockargs *argp, void *resp, struct svc_req *sr)
816*bbaa8b60SDan Kruchinin {
817*bbaa8b60SDan Kruchinin 	nlm4_res res4;
818*bbaa8b60SDan Kruchinin 
819*bbaa8b60SDan Kruchinin 	bzero(&res4, sizeof (res4));
820*bbaa8b60SDan Kruchinin 	nlm_do_unlock(argp, &res4, sr,
821*bbaa8b60SDan Kruchinin 	    nlm4_unlock_res_4);
822*bbaa8b60SDan Kruchinin 
823*bbaa8b60SDan Kruchinin 	/* NB: We have a result our caller will not free. */
824*bbaa8b60SDan Kruchinin 	xdr_free((xdrproc_t)xdr_nlm4_res, (void *)&res4);
825*bbaa8b60SDan Kruchinin 	(void) resp;
826*bbaa8b60SDan Kruchinin 
827*bbaa8b60SDan Kruchinin 	/* The _msg_ calls get no reply. */
828*bbaa8b60SDan Kruchinin 	return (FALSE);
829*bbaa8b60SDan Kruchinin }
830*bbaa8b60SDan Kruchinin 
831*bbaa8b60SDan Kruchinin bool_t
832*bbaa8b60SDan Kruchinin nlm4_granted_msg_4_svc(nlm4_testargs *argp, void *resp, struct svc_req *sr)
833*bbaa8b60SDan Kruchinin {
834*bbaa8b60SDan Kruchinin 	nlm4_res res4;
835*bbaa8b60SDan Kruchinin 
836*bbaa8b60SDan Kruchinin 	bzero(&res4, sizeof (res4));
837*bbaa8b60SDan Kruchinin 	nlm_do_granted(argp, &res4, sr,
838*bbaa8b60SDan Kruchinin 	    nlm4_granted_res_4);
839*bbaa8b60SDan Kruchinin 
840*bbaa8b60SDan Kruchinin 	/* NB: We have a result our caller will not free. */
841*bbaa8b60SDan Kruchinin 	xdr_free((xdrproc_t)xdr_nlm4_res, (void *)&res4);
842*bbaa8b60SDan Kruchinin 	(void) resp;
843*bbaa8b60SDan Kruchinin 
844*bbaa8b60SDan Kruchinin 	/* The _msg_ calls get no reply. */
845*bbaa8b60SDan Kruchinin 	return (FALSE);
846*bbaa8b60SDan Kruchinin }
847*bbaa8b60SDan Kruchinin 
848*bbaa8b60SDan Kruchinin /* ARGSUSED */
849*bbaa8b60SDan Kruchinin bool_t
850*bbaa8b60SDan Kruchinin nlm4_test_res_4_svc(nlm4_testres *argp, void *resp, struct svc_req *sr)
851*bbaa8b60SDan Kruchinin {
852*bbaa8b60SDan Kruchinin 	/* The _res_ calls get no reply. */
853*bbaa8b60SDan Kruchinin 	return (FALSE);
854*bbaa8b60SDan Kruchinin }
855*bbaa8b60SDan Kruchinin 
856*bbaa8b60SDan Kruchinin /* ARGSUSED */
857*bbaa8b60SDan Kruchinin bool_t
858*bbaa8b60SDan Kruchinin nlm4_lock_res_4_svc(nlm4_res *argp, void *resp, struct svc_req *sr)
859*bbaa8b60SDan Kruchinin {
860*bbaa8b60SDan Kruchinin 	/* The _res_ calls get no reply. */
861*bbaa8b60SDan Kruchinin 	return (FALSE);
862*bbaa8b60SDan Kruchinin }
863*bbaa8b60SDan Kruchinin 
864*bbaa8b60SDan Kruchinin /* ARGSUSED */
865*bbaa8b60SDan Kruchinin bool_t
866*bbaa8b60SDan Kruchinin nlm4_cancel_res_4_svc(nlm4_res *argp, void *resp, struct svc_req *sr)
867*bbaa8b60SDan Kruchinin {
868*bbaa8b60SDan Kruchinin 	/* The _res_ calls get no reply. */
869*bbaa8b60SDan Kruchinin 	return (FALSE);
870*bbaa8b60SDan Kruchinin }
871*bbaa8b60SDan Kruchinin 
872*bbaa8b60SDan Kruchinin /* ARGSUSED */
873*bbaa8b60SDan Kruchinin bool_t
874*bbaa8b60SDan Kruchinin nlm4_unlock_res_4_svc(nlm4_res *argp, void *resp, struct svc_req *sr)
875*bbaa8b60SDan Kruchinin {
876*bbaa8b60SDan Kruchinin 	/* The _res_ calls get no reply. */
877*bbaa8b60SDan Kruchinin 	return (FALSE);
878*bbaa8b60SDan Kruchinin }
879*bbaa8b60SDan Kruchinin 
880*bbaa8b60SDan Kruchinin /* ARGSUSED */
881*bbaa8b60SDan Kruchinin bool_t
882*bbaa8b60SDan Kruchinin nlm4_granted_res_4_svc(nlm4_res *argp, void *resp, struct svc_req *sr)
883*bbaa8b60SDan Kruchinin {
884*bbaa8b60SDan Kruchinin 	/* The _res_ calls get no reply. */
885*bbaa8b60SDan Kruchinin 	return (FALSE);
886*bbaa8b60SDan Kruchinin }
887*bbaa8b60SDan Kruchinin 
888*bbaa8b60SDan Kruchinin /* ARGSUSED */
889*bbaa8b60SDan Kruchinin bool_t
890*bbaa8b60SDan Kruchinin nlm4_share_4_svc(nlm4_shareargs *argp, nlm4_shareres *resp,
891*bbaa8b60SDan Kruchinin     struct svc_req *sr)
892*bbaa8b60SDan Kruchinin {
893*bbaa8b60SDan Kruchinin 	nlm_do_share(argp, resp, sr);
894*bbaa8b60SDan Kruchinin 	return (TRUE);
895*bbaa8b60SDan Kruchinin }
896*bbaa8b60SDan Kruchinin 
897*bbaa8b60SDan Kruchinin /* ARGSUSED */
898*bbaa8b60SDan Kruchinin bool_t
899*bbaa8b60SDan Kruchinin nlm4_unshare_4_svc(nlm4_shareargs *argp, nlm4_shareres *resp,
900*bbaa8b60SDan Kruchinin     struct svc_req *sr)
901*bbaa8b60SDan Kruchinin {
902*bbaa8b60SDan Kruchinin 	nlm_do_unshare(argp, resp, sr);
903*bbaa8b60SDan Kruchinin 	return (TRUE);
904*bbaa8b60SDan Kruchinin }
905*bbaa8b60SDan Kruchinin 
906*bbaa8b60SDan Kruchinin bool_t
907*bbaa8b60SDan Kruchinin nlm4_nm_lock_4_svc(nlm4_lockargs *argp, nlm4_res *resp, struct svc_req *sr)
908*bbaa8b60SDan Kruchinin {
909*bbaa8b60SDan Kruchinin 
910*bbaa8b60SDan Kruchinin 	/*
911*bbaa8b60SDan Kruchinin 	 * Don't allow blocking for non-monitored (nm_lock) calls.
912*bbaa8b60SDan Kruchinin 	 * These clients don't handle any callbacks, including
913*bbaa8b60SDan Kruchinin 	 * the granted call we make after a blocking lock.
914*bbaa8b60SDan Kruchinin 	 * Same reply callback as nlm4_lock_4_svc
915*bbaa8b60SDan Kruchinin 	 */
916*bbaa8b60SDan Kruchinin 	argp->block = FALSE;
917*bbaa8b60SDan Kruchinin 
918*bbaa8b60SDan Kruchinin 	/* NLM4_NM_LOCK */
919*bbaa8b60SDan Kruchinin 	nlm_do_lock(argp, resp, sr,
920*bbaa8b60SDan Kruchinin 	    nlm4_lock_4_reply, NULL,
921*bbaa8b60SDan Kruchinin 	    NULL); /* indicates non-monitored */
922*bbaa8b60SDan Kruchinin 
923*bbaa8b60SDan Kruchinin 	/* above does its own reply */
924*bbaa8b60SDan Kruchinin 	return (FALSE);
925*bbaa8b60SDan Kruchinin }
926*bbaa8b60SDan Kruchinin 
927*bbaa8b60SDan Kruchinin bool_t
928*bbaa8b60SDan Kruchinin nlm4_free_all_4_svc(nlm4_notify *argp, void *resp, struct svc_req *sr)
929*bbaa8b60SDan Kruchinin {
930*bbaa8b60SDan Kruchinin 	nlm_do_free_all(argp, resp, sr);
931*bbaa8b60SDan Kruchinin 	return (TRUE);
932*bbaa8b60SDan Kruchinin }
933