summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorVitaliy Gusev <gusev.vitaliy@gmail.com>2021-08-02 02:01:56 +0300
committerRobert Mustacchi <rm@fingolfin.org>2022-01-04 23:28:15 +0000
commit214d537cc1e7896ae3489ebec3ae766e01f32b2a (patch)
treed40b5e2bd08120733745dfe13fcd0640c217f72e /usr/src
parent45ede40b2394db7967e59f19288fae9b62efd4aa (diff)
downloadillumos-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.c6
-rw-r--r--usr/src/uts/common/fs/nfs/nfs_server.c26
-rw-r--r--usr/src/uts/common/rpc/svc.c20
-rw-r--r--usr/src/uts/common/rpc/svc.h3
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