Print this page
3354 kernel crash in rpcsec_gss after using gsscred
Reviewed by: Toomas Soome <tsoome@me.com>
Reviewed by: Carlos Neira <cneirabustos@gmail.com>
Approved by: Robert Mustacchi <rm@joyent.com>
re #12783 rb4338 Flow control is needed in rpcmod when the NFS server is unable to keep up with the network
@@ -18,11 +18,13 @@
*
* CDDL HEADER END
*/
/*
* Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2012 Marcel Telka <marcel@telka.sk>
* Copyright 2013 Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2018 OmniOS Community Edition (OmniOSce) Association.
*/
/* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
/*
* Portions of this source code were derived from Berkeley
@@ -187,11 +189,15 @@
/* destroy a clone xprt */
void (*xp_start)(SVCMASTERXPRT *);
/* `ready-to-receive' */
void (*xp_clone_xprt)(SVCXPRT *, SVCXPRT *);
/* transport specific clone function */
- void (*xp_tattrs) (SVCXPRT *, int, void **);
+ void (*xp_tattrs)(SVCXPRT *, int, void **);
+ /* transport specific hold function */
+ void (*xp_hold)(queue_t *);
+ /* transport specific release function */
+ void (*xp_release)(queue_t *, mblk_t *, bool_t);
};
#define SVC_TATTR_ADDRMASK 1
#else /* _KERNEL */
@@ -530,10 +536,18 @@
#define SVC_CLONE_XPRT(src_xprt, dst_xprt) \
if ((src_xprt)->xp_ops->xp_clone_xprt) \
(*(src_xprt)->xp_ops->xp_clone_xprt) \
(src_xprt, dst_xprt)
+#define SVC_HOLD(xprt) \
+ if ((xprt)->xp_ops->xp_hold) \
+ (*(xprt)->xp_ops->xp_hold)((xprt)->xp_wq)
+
+#define SVC_RELE(xprt, mp, enable) \
+ if ((xprt)->xp_ops->xp_release) \
+ (*(xprt)->xp_ops->xp_release)((xprt)->xp_wq, (mp), (enable))
+
#define SVC_RECV(clone_xprt, mp, msg) \
(*(clone_xprt)->xp_ops->xp_recv)((clone_xprt), (mp), (msg))
/*
* PSARC 2003/523 Contract Private Interface
@@ -726,10 +740,19 @@
extern void xprt_register();
extern void xprt_unregister();
#endif /* __STDC__ */
#endif /* _KERNEL */
+#ifdef _KERNEL
+/*
+ * Transport hold and release.
+ */
+extern void rpcmod_hold(queue_t *);
+extern void rpcmod_release(queue_t *, mblk_t *, bool_t);
+extern void mir_svc_hold(queue_t *);
+extern void mir_svc_release(queue_t *, mblk_t *, bool_t);
+#endif /* _KERNEL */
/*
* When the service routine is called, it must first check to see if it
* knows about the procedure; if not, it should call svcerr_noproc
* and return. If so, it should deserialize its arguments via