162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * linux/fs/lockd/svcproc.c 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Lockd server procedures. We don't implement the NLM_*_RES 662306a36Sopenharmony_ci * procedures because we don't use the async procedures. 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * Copyright (C) 1996, Olaf Kirch <okir@monad.swb.de> 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/types.h> 1262306a36Sopenharmony_ci#include <linux/time.h> 1362306a36Sopenharmony_ci#include <linux/lockd/lockd.h> 1462306a36Sopenharmony_ci#include <linux/lockd/share.h> 1562306a36Sopenharmony_ci#include <linux/sunrpc/svc_xprt.h> 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#define NLMDBG_FACILITY NLMDBG_CLIENT 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#ifdef CONFIG_LOCKD_V4 2062306a36Sopenharmony_cistatic __be32 2162306a36Sopenharmony_cicast_to_nlm(__be32 status, u32 vers) 2262306a36Sopenharmony_ci{ 2362306a36Sopenharmony_ci /* Note: status is assumed to be in network byte order !!! */ 2462306a36Sopenharmony_ci if (vers != 4){ 2562306a36Sopenharmony_ci switch (status) { 2662306a36Sopenharmony_ci case nlm_granted: 2762306a36Sopenharmony_ci case nlm_lck_denied: 2862306a36Sopenharmony_ci case nlm_lck_denied_nolocks: 2962306a36Sopenharmony_ci case nlm_lck_blocked: 3062306a36Sopenharmony_ci case nlm_lck_denied_grace_period: 3162306a36Sopenharmony_ci case nlm_drop_reply: 3262306a36Sopenharmony_ci break; 3362306a36Sopenharmony_ci case nlm4_deadlock: 3462306a36Sopenharmony_ci status = nlm_lck_denied; 3562306a36Sopenharmony_ci break; 3662306a36Sopenharmony_ci default: 3762306a36Sopenharmony_ci status = nlm_lck_denied_nolocks; 3862306a36Sopenharmony_ci } 3962306a36Sopenharmony_ci } 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci return (status); 4262306a36Sopenharmony_ci} 4362306a36Sopenharmony_ci#define cast_status(status) (cast_to_nlm(status, rqstp->rq_vers)) 4462306a36Sopenharmony_ci#else 4562306a36Sopenharmony_ci#define cast_status(status) (status) 4662306a36Sopenharmony_ci#endif 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci/* 4962306a36Sopenharmony_ci * Obtain client and file from arguments 5062306a36Sopenharmony_ci */ 5162306a36Sopenharmony_cistatic __be32 5262306a36Sopenharmony_cinlmsvc_retrieve_args(struct svc_rqst *rqstp, struct nlm_args *argp, 5362306a36Sopenharmony_ci struct nlm_host **hostp, struct nlm_file **filp) 5462306a36Sopenharmony_ci{ 5562306a36Sopenharmony_ci struct nlm_host *host = NULL; 5662306a36Sopenharmony_ci struct nlm_file *file = NULL; 5762306a36Sopenharmony_ci struct nlm_lock *lock = &argp->lock; 5862306a36Sopenharmony_ci int mode; 5962306a36Sopenharmony_ci __be32 error = 0; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci /* nfsd callbacks must have been installed for this procedure */ 6262306a36Sopenharmony_ci if (!nlmsvc_ops) 6362306a36Sopenharmony_ci return nlm_lck_denied_nolocks; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci /* Obtain host handle */ 6662306a36Sopenharmony_ci if (!(host = nlmsvc_lookup_host(rqstp, lock->caller, lock->len)) 6762306a36Sopenharmony_ci || (argp->monitor && nsm_monitor(host) < 0)) 6862306a36Sopenharmony_ci goto no_locks; 6962306a36Sopenharmony_ci *hostp = host; 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci /* Obtain file pointer. Not used by FREE_ALL call. */ 7262306a36Sopenharmony_ci if (filp != NULL) { 7362306a36Sopenharmony_ci error = cast_status(nlm_lookup_file(rqstp, &file, lock)); 7462306a36Sopenharmony_ci if (error != 0) 7562306a36Sopenharmony_ci goto no_locks; 7662306a36Sopenharmony_ci *filp = file; 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci /* Set up the missing parts of the file_lock structure */ 7962306a36Sopenharmony_ci mode = lock_to_openmode(&lock->fl); 8062306a36Sopenharmony_ci lock->fl.fl_flags = FL_POSIX; 8162306a36Sopenharmony_ci lock->fl.fl_file = file->f_file[mode]; 8262306a36Sopenharmony_ci lock->fl.fl_pid = current->tgid; 8362306a36Sopenharmony_ci lock->fl.fl_lmops = &nlmsvc_lock_operations; 8462306a36Sopenharmony_ci nlmsvc_locks_init_private(&lock->fl, host, (pid_t)lock->svid); 8562306a36Sopenharmony_ci if (!lock->fl.fl_owner) { 8662306a36Sopenharmony_ci /* lockowner allocation has failed */ 8762306a36Sopenharmony_ci nlmsvc_release_host(host); 8862306a36Sopenharmony_ci return nlm_lck_denied_nolocks; 8962306a36Sopenharmony_ci } 9062306a36Sopenharmony_ci } 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci return 0; 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_cino_locks: 9562306a36Sopenharmony_ci nlmsvc_release_host(host); 9662306a36Sopenharmony_ci if (error) 9762306a36Sopenharmony_ci return error; 9862306a36Sopenharmony_ci return nlm_lck_denied_nolocks; 9962306a36Sopenharmony_ci} 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci/* 10262306a36Sopenharmony_ci * NULL: Test for presence of service 10362306a36Sopenharmony_ci */ 10462306a36Sopenharmony_cistatic __be32 10562306a36Sopenharmony_cinlmsvc_proc_null(struct svc_rqst *rqstp) 10662306a36Sopenharmony_ci{ 10762306a36Sopenharmony_ci dprintk("lockd: NULL called\n"); 10862306a36Sopenharmony_ci return rpc_success; 10962306a36Sopenharmony_ci} 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci/* 11262306a36Sopenharmony_ci * TEST: Check for conflicting lock 11362306a36Sopenharmony_ci */ 11462306a36Sopenharmony_cistatic __be32 11562306a36Sopenharmony_ci__nlmsvc_proc_test(struct svc_rqst *rqstp, struct nlm_res *resp) 11662306a36Sopenharmony_ci{ 11762306a36Sopenharmony_ci struct nlm_args *argp = rqstp->rq_argp; 11862306a36Sopenharmony_ci struct nlm_host *host; 11962306a36Sopenharmony_ci struct nlm_file *file; 12062306a36Sopenharmony_ci struct nlm_lockowner *test_owner; 12162306a36Sopenharmony_ci __be32 rc = rpc_success; 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci dprintk("lockd: TEST called\n"); 12462306a36Sopenharmony_ci resp->cookie = argp->cookie; 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci /* Obtain client and file */ 12762306a36Sopenharmony_ci if ((resp->status = nlmsvc_retrieve_args(rqstp, argp, &host, &file))) 12862306a36Sopenharmony_ci return resp->status == nlm_drop_reply ? rpc_drop_reply :rpc_success; 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci test_owner = argp->lock.fl.fl_owner; 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci /* Now check for conflicting locks */ 13362306a36Sopenharmony_ci resp->status = cast_status(nlmsvc_testlock(rqstp, file, host, &argp->lock, &resp->lock, &resp->cookie)); 13462306a36Sopenharmony_ci if (resp->status == nlm_drop_reply) 13562306a36Sopenharmony_ci rc = rpc_drop_reply; 13662306a36Sopenharmony_ci else 13762306a36Sopenharmony_ci dprintk("lockd: TEST status %d vers %d\n", 13862306a36Sopenharmony_ci ntohl(resp->status), rqstp->rq_vers); 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci nlmsvc_put_lockowner(test_owner); 14162306a36Sopenharmony_ci nlmsvc_release_host(host); 14262306a36Sopenharmony_ci nlm_release_file(file); 14362306a36Sopenharmony_ci return rc; 14462306a36Sopenharmony_ci} 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_cistatic __be32 14762306a36Sopenharmony_cinlmsvc_proc_test(struct svc_rqst *rqstp) 14862306a36Sopenharmony_ci{ 14962306a36Sopenharmony_ci return __nlmsvc_proc_test(rqstp, rqstp->rq_resp); 15062306a36Sopenharmony_ci} 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_cistatic __be32 15362306a36Sopenharmony_ci__nlmsvc_proc_lock(struct svc_rqst *rqstp, struct nlm_res *resp) 15462306a36Sopenharmony_ci{ 15562306a36Sopenharmony_ci struct nlm_args *argp = rqstp->rq_argp; 15662306a36Sopenharmony_ci struct nlm_host *host; 15762306a36Sopenharmony_ci struct nlm_file *file; 15862306a36Sopenharmony_ci __be32 rc = rpc_success; 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci dprintk("lockd: LOCK called\n"); 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_ci resp->cookie = argp->cookie; 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ci /* Obtain client and file */ 16562306a36Sopenharmony_ci if ((resp->status = nlmsvc_retrieve_args(rqstp, argp, &host, &file))) 16662306a36Sopenharmony_ci return resp->status == nlm_drop_reply ? rpc_drop_reply :rpc_success; 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci#if 0 16962306a36Sopenharmony_ci /* If supplied state doesn't match current state, we assume it's 17062306a36Sopenharmony_ci * an old request that time-warped somehow. Any error return would 17162306a36Sopenharmony_ci * do in this case because it's irrelevant anyway. 17262306a36Sopenharmony_ci * 17362306a36Sopenharmony_ci * NB: We don't retrieve the remote host's state yet. 17462306a36Sopenharmony_ci */ 17562306a36Sopenharmony_ci if (host->h_nsmstate && host->h_nsmstate != argp->state) { 17662306a36Sopenharmony_ci resp->status = nlm_lck_denied_nolocks; 17762306a36Sopenharmony_ci } else 17862306a36Sopenharmony_ci#endif 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci /* Now try to lock the file */ 18162306a36Sopenharmony_ci resp->status = cast_status(nlmsvc_lock(rqstp, file, host, &argp->lock, 18262306a36Sopenharmony_ci argp->block, &argp->cookie, 18362306a36Sopenharmony_ci argp->reclaim)); 18462306a36Sopenharmony_ci if (resp->status == nlm_drop_reply) 18562306a36Sopenharmony_ci rc = rpc_drop_reply; 18662306a36Sopenharmony_ci else 18762306a36Sopenharmony_ci dprintk("lockd: LOCK status %d\n", ntohl(resp->status)); 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_ci nlmsvc_release_lockowner(&argp->lock); 19062306a36Sopenharmony_ci nlmsvc_release_host(host); 19162306a36Sopenharmony_ci nlm_release_file(file); 19262306a36Sopenharmony_ci return rc; 19362306a36Sopenharmony_ci} 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_cistatic __be32 19662306a36Sopenharmony_cinlmsvc_proc_lock(struct svc_rqst *rqstp) 19762306a36Sopenharmony_ci{ 19862306a36Sopenharmony_ci return __nlmsvc_proc_lock(rqstp, rqstp->rq_resp); 19962306a36Sopenharmony_ci} 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_cistatic __be32 20262306a36Sopenharmony_ci__nlmsvc_proc_cancel(struct svc_rqst *rqstp, struct nlm_res *resp) 20362306a36Sopenharmony_ci{ 20462306a36Sopenharmony_ci struct nlm_args *argp = rqstp->rq_argp; 20562306a36Sopenharmony_ci struct nlm_host *host; 20662306a36Sopenharmony_ci struct nlm_file *file; 20762306a36Sopenharmony_ci struct net *net = SVC_NET(rqstp); 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci dprintk("lockd: CANCEL called\n"); 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci resp->cookie = argp->cookie; 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ci /* Don't accept requests during grace period */ 21462306a36Sopenharmony_ci if (locks_in_grace(net)) { 21562306a36Sopenharmony_ci resp->status = nlm_lck_denied_grace_period; 21662306a36Sopenharmony_ci return rpc_success; 21762306a36Sopenharmony_ci } 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_ci /* Obtain client and file */ 22062306a36Sopenharmony_ci if ((resp->status = nlmsvc_retrieve_args(rqstp, argp, &host, &file))) 22162306a36Sopenharmony_ci return resp->status == nlm_drop_reply ? rpc_drop_reply :rpc_success; 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_ci /* Try to cancel request. */ 22462306a36Sopenharmony_ci resp->status = cast_status(nlmsvc_cancel_blocked(net, file, &argp->lock)); 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_ci dprintk("lockd: CANCEL status %d\n", ntohl(resp->status)); 22762306a36Sopenharmony_ci nlmsvc_release_lockowner(&argp->lock); 22862306a36Sopenharmony_ci nlmsvc_release_host(host); 22962306a36Sopenharmony_ci nlm_release_file(file); 23062306a36Sopenharmony_ci return rpc_success; 23162306a36Sopenharmony_ci} 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_cistatic __be32 23462306a36Sopenharmony_cinlmsvc_proc_cancel(struct svc_rqst *rqstp) 23562306a36Sopenharmony_ci{ 23662306a36Sopenharmony_ci return __nlmsvc_proc_cancel(rqstp, rqstp->rq_resp); 23762306a36Sopenharmony_ci} 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_ci/* 24062306a36Sopenharmony_ci * UNLOCK: release a lock 24162306a36Sopenharmony_ci */ 24262306a36Sopenharmony_cistatic __be32 24362306a36Sopenharmony_ci__nlmsvc_proc_unlock(struct svc_rqst *rqstp, struct nlm_res *resp) 24462306a36Sopenharmony_ci{ 24562306a36Sopenharmony_ci struct nlm_args *argp = rqstp->rq_argp; 24662306a36Sopenharmony_ci struct nlm_host *host; 24762306a36Sopenharmony_ci struct nlm_file *file; 24862306a36Sopenharmony_ci struct net *net = SVC_NET(rqstp); 24962306a36Sopenharmony_ci 25062306a36Sopenharmony_ci dprintk("lockd: UNLOCK called\n"); 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_ci resp->cookie = argp->cookie; 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_ci /* Don't accept new lock requests during grace period */ 25562306a36Sopenharmony_ci if (locks_in_grace(net)) { 25662306a36Sopenharmony_ci resp->status = nlm_lck_denied_grace_period; 25762306a36Sopenharmony_ci return rpc_success; 25862306a36Sopenharmony_ci } 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_ci /* Obtain client and file */ 26162306a36Sopenharmony_ci if ((resp->status = nlmsvc_retrieve_args(rqstp, argp, &host, &file))) 26262306a36Sopenharmony_ci return resp->status == nlm_drop_reply ? rpc_drop_reply :rpc_success; 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_ci /* Now try to remove the lock */ 26562306a36Sopenharmony_ci resp->status = cast_status(nlmsvc_unlock(net, file, &argp->lock)); 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_ci dprintk("lockd: UNLOCK status %d\n", ntohl(resp->status)); 26862306a36Sopenharmony_ci nlmsvc_release_lockowner(&argp->lock); 26962306a36Sopenharmony_ci nlmsvc_release_host(host); 27062306a36Sopenharmony_ci nlm_release_file(file); 27162306a36Sopenharmony_ci return rpc_success; 27262306a36Sopenharmony_ci} 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_cistatic __be32 27562306a36Sopenharmony_cinlmsvc_proc_unlock(struct svc_rqst *rqstp) 27662306a36Sopenharmony_ci{ 27762306a36Sopenharmony_ci return __nlmsvc_proc_unlock(rqstp, rqstp->rq_resp); 27862306a36Sopenharmony_ci} 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_ci/* 28162306a36Sopenharmony_ci * GRANTED: A server calls us to tell that a process' lock request 28262306a36Sopenharmony_ci * was granted 28362306a36Sopenharmony_ci */ 28462306a36Sopenharmony_cistatic __be32 28562306a36Sopenharmony_ci__nlmsvc_proc_granted(struct svc_rqst *rqstp, struct nlm_res *resp) 28662306a36Sopenharmony_ci{ 28762306a36Sopenharmony_ci struct nlm_args *argp = rqstp->rq_argp; 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_ci resp->cookie = argp->cookie; 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_ci dprintk("lockd: GRANTED called\n"); 29262306a36Sopenharmony_ci resp->status = nlmclnt_grant(svc_addr(rqstp), &argp->lock); 29362306a36Sopenharmony_ci dprintk("lockd: GRANTED status %d\n", ntohl(resp->status)); 29462306a36Sopenharmony_ci return rpc_success; 29562306a36Sopenharmony_ci} 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_cistatic __be32 29862306a36Sopenharmony_cinlmsvc_proc_granted(struct svc_rqst *rqstp) 29962306a36Sopenharmony_ci{ 30062306a36Sopenharmony_ci return __nlmsvc_proc_granted(rqstp, rqstp->rq_resp); 30162306a36Sopenharmony_ci} 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_ci/* 30462306a36Sopenharmony_ci * This is the generic lockd callback for async RPC calls 30562306a36Sopenharmony_ci */ 30662306a36Sopenharmony_cistatic void nlmsvc_callback_exit(struct rpc_task *task, void *data) 30762306a36Sopenharmony_ci{ 30862306a36Sopenharmony_ci} 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_civoid nlmsvc_release_call(struct nlm_rqst *call) 31162306a36Sopenharmony_ci{ 31262306a36Sopenharmony_ci if (!refcount_dec_and_test(&call->a_count)) 31362306a36Sopenharmony_ci return; 31462306a36Sopenharmony_ci nlmsvc_release_host(call->a_host); 31562306a36Sopenharmony_ci kfree(call); 31662306a36Sopenharmony_ci} 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_cistatic void nlmsvc_callback_release(void *data) 31962306a36Sopenharmony_ci{ 32062306a36Sopenharmony_ci nlmsvc_release_call(data); 32162306a36Sopenharmony_ci} 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_cistatic const struct rpc_call_ops nlmsvc_callback_ops = { 32462306a36Sopenharmony_ci .rpc_call_done = nlmsvc_callback_exit, 32562306a36Sopenharmony_ci .rpc_release = nlmsvc_callback_release, 32662306a36Sopenharmony_ci}; 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_ci/* 32962306a36Sopenharmony_ci * `Async' versions of the above service routines. They aren't really, 33062306a36Sopenharmony_ci * because we send the callback before the reply proper. I hope this 33162306a36Sopenharmony_ci * doesn't break any clients. 33262306a36Sopenharmony_ci */ 33362306a36Sopenharmony_cistatic __be32 nlmsvc_callback(struct svc_rqst *rqstp, u32 proc, 33462306a36Sopenharmony_ci __be32 (*func)(struct svc_rqst *, struct nlm_res *)) 33562306a36Sopenharmony_ci{ 33662306a36Sopenharmony_ci struct nlm_args *argp = rqstp->rq_argp; 33762306a36Sopenharmony_ci struct nlm_host *host; 33862306a36Sopenharmony_ci struct nlm_rqst *call; 33962306a36Sopenharmony_ci __be32 stat; 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_ci host = nlmsvc_lookup_host(rqstp, 34262306a36Sopenharmony_ci argp->lock.caller, 34362306a36Sopenharmony_ci argp->lock.len); 34462306a36Sopenharmony_ci if (host == NULL) 34562306a36Sopenharmony_ci return rpc_system_err; 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_ci call = nlm_alloc_call(host); 34862306a36Sopenharmony_ci nlmsvc_release_host(host); 34962306a36Sopenharmony_ci if (call == NULL) 35062306a36Sopenharmony_ci return rpc_system_err; 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_ci stat = func(rqstp, &call->a_res); 35362306a36Sopenharmony_ci if (stat != 0) { 35462306a36Sopenharmony_ci nlmsvc_release_call(call); 35562306a36Sopenharmony_ci return stat; 35662306a36Sopenharmony_ci } 35762306a36Sopenharmony_ci 35862306a36Sopenharmony_ci call->a_flags = RPC_TASK_ASYNC; 35962306a36Sopenharmony_ci if (nlm_async_reply(call, proc, &nlmsvc_callback_ops) < 0) 36062306a36Sopenharmony_ci return rpc_system_err; 36162306a36Sopenharmony_ci return rpc_success; 36262306a36Sopenharmony_ci} 36362306a36Sopenharmony_ci 36462306a36Sopenharmony_cistatic __be32 nlmsvc_proc_test_msg(struct svc_rqst *rqstp) 36562306a36Sopenharmony_ci{ 36662306a36Sopenharmony_ci dprintk("lockd: TEST_MSG called\n"); 36762306a36Sopenharmony_ci return nlmsvc_callback(rqstp, NLMPROC_TEST_RES, __nlmsvc_proc_test); 36862306a36Sopenharmony_ci} 36962306a36Sopenharmony_ci 37062306a36Sopenharmony_cistatic __be32 nlmsvc_proc_lock_msg(struct svc_rqst *rqstp) 37162306a36Sopenharmony_ci{ 37262306a36Sopenharmony_ci dprintk("lockd: LOCK_MSG called\n"); 37362306a36Sopenharmony_ci return nlmsvc_callback(rqstp, NLMPROC_LOCK_RES, __nlmsvc_proc_lock); 37462306a36Sopenharmony_ci} 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_cistatic __be32 nlmsvc_proc_cancel_msg(struct svc_rqst *rqstp) 37762306a36Sopenharmony_ci{ 37862306a36Sopenharmony_ci dprintk("lockd: CANCEL_MSG called\n"); 37962306a36Sopenharmony_ci return nlmsvc_callback(rqstp, NLMPROC_CANCEL_RES, __nlmsvc_proc_cancel); 38062306a36Sopenharmony_ci} 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_cistatic __be32 38362306a36Sopenharmony_cinlmsvc_proc_unlock_msg(struct svc_rqst *rqstp) 38462306a36Sopenharmony_ci{ 38562306a36Sopenharmony_ci dprintk("lockd: UNLOCK_MSG called\n"); 38662306a36Sopenharmony_ci return nlmsvc_callback(rqstp, NLMPROC_UNLOCK_RES, __nlmsvc_proc_unlock); 38762306a36Sopenharmony_ci} 38862306a36Sopenharmony_ci 38962306a36Sopenharmony_cistatic __be32 39062306a36Sopenharmony_cinlmsvc_proc_granted_msg(struct svc_rqst *rqstp) 39162306a36Sopenharmony_ci{ 39262306a36Sopenharmony_ci dprintk("lockd: GRANTED_MSG called\n"); 39362306a36Sopenharmony_ci return nlmsvc_callback(rqstp, NLMPROC_GRANTED_RES, __nlmsvc_proc_granted); 39462306a36Sopenharmony_ci} 39562306a36Sopenharmony_ci 39662306a36Sopenharmony_ci/* 39762306a36Sopenharmony_ci * SHARE: create a DOS share or alter existing share. 39862306a36Sopenharmony_ci */ 39962306a36Sopenharmony_cistatic __be32 40062306a36Sopenharmony_cinlmsvc_proc_share(struct svc_rqst *rqstp) 40162306a36Sopenharmony_ci{ 40262306a36Sopenharmony_ci struct nlm_args *argp = rqstp->rq_argp; 40362306a36Sopenharmony_ci struct nlm_res *resp = rqstp->rq_resp; 40462306a36Sopenharmony_ci struct nlm_host *host; 40562306a36Sopenharmony_ci struct nlm_file *file; 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_ci dprintk("lockd: SHARE called\n"); 40862306a36Sopenharmony_ci 40962306a36Sopenharmony_ci resp->cookie = argp->cookie; 41062306a36Sopenharmony_ci 41162306a36Sopenharmony_ci /* Don't accept new lock requests during grace period */ 41262306a36Sopenharmony_ci if (locks_in_grace(SVC_NET(rqstp)) && !argp->reclaim) { 41362306a36Sopenharmony_ci resp->status = nlm_lck_denied_grace_period; 41462306a36Sopenharmony_ci return rpc_success; 41562306a36Sopenharmony_ci } 41662306a36Sopenharmony_ci 41762306a36Sopenharmony_ci /* Obtain client and file */ 41862306a36Sopenharmony_ci if ((resp->status = nlmsvc_retrieve_args(rqstp, argp, &host, &file))) 41962306a36Sopenharmony_ci return resp->status == nlm_drop_reply ? rpc_drop_reply :rpc_success; 42062306a36Sopenharmony_ci 42162306a36Sopenharmony_ci /* Now try to create the share */ 42262306a36Sopenharmony_ci resp->status = cast_status(nlmsvc_share_file(host, file, argp)); 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_ci dprintk("lockd: SHARE status %d\n", ntohl(resp->status)); 42562306a36Sopenharmony_ci nlmsvc_release_lockowner(&argp->lock); 42662306a36Sopenharmony_ci nlmsvc_release_host(host); 42762306a36Sopenharmony_ci nlm_release_file(file); 42862306a36Sopenharmony_ci return rpc_success; 42962306a36Sopenharmony_ci} 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_ci/* 43262306a36Sopenharmony_ci * UNSHARE: Release a DOS share. 43362306a36Sopenharmony_ci */ 43462306a36Sopenharmony_cistatic __be32 43562306a36Sopenharmony_cinlmsvc_proc_unshare(struct svc_rqst *rqstp) 43662306a36Sopenharmony_ci{ 43762306a36Sopenharmony_ci struct nlm_args *argp = rqstp->rq_argp; 43862306a36Sopenharmony_ci struct nlm_res *resp = rqstp->rq_resp; 43962306a36Sopenharmony_ci struct nlm_host *host; 44062306a36Sopenharmony_ci struct nlm_file *file; 44162306a36Sopenharmony_ci 44262306a36Sopenharmony_ci dprintk("lockd: UNSHARE called\n"); 44362306a36Sopenharmony_ci 44462306a36Sopenharmony_ci resp->cookie = argp->cookie; 44562306a36Sopenharmony_ci 44662306a36Sopenharmony_ci /* Don't accept requests during grace period */ 44762306a36Sopenharmony_ci if (locks_in_grace(SVC_NET(rqstp))) { 44862306a36Sopenharmony_ci resp->status = nlm_lck_denied_grace_period; 44962306a36Sopenharmony_ci return rpc_success; 45062306a36Sopenharmony_ci } 45162306a36Sopenharmony_ci 45262306a36Sopenharmony_ci /* Obtain client and file */ 45362306a36Sopenharmony_ci if ((resp->status = nlmsvc_retrieve_args(rqstp, argp, &host, &file))) 45462306a36Sopenharmony_ci return resp->status == nlm_drop_reply ? rpc_drop_reply :rpc_success; 45562306a36Sopenharmony_ci 45662306a36Sopenharmony_ci /* Now try to unshare the file */ 45762306a36Sopenharmony_ci resp->status = cast_status(nlmsvc_unshare_file(host, file, argp)); 45862306a36Sopenharmony_ci 45962306a36Sopenharmony_ci dprintk("lockd: UNSHARE status %d\n", ntohl(resp->status)); 46062306a36Sopenharmony_ci nlmsvc_release_lockowner(&argp->lock); 46162306a36Sopenharmony_ci nlmsvc_release_host(host); 46262306a36Sopenharmony_ci nlm_release_file(file); 46362306a36Sopenharmony_ci return rpc_success; 46462306a36Sopenharmony_ci} 46562306a36Sopenharmony_ci 46662306a36Sopenharmony_ci/* 46762306a36Sopenharmony_ci * NM_LOCK: Create an unmonitored lock 46862306a36Sopenharmony_ci */ 46962306a36Sopenharmony_cistatic __be32 47062306a36Sopenharmony_cinlmsvc_proc_nm_lock(struct svc_rqst *rqstp) 47162306a36Sopenharmony_ci{ 47262306a36Sopenharmony_ci struct nlm_args *argp = rqstp->rq_argp; 47362306a36Sopenharmony_ci 47462306a36Sopenharmony_ci dprintk("lockd: NM_LOCK called\n"); 47562306a36Sopenharmony_ci 47662306a36Sopenharmony_ci argp->monitor = 0; /* just clean the monitor flag */ 47762306a36Sopenharmony_ci return nlmsvc_proc_lock(rqstp); 47862306a36Sopenharmony_ci} 47962306a36Sopenharmony_ci 48062306a36Sopenharmony_ci/* 48162306a36Sopenharmony_ci * FREE_ALL: Release all locks and shares held by client 48262306a36Sopenharmony_ci */ 48362306a36Sopenharmony_cistatic __be32 48462306a36Sopenharmony_cinlmsvc_proc_free_all(struct svc_rqst *rqstp) 48562306a36Sopenharmony_ci{ 48662306a36Sopenharmony_ci struct nlm_args *argp = rqstp->rq_argp; 48762306a36Sopenharmony_ci struct nlm_host *host; 48862306a36Sopenharmony_ci 48962306a36Sopenharmony_ci /* Obtain client */ 49062306a36Sopenharmony_ci if (nlmsvc_retrieve_args(rqstp, argp, &host, NULL)) 49162306a36Sopenharmony_ci return rpc_success; 49262306a36Sopenharmony_ci 49362306a36Sopenharmony_ci nlmsvc_free_host_resources(host); 49462306a36Sopenharmony_ci nlmsvc_release_host(host); 49562306a36Sopenharmony_ci return rpc_success; 49662306a36Sopenharmony_ci} 49762306a36Sopenharmony_ci 49862306a36Sopenharmony_ci/* 49962306a36Sopenharmony_ci * SM_NOTIFY: private callback from statd (not part of official NLM proto) 50062306a36Sopenharmony_ci */ 50162306a36Sopenharmony_cistatic __be32 50262306a36Sopenharmony_cinlmsvc_proc_sm_notify(struct svc_rqst *rqstp) 50362306a36Sopenharmony_ci{ 50462306a36Sopenharmony_ci struct nlm_reboot *argp = rqstp->rq_argp; 50562306a36Sopenharmony_ci 50662306a36Sopenharmony_ci dprintk("lockd: SM_NOTIFY called\n"); 50762306a36Sopenharmony_ci 50862306a36Sopenharmony_ci if (!nlm_privileged_requester(rqstp)) { 50962306a36Sopenharmony_ci char buf[RPC_MAX_ADDRBUFLEN]; 51062306a36Sopenharmony_ci printk(KERN_WARNING "lockd: rejected NSM callback from %s\n", 51162306a36Sopenharmony_ci svc_print_addr(rqstp, buf, sizeof(buf))); 51262306a36Sopenharmony_ci return rpc_system_err; 51362306a36Sopenharmony_ci } 51462306a36Sopenharmony_ci 51562306a36Sopenharmony_ci nlm_host_rebooted(SVC_NET(rqstp), argp); 51662306a36Sopenharmony_ci return rpc_success; 51762306a36Sopenharmony_ci} 51862306a36Sopenharmony_ci 51962306a36Sopenharmony_ci/* 52062306a36Sopenharmony_ci * client sent a GRANTED_RES, let's remove the associated block 52162306a36Sopenharmony_ci */ 52262306a36Sopenharmony_cistatic __be32 52362306a36Sopenharmony_cinlmsvc_proc_granted_res(struct svc_rqst *rqstp) 52462306a36Sopenharmony_ci{ 52562306a36Sopenharmony_ci struct nlm_res *argp = rqstp->rq_argp; 52662306a36Sopenharmony_ci 52762306a36Sopenharmony_ci if (!nlmsvc_ops) 52862306a36Sopenharmony_ci return rpc_success; 52962306a36Sopenharmony_ci 53062306a36Sopenharmony_ci dprintk("lockd: GRANTED_RES called\n"); 53162306a36Sopenharmony_ci 53262306a36Sopenharmony_ci nlmsvc_grant_reply(&argp->cookie, argp->status); 53362306a36Sopenharmony_ci return rpc_success; 53462306a36Sopenharmony_ci} 53562306a36Sopenharmony_ci 53662306a36Sopenharmony_cistatic __be32 53762306a36Sopenharmony_cinlmsvc_proc_unused(struct svc_rqst *rqstp) 53862306a36Sopenharmony_ci{ 53962306a36Sopenharmony_ci return rpc_proc_unavail; 54062306a36Sopenharmony_ci} 54162306a36Sopenharmony_ci 54262306a36Sopenharmony_ci/* 54362306a36Sopenharmony_ci * NLM Server procedures. 54462306a36Sopenharmony_ci */ 54562306a36Sopenharmony_ci 54662306a36Sopenharmony_cistruct nlm_void { int dummy; }; 54762306a36Sopenharmony_ci 54862306a36Sopenharmony_ci#define Ck (1+XDR_QUADLEN(NLM_MAXCOOKIELEN)) /* cookie */ 54962306a36Sopenharmony_ci#define St 1 /* status */ 55062306a36Sopenharmony_ci#define No (1+1024/4) /* Net Obj */ 55162306a36Sopenharmony_ci#define Rg 2 /* range - offset + size */ 55262306a36Sopenharmony_ci 55362306a36Sopenharmony_ciconst struct svc_procedure nlmsvc_procedures[24] = { 55462306a36Sopenharmony_ci [NLMPROC_NULL] = { 55562306a36Sopenharmony_ci .pc_func = nlmsvc_proc_null, 55662306a36Sopenharmony_ci .pc_decode = nlmsvc_decode_void, 55762306a36Sopenharmony_ci .pc_encode = nlmsvc_encode_void, 55862306a36Sopenharmony_ci .pc_argsize = sizeof(struct nlm_void), 55962306a36Sopenharmony_ci .pc_argzero = sizeof(struct nlm_void), 56062306a36Sopenharmony_ci .pc_ressize = sizeof(struct nlm_void), 56162306a36Sopenharmony_ci .pc_xdrressize = St, 56262306a36Sopenharmony_ci .pc_name = "NULL", 56362306a36Sopenharmony_ci }, 56462306a36Sopenharmony_ci [NLMPROC_TEST] = { 56562306a36Sopenharmony_ci .pc_func = nlmsvc_proc_test, 56662306a36Sopenharmony_ci .pc_decode = nlmsvc_decode_testargs, 56762306a36Sopenharmony_ci .pc_encode = nlmsvc_encode_testres, 56862306a36Sopenharmony_ci .pc_argsize = sizeof(struct nlm_args), 56962306a36Sopenharmony_ci .pc_argzero = sizeof(struct nlm_args), 57062306a36Sopenharmony_ci .pc_ressize = sizeof(struct nlm_res), 57162306a36Sopenharmony_ci .pc_xdrressize = Ck+St+2+No+Rg, 57262306a36Sopenharmony_ci .pc_name = "TEST", 57362306a36Sopenharmony_ci }, 57462306a36Sopenharmony_ci [NLMPROC_LOCK] = { 57562306a36Sopenharmony_ci .pc_func = nlmsvc_proc_lock, 57662306a36Sopenharmony_ci .pc_decode = nlmsvc_decode_lockargs, 57762306a36Sopenharmony_ci .pc_encode = nlmsvc_encode_res, 57862306a36Sopenharmony_ci .pc_argsize = sizeof(struct nlm_args), 57962306a36Sopenharmony_ci .pc_argzero = sizeof(struct nlm_args), 58062306a36Sopenharmony_ci .pc_ressize = sizeof(struct nlm_res), 58162306a36Sopenharmony_ci .pc_xdrressize = Ck+St, 58262306a36Sopenharmony_ci .pc_name = "LOCK", 58362306a36Sopenharmony_ci }, 58462306a36Sopenharmony_ci [NLMPROC_CANCEL] = { 58562306a36Sopenharmony_ci .pc_func = nlmsvc_proc_cancel, 58662306a36Sopenharmony_ci .pc_decode = nlmsvc_decode_cancargs, 58762306a36Sopenharmony_ci .pc_encode = nlmsvc_encode_res, 58862306a36Sopenharmony_ci .pc_argsize = sizeof(struct nlm_args), 58962306a36Sopenharmony_ci .pc_argzero = sizeof(struct nlm_args), 59062306a36Sopenharmony_ci .pc_ressize = sizeof(struct nlm_res), 59162306a36Sopenharmony_ci .pc_xdrressize = Ck+St, 59262306a36Sopenharmony_ci .pc_name = "CANCEL", 59362306a36Sopenharmony_ci }, 59462306a36Sopenharmony_ci [NLMPROC_UNLOCK] = { 59562306a36Sopenharmony_ci .pc_func = nlmsvc_proc_unlock, 59662306a36Sopenharmony_ci .pc_decode = nlmsvc_decode_unlockargs, 59762306a36Sopenharmony_ci .pc_encode = nlmsvc_encode_res, 59862306a36Sopenharmony_ci .pc_argsize = sizeof(struct nlm_args), 59962306a36Sopenharmony_ci .pc_argzero = sizeof(struct nlm_args), 60062306a36Sopenharmony_ci .pc_ressize = sizeof(struct nlm_res), 60162306a36Sopenharmony_ci .pc_xdrressize = Ck+St, 60262306a36Sopenharmony_ci .pc_name = "UNLOCK", 60362306a36Sopenharmony_ci }, 60462306a36Sopenharmony_ci [NLMPROC_GRANTED] = { 60562306a36Sopenharmony_ci .pc_func = nlmsvc_proc_granted, 60662306a36Sopenharmony_ci .pc_decode = nlmsvc_decode_testargs, 60762306a36Sopenharmony_ci .pc_encode = nlmsvc_encode_res, 60862306a36Sopenharmony_ci .pc_argsize = sizeof(struct nlm_args), 60962306a36Sopenharmony_ci .pc_argzero = sizeof(struct nlm_args), 61062306a36Sopenharmony_ci .pc_ressize = sizeof(struct nlm_res), 61162306a36Sopenharmony_ci .pc_xdrressize = Ck+St, 61262306a36Sopenharmony_ci .pc_name = "GRANTED", 61362306a36Sopenharmony_ci }, 61462306a36Sopenharmony_ci [NLMPROC_TEST_MSG] = { 61562306a36Sopenharmony_ci .pc_func = nlmsvc_proc_test_msg, 61662306a36Sopenharmony_ci .pc_decode = nlmsvc_decode_testargs, 61762306a36Sopenharmony_ci .pc_encode = nlmsvc_encode_void, 61862306a36Sopenharmony_ci .pc_argsize = sizeof(struct nlm_args), 61962306a36Sopenharmony_ci .pc_argzero = sizeof(struct nlm_args), 62062306a36Sopenharmony_ci .pc_ressize = sizeof(struct nlm_void), 62162306a36Sopenharmony_ci .pc_xdrressize = St, 62262306a36Sopenharmony_ci .pc_name = "TEST_MSG", 62362306a36Sopenharmony_ci }, 62462306a36Sopenharmony_ci [NLMPROC_LOCK_MSG] = { 62562306a36Sopenharmony_ci .pc_func = nlmsvc_proc_lock_msg, 62662306a36Sopenharmony_ci .pc_decode = nlmsvc_decode_lockargs, 62762306a36Sopenharmony_ci .pc_encode = nlmsvc_encode_void, 62862306a36Sopenharmony_ci .pc_argsize = sizeof(struct nlm_args), 62962306a36Sopenharmony_ci .pc_argzero = sizeof(struct nlm_args), 63062306a36Sopenharmony_ci .pc_ressize = sizeof(struct nlm_void), 63162306a36Sopenharmony_ci .pc_xdrressize = St, 63262306a36Sopenharmony_ci .pc_name = "LOCK_MSG", 63362306a36Sopenharmony_ci }, 63462306a36Sopenharmony_ci [NLMPROC_CANCEL_MSG] = { 63562306a36Sopenharmony_ci .pc_func = nlmsvc_proc_cancel_msg, 63662306a36Sopenharmony_ci .pc_decode = nlmsvc_decode_cancargs, 63762306a36Sopenharmony_ci .pc_encode = nlmsvc_encode_void, 63862306a36Sopenharmony_ci .pc_argsize = sizeof(struct nlm_args), 63962306a36Sopenharmony_ci .pc_argzero = sizeof(struct nlm_args), 64062306a36Sopenharmony_ci .pc_ressize = sizeof(struct nlm_void), 64162306a36Sopenharmony_ci .pc_xdrressize = St, 64262306a36Sopenharmony_ci .pc_name = "CANCEL_MSG", 64362306a36Sopenharmony_ci }, 64462306a36Sopenharmony_ci [NLMPROC_UNLOCK_MSG] = { 64562306a36Sopenharmony_ci .pc_func = nlmsvc_proc_unlock_msg, 64662306a36Sopenharmony_ci .pc_decode = nlmsvc_decode_unlockargs, 64762306a36Sopenharmony_ci .pc_encode = nlmsvc_encode_void, 64862306a36Sopenharmony_ci .pc_argsize = sizeof(struct nlm_args), 64962306a36Sopenharmony_ci .pc_argzero = sizeof(struct nlm_args), 65062306a36Sopenharmony_ci .pc_ressize = sizeof(struct nlm_void), 65162306a36Sopenharmony_ci .pc_xdrressize = St, 65262306a36Sopenharmony_ci .pc_name = "UNLOCK_MSG", 65362306a36Sopenharmony_ci }, 65462306a36Sopenharmony_ci [NLMPROC_GRANTED_MSG] = { 65562306a36Sopenharmony_ci .pc_func = nlmsvc_proc_granted_msg, 65662306a36Sopenharmony_ci .pc_decode = nlmsvc_decode_testargs, 65762306a36Sopenharmony_ci .pc_encode = nlmsvc_encode_void, 65862306a36Sopenharmony_ci .pc_argsize = sizeof(struct nlm_args), 65962306a36Sopenharmony_ci .pc_argzero = sizeof(struct nlm_args), 66062306a36Sopenharmony_ci .pc_ressize = sizeof(struct nlm_void), 66162306a36Sopenharmony_ci .pc_xdrressize = St, 66262306a36Sopenharmony_ci .pc_name = "GRANTED_MSG", 66362306a36Sopenharmony_ci }, 66462306a36Sopenharmony_ci [NLMPROC_TEST_RES] = { 66562306a36Sopenharmony_ci .pc_func = nlmsvc_proc_null, 66662306a36Sopenharmony_ci .pc_decode = nlmsvc_decode_void, 66762306a36Sopenharmony_ci .pc_encode = nlmsvc_encode_void, 66862306a36Sopenharmony_ci .pc_argsize = sizeof(struct nlm_res), 66962306a36Sopenharmony_ci .pc_argzero = sizeof(struct nlm_res), 67062306a36Sopenharmony_ci .pc_ressize = sizeof(struct nlm_void), 67162306a36Sopenharmony_ci .pc_xdrressize = St, 67262306a36Sopenharmony_ci .pc_name = "TEST_RES", 67362306a36Sopenharmony_ci }, 67462306a36Sopenharmony_ci [NLMPROC_LOCK_RES] = { 67562306a36Sopenharmony_ci .pc_func = nlmsvc_proc_null, 67662306a36Sopenharmony_ci .pc_decode = nlmsvc_decode_void, 67762306a36Sopenharmony_ci .pc_encode = nlmsvc_encode_void, 67862306a36Sopenharmony_ci .pc_argsize = sizeof(struct nlm_res), 67962306a36Sopenharmony_ci .pc_argzero = sizeof(struct nlm_res), 68062306a36Sopenharmony_ci .pc_ressize = sizeof(struct nlm_void), 68162306a36Sopenharmony_ci .pc_xdrressize = St, 68262306a36Sopenharmony_ci .pc_name = "LOCK_RES", 68362306a36Sopenharmony_ci }, 68462306a36Sopenharmony_ci [NLMPROC_CANCEL_RES] = { 68562306a36Sopenharmony_ci .pc_func = nlmsvc_proc_null, 68662306a36Sopenharmony_ci .pc_decode = nlmsvc_decode_void, 68762306a36Sopenharmony_ci .pc_encode = nlmsvc_encode_void, 68862306a36Sopenharmony_ci .pc_argsize = sizeof(struct nlm_res), 68962306a36Sopenharmony_ci .pc_argzero = sizeof(struct nlm_res), 69062306a36Sopenharmony_ci .pc_ressize = sizeof(struct nlm_void), 69162306a36Sopenharmony_ci .pc_xdrressize = St, 69262306a36Sopenharmony_ci .pc_name = "CANCEL_RES", 69362306a36Sopenharmony_ci }, 69462306a36Sopenharmony_ci [NLMPROC_UNLOCK_RES] = { 69562306a36Sopenharmony_ci .pc_func = nlmsvc_proc_null, 69662306a36Sopenharmony_ci .pc_decode = nlmsvc_decode_void, 69762306a36Sopenharmony_ci .pc_encode = nlmsvc_encode_void, 69862306a36Sopenharmony_ci .pc_argsize = sizeof(struct nlm_res), 69962306a36Sopenharmony_ci .pc_argzero = sizeof(struct nlm_res), 70062306a36Sopenharmony_ci .pc_ressize = sizeof(struct nlm_void), 70162306a36Sopenharmony_ci .pc_xdrressize = St, 70262306a36Sopenharmony_ci .pc_name = "UNLOCK_RES", 70362306a36Sopenharmony_ci }, 70462306a36Sopenharmony_ci [NLMPROC_GRANTED_RES] = { 70562306a36Sopenharmony_ci .pc_func = nlmsvc_proc_granted_res, 70662306a36Sopenharmony_ci .pc_decode = nlmsvc_decode_res, 70762306a36Sopenharmony_ci .pc_encode = nlmsvc_encode_void, 70862306a36Sopenharmony_ci .pc_argsize = sizeof(struct nlm_res), 70962306a36Sopenharmony_ci .pc_argzero = sizeof(struct nlm_res), 71062306a36Sopenharmony_ci .pc_ressize = sizeof(struct nlm_void), 71162306a36Sopenharmony_ci .pc_xdrressize = St, 71262306a36Sopenharmony_ci .pc_name = "GRANTED_RES", 71362306a36Sopenharmony_ci }, 71462306a36Sopenharmony_ci [NLMPROC_NSM_NOTIFY] = { 71562306a36Sopenharmony_ci .pc_func = nlmsvc_proc_sm_notify, 71662306a36Sopenharmony_ci .pc_decode = nlmsvc_decode_reboot, 71762306a36Sopenharmony_ci .pc_encode = nlmsvc_encode_void, 71862306a36Sopenharmony_ci .pc_argsize = sizeof(struct nlm_reboot), 71962306a36Sopenharmony_ci .pc_argzero = sizeof(struct nlm_reboot), 72062306a36Sopenharmony_ci .pc_ressize = sizeof(struct nlm_void), 72162306a36Sopenharmony_ci .pc_xdrressize = St, 72262306a36Sopenharmony_ci .pc_name = "SM_NOTIFY", 72362306a36Sopenharmony_ci }, 72462306a36Sopenharmony_ci [17] = { 72562306a36Sopenharmony_ci .pc_func = nlmsvc_proc_unused, 72662306a36Sopenharmony_ci .pc_decode = nlmsvc_decode_void, 72762306a36Sopenharmony_ci .pc_encode = nlmsvc_encode_void, 72862306a36Sopenharmony_ci .pc_argsize = sizeof(struct nlm_void), 72962306a36Sopenharmony_ci .pc_argzero = sizeof(struct nlm_void), 73062306a36Sopenharmony_ci .pc_ressize = sizeof(struct nlm_void), 73162306a36Sopenharmony_ci .pc_xdrressize = St, 73262306a36Sopenharmony_ci .pc_name = "UNUSED", 73362306a36Sopenharmony_ci }, 73462306a36Sopenharmony_ci [18] = { 73562306a36Sopenharmony_ci .pc_func = nlmsvc_proc_unused, 73662306a36Sopenharmony_ci .pc_decode = nlmsvc_decode_void, 73762306a36Sopenharmony_ci .pc_encode = nlmsvc_encode_void, 73862306a36Sopenharmony_ci .pc_argsize = sizeof(struct nlm_void), 73962306a36Sopenharmony_ci .pc_argzero = sizeof(struct nlm_void), 74062306a36Sopenharmony_ci .pc_ressize = sizeof(struct nlm_void), 74162306a36Sopenharmony_ci .pc_xdrressize = St, 74262306a36Sopenharmony_ci .pc_name = "UNUSED", 74362306a36Sopenharmony_ci }, 74462306a36Sopenharmony_ci [19] = { 74562306a36Sopenharmony_ci .pc_func = nlmsvc_proc_unused, 74662306a36Sopenharmony_ci .pc_decode = nlmsvc_decode_void, 74762306a36Sopenharmony_ci .pc_encode = nlmsvc_encode_void, 74862306a36Sopenharmony_ci .pc_argsize = sizeof(struct nlm_void), 74962306a36Sopenharmony_ci .pc_argzero = sizeof(struct nlm_void), 75062306a36Sopenharmony_ci .pc_ressize = sizeof(struct nlm_void), 75162306a36Sopenharmony_ci .pc_xdrressize = St, 75262306a36Sopenharmony_ci .pc_name = "UNUSED", 75362306a36Sopenharmony_ci }, 75462306a36Sopenharmony_ci [NLMPROC_SHARE] = { 75562306a36Sopenharmony_ci .pc_func = nlmsvc_proc_share, 75662306a36Sopenharmony_ci .pc_decode = nlmsvc_decode_shareargs, 75762306a36Sopenharmony_ci .pc_encode = nlmsvc_encode_shareres, 75862306a36Sopenharmony_ci .pc_argsize = sizeof(struct nlm_args), 75962306a36Sopenharmony_ci .pc_argzero = sizeof(struct nlm_args), 76062306a36Sopenharmony_ci .pc_ressize = sizeof(struct nlm_res), 76162306a36Sopenharmony_ci .pc_xdrressize = Ck+St+1, 76262306a36Sopenharmony_ci .pc_name = "SHARE", 76362306a36Sopenharmony_ci }, 76462306a36Sopenharmony_ci [NLMPROC_UNSHARE] = { 76562306a36Sopenharmony_ci .pc_func = nlmsvc_proc_unshare, 76662306a36Sopenharmony_ci .pc_decode = nlmsvc_decode_shareargs, 76762306a36Sopenharmony_ci .pc_encode = nlmsvc_encode_shareres, 76862306a36Sopenharmony_ci .pc_argsize = sizeof(struct nlm_args), 76962306a36Sopenharmony_ci .pc_argzero = sizeof(struct nlm_args), 77062306a36Sopenharmony_ci .pc_ressize = sizeof(struct nlm_res), 77162306a36Sopenharmony_ci .pc_xdrressize = Ck+St+1, 77262306a36Sopenharmony_ci .pc_name = "UNSHARE", 77362306a36Sopenharmony_ci }, 77462306a36Sopenharmony_ci [NLMPROC_NM_LOCK] = { 77562306a36Sopenharmony_ci .pc_func = nlmsvc_proc_nm_lock, 77662306a36Sopenharmony_ci .pc_decode = nlmsvc_decode_lockargs, 77762306a36Sopenharmony_ci .pc_encode = nlmsvc_encode_res, 77862306a36Sopenharmony_ci .pc_argsize = sizeof(struct nlm_args), 77962306a36Sopenharmony_ci .pc_argzero = sizeof(struct nlm_args), 78062306a36Sopenharmony_ci .pc_ressize = sizeof(struct nlm_res), 78162306a36Sopenharmony_ci .pc_xdrressize = Ck+St, 78262306a36Sopenharmony_ci .pc_name = "NM_LOCK", 78362306a36Sopenharmony_ci }, 78462306a36Sopenharmony_ci [NLMPROC_FREE_ALL] = { 78562306a36Sopenharmony_ci .pc_func = nlmsvc_proc_free_all, 78662306a36Sopenharmony_ci .pc_decode = nlmsvc_decode_notify, 78762306a36Sopenharmony_ci .pc_encode = nlmsvc_encode_void, 78862306a36Sopenharmony_ci .pc_argsize = sizeof(struct nlm_args), 78962306a36Sopenharmony_ci .pc_argzero = sizeof(struct nlm_args), 79062306a36Sopenharmony_ci .pc_ressize = sizeof(struct nlm_void), 79162306a36Sopenharmony_ci .pc_xdrressize = 0, 79262306a36Sopenharmony_ci .pc_name = "FREE_ALL", 79362306a36Sopenharmony_ci }, 79462306a36Sopenharmony_ci}; 795