]> Git Repo - J-linux.git/blob - fs/lockd/svc4proc.c
Merge tag 'vfs-6.13-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[J-linux.git] / fs / lockd / svc4proc.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * linux/fs/lockd/svc4proc.c
4  *
5  * Lockd server procedures. We don't implement the NLM_*_RES 
6  * procedures because we don't use the async procedures.
7  *
8  * Copyright (C) 1996, Olaf Kirch <[email protected]>
9  */
10
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>
16
17 #define NLMDBG_FACILITY         NLMDBG_CLIENT
18
19 /*
20  * Obtain client and file from arguments
21  */
22 static __be32
23 nlm4svc_retrieve_args(struct svc_rqst *rqstp, struct nlm_args *argp,
24                         struct nlm_host **hostp, struct nlm_file **filp)
25 {
26         struct nlm_host         *host = NULL;
27         struct nlm_file         *file = NULL;
28         struct nlm_lock         *lock = &argp->lock;
29         __be32                  error = 0;
30
31         /* nfsd callbacks must have been installed for this procedure */
32         if (!nlmsvc_ops)
33                 return nlm_lck_denied_nolocks;
34
35         if (lock->lock_start > OFFSET_MAX ||
36             (lock->lock_len && ((lock->lock_len - 1) > (OFFSET_MAX - lock->lock_start))))
37                 return nlm4_fbig;
38
39         /* Obtain host handle */
40         if (!(host = nlmsvc_lookup_host(rqstp, lock->caller, lock->len))
41          || (argp->monitor && nsm_monitor(host) < 0))
42                 goto no_locks;
43         *hostp = host;
44
45         /* Obtain file pointer. Not used by FREE_ALL call. */
46         if (filp != NULL) {
47                 int mode = lock_to_openmode(&lock->fl);
48
49                 lock->fl.c.flc_flags = FL_POSIX;
50
51                 error = nlm_lookup_file(rqstp, &file, lock);
52                 if (error)
53                         goto no_locks;
54                 *filp = file;
55
56                 /* Set up the missing parts of the file_lock structure */
57                 lock->fl.c.flc_file = file->f_file[mode];
58                 lock->fl.c.flc_pid = current->tgid;
59                 lock->fl.fl_start = (loff_t)lock->lock_start;
60                 lock->fl.fl_end = lock->lock_len ?
61                                    (loff_t)(lock->lock_start + lock->lock_len - 1) :
62                                    OFFSET_MAX;
63                 lock->fl.fl_lmops = &nlmsvc_lock_operations;
64                 nlmsvc_locks_init_private(&lock->fl, host, (pid_t)lock->svid);
65                 if (!lock->fl.c.flc_owner) {
66                         /* lockowner allocation has failed */
67                         nlmsvc_release_host(host);
68                         return nlm_lck_denied_nolocks;
69                 }
70         }
71
72         return 0;
73
74 no_locks:
75         nlmsvc_release_host(host);
76         if (error)
77                 return error;   
78         return nlm_lck_denied_nolocks;
79 }
80
81 /*
82  * NULL: Test for presence of service
83  */
84 static __be32
85 nlm4svc_proc_null(struct svc_rqst *rqstp)
86 {
87         dprintk("lockd: NULL          called\n");
88         return rpc_success;
89 }
90
91 /*
92  * TEST: Check for conflicting lock
93  */
94 static __be32
95 __nlm4svc_proc_test(struct svc_rqst *rqstp, struct nlm_res *resp)
96 {
97         struct nlm_args *argp = rqstp->rq_argp;
98         struct nlm_host *host;
99         struct nlm_file *file;
100         struct nlm_lockowner *test_owner;
101         __be32 rc = rpc_success;
102
103         dprintk("lockd: TEST4        called\n");
104         resp->cookie = argp->cookie;
105
106         /* Obtain client and file */
107         if ((resp->status = nlm4svc_retrieve_args(rqstp, argp, &host, &file)))
108                 return resp->status == nlm_drop_reply ? rpc_drop_reply :rpc_success;
109
110         test_owner = argp->lock.fl.c.flc_owner;
111         /* Now check for conflicting locks */
112         resp->status = nlmsvc_testlock(rqstp, file, host, &argp->lock,
113                                        &resp->lock);
114         if (resp->status == nlm_drop_reply)
115                 rc = rpc_drop_reply;
116         else
117                 dprintk("lockd: TEST4        status %d\n", ntohl(resp->status));
118
119         nlmsvc_put_lockowner(test_owner);
120         nlmsvc_release_host(host);
121         nlm_release_file(file);
122         return rc;
123 }
124
125 static __be32
126 nlm4svc_proc_test(struct svc_rqst *rqstp)
127 {
128         return __nlm4svc_proc_test(rqstp, rqstp->rq_resp);
129 }
130
131 static __be32
132 __nlm4svc_proc_lock(struct svc_rqst *rqstp, struct nlm_res *resp)
133 {
134         struct nlm_args *argp = rqstp->rq_argp;
135         struct nlm_host *host;
136         struct nlm_file *file;
137         __be32 rc = rpc_success;
138
139         dprintk("lockd: LOCK          called\n");
140
141         resp->cookie = argp->cookie;
142
143         /* Obtain client and file */
144         if ((resp->status = nlm4svc_retrieve_args(rqstp, argp, &host, &file)))
145                 return resp->status == nlm_drop_reply ? rpc_drop_reply :rpc_success;
146
147         /* Now try to lock the file */
148         resp->status = nlmsvc_lock(rqstp, file, host, &argp->lock,
149                                         argp->block, &argp->cookie,
150                                         argp->reclaim);
151         if (resp->status == nlm_drop_reply)
152                 rc = rpc_drop_reply;
153         else
154                 dprintk("lockd: LOCK         status %d\n", ntohl(resp->status));
155
156         nlmsvc_release_lockowner(&argp->lock);
157         nlmsvc_release_host(host);
158         nlm_release_file(file);
159         return rc;
160 }
161
162 static __be32
163 nlm4svc_proc_lock(struct svc_rqst *rqstp)
164 {
165         return __nlm4svc_proc_lock(rqstp, rqstp->rq_resp);
166 }
167
168 static __be32
169 __nlm4svc_proc_cancel(struct svc_rqst *rqstp, struct nlm_res *resp)
170 {
171         struct nlm_args *argp = rqstp->rq_argp;
172         struct nlm_host *host;
173         struct nlm_file *file;
174
175         dprintk("lockd: CANCEL        called\n");
176
177         resp->cookie = argp->cookie;
178
179         /* Don't accept requests during grace period */
180         if (locks_in_grace(SVC_NET(rqstp))) {
181                 resp->status = nlm_lck_denied_grace_period;
182                 return rpc_success;
183         }
184
185         /* Obtain client and file */
186         if ((resp->status = nlm4svc_retrieve_args(rqstp, argp, &host, &file)))
187                 return resp->status == nlm_drop_reply ? rpc_drop_reply :rpc_success;
188
189         /* Try to cancel request. */
190         resp->status = nlmsvc_cancel_blocked(SVC_NET(rqstp), file, &argp->lock);
191
192         dprintk("lockd: CANCEL        status %d\n", ntohl(resp->status));
193         nlmsvc_release_lockowner(&argp->lock);
194         nlmsvc_release_host(host);
195         nlm_release_file(file);
196         return rpc_success;
197 }
198
199 static __be32
200 nlm4svc_proc_cancel(struct svc_rqst *rqstp)
201 {
202         return __nlm4svc_proc_cancel(rqstp, rqstp->rq_resp);
203 }
204
205 /*
206  * UNLOCK: release a lock
207  */
208 static __be32
209 __nlm4svc_proc_unlock(struct svc_rqst *rqstp, struct nlm_res *resp)
210 {
211         struct nlm_args *argp = rqstp->rq_argp;
212         struct nlm_host *host;
213         struct nlm_file *file;
214
215         dprintk("lockd: UNLOCK        called\n");
216
217         resp->cookie = argp->cookie;
218
219         /* Don't accept new lock requests during grace period */
220         if (locks_in_grace(SVC_NET(rqstp))) {
221                 resp->status = nlm_lck_denied_grace_period;
222                 return rpc_success;
223         }
224
225         /* Obtain client and file */
226         if ((resp->status = nlm4svc_retrieve_args(rqstp, argp, &host, &file)))
227                 return resp->status == nlm_drop_reply ? rpc_drop_reply :rpc_success;
228
229         /* Now try to remove the lock */
230         resp->status = nlmsvc_unlock(SVC_NET(rqstp), file, &argp->lock);
231
232         dprintk("lockd: UNLOCK        status %d\n", ntohl(resp->status));
233         nlmsvc_release_lockowner(&argp->lock);
234         nlmsvc_release_host(host);
235         nlm_release_file(file);
236         return rpc_success;
237 }
238
239 static __be32
240 nlm4svc_proc_unlock(struct svc_rqst *rqstp)
241 {
242         return __nlm4svc_proc_unlock(rqstp, rqstp->rq_resp);
243 }
244
245 /*
246  * GRANTED: A server calls us to tell that a process' lock request
247  * was granted
248  */
249 static __be32
250 __nlm4svc_proc_granted(struct svc_rqst *rqstp, struct nlm_res *resp)
251 {
252         struct nlm_args *argp = rqstp->rq_argp;
253
254         resp->cookie = argp->cookie;
255
256         dprintk("lockd: GRANTED       called\n");
257         resp->status = nlmclnt_grant(svc_addr(rqstp), &argp->lock);
258         dprintk("lockd: GRANTED       status %d\n", ntohl(resp->status));
259         return rpc_success;
260 }
261
262 static __be32
263 nlm4svc_proc_granted(struct svc_rqst *rqstp)
264 {
265         return __nlm4svc_proc_granted(rqstp, rqstp->rq_resp);
266 }
267
268 /*
269  * This is the generic lockd callback for async RPC calls
270  */
271 static void nlm4svc_callback_exit(struct rpc_task *task, void *data)
272 {
273 }
274
275 static void nlm4svc_callback_release(void *data)
276 {
277         nlmsvc_release_call(data);
278 }
279
280 static const struct rpc_call_ops nlm4svc_callback_ops = {
281         .rpc_call_done = nlm4svc_callback_exit,
282         .rpc_release = nlm4svc_callback_release,
283 };
284
285 /*
286  * `Async' versions of the above service routines. They aren't really,
287  * because we send the callback before the reply proper. I hope this
288  * doesn't break any clients.
289  */
290 static __be32 nlm4svc_callback(struct svc_rqst *rqstp, u32 proc,
291                 __be32 (*func)(struct svc_rqst *,  struct nlm_res *))
292 {
293         struct nlm_args *argp = rqstp->rq_argp;
294         struct nlm_host *host;
295         struct nlm_rqst *call;
296         __be32 stat;
297
298         host = nlmsvc_lookup_host(rqstp,
299                                   argp->lock.caller,
300                                   argp->lock.len);
301         if (host == NULL)
302                 return rpc_system_err;
303
304         call = nlm_alloc_call(host);
305         nlmsvc_release_host(host);
306         if (call == NULL)
307                 return rpc_system_err;
308
309         stat = func(rqstp, &call->a_res);
310         if (stat != 0) {
311                 nlmsvc_release_call(call);
312                 return stat;
313         }
314
315         call->a_flags = RPC_TASK_ASYNC;
316         if (nlm_async_reply(call, proc, &nlm4svc_callback_ops) < 0)
317                 return rpc_system_err;
318         return rpc_success;
319 }
320
321 static __be32 nlm4svc_proc_test_msg(struct svc_rqst *rqstp)
322 {
323         dprintk("lockd: TEST_MSG      called\n");
324         return nlm4svc_callback(rqstp, NLMPROC_TEST_RES, __nlm4svc_proc_test);
325 }
326
327 static __be32 nlm4svc_proc_lock_msg(struct svc_rqst *rqstp)
328 {
329         dprintk("lockd: LOCK_MSG      called\n");
330         return nlm4svc_callback(rqstp, NLMPROC_LOCK_RES, __nlm4svc_proc_lock);
331 }
332
333 static __be32 nlm4svc_proc_cancel_msg(struct svc_rqst *rqstp)
334 {
335         dprintk("lockd: CANCEL_MSG    called\n");
336         return nlm4svc_callback(rqstp, NLMPROC_CANCEL_RES, __nlm4svc_proc_cancel);
337 }
338
339 static __be32 nlm4svc_proc_unlock_msg(struct svc_rqst *rqstp)
340 {
341         dprintk("lockd: UNLOCK_MSG    called\n");
342         return nlm4svc_callback(rqstp, NLMPROC_UNLOCK_RES, __nlm4svc_proc_unlock);
343 }
344
345 static __be32 nlm4svc_proc_granted_msg(struct svc_rqst *rqstp)
346 {
347         dprintk("lockd: GRANTED_MSG   called\n");
348         return nlm4svc_callback(rqstp, NLMPROC_GRANTED_RES, __nlm4svc_proc_granted);
349 }
350
351 /*
352  * SHARE: create a DOS share or alter existing share.
353  */
354 static __be32
355 nlm4svc_proc_share(struct svc_rqst *rqstp)
356 {
357         struct nlm_args *argp = rqstp->rq_argp;
358         struct nlm_res *resp = rqstp->rq_resp;
359         struct nlm_host *host;
360         struct nlm_file *file;
361
362         dprintk("lockd: SHARE         called\n");
363
364         resp->cookie = argp->cookie;
365
366         /* Don't accept new lock requests during grace period */
367         if (locks_in_grace(SVC_NET(rqstp)) && !argp->reclaim) {
368                 resp->status = nlm_lck_denied_grace_period;
369                 return rpc_success;
370         }
371
372         /* Obtain client and file */
373         if ((resp->status = nlm4svc_retrieve_args(rqstp, argp, &host, &file)))
374                 return resp->status == nlm_drop_reply ? rpc_drop_reply :rpc_success;
375
376         /* Now try to create the share */
377         resp->status = nlmsvc_share_file(host, file, argp);
378
379         dprintk("lockd: SHARE         status %d\n", ntohl(resp->status));
380         nlmsvc_release_lockowner(&argp->lock);
381         nlmsvc_release_host(host);
382         nlm_release_file(file);
383         return rpc_success;
384 }
385
386 /*
387  * UNSHARE: Release a DOS share.
388  */
389 static __be32
390 nlm4svc_proc_unshare(struct svc_rqst *rqstp)
391 {
392         struct nlm_args *argp = rqstp->rq_argp;
393         struct nlm_res *resp = rqstp->rq_resp;
394         struct nlm_host *host;
395         struct nlm_file *file;
396
397         dprintk("lockd: UNSHARE       called\n");
398
399         resp->cookie = argp->cookie;
400
401         /* Don't accept requests during grace period */
402         if (locks_in_grace(SVC_NET(rqstp))) {
403                 resp->status = nlm_lck_denied_grace_period;
404                 return rpc_success;
405         }
406
407         /* Obtain client and file */
408         if ((resp->status = nlm4svc_retrieve_args(rqstp, argp, &host, &file)))
409                 return resp->status == nlm_drop_reply ? rpc_drop_reply :rpc_success;
410
411         /* Now try to lock the file */
412         resp->status = nlmsvc_unshare_file(host, file, argp);
413
414         dprintk("lockd: UNSHARE       status %d\n", ntohl(resp->status));
415         nlmsvc_release_lockowner(&argp->lock);
416         nlmsvc_release_host(host);
417         nlm_release_file(file);
418         return rpc_success;
419 }
420
421 /*
422  * NM_LOCK: Create an unmonitored lock
423  */
424 static __be32
425 nlm4svc_proc_nm_lock(struct svc_rqst *rqstp)
426 {
427         struct nlm_args *argp = rqstp->rq_argp;
428
429         dprintk("lockd: NM_LOCK       called\n");
430
431         argp->monitor = 0;              /* just clean the monitor flag */
432         return nlm4svc_proc_lock(rqstp);
433 }
434
435 /*
436  * FREE_ALL: Release all locks and shares held by client
437  */
438 static __be32
439 nlm4svc_proc_free_all(struct svc_rqst *rqstp)
440 {
441         struct nlm_args *argp = rqstp->rq_argp;
442         struct nlm_host *host;
443
444         /* Obtain client */
445         if (nlm4svc_retrieve_args(rqstp, argp, &host, NULL))
446                 return rpc_success;
447
448         nlmsvc_free_host_resources(host);
449         nlmsvc_release_host(host);
450         return rpc_success;
451 }
452
453 /*
454  * SM_NOTIFY: private callback from statd (not part of official NLM proto)
455  */
456 static __be32
457 nlm4svc_proc_sm_notify(struct svc_rqst *rqstp)
458 {
459         struct nlm_reboot *argp = rqstp->rq_argp;
460
461         dprintk("lockd: SM_NOTIFY     called\n");
462
463         if (!nlm_privileged_requester(rqstp)) {
464                 char buf[RPC_MAX_ADDRBUFLEN];
465                 printk(KERN_WARNING "lockd: rejected NSM callback from %s\n",
466                                 svc_print_addr(rqstp, buf, sizeof(buf)));
467                 return rpc_system_err;
468         }
469
470         nlm_host_rebooted(SVC_NET(rqstp), argp);
471         return rpc_success;
472 }
473
474 /*
475  * client sent a GRANTED_RES, let's remove the associated block
476  */
477 static __be32
478 nlm4svc_proc_granted_res(struct svc_rqst *rqstp)
479 {
480         struct nlm_res *argp = rqstp->rq_argp;
481
482         if (!nlmsvc_ops)
483                 return rpc_success;
484
485         dprintk("lockd: GRANTED_RES   called\n");
486
487         nlmsvc_grant_reply(&argp->cookie, argp->status);
488         return rpc_success;
489 }
490
491 static __be32
492 nlm4svc_proc_unused(struct svc_rqst *rqstp)
493 {
494         return rpc_proc_unavail;
495 }
496
497
498 /*
499  * NLM Server procedures.
500  */
501
502 struct nlm_void                 { int dummy; };
503
504 #define Ck      (1+XDR_QUADLEN(NLM_MAXCOOKIELEN))       /* cookie */
505 #define No      (1+1024/4)                              /* netobj */
506 #define St      1                                       /* status */
507 #define Rg      4                                       /* range (offset + length) */
508
509 const struct svc_procedure nlmsvc_procedures4[24] = {
510         [NLMPROC_NULL] = {
511                 .pc_func = nlm4svc_proc_null,
512                 .pc_decode = nlm4svc_decode_void,
513                 .pc_encode = nlm4svc_encode_void,
514                 .pc_argsize = sizeof(struct nlm_void),
515                 .pc_argzero = sizeof(struct nlm_void),
516                 .pc_ressize = sizeof(struct nlm_void),
517                 .pc_xdrressize = St,
518                 .pc_name = "NULL",
519         },
520         [NLMPROC_TEST] = {
521                 .pc_func = nlm4svc_proc_test,
522                 .pc_decode = nlm4svc_decode_testargs,
523                 .pc_encode = nlm4svc_encode_testres,
524                 .pc_argsize = sizeof(struct nlm_args),
525                 .pc_argzero = sizeof(struct nlm_args),
526                 .pc_ressize = sizeof(struct nlm_res),
527                 .pc_xdrressize = Ck+St+2+No+Rg,
528                 .pc_name = "TEST",
529         },
530         [NLMPROC_LOCK] = {
531                 .pc_func = nlm4svc_proc_lock,
532                 .pc_decode = nlm4svc_decode_lockargs,
533                 .pc_encode = nlm4svc_encode_res,
534                 .pc_argsize = sizeof(struct nlm_args),
535                 .pc_argzero = sizeof(struct nlm_args),
536                 .pc_ressize = sizeof(struct nlm_res),
537                 .pc_xdrressize = Ck+St,
538                 .pc_name = "LOCK",
539         },
540         [NLMPROC_CANCEL] = {
541                 .pc_func = nlm4svc_proc_cancel,
542                 .pc_decode = nlm4svc_decode_cancargs,
543                 .pc_encode = nlm4svc_encode_res,
544                 .pc_argsize = sizeof(struct nlm_args),
545                 .pc_argzero = sizeof(struct nlm_args),
546                 .pc_ressize = sizeof(struct nlm_res),
547                 .pc_xdrressize = Ck+St,
548                 .pc_name = "CANCEL",
549         },
550         [NLMPROC_UNLOCK] = {
551                 .pc_func = nlm4svc_proc_unlock,
552                 .pc_decode = nlm4svc_decode_unlockargs,
553                 .pc_encode = nlm4svc_encode_res,
554                 .pc_argsize = sizeof(struct nlm_args),
555                 .pc_argzero = sizeof(struct nlm_args),
556                 .pc_ressize = sizeof(struct nlm_res),
557                 .pc_xdrressize = Ck+St,
558                 .pc_name = "UNLOCK",
559         },
560         [NLMPROC_GRANTED] = {
561                 .pc_func = nlm4svc_proc_granted,
562                 .pc_decode = nlm4svc_decode_testargs,
563                 .pc_encode = nlm4svc_encode_res,
564                 .pc_argsize = sizeof(struct nlm_args),
565                 .pc_argzero = sizeof(struct nlm_args),
566                 .pc_ressize = sizeof(struct nlm_res),
567                 .pc_xdrressize = Ck+St,
568                 .pc_name = "GRANTED",
569         },
570         [NLMPROC_TEST_MSG] = {
571                 .pc_func = nlm4svc_proc_test_msg,
572                 .pc_decode = nlm4svc_decode_testargs,
573                 .pc_encode = nlm4svc_encode_void,
574                 .pc_argsize = sizeof(struct nlm_args),
575                 .pc_argzero = sizeof(struct nlm_args),
576                 .pc_ressize = sizeof(struct nlm_void),
577                 .pc_xdrressize = St,
578                 .pc_name = "TEST_MSG",
579         },
580         [NLMPROC_LOCK_MSG] = {
581                 .pc_func = nlm4svc_proc_lock_msg,
582                 .pc_decode = nlm4svc_decode_lockargs,
583                 .pc_encode = nlm4svc_encode_void,
584                 .pc_argsize = sizeof(struct nlm_args),
585                 .pc_argzero = sizeof(struct nlm_args),
586                 .pc_ressize = sizeof(struct nlm_void),
587                 .pc_xdrressize = St,
588                 .pc_name = "LOCK_MSG",
589         },
590         [NLMPROC_CANCEL_MSG] = {
591                 .pc_func = nlm4svc_proc_cancel_msg,
592                 .pc_decode = nlm4svc_decode_cancargs,
593                 .pc_encode = nlm4svc_encode_void,
594                 .pc_argsize = sizeof(struct nlm_args),
595                 .pc_argzero = sizeof(struct nlm_args),
596                 .pc_ressize = sizeof(struct nlm_void),
597                 .pc_xdrressize = St,
598                 .pc_name = "CANCEL_MSG",
599         },
600         [NLMPROC_UNLOCK_MSG] = {
601                 .pc_func = nlm4svc_proc_unlock_msg,
602                 .pc_decode = nlm4svc_decode_unlockargs,
603                 .pc_encode = nlm4svc_encode_void,
604                 .pc_argsize = sizeof(struct nlm_args),
605                 .pc_argzero = sizeof(struct nlm_args),
606                 .pc_ressize = sizeof(struct nlm_void),
607                 .pc_xdrressize = St,
608                 .pc_name = "UNLOCK_MSG",
609         },
610         [NLMPROC_GRANTED_MSG] = {
611                 .pc_func = nlm4svc_proc_granted_msg,
612                 .pc_decode = nlm4svc_decode_testargs,
613                 .pc_encode = nlm4svc_encode_void,
614                 .pc_argsize = sizeof(struct nlm_args),
615                 .pc_argzero = sizeof(struct nlm_args),
616                 .pc_ressize = sizeof(struct nlm_void),
617                 .pc_xdrressize = St,
618                 .pc_name = "GRANTED_MSG",
619         },
620         [NLMPROC_TEST_RES] = {
621                 .pc_func = nlm4svc_proc_null,
622                 .pc_decode = nlm4svc_decode_void,
623                 .pc_encode = nlm4svc_encode_void,
624                 .pc_argsize = sizeof(struct nlm_res),
625                 .pc_argzero = sizeof(struct nlm_res),
626                 .pc_ressize = sizeof(struct nlm_void),
627                 .pc_xdrressize = St,
628                 .pc_name = "TEST_RES",
629         },
630         [NLMPROC_LOCK_RES] = {
631                 .pc_func = nlm4svc_proc_null,
632                 .pc_decode = nlm4svc_decode_void,
633                 .pc_encode = nlm4svc_encode_void,
634                 .pc_argsize = sizeof(struct nlm_res),
635                 .pc_argzero = sizeof(struct nlm_res),
636                 .pc_ressize = sizeof(struct nlm_void),
637                 .pc_xdrressize = St,
638                 .pc_name = "LOCK_RES",
639         },
640         [NLMPROC_CANCEL_RES] = {
641                 .pc_func = nlm4svc_proc_null,
642                 .pc_decode = nlm4svc_decode_void,
643                 .pc_encode = nlm4svc_encode_void,
644                 .pc_argsize = sizeof(struct nlm_res),
645                 .pc_argzero = sizeof(struct nlm_res),
646                 .pc_ressize = sizeof(struct nlm_void),
647                 .pc_xdrressize = St,
648                 .pc_name = "CANCEL_RES",
649         },
650         [NLMPROC_UNLOCK_RES] = {
651                 .pc_func = nlm4svc_proc_null,
652                 .pc_decode = nlm4svc_decode_void,
653                 .pc_encode = nlm4svc_encode_void,
654                 .pc_argsize = sizeof(struct nlm_res),
655                 .pc_argzero = sizeof(struct nlm_res),
656                 .pc_ressize = sizeof(struct nlm_void),
657                 .pc_xdrressize = St,
658                 .pc_name = "UNLOCK_RES",
659         },
660         [NLMPROC_GRANTED_RES] = {
661                 .pc_func = nlm4svc_proc_granted_res,
662                 .pc_decode = nlm4svc_decode_res,
663                 .pc_encode = nlm4svc_encode_void,
664                 .pc_argsize = sizeof(struct nlm_res),
665                 .pc_argzero = sizeof(struct nlm_res),
666                 .pc_ressize = sizeof(struct nlm_void),
667                 .pc_xdrressize = St,
668                 .pc_name = "GRANTED_RES",
669         },
670         [NLMPROC_NSM_NOTIFY] = {
671                 .pc_func = nlm4svc_proc_sm_notify,
672                 .pc_decode = nlm4svc_decode_reboot,
673                 .pc_encode = nlm4svc_encode_void,
674                 .pc_argsize = sizeof(struct nlm_reboot),
675                 .pc_argzero = sizeof(struct nlm_reboot),
676                 .pc_ressize = sizeof(struct nlm_void),
677                 .pc_xdrressize = St,
678                 .pc_name = "SM_NOTIFY",
679         },
680         [17] = {
681                 .pc_func = nlm4svc_proc_unused,
682                 .pc_decode = nlm4svc_decode_void,
683                 .pc_encode = nlm4svc_encode_void,
684                 .pc_argsize = sizeof(struct nlm_void),
685                 .pc_argzero = sizeof(struct nlm_void),
686                 .pc_ressize = sizeof(struct nlm_void),
687                 .pc_xdrressize = 0,
688                 .pc_name = "UNUSED",
689         },
690         [18] = {
691                 .pc_func = nlm4svc_proc_unused,
692                 .pc_decode = nlm4svc_decode_void,
693                 .pc_encode = nlm4svc_encode_void,
694                 .pc_argsize = sizeof(struct nlm_void),
695                 .pc_argzero = sizeof(struct nlm_void),
696                 .pc_ressize = sizeof(struct nlm_void),
697                 .pc_xdrressize = 0,
698                 .pc_name = "UNUSED",
699         },
700         [19] = {
701                 .pc_func = nlm4svc_proc_unused,
702                 .pc_decode = nlm4svc_decode_void,
703                 .pc_encode = nlm4svc_encode_void,
704                 .pc_argsize = sizeof(struct nlm_void),
705                 .pc_argzero = sizeof(struct nlm_void),
706                 .pc_ressize = sizeof(struct nlm_void),
707                 .pc_xdrressize = 0,
708                 .pc_name = "UNUSED",
709         },
710         [NLMPROC_SHARE] = {
711                 .pc_func = nlm4svc_proc_share,
712                 .pc_decode = nlm4svc_decode_shareargs,
713                 .pc_encode = nlm4svc_encode_shareres,
714                 .pc_argsize = sizeof(struct nlm_args),
715                 .pc_argzero = sizeof(struct nlm_args),
716                 .pc_ressize = sizeof(struct nlm_res),
717                 .pc_xdrressize = Ck+St+1,
718                 .pc_name = "SHARE",
719         },
720         [NLMPROC_UNSHARE] = {
721                 .pc_func = nlm4svc_proc_unshare,
722                 .pc_decode = nlm4svc_decode_shareargs,
723                 .pc_encode = nlm4svc_encode_shareres,
724                 .pc_argsize = sizeof(struct nlm_args),
725                 .pc_argzero = sizeof(struct nlm_args),
726                 .pc_ressize = sizeof(struct nlm_res),
727                 .pc_xdrressize = Ck+St+1,
728                 .pc_name = "UNSHARE",
729         },
730         [NLMPROC_NM_LOCK] = {
731                 .pc_func = nlm4svc_proc_nm_lock,
732                 .pc_decode = nlm4svc_decode_lockargs,
733                 .pc_encode = nlm4svc_encode_res,
734                 .pc_argsize = sizeof(struct nlm_args),
735                 .pc_argzero = sizeof(struct nlm_args),
736                 .pc_ressize = sizeof(struct nlm_res),
737                 .pc_xdrressize = Ck+St,
738                 .pc_name = "NM_LOCK",
739         },
740         [NLMPROC_FREE_ALL] = {
741                 .pc_func = nlm4svc_proc_free_all,
742                 .pc_decode = nlm4svc_decode_notify,
743                 .pc_encode = nlm4svc_encode_void,
744                 .pc_argsize = sizeof(struct nlm_args),
745                 .pc_argzero = sizeof(struct nlm_args),
746                 .pc_ressize = sizeof(struct nlm_void),
747                 .pc_xdrressize = St,
748                 .pc_name = "FREE_ALL",
749         },
750 };
This page took 0.06737 seconds and 4 git commands to generate.