1 // SPDX-License-Identifier: GPL-2.0
3 * linux/fs/lockd/svcproc.c
5 * Lockd server procedures. We don't implement the NLM_*_RES
6 * procedures because we don't use the async procedures.
8 * Copyright (C) 1996, Olaf Kirch <okir@monad.swb.de>
11 #include <linux/types.h>
12 #include <linux/time.h>
13 #include <linux/lockd/lockd.h>
14 #include <linux/lockd/share.h>
15 #include <linux/sunrpc/svc_xprt.h>
17 #define NLMDBG_FACILITY NLMDBG_CLIENT
19 #ifdef CONFIG_LOCKD_V4
21 cast_to_nlm(__be32 status
, u32 vers
)
23 /* Note: status is assumed to be in network byte order !!! */
28 case nlm_lck_denied_nolocks
:
30 case nlm_lck_denied_grace_period
:
34 status
= nlm_lck_denied
;
37 status
= nlm_lck_denied_nolocks
;
43 #define cast_status(status) (cast_to_nlm(status, rqstp->rq_vers))
45 #define cast_status(status) (status)
49 * Obtain client and file from arguments
52 nlmsvc_retrieve_args(struct svc_rqst
*rqstp
, struct nlm_args
*argp
,
53 struct nlm_host
**hostp
, struct nlm_file
**filp
)
55 struct nlm_host
*host
= NULL
;
56 struct nlm_file
*file
= NULL
;
57 struct nlm_lock
*lock
= &argp
->lock
;
61 /* nfsd callbacks must have been installed for this procedure */
63 return nlm_lck_denied_nolocks
;
65 /* Obtain host handle */
66 if (!(host
= nlmsvc_lookup_host(rqstp
, lock
->caller
, lock
->len
))
67 || (argp
->monitor
&& nsm_monitor(host
) < 0))
71 /* Obtain file pointer. Not used by FREE_ALL call. */
73 error
= cast_status(nlm_lookup_file(rqstp
, &file
, lock
));
78 /* Set up the missing parts of the file_lock structure */
79 mode
= lock_to_openmode(&lock
->fl
);
80 lock
->fl
.c
.flc_flags
= FL_POSIX
;
81 lock
->fl
.c
.flc_file
= file
->f_file
[mode
];
82 lock
->fl
.c
.flc_pid
= current
->tgid
;
83 lock
->fl
.fl_lmops
= &nlmsvc_lock_operations
;
84 nlmsvc_locks_init_private(&lock
->fl
, host
, (pid_t
)lock
->svid
);
85 if (!lock
->fl
.c
.flc_owner
) {
86 /* lockowner allocation has failed */
87 nlmsvc_release_host(host
);
88 return nlm_lck_denied_nolocks
;
95 nlmsvc_release_host(host
);
98 return nlm_lck_denied_nolocks
;
102 * NULL: Test for presence of service
105 nlmsvc_proc_null(struct svc_rqst
*rqstp
)
107 dprintk("lockd: NULL called\n");
112 * TEST: Check for conflicting lock
115 __nlmsvc_proc_test(struct svc_rqst
*rqstp
, struct nlm_res
*resp
)
117 struct nlm_args
*argp
= rqstp
->rq_argp
;
118 struct nlm_host
*host
;
119 struct nlm_file
*file
;
120 struct nlm_lockowner
*test_owner
;
121 __be32 rc
= rpc_success
;
123 dprintk("lockd: TEST called\n");
124 resp
->cookie
= argp
->cookie
;
126 /* Obtain client and file */
127 if ((resp
->status
= nlmsvc_retrieve_args(rqstp
, argp
, &host
, &file
)))
128 return resp
->status
== nlm_drop_reply
? rpc_drop_reply
:rpc_success
;
130 test_owner
= argp
->lock
.fl
.c
.flc_owner
;
132 /* Now check for conflicting locks */
133 resp
->status
= cast_status(nlmsvc_testlock(rqstp
, file
, host
,
134 &argp
->lock
, &resp
->lock
));
135 if (resp
->status
== nlm_drop_reply
)
138 dprintk("lockd: TEST status %d vers %d\n",
139 ntohl(resp
->status
), rqstp
->rq_vers
);
141 nlmsvc_put_lockowner(test_owner
);
142 nlmsvc_release_host(host
);
143 nlm_release_file(file
);
148 nlmsvc_proc_test(struct svc_rqst
*rqstp
)
150 return __nlmsvc_proc_test(rqstp
, rqstp
->rq_resp
);
154 __nlmsvc_proc_lock(struct svc_rqst
*rqstp
, struct nlm_res
*resp
)
156 struct nlm_args
*argp
= rqstp
->rq_argp
;
157 struct nlm_host
*host
;
158 struct nlm_file
*file
;
159 __be32 rc
= rpc_success
;
161 dprintk("lockd: LOCK called\n");
163 resp
->cookie
= argp
->cookie
;
165 /* Obtain client and file */
166 if ((resp
->status
= nlmsvc_retrieve_args(rqstp
, argp
, &host
, &file
)))
167 return resp
->status
== nlm_drop_reply
? rpc_drop_reply
:rpc_success
;
169 /* Now try to lock the file */
170 resp
->status
= cast_status(nlmsvc_lock(rqstp
, file
, host
, &argp
->lock
,
171 argp
->block
, &argp
->cookie
,
173 if (resp
->status
== nlm_drop_reply
)
176 dprintk("lockd: LOCK status %d\n", ntohl(resp
->status
));
178 nlmsvc_release_lockowner(&argp
->lock
);
179 nlmsvc_release_host(host
);
180 nlm_release_file(file
);
185 nlmsvc_proc_lock(struct svc_rqst
*rqstp
)
187 return __nlmsvc_proc_lock(rqstp
, rqstp
->rq_resp
);
191 __nlmsvc_proc_cancel(struct svc_rqst
*rqstp
, struct nlm_res
*resp
)
193 struct nlm_args
*argp
= rqstp
->rq_argp
;
194 struct nlm_host
*host
;
195 struct nlm_file
*file
;
196 struct net
*net
= SVC_NET(rqstp
);
198 dprintk("lockd: CANCEL called\n");
200 resp
->cookie
= argp
->cookie
;
202 /* Don't accept requests during grace period */
203 if (locks_in_grace(net
)) {
204 resp
->status
= nlm_lck_denied_grace_period
;
208 /* Obtain client and file */
209 if ((resp
->status
= nlmsvc_retrieve_args(rqstp
, argp
, &host
, &file
)))
210 return resp
->status
== nlm_drop_reply
? rpc_drop_reply
:rpc_success
;
212 /* Try to cancel request. */
213 resp
->status
= cast_status(nlmsvc_cancel_blocked(net
, file
, &argp
->lock
));
215 dprintk("lockd: CANCEL status %d\n", ntohl(resp
->status
));
216 nlmsvc_release_lockowner(&argp
->lock
);
217 nlmsvc_release_host(host
);
218 nlm_release_file(file
);
223 nlmsvc_proc_cancel(struct svc_rqst
*rqstp
)
225 return __nlmsvc_proc_cancel(rqstp
, rqstp
->rq_resp
);
229 * UNLOCK: release a lock
232 __nlmsvc_proc_unlock(struct svc_rqst
*rqstp
, struct nlm_res
*resp
)
234 struct nlm_args
*argp
= rqstp
->rq_argp
;
235 struct nlm_host
*host
;
236 struct nlm_file
*file
;
237 struct net
*net
= SVC_NET(rqstp
);
239 dprintk("lockd: UNLOCK called\n");
241 resp
->cookie
= argp
->cookie
;
243 /* Don't accept new lock requests during grace period */
244 if (locks_in_grace(net
)) {
245 resp
->status
= nlm_lck_denied_grace_period
;
249 /* Obtain client and file */
250 if ((resp
->status
= nlmsvc_retrieve_args(rqstp
, argp
, &host
, &file
)))
251 return resp
->status
== nlm_drop_reply
? rpc_drop_reply
:rpc_success
;
253 /* Now try to remove the lock */
254 resp
->status
= cast_status(nlmsvc_unlock(net
, file
, &argp
->lock
));
256 dprintk("lockd: UNLOCK status %d\n", ntohl(resp
->status
));
257 nlmsvc_release_lockowner(&argp
->lock
);
258 nlmsvc_release_host(host
);
259 nlm_release_file(file
);
264 nlmsvc_proc_unlock(struct svc_rqst
*rqstp
)
266 return __nlmsvc_proc_unlock(rqstp
, rqstp
->rq_resp
);
270 * GRANTED: A server calls us to tell that a process' lock request
274 __nlmsvc_proc_granted(struct svc_rqst
*rqstp
, struct nlm_res
*resp
)
276 struct nlm_args
*argp
= rqstp
->rq_argp
;
278 resp
->cookie
= argp
->cookie
;
280 dprintk("lockd: GRANTED called\n");
281 resp
->status
= nlmclnt_grant(svc_addr(rqstp
), &argp
->lock
);
282 dprintk("lockd: GRANTED status %d\n", ntohl(resp
->status
));
287 nlmsvc_proc_granted(struct svc_rqst
*rqstp
)
289 return __nlmsvc_proc_granted(rqstp
, rqstp
->rq_resp
);
293 * This is the generic lockd callback for async RPC calls
295 static void nlmsvc_callback_exit(struct rpc_task
*task
, void *data
)
299 void nlmsvc_release_call(struct nlm_rqst
*call
)
301 if (!refcount_dec_and_test(&call
->a_count
))
303 nlmsvc_release_host(call
->a_host
);
307 static void nlmsvc_callback_release(void *data
)
309 nlmsvc_release_call(data
);
312 static const struct rpc_call_ops nlmsvc_callback_ops
= {
313 .rpc_call_done
= nlmsvc_callback_exit
,
314 .rpc_release
= nlmsvc_callback_release
,
318 * `Async' versions of the above service routines. They aren't really,
319 * because we send the callback before the reply proper. I hope this
320 * doesn't break any clients.
322 static __be32
nlmsvc_callback(struct svc_rqst
*rqstp
, u32 proc
,
323 __be32 (*func
)(struct svc_rqst
*, struct nlm_res
*))
325 struct nlm_args
*argp
= rqstp
->rq_argp
;
326 struct nlm_host
*host
;
327 struct nlm_rqst
*call
;
330 host
= nlmsvc_lookup_host(rqstp
,
334 return rpc_system_err
;
336 call
= nlm_alloc_call(host
);
337 nlmsvc_release_host(host
);
339 return rpc_system_err
;
341 stat
= func(rqstp
, &call
->a_res
);
343 nlmsvc_release_call(call
);
347 call
->a_flags
= RPC_TASK_ASYNC
;
348 if (nlm_async_reply(call
, proc
, &nlmsvc_callback_ops
) < 0)
349 return rpc_system_err
;
353 static __be32
nlmsvc_proc_test_msg(struct svc_rqst
*rqstp
)
355 dprintk("lockd: TEST_MSG called\n");
356 return nlmsvc_callback(rqstp
, NLMPROC_TEST_RES
, __nlmsvc_proc_test
);
359 static __be32
nlmsvc_proc_lock_msg(struct svc_rqst
*rqstp
)
361 dprintk("lockd: LOCK_MSG called\n");
362 return nlmsvc_callback(rqstp
, NLMPROC_LOCK_RES
, __nlmsvc_proc_lock
);
365 static __be32
nlmsvc_proc_cancel_msg(struct svc_rqst
*rqstp
)
367 dprintk("lockd: CANCEL_MSG called\n");
368 return nlmsvc_callback(rqstp
, NLMPROC_CANCEL_RES
, __nlmsvc_proc_cancel
);
372 nlmsvc_proc_unlock_msg(struct svc_rqst
*rqstp
)
374 dprintk("lockd: UNLOCK_MSG called\n");
375 return nlmsvc_callback(rqstp
, NLMPROC_UNLOCK_RES
, __nlmsvc_proc_unlock
);
379 nlmsvc_proc_granted_msg(struct svc_rqst
*rqstp
)
381 dprintk("lockd: GRANTED_MSG called\n");
382 return nlmsvc_callback(rqstp
, NLMPROC_GRANTED_RES
, __nlmsvc_proc_granted
);
386 * SHARE: create a DOS share or alter existing share.
389 nlmsvc_proc_share(struct svc_rqst
*rqstp
)
391 struct nlm_args
*argp
= rqstp
->rq_argp
;
392 struct nlm_res
*resp
= rqstp
->rq_resp
;
393 struct nlm_host
*host
;
394 struct nlm_file
*file
;
396 dprintk("lockd: SHARE called\n");
398 resp
->cookie
= argp
->cookie
;
400 /* Don't accept new lock requests during grace period */
401 if (locks_in_grace(SVC_NET(rqstp
)) && !argp
->reclaim
) {
402 resp
->status
= nlm_lck_denied_grace_period
;
406 /* Obtain client and file */
407 if ((resp
->status
= nlmsvc_retrieve_args(rqstp
, argp
, &host
, &file
)))
408 return resp
->status
== nlm_drop_reply
? rpc_drop_reply
:rpc_success
;
410 /* Now try to create the share */
411 resp
->status
= cast_status(nlmsvc_share_file(host
, file
, argp
));
413 dprintk("lockd: SHARE status %d\n", ntohl(resp
->status
));
414 nlmsvc_release_lockowner(&argp
->lock
);
415 nlmsvc_release_host(host
);
416 nlm_release_file(file
);
421 * UNSHARE: Release a DOS share.
424 nlmsvc_proc_unshare(struct svc_rqst
*rqstp
)
426 struct nlm_args
*argp
= rqstp
->rq_argp
;
427 struct nlm_res
*resp
= rqstp
->rq_resp
;
428 struct nlm_host
*host
;
429 struct nlm_file
*file
;
431 dprintk("lockd: UNSHARE called\n");
433 resp
->cookie
= argp
->cookie
;
435 /* Don't accept requests during grace period */
436 if (locks_in_grace(SVC_NET(rqstp
))) {
437 resp
->status
= nlm_lck_denied_grace_period
;
441 /* Obtain client and file */
442 if ((resp
->status
= nlmsvc_retrieve_args(rqstp
, argp
, &host
, &file
)))
443 return resp
->status
== nlm_drop_reply
? rpc_drop_reply
:rpc_success
;
445 /* Now try to unshare the file */
446 resp
->status
= cast_status(nlmsvc_unshare_file(host
, file
, argp
));
448 dprintk("lockd: UNSHARE status %d\n", ntohl(resp
->status
));
449 nlmsvc_release_lockowner(&argp
->lock
);
450 nlmsvc_release_host(host
);
451 nlm_release_file(file
);
456 * NM_LOCK: Create an unmonitored lock
459 nlmsvc_proc_nm_lock(struct svc_rqst
*rqstp
)
461 struct nlm_args
*argp
= rqstp
->rq_argp
;
463 dprintk("lockd: NM_LOCK called\n");
465 argp
->monitor
= 0; /* just clean the monitor flag */
466 return nlmsvc_proc_lock(rqstp
);
470 * FREE_ALL: Release all locks and shares held by client
473 nlmsvc_proc_free_all(struct svc_rqst
*rqstp
)
475 struct nlm_args
*argp
= rqstp
->rq_argp
;
476 struct nlm_host
*host
;
479 if (nlmsvc_retrieve_args(rqstp
, argp
, &host
, NULL
))
482 nlmsvc_free_host_resources(host
);
483 nlmsvc_release_host(host
);
488 * SM_NOTIFY: private callback from statd (not part of official NLM proto)
491 nlmsvc_proc_sm_notify(struct svc_rqst
*rqstp
)
493 struct nlm_reboot
*argp
= rqstp
->rq_argp
;
495 dprintk("lockd: SM_NOTIFY called\n");
497 if (!nlm_privileged_requester(rqstp
)) {
498 char buf
[RPC_MAX_ADDRBUFLEN
];
499 printk(KERN_WARNING
"lockd: rejected NSM callback from %s\n",
500 svc_print_addr(rqstp
, buf
, sizeof(buf
)));
501 return rpc_system_err
;
504 nlm_host_rebooted(SVC_NET(rqstp
), argp
);
509 * client sent a GRANTED_RES, let's remove the associated block
512 nlmsvc_proc_granted_res(struct svc_rqst
*rqstp
)
514 struct nlm_res
*argp
= rqstp
->rq_argp
;
519 dprintk("lockd: GRANTED_RES called\n");
521 nlmsvc_grant_reply(&argp
->cookie
, argp
->status
);
526 nlmsvc_proc_unused(struct svc_rqst
*rqstp
)
528 return rpc_proc_unavail
;
532 * NLM Server procedures.
535 struct nlm_void
{ int dummy
; };
537 #define Ck (1+XDR_QUADLEN(NLM_MAXCOOKIELEN)) /* cookie */
538 #define St 1 /* status */
539 #define No (1+1024/4) /* Net Obj */
540 #define Rg 2 /* range - offset + size */
542 const struct svc_procedure nlmsvc_procedures
[24] = {
544 .pc_func
= nlmsvc_proc_null
,
545 .pc_decode
= nlmsvc_decode_void
,
546 .pc_encode
= nlmsvc_encode_void
,
547 .pc_argsize
= sizeof(struct nlm_void
),
548 .pc_argzero
= sizeof(struct nlm_void
),
549 .pc_ressize
= sizeof(struct nlm_void
),
554 .pc_func
= nlmsvc_proc_test
,
555 .pc_decode
= nlmsvc_decode_testargs
,
556 .pc_encode
= nlmsvc_encode_testres
,
557 .pc_argsize
= sizeof(struct nlm_args
),
558 .pc_argzero
= sizeof(struct nlm_args
),
559 .pc_ressize
= sizeof(struct nlm_res
),
560 .pc_xdrressize
= Ck
+St
+2+No
+Rg
,
564 .pc_func
= nlmsvc_proc_lock
,
565 .pc_decode
= nlmsvc_decode_lockargs
,
566 .pc_encode
= nlmsvc_encode_res
,
567 .pc_argsize
= sizeof(struct nlm_args
),
568 .pc_argzero
= sizeof(struct nlm_args
),
569 .pc_ressize
= sizeof(struct nlm_res
),
570 .pc_xdrressize
= Ck
+St
,
574 .pc_func
= nlmsvc_proc_cancel
,
575 .pc_decode
= nlmsvc_decode_cancargs
,
576 .pc_encode
= nlmsvc_encode_res
,
577 .pc_argsize
= sizeof(struct nlm_args
),
578 .pc_argzero
= sizeof(struct nlm_args
),
579 .pc_ressize
= sizeof(struct nlm_res
),
580 .pc_xdrressize
= Ck
+St
,
584 .pc_func
= nlmsvc_proc_unlock
,
585 .pc_decode
= nlmsvc_decode_unlockargs
,
586 .pc_encode
= nlmsvc_encode_res
,
587 .pc_argsize
= sizeof(struct nlm_args
),
588 .pc_argzero
= sizeof(struct nlm_args
),
589 .pc_ressize
= sizeof(struct nlm_res
),
590 .pc_xdrressize
= Ck
+St
,
593 [NLMPROC_GRANTED
] = {
594 .pc_func
= nlmsvc_proc_granted
,
595 .pc_decode
= nlmsvc_decode_testargs
,
596 .pc_encode
= nlmsvc_encode_res
,
597 .pc_argsize
= sizeof(struct nlm_args
),
598 .pc_argzero
= sizeof(struct nlm_args
),
599 .pc_ressize
= sizeof(struct nlm_res
),
600 .pc_xdrressize
= Ck
+St
,
601 .pc_name
= "GRANTED",
603 [NLMPROC_TEST_MSG
] = {
604 .pc_func
= nlmsvc_proc_test_msg
,
605 .pc_decode
= nlmsvc_decode_testargs
,
606 .pc_encode
= nlmsvc_encode_void
,
607 .pc_argsize
= sizeof(struct nlm_args
),
608 .pc_argzero
= sizeof(struct nlm_args
),
609 .pc_ressize
= sizeof(struct nlm_void
),
611 .pc_name
= "TEST_MSG",
613 [NLMPROC_LOCK_MSG
] = {
614 .pc_func
= nlmsvc_proc_lock_msg
,
615 .pc_decode
= nlmsvc_decode_lockargs
,
616 .pc_encode
= nlmsvc_encode_void
,
617 .pc_argsize
= sizeof(struct nlm_args
),
618 .pc_argzero
= sizeof(struct nlm_args
),
619 .pc_ressize
= sizeof(struct nlm_void
),
621 .pc_name
= "LOCK_MSG",
623 [NLMPROC_CANCEL_MSG
] = {
624 .pc_func
= nlmsvc_proc_cancel_msg
,
625 .pc_decode
= nlmsvc_decode_cancargs
,
626 .pc_encode
= nlmsvc_encode_void
,
627 .pc_argsize
= sizeof(struct nlm_args
),
628 .pc_argzero
= sizeof(struct nlm_args
),
629 .pc_ressize
= sizeof(struct nlm_void
),
631 .pc_name
= "CANCEL_MSG",
633 [NLMPROC_UNLOCK_MSG
] = {
634 .pc_func
= nlmsvc_proc_unlock_msg
,
635 .pc_decode
= nlmsvc_decode_unlockargs
,
636 .pc_encode
= nlmsvc_encode_void
,
637 .pc_argsize
= sizeof(struct nlm_args
),
638 .pc_argzero
= sizeof(struct nlm_args
),
639 .pc_ressize
= sizeof(struct nlm_void
),
641 .pc_name
= "UNLOCK_MSG",
643 [NLMPROC_GRANTED_MSG
] = {
644 .pc_func
= nlmsvc_proc_granted_msg
,
645 .pc_decode
= nlmsvc_decode_testargs
,
646 .pc_encode
= nlmsvc_encode_void
,
647 .pc_argsize
= sizeof(struct nlm_args
),
648 .pc_argzero
= sizeof(struct nlm_args
),
649 .pc_ressize
= sizeof(struct nlm_void
),
651 .pc_name
= "GRANTED_MSG",
653 [NLMPROC_TEST_RES
] = {
654 .pc_func
= nlmsvc_proc_null
,
655 .pc_decode
= nlmsvc_decode_void
,
656 .pc_encode
= nlmsvc_encode_void
,
657 .pc_argsize
= sizeof(struct nlm_res
),
658 .pc_argzero
= sizeof(struct nlm_res
),
659 .pc_ressize
= sizeof(struct nlm_void
),
661 .pc_name
= "TEST_RES",
663 [NLMPROC_LOCK_RES
] = {
664 .pc_func
= nlmsvc_proc_null
,
665 .pc_decode
= nlmsvc_decode_void
,
666 .pc_encode
= nlmsvc_encode_void
,
667 .pc_argsize
= sizeof(struct nlm_res
),
668 .pc_argzero
= sizeof(struct nlm_res
),
669 .pc_ressize
= sizeof(struct nlm_void
),
671 .pc_name
= "LOCK_RES",
673 [NLMPROC_CANCEL_RES
] = {
674 .pc_func
= nlmsvc_proc_null
,
675 .pc_decode
= nlmsvc_decode_void
,
676 .pc_encode
= nlmsvc_encode_void
,
677 .pc_argsize
= sizeof(struct nlm_res
),
678 .pc_argzero
= sizeof(struct nlm_res
),
679 .pc_ressize
= sizeof(struct nlm_void
),
681 .pc_name
= "CANCEL_RES",
683 [NLMPROC_UNLOCK_RES
] = {
684 .pc_func
= nlmsvc_proc_null
,
685 .pc_decode
= nlmsvc_decode_void
,
686 .pc_encode
= nlmsvc_encode_void
,
687 .pc_argsize
= sizeof(struct nlm_res
),
688 .pc_argzero
= sizeof(struct nlm_res
),
689 .pc_ressize
= sizeof(struct nlm_void
),
691 .pc_name
= "UNLOCK_RES",
693 [NLMPROC_GRANTED_RES
] = {
694 .pc_func
= nlmsvc_proc_granted_res
,
695 .pc_decode
= nlmsvc_decode_res
,
696 .pc_encode
= nlmsvc_encode_void
,
697 .pc_argsize
= sizeof(struct nlm_res
),
698 .pc_argzero
= sizeof(struct nlm_res
),
699 .pc_ressize
= sizeof(struct nlm_void
),
701 .pc_name
= "GRANTED_RES",
703 [NLMPROC_NSM_NOTIFY
] = {
704 .pc_func
= nlmsvc_proc_sm_notify
,
705 .pc_decode
= nlmsvc_decode_reboot
,
706 .pc_encode
= nlmsvc_encode_void
,
707 .pc_argsize
= sizeof(struct nlm_reboot
),
708 .pc_argzero
= sizeof(struct nlm_reboot
),
709 .pc_ressize
= sizeof(struct nlm_void
),
711 .pc_name
= "SM_NOTIFY",
714 .pc_func
= nlmsvc_proc_unused
,
715 .pc_decode
= nlmsvc_decode_void
,
716 .pc_encode
= nlmsvc_encode_void
,
717 .pc_argsize
= sizeof(struct nlm_void
),
718 .pc_argzero
= sizeof(struct nlm_void
),
719 .pc_ressize
= sizeof(struct nlm_void
),
724 .pc_func
= nlmsvc_proc_unused
,
725 .pc_decode
= nlmsvc_decode_void
,
726 .pc_encode
= nlmsvc_encode_void
,
727 .pc_argsize
= sizeof(struct nlm_void
),
728 .pc_argzero
= sizeof(struct nlm_void
),
729 .pc_ressize
= sizeof(struct nlm_void
),
734 .pc_func
= nlmsvc_proc_unused
,
735 .pc_decode
= nlmsvc_decode_void
,
736 .pc_encode
= nlmsvc_encode_void
,
737 .pc_argsize
= sizeof(struct nlm_void
),
738 .pc_argzero
= sizeof(struct nlm_void
),
739 .pc_ressize
= sizeof(struct nlm_void
),
744 .pc_func
= nlmsvc_proc_share
,
745 .pc_decode
= nlmsvc_decode_shareargs
,
746 .pc_encode
= nlmsvc_encode_shareres
,
747 .pc_argsize
= sizeof(struct nlm_args
),
748 .pc_argzero
= sizeof(struct nlm_args
),
749 .pc_ressize
= sizeof(struct nlm_res
),
750 .pc_xdrressize
= Ck
+St
+1,
753 [NLMPROC_UNSHARE
] = {
754 .pc_func
= nlmsvc_proc_unshare
,
755 .pc_decode
= nlmsvc_decode_shareargs
,
756 .pc_encode
= nlmsvc_encode_shareres
,
757 .pc_argsize
= sizeof(struct nlm_args
),
758 .pc_argzero
= sizeof(struct nlm_args
),
759 .pc_ressize
= sizeof(struct nlm_res
),
760 .pc_xdrressize
= Ck
+St
+1,
761 .pc_name
= "UNSHARE",
763 [NLMPROC_NM_LOCK
] = {
764 .pc_func
= nlmsvc_proc_nm_lock
,
765 .pc_decode
= nlmsvc_decode_lockargs
,
766 .pc_encode
= nlmsvc_encode_res
,
767 .pc_argsize
= sizeof(struct nlm_args
),
768 .pc_argzero
= sizeof(struct nlm_args
),
769 .pc_ressize
= sizeof(struct nlm_res
),
770 .pc_xdrressize
= Ck
+St
,
771 .pc_name
= "NM_LOCK",
773 [NLMPROC_FREE_ALL
] = {
774 .pc_func
= nlmsvc_proc_free_all
,
775 .pc_decode
= nlmsvc_decode_notify
,
776 .pc_encode
= nlmsvc_encode_void
,
777 .pc_argsize
= sizeof(struct nlm_args
),
778 .pc_argzero
= sizeof(struct nlm_args
),
779 .pc_ressize
= sizeof(struct nlm_void
),
781 .pc_name
= "FREE_ALL",