summaryrefslogtreecommitdiffstats
path: root/sys/nlm
diff options
context:
space:
mode:
Diffstat (limited to 'sys/nlm')
-rw-r--r--sys/nlm/nlm.h2
-rw-r--r--sys/nlm/nlm_advlock.c9
-rw-r--r--sys/nlm/nlm_prot_impl.c116
-rw-r--r--sys/nlm/nlm_prot_svc.c72
4 files changed, 121 insertions, 78 deletions
diff --git a/sys/nlm/nlm.h b/sys/nlm/nlm.h
index addd07e..27b921f 100644
--- a/sys/nlm/nlm.h
+++ b/sys/nlm/nlm.h
@@ -93,7 +93,7 @@ extern void nlm_host_release(struct nlm_host *host);
* Return an RPC client handle that can be used to talk to the NLM
* running on the given host.
*/
-extern CLIENT *nlm_host_get_rpc(struct nlm_host *host);
+extern CLIENT *nlm_host_get_rpc(struct nlm_host *host, bool_t isserver);
/*
* Return the system ID for a host.
diff --git a/sys/nlm/nlm_advlock.c b/sys/nlm/nlm_advlock.c
index 5d1cc83..2c1f1a6 100644
--- a/sys/nlm/nlm_advlock.c
+++ b/sys/nlm/nlm_advlock.c
@@ -267,6 +267,7 @@ nlm_advlock_internal(struct vnode *vp, void *id, int op, struct flock *fl,
ext.rc_feedback = nlm_feedback;
ext.rc_feedback_arg = &nf;
+ ext.rc_timers = NULL;
ns = NULL;
if (flags & F_FLOCK) {
@@ -753,7 +754,7 @@ nlm_setlock(struct nlm_host *host, struct rpc_callextra *ext,
retry = 5*hz;
for (;;) {
- client = nlm_host_get_rpc(host);
+ client = nlm_host_get_rpc(host, FALSE);
if (!client)
return (ENOLCK); /* XXX retry? */
@@ -834,7 +835,7 @@ nlm_setlock(struct nlm_host *host, struct rpc_callextra *ext,
cancel.alock = args.alock;
do {
- client = nlm_host_get_rpc(host);
+ client = nlm_host_get_rpc(host, FALSE);
if (!client)
/* XXX retry? */
return (ENOLCK);
@@ -942,7 +943,7 @@ nlm_clearlock(struct nlm_host *host, struct rpc_callextra *ext,
return (error);
for (;;) {
- client = nlm_host_get_rpc(host);
+ client = nlm_host_get_rpc(host, FALSE);
if (!client)
return (ENOLCK); /* XXX retry? */
@@ -1023,7 +1024,7 @@ nlm_getlock(struct nlm_host *host, struct rpc_callextra *ext,
args.exclusive = exclusive;
for (;;) {
- client = nlm_host_get_rpc(host);
+ client = nlm_host_get_rpc(host, FALSE);
if (!client)
return (ENOLCK); /* XXX retry? */
diff --git a/sys/nlm/nlm_prot_impl.c b/sys/nlm/nlm_prot_impl.c
index 831d330..1add718 100644
--- a/sys/nlm/nlm_prot_impl.c
+++ b/sys/nlm/nlm_prot_impl.c
@@ -26,6 +26,7 @@
*/
#include "opt_inet6.h"
+#include "opt_nfs.h"
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
@@ -205,6 +206,12 @@ enum nlm_host_state {
NLM_MONITOR_FAILED,
NLM_RECOVERING
};
+
+struct nlm_rpc {
+ CLIENT *nr_client; /* (l) RPC client handle */
+ time_t nr_create_time; /* (l) when client was created */
+};
+
struct nlm_host {
struct mtx nh_lock;
volatile u_int nh_refs; /* (a) reference count */
@@ -213,12 +220,12 @@ struct nlm_host {
uint32_t nh_sysid; /* (c) our allocaed system ID */
char nh_sysid_string[10]; /* (c) string rep. of sysid */
struct sockaddr_storage nh_addr; /* (s) remote address of host */
- CLIENT *nh_rpc; /* (l) RPC handle to send to host */
+ struct nlm_rpc nh_srvrpc; /* (l) RPC for server replies */
+ struct nlm_rpc nh_clntrpc; /* (l) RPC for client requests */
rpcvers_t nh_vers; /* (s) NLM version of host */
int nh_state; /* (s) last seen NSM state of host */
enum nlm_host_state nh_monstate; /* (l) local NSM monitoring state */
time_t nh_idle_timeout; /* (s) Time at which host is idle */
- time_t nh_rpc_create_time; /* (s) Time we create RPC client */
struct sysctl_ctx_list nh_sysctl; /* (c) vfs.nlm.sysid nodes */
struct nlm_async_lock_list nh_pending; /* (l) pending async locks */
struct nlm_async_lock_list nh_finished; /* (l) finished async locks */
@@ -283,7 +290,7 @@ nlm_copy_netobj(struct netobj *dst, struct netobj *src,
static CLIENT *
nlm_get_rpc(struct sockaddr *sa, rpcprog_t prog, rpcvers_t vers)
{
- const char *wchan = "nlmrcv";
+ char *wchan = "nlmrcv";
const char* protofmly;
struct sockaddr_storage ss;
struct socket *so;
@@ -472,7 +479,7 @@ again:
rpcb = clnt_reconnect_create(nconf, (struct sockaddr *)&ss,
prog, vers, 0, 0);
- CLNT_CONTROL(rpcb, CLSET_WAITCHAN, &wchan);
+ CLNT_CONTROL(rpcb, CLSET_WAITCHAN, wchan);
rpcb->cl_auth = nlm_auth;
} else {
@@ -482,7 +489,7 @@ again:
CLNT_CONTROL(rpcb, CLSET_SVC_ADDR, &ss);
CLNT_CONTROL(rpcb, CLSET_PROG, &prog);
CLNT_CONTROL(rpcb, CLSET_VERS, &vers);
- CLNT_CONTROL(rpcb, CLSET_WAITCHAN, &wchan);
+ CLNT_CONTROL(rpcb, CLSET_WAITCHAN, wchan);
rpcb->cl_auth = nlm_auth;
}
@@ -646,13 +653,17 @@ nlm_host_destroy(struct nlm_host *host)
TAILQ_REMOVE(&nlm_hosts, host, nh_link);
mtx_unlock(&nlm_global_lock);
- if (host->nh_rpc)
- CLNT_RELEASE(host->nh_rpc);
+ if (host->nh_srvrpc.nr_client)
+ CLNT_RELEASE(host->nh_srvrpc.nr_client);
+ if (host->nh_clntrpc.nr_client)
+ CLNT_RELEASE(host->nh_clntrpc.nr_client);
mtx_destroy(&host->nh_lock);
sysctl_ctx_free(&host->nh_sysctl);
free(host, M_NLM);
}
+#ifdef NFSCLIENT
+
/*
* Thread start callback for client lock recovery
*/
@@ -677,6 +688,8 @@ nlm_client_recovery_start(void *arg)
kthread_exit();
}
+#endif
+
/*
* This is called when we receive a host state change notification. We
* unlock any active locks owned by the host. When rpc.lockd is
@@ -716,6 +729,7 @@ nlm_host_notify(struct nlm_host *host, int newstate)
lf_clearremotesys(host->nh_sysid);
host->nh_state = newstate;
+#ifdef NFSCLIENT
/*
* If we have any remote locks for this host (i.e. it
* represents a remote NFS server that our local NFS client
@@ -730,6 +744,7 @@ nlm_host_notify(struct nlm_host *host, int newstate)
kthread_add(nlm_client_recovery_start, host, curproc, &td, 0, 0,
"NFS lock recovery for %s", host->nh_caller_name);
}
+#endif
}
/*
@@ -783,7 +798,6 @@ nlm_create_host(const char* caller_name)
host->nh_sysid = nlm_next_sysid++;
snprintf(host->nh_sysid_string, sizeof(host->nh_sysid_string),
"%d", host->nh_sysid);
- host->nh_rpc = NULL;
host->nh_vers = 0;
host->nh_state = 0;
host->nh_monstate = NLM_UNMONITORED;
@@ -933,15 +947,15 @@ nlm_find_host_by_name(const char *name, const struct sockaddr *addr,
* have an RPC client handle, make sure the address is
* the same, otherwise discard the client handle.
*/
- if (host->nh_addr.ss_len && host->nh_rpc) {
+ if (host->nh_addr.ss_len && host->nh_srvrpc.nr_client) {
if (!nlm_compare_addr(
(struct sockaddr *) &host->nh_addr,
addr)
|| host->nh_vers != vers) {
CLIENT *client;
mtx_lock(&host->nh_lock);
- client = host->nh_rpc;
- host->nh_rpc = NULL;
+ client = host->nh_srvrpc.nr_client;
+ host->nh_srvrpc.nr_client = NULL;
mtx_unlock(&host->nh_lock);
if (client) {
CLNT_RELEASE(client);
@@ -1173,12 +1187,18 @@ nlm_host_monitor(struct nlm_host *host, int state)
* running on the given host.
*/
CLIENT *
-nlm_host_get_rpc(struct nlm_host *host)
+nlm_host_get_rpc(struct nlm_host *host, bool_t isserver)
{
+ struct nlm_rpc *rpc;
CLIENT *client;
mtx_lock(&host->nh_lock);
+ if (isserver)
+ rpc = &host->nh_srvrpc;
+ else
+ rpc = &host->nh_clntrpc;
+
/*
* We can't hold onto RPC handles for too long - the async
* call/reply protocol used by some NLM clients makes it hard
@@ -1187,33 +1207,33 @@ nlm_host_get_rpc(struct nlm_host *host)
* holding any locks, it won't bother to notify us. We
* expire the RPC handles after two minutes.
*/
- if (host->nh_rpc && time_uptime > host->nh_rpc_create_time + 2*60) {
- client = host->nh_rpc;
- host->nh_rpc = NULL;
+ if (rpc->nr_client && time_uptime > rpc->nr_create_time + 2*60) {
+ client = rpc->nr_client;
+ rpc->nr_client = NULL;
mtx_unlock(&host->nh_lock);
CLNT_RELEASE(client);
mtx_lock(&host->nh_lock);
}
- if (!host->nh_rpc) {
+ if (!rpc->nr_client) {
mtx_unlock(&host->nh_lock);
client = nlm_get_rpc((struct sockaddr *)&host->nh_addr,
NLM_PROG, host->nh_vers);
mtx_lock(&host->nh_lock);
if (client) {
- if (host->nh_rpc) {
+ if (rpc->nr_client) {
mtx_unlock(&host->nh_lock);
CLNT_DESTROY(client);
mtx_lock(&host->nh_lock);
} else {
- host->nh_rpc = client;
- host->nh_rpc_create_time = time_uptime;
+ rpc->nr_client = client;
+ rpc->nr_create_time = time_uptime;
}
}
}
- client = host->nh_rpc;
+ client = rpc->nr_client;
if (client)
CLNT_ACQUIRE(client);
mtx_unlock(&host->nh_lock);
@@ -1439,8 +1459,10 @@ nlm_server_main(int addr_count, char **addrs)
enum clnt_stat stat;
struct nlm_host *host, *nhost;
struct nlm_waiting_lock *nw;
+#ifdef NFSCLIENT
vop_advlock_t *old_nfs_advlock;
vop_reclaim_t *old_nfs_reclaim;
+#endif
int v4_used;
#ifdef INET6
int v6_used;
@@ -1512,7 +1534,7 @@ nlm_server_main(int addr_count, char **addrs)
goto out;
}
- pool = svcpool_create();
+ pool = svcpool_create("NLM", NULL);
error = nlm_register_services(pool, addr_count, addrs);
if (error)
@@ -1541,16 +1563,20 @@ nlm_server_main(int addr_count, char **addrs)
printf("NLM: local NSM state is %d\n", smstat.state);
nlm_nsm_state = smstat.state;
+#ifdef NFSCLIENT
old_nfs_advlock = nfs_advlock_p;
nfs_advlock_p = nlm_advlock;
old_nfs_reclaim = nfs_reclaim_p;
nfs_reclaim_p = nlm_reclaim;
+#endif
svc_run(pool);
error = 0;
+#ifdef NFSCLIENT
nfs_advlock_p = old_nfs_advlock;
nfs_reclaim_p = old_nfs_reclaim;
+#endif
out:
if (pool)
@@ -1595,7 +1621,8 @@ out:
}
TAILQ_FOREACH_SAFE(host, &nlm_hosts, nh_link, nhost) {
mtx_lock(&host->nh_lock);
- if (host->nh_rpc) {
+ if (host->nh_srvrpc.nr_client
+ || host->nh_clntrpc.nr_client) {
if (host->nh_addr.ss_family == AF_INET)
v4_used++;
#ifdef INET6
@@ -1607,7 +1634,12 @@ out:
* correctly with the fact that a socket may
* be used by many rpc handles.
*/
- CLNT_CONTROL(host->nh_rpc, CLSET_FD_CLOSE, 0);
+ if (host->nh_srvrpc.nr_client)
+ CLNT_CONTROL(host->nh_srvrpc.nr_client,
+ CLSET_FD_CLOSE, 0);
+ if (host->nh_clntrpc.nr_client)
+ CLNT_CONTROL(host->nh_clntrpc.nr_client,
+ CLSET_FD_CLOSE, 0);
}
mtx_unlock(&host->nh_lock);
}
@@ -1687,11 +1719,10 @@ static int
nlm_get_vfs_state(struct nlm_host *host, struct svc_req *rqstp,
fhandle_t *fhp, struct vfs_state *vs)
{
- int error, exflags, freecred;
+ int error, exflags;
struct ucred *cred = NULL, *credanon;
memset(vs, 0, sizeof(*vs));
- freecred = FALSE;
vs->vs_mp = vfs_getvfs(&fhp->fh_fsid);
if (!vs->vs_mp) {
@@ -1700,7 +1731,7 @@ nlm_get_vfs_state(struct nlm_host *host, struct svc_req *rqstp,
vs->vs_vfslocked = VFS_LOCK_GIANT(vs->vs_mp);
error = VFS_CHECKEXP(vs->vs_mp, (struct sockaddr *)&host->nh_addr,
- &exflags, &credanon);
+ &exflags, &credanon, NULL, NULL);
if (error)
goto out;
@@ -1714,16 +1745,13 @@ nlm_get_vfs_state(struct nlm_host *host, struct svc_req *rqstp,
goto out;
vs->vs_vnlocked = TRUE;
- cred = crget();
- freecred = TRUE;
- if (!svc_getcred(rqstp, cred, NULL)) {
+ if (!svc_getcred(rqstp, &cred, NULL)) {
error = EINVAL;
goto out;
}
if (cred->cr_uid == 0 || (exflags & MNT_EXPORTANON)) {
crfree(cred);
- cred = credanon;
- freecred = FALSE;
+ cred = crhold(credanon);
}
/*
@@ -1741,7 +1769,7 @@ nlm_get_vfs_state(struct nlm_host *host, struct svc_req *rqstp,
vs->vs_vnlocked = FALSE;
out:
- if (freecred)
+ if (cred)
crfree(cred);
return (error);
@@ -1788,7 +1816,7 @@ nlm_do_test(nlm4_testargs *argp, nlm4_testres *result, struct svc_req *rqstp,
memset(&vs, 0, sizeof(vs));
host = nlm_find_host_by_name(argp->alock.caller_name,
- (struct sockaddr *) rqstp->rq_xprt->xp_rtaddr.buf, rqstp->rq_vers);
+ svc_getrpccaller(rqstp), rqstp->rq_vers);
if (!host) {
result->stat.stat = nlm4_denied_nolocks;
return (ENOMEM);
@@ -1866,7 +1894,7 @@ nlm_do_test(nlm4_testargs *argp, nlm4_testres *result, struct svc_req *rqstp,
out:
nlm_release_vfs_state(&vs);
if (rpcp)
- *rpcp = nlm_host_get_rpc(host);
+ *rpcp = nlm_host_get_rpc(host, TRUE);
nlm_host_release(host);
return (0);
}
@@ -1885,7 +1913,7 @@ nlm_do_lock(nlm4_lockargs *argp, nlm4_res *result, struct svc_req *rqstp,
memset(&vs, 0, sizeof(vs));
host = nlm_find_host_by_name(argp->alock.caller_name,
- (struct sockaddr *) rqstp->rq_xprt->xp_rtaddr.buf, rqstp->rq_vers);
+ svc_getrpccaller(rqstp), rqstp->rq_vers);
if (!host) {
result->stat.stat = nlm4_denied_nolocks;
return (ENOMEM);
@@ -1937,7 +1965,7 @@ nlm_do_lock(nlm4_lockargs *argp, nlm4_res *result, struct svc_req *rqstp,
/*
* First, make sure we can contact the host's NLM.
*/
- client = nlm_host_get_rpc(host);
+ client = nlm_host_get_rpc(host, TRUE);
if (!client) {
result->stat.stat = nlm4_failed;
goto out;
@@ -2049,7 +2077,7 @@ nlm_do_lock(nlm4_lockargs *argp, nlm4_res *result, struct svc_req *rqstp,
out:
nlm_release_vfs_state(&vs);
if (rpcp)
- *rpcp = nlm_host_get_rpc(host);
+ *rpcp = nlm_host_get_rpc(host, TRUE);
nlm_host_release(host);
return (0);
}
@@ -2069,7 +2097,7 @@ nlm_do_cancel(nlm4_cancargs *argp, nlm4_res *result, struct svc_req *rqstp,
memset(&vs, 0, sizeof(vs));
host = nlm_find_host_by_name(argp->alock.caller_name,
- (struct sockaddr *) rqstp->rq_xprt->xp_rtaddr.buf, rqstp->rq_vers);
+ svc_getrpccaller(rqstp), rqstp->rq_vers);
if (!host) {
result->stat.stat = nlm4_denied_nolocks;
return (ENOMEM);
@@ -2140,7 +2168,7 @@ nlm_do_cancel(nlm4_cancargs *argp, nlm4_res *result, struct svc_req *rqstp,
out:
nlm_release_vfs_state(&vs);
if (rpcp)
- *rpcp = nlm_host_get_rpc(host);
+ *rpcp = nlm_host_get_rpc(host, TRUE);
nlm_host_release(host);
return (0);
}
@@ -2159,7 +2187,7 @@ nlm_do_unlock(nlm4_unlockargs *argp, nlm4_res *result, struct svc_req *rqstp,
memset(&vs, 0, sizeof(vs));
host = nlm_find_host_by_name(argp->alock.caller_name,
- (struct sockaddr *) rqstp->rq_xprt->xp_rtaddr.buf, rqstp->rq_vers);
+ svc_getrpccaller(rqstp), rqstp->rq_vers);
if (!host) {
result->stat.stat = nlm4_denied_nolocks;
return (ENOMEM);
@@ -2203,7 +2231,7 @@ nlm_do_unlock(nlm4_unlockargs *argp, nlm4_res *result, struct svc_req *rqstp,
out:
nlm_release_vfs_state(&vs);
if (rpcp)
- *rpcp = nlm_host_get_rpc(host);
+ *rpcp = nlm_host_get_rpc(host, TRUE);
nlm_host_release(host);
return (0);
}
@@ -2218,9 +2246,7 @@ nlm_do_granted(nlm4_testargs *argp, nlm4_res *result, struct svc_req *rqstp,
memset(result, 0, sizeof(*result));
- host = nlm_find_host_by_addr(
- (struct sockaddr *) rqstp->rq_xprt->xp_rtaddr.buf,
- rqstp->rq_vers);
+ host = nlm_find_host_by_addr(svc_getrpccaller(rqstp), rqstp->rq_vers);
if (!host) {
result->stat.stat = nlm4_denied_nolocks;
return (ENOMEM);
@@ -2247,7 +2273,7 @@ nlm_do_granted(nlm4_testargs *argp, nlm4_res *result, struct svc_req *rqstp,
}
mtx_unlock(&nlm_global_lock);
if (rpcp)
- *rpcp = nlm_host_get_rpc(host);
+ *rpcp = nlm_host_get_rpc(host, TRUE);
nlm_host_release(host);
return (0);
}
diff --git a/sys/nlm/nlm_prot_svc.c b/sys/nlm/nlm_prot_svc.c
index 3b1a140..5141f87 100644
--- a/sys/nlm/nlm_prot_svc.c
+++ b/sys/nlm/nlm_prot_svc.c
@@ -57,8 +57,9 @@ nlm_prog_0(struct svc_req *rqstp, SVCXPRT *transp)
switch (rqstp->rq_proc) {
case NULLPROC:
- (void) svc_sendreply(transp,
+ (void) svc_sendreply(rqstp,
(xdrproc_t) xdr_void, (char *)NULL);
+ svc_freereq(rqstp);
return;
case NLM_SM_NOTIFY:
@@ -68,19 +69,22 @@ nlm_prog_0(struct svc_req *rqstp, SVCXPRT *transp)
break;
default:
- svcerr_noproc(transp);
+ svcerr_noproc(rqstp);
+ svc_freereq(rqstp);
return;
}
(void) memset((char *)&argument, 0, sizeof (argument));
- if (!svc_getargs(transp, xdr_argument, (char *)(caddr_t) &argument)) {
- svcerr_decode(transp);
+ if (!svc_getargs(rqstp, xdr_argument, (char *)(caddr_t) &argument)) {
+ svcerr_decode(rqstp);
+ svc_freereq(rqstp);
return;
}
retval = (bool_t) (*local)((char *)&argument, (void *)&result, rqstp);
- if (retval > 0 && !svc_sendreply(transp, xdr_result, (char *)&result)) {
- svcerr_systemerr(transp);
+ if (retval > 0 && !svc_sendreply(rqstp, xdr_result, (char *)&result)) {
+ svcerr_systemerr(rqstp);
}
- if (!svc_freeargs(transp, xdr_argument, (char *)(caddr_t) &argument)) {
+ svc_freereq(rqstp);
+ if (!svc_freeargs(rqstp, xdr_argument, (char *)(caddr_t) &argument)) {
printf("unable to free arguments");
//exit(1);
}
@@ -121,8 +125,9 @@ nlm_prog_1(struct svc_req *rqstp, SVCXPRT *transp)
switch (rqstp->rq_proc) {
case NULLPROC:
- (void) svc_sendreply(transp,
+ (void) svc_sendreply(rqstp,
(xdrproc_t) xdr_void, (char *)NULL);
+ svc_freereq(rqstp);
return;
case NLM_TEST:
@@ -216,22 +221,25 @@ nlm_prog_1(struct svc_req *rqstp, SVCXPRT *transp)
break;
default:
- svcerr_noproc(transp);
+ svcerr_noproc(rqstp);
+ svc_freereq(rqstp);
return;
}
(void) memset((char *)&argument, 0, sizeof (argument));
- if (!svc_getargs(transp, xdr_argument, (char *)(caddr_t) &argument)) {
- svcerr_decode(transp);
+ if (!svc_getargs(rqstp, xdr_argument, (char *)(caddr_t) &argument)) {
+ svcerr_decode(rqstp);
+ svc_freereq(rqstp);
return;
}
retval = (bool_t) (*local)((char *)&argument, (void *)&result, rqstp);
- if (retval > 0 && !svc_sendreply(transp, xdr_result, (char *)&result)) {
- svcerr_systemerr(transp);
+ if (retval > 0 && !svc_sendreply(rqstp, xdr_result, (char *)&result)) {
+ svcerr_systemerr(rqstp);
}
- if (!svc_freeargs(transp, xdr_argument, (char *)(caddr_t) &argument)) {
+ if (!svc_freeargs(rqstp, xdr_argument, (char *)(caddr_t) &argument)) {
printf("unable to free arguments");
//exit(1);
}
+ svc_freereq(rqstp);
if (!nlm_prog_1_freeresult(transp, xdr_result, (caddr_t) &result))
printf("unable to free results");
@@ -258,8 +266,9 @@ nlm_prog_3(struct svc_req *rqstp, SVCXPRT *transp)
switch (rqstp->rq_proc) {
case NULLPROC:
- (void) svc_sendreply(transp,
+ (void) svc_sendreply(rqstp,
(xdrproc_t) xdr_void, (char *)NULL);
+ svc_freereq(rqstp);
return;
case NLM_TEST:
@@ -305,22 +314,25 @@ nlm_prog_3(struct svc_req *rqstp, SVCXPRT *transp)
break;
default:
- svcerr_noproc(transp);
+ svcerr_noproc(rqstp);
+ svc_freereq(rqstp);
return;
}
(void) memset((char *)&argument, 0, sizeof (argument));
- if (!svc_getargs(transp, xdr_argument, (char *)(caddr_t) &argument)) {
- svcerr_decode(transp);
+ if (!svc_getargs(rqstp, xdr_argument, (char *)(caddr_t) &argument)) {
+ svcerr_decode(rqstp);
+ svc_freereq(rqstp);
return;
}
retval = (bool_t) (*local)((char *)&argument, (void *)&result, rqstp);
- if (retval > 0 && !svc_sendreply(transp, xdr_result, (char *)&result)) {
- svcerr_systemerr(transp);
+ if (retval > 0 && !svc_sendreply(rqstp, xdr_result, (char *)&result)) {
+ svcerr_systemerr(rqstp);
}
- if (!svc_freeargs(transp, xdr_argument, (char *)(caddr_t) &argument)) {
+ if (!svc_freeargs(rqstp, xdr_argument, (char *)(caddr_t) &argument)) {
printf("unable to free arguments");
//exit(1);
}
+ svc_freereq(rqstp);
if (!nlm_prog_3_freeresult(transp, xdr_result, (caddr_t) &result))
printf("unable to free results");
@@ -367,8 +379,9 @@ nlm_prog_4(struct svc_req *rqstp, SVCXPRT *transp)
switch (rqstp->rq_proc) {
case NULLPROC:
- (void) svc_sendreply(transp,
+ (void) svc_sendreply(rqstp,
(xdrproc_t) xdr_void, (char *)NULL);
+ svc_freereq(rqstp);
return;
case NLM4_TEST:
@@ -486,22 +499,25 @@ nlm_prog_4(struct svc_req *rqstp, SVCXPRT *transp)
break;
default:
- svcerr_noproc(transp);
+ svcerr_noproc(rqstp);
+ svc_freereq(rqstp);
return;
}
(void) memset((char *)&argument, 0, sizeof (argument));
- if (!svc_getargs(transp, xdr_argument, (char *)(caddr_t) &argument)) {
- svcerr_decode(transp);
+ if (!svc_getargs(rqstp, xdr_argument, (char *)(caddr_t) &argument)) {
+ svcerr_decode(rqstp);
+ svc_freereq(rqstp);
return;
}
retval = (bool_t) (*local)((char *)&argument, (void *)&result, rqstp);
- if (retval > 0 && !svc_sendreply(transp, xdr_result, (char *)&result)) {
- svcerr_systemerr(transp);
+ if (retval > 0 && !svc_sendreply(rqstp, xdr_result, (char *)&result)) {
+ svcerr_systemerr(rqstp);
}
- if (!svc_freeargs(transp, xdr_argument, (char *)(caddr_t) &argument)) {
+ if (!svc_freeargs(rqstp, xdr_argument, (char *)(caddr_t) &argument)) {
printf("unable to free arguments");
//exit(1);
}
+ svc_freereq(rqstp);
if (!nlm_prog_4_freeresult(transp, xdr_result, (caddr_t) &result))
printf("unable to free results");
OpenPOWER on IntegriCloud