summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/rpc
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/uts/common/rpc
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/uts/common/rpc')
-rw-r--r--usr/src/uts/common/rpc/svc.c20
-rw-r--r--usr/src/uts/common/rpc/svc.h3
2 files changed, 23 insertions, 0 deletions
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