diff options
author | Vitaliy Gusev <gusev.vitaliy@gmail.com> | 2021-08-02 02:01:56 +0300 |
---|---|---|
committer | Robert Mustacchi <rm@fingolfin.org> | 2022-01-04 23:28:15 +0000 |
commit | 214d537cc1e7896ae3489ebec3ae766e01f32b2a (patch) | |
tree | d40b5e2bd08120733745dfe13fcd0640c217f72e /usr/src | |
parent | 45ede40b2394db7967e59f19288fae9b62efd4aa (diff) | |
download | illumos-joyent-214d537cc1e7896ae3489ebec3ae766e01f32b2a.tar.gz |
13990 nfssrv: get rid of one crget for nfsv4
Reviewed by: Dan McDonald <danmcd@joyent.com>
Reviewed by: Evan Layton <elayton@tintri.com>
Reviewed by: Marcel Telka <marcel@telka.sk>
Approved by: Robert Mustacchi <rm@fingolfin.org>
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/uts/common/fs/nfs/nfs4_srv.c | 6 | ||||
-rw-r--r-- | usr/src/uts/common/fs/nfs/nfs_server.c | 26 | ||||
-rw-r--r-- | usr/src/uts/common/rpc/svc.c | 20 | ||||
-rw-r--r-- | usr/src/uts/common/rpc/svc.h | 3 |
4 files changed, 27 insertions, 28 deletions
diff --git a/usr/src/uts/common/fs/nfs/nfs4_srv.c b/usr/src/uts/common/fs/nfs/nfs4_srv.c index 757964eb84..077fc4a25f 100644 --- a/usr/src/uts/common/fs/nfs/nfs4_srv.c +++ b/usr/src/uts/common/fs/nfs/nfs4_srv.c @@ -32,6 +32,7 @@ * Copyright (c) 2012, 2016 by Delphix. All rights reserved. * Copyright 2019 Nexenta Systems, Inc. * Copyright 2019 Nexenta by DDN, Inc. + * Copyright 2021 Racktop Systems, Inc. */ #include <sys/param.h> @@ -5840,13 +5841,12 @@ rfs4_compound(COMPOUND4args *args, COMPOUND4res *resp, struct exportinfo *exi, ASSERT(exi == NULL); ASSERT(cr == NULL); - cr = crget(); + cr = svc_xprt_cred(req->rq_xprt); ASSERT(cr != NULL); if (sec_svc_getcred(req, cr, &cs.principal, &cs.nfsflavor) == 0) { DTRACE_NFSV4_2(compound__start, struct compound_state *, &cs, COMPOUND4args *, args); - crfree(cr); DTRACE_NFSV4_2(compound__done, struct compound_state *, &cs, COMPOUND4res *, resp); svcerr_badcred(req->rq_xprt); @@ -5965,8 +5965,6 @@ rfs4_compound(COMPOUND4args *args, COMPOUND4res *resp, struct exportinfo *exi, if (cs.saved_fh.nfs_fh4_val) kmem_free(cs.saved_fh.nfs_fh4_val, NFS4_FHSIZE); - if (cs.basecr) - crfree(cs.basecr); if (cs.cr) crfree(cs.cr); /* diff --git a/usr/src/uts/common/fs/nfs/nfs_server.c b/usr/src/uts/common/fs/nfs/nfs_server.c index b916f727d9..28c079968f 100644 --- a/usr/src/uts/common/fs/nfs/nfs_server.c +++ b/usr/src/uts/common/fs/nfs/nfs_server.c @@ -24,6 +24,7 @@ * Copyright (c) 2013 by Delphix. All rights reserved. * Copyright (c) 2017 Joyent Inc * Copyright 2019 Nexenta by DDN, Inc. + * Copyright 2021 Racktop Systems, Inc. */ /* @@ -1363,11 +1364,6 @@ static struct rpc_disptable rfs_disptable[] = { static int nfs_portmon = 0; #ifdef DEBUG -static int cred_hits = 0; -static int cred_misses = 0; -#endif - -#ifdef DEBUG /* * Debug code to allow disabling of rfs_dispatch() use of * fastxdrargs() and fastxdrres() calls for testing purposes. @@ -1635,25 +1631,7 @@ common_dispatch(struct svc_req *req, SVCXPRT *xprt, rpcvers_t min_vers, else anon_ok = 0; - cr = xprt->xp_cred; - ASSERT(cr != NULL); -#ifdef DEBUG - { - if (crgetref(cr) != 1) { - crfree(cr); - cr = crget(); - xprt->xp_cred = cr; - cred_misses++; - } else - cred_hits++; - } -#else - if (crgetref(cr) != 1) { - crfree(cr); - cr = crget(); - xprt->xp_cred = cr; - } -#endif + cr = svc_xprt_cred(xprt); exi = checkexport(fsid, xfid); diff --git a/usr/src/uts/common/rpc/svc.c b/usr/src/uts/common/rpc/svc.c index 12cd548af3..6acf9bb76d 100644 --- a/usr/src/uts/common/rpc/svc.c +++ b/usr/src/uts/common/rpc/svc.c @@ -23,6 +23,7 @@ * Copyright 2012 Marcel Telka <marcel@telka.sk> * Copyright 2015 Nexenta Systems, Inc. All rights reserved. * Copyright 2018 OmniOS Community Edition (OmniOSce) Association. + * Copyright 2021 Racktop Systems, Inc. */ /* @@ -2868,3 +2869,22 @@ rpc_msg_free(struct rpc_msg **msg, int cb_verf_oa_length) kmem_free(m, sizeof (*m)); m = NULL; } + +/* + * Generally 'cr_ref' should be 1, otherwise reference is kept + * in underlying calls, so reset it. + */ +cred_t * +svc_xprt_cred(SVCXPRT *xprt) +{ + cred_t *cr = xprt->xp_cred; + + ASSERT(cr != NULL); + + if (crgetref(cr) != 1) { + crfree(cr); + cr = crget(); + xprt->xp_cred = cr; + } + return (cr); +} diff --git a/usr/src/uts/common/rpc/svc.h b/usr/src/uts/common/rpc/svc.h index 2ed1ce5e34..28d2f29777 100644 --- a/usr/src/uts/common/rpc/svc.h +++ b/usr/src/uts/common/rpc/svc.h @@ -1158,6 +1158,9 @@ extern SVCXPRT *svc_clone_init(void); extern void svc_clone_free(SVCXPRT *); extern void svc_clone_link(SVCMASTERXPRT *, SVCXPRT *, SVCXPRT *); extern void svc_clone_unlink(SVCXPRT *); + +/* Get cached preallocated cred */ +extern cred_t *svc_xprt_cred(SVCXPRT *); #endif /* _KERNEL */ #ifdef __cplusplus |