svn commit: r193649 - head/sys/rpc

Rick Macklem rmacklem at FreeBSD.org
Sun Jun 7 20:38:43 UTC 2009


Author: rmacklem
Date: Sun Jun  7 20:38:41 2009
New Revision: 193649
URL: http://svn.freebsd.org/changeset/base/193649

Log:
  Add a check to xprt_unregister() to catch the case where another
  thread has already unregistered the structure. Also add a KASSERT()
  to xprt_unregister_locked() to check that the structure hasn't already
  been unregistered.
  
  Reviewed by:	jhb
  Tested by:	pho
  Approved by:	kib (mentor)

Modified:
  head/sys/rpc/svc.c

Modified: head/sys/rpc/svc.c
==============================================================================
--- head/sys/rpc/svc.c	Sun Jun  7 20:12:14 2009	(r193648)
+++ head/sys/rpc/svc.c	Sun Jun  7 20:38:41 2009	(r193649)
@@ -293,6 +293,8 @@ xprt_unregister_locked(SVCXPRT *xprt)
 {
 	SVCPOOL *pool = xprt->xp_pool;
 
+	KASSERT(xprt->xp_registered == TRUE,
+	    ("xprt_unregister_locked: not registered"));
 	if (xprt->xp_active) {
 		TAILQ_REMOVE(&pool->sp_active, xprt, xp_alink);
 		xprt->xp_active = FALSE;
@@ -307,6 +309,11 @@ xprt_unregister(SVCXPRT *xprt)
 	SVCPOOL *pool = xprt->xp_pool;
 
 	mtx_lock(&pool->sp_lock);
+	if (xprt->xp_registered == FALSE) {
+		/* Already unregistered by another thread */
+		mtx_unlock(&pool->sp_lock);
+		return;
+	}
 	xprt_unregister_locked(xprt);
 	mtx_unlock(&pool->sp_lock);
 


More information about the svn-src-all mailing list