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