summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Mustacchi <rm@joyent.com>2013-03-19 00:16:09 +0000
committerRobert Mustacchi <rm@joyent.com>2013-08-01 10:46:59 -0700
commita29160b0f5f650ae34e2273cacdd3eff15c62fba (patch)
tree04e0019037d3a4ef0b876a1c59dd201bfb877511
parent8f68126c6dc4f2178929233f0c7ccce877e973ca (diff)
downloadillumos-joyent-a29160b0f5f650ae34e2273cacdd3eff15c62fba.tar.gz
3939 parent rn_lock being held across calls to rc_hold
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com> Reviewed by: Gordon Ross <gordon.ross@nexenta.com> Reviewed by: Eric Schrock <eric.schrock@delphix.com> Approved by: Dan McDonald <danmcd@nexenta.com>
-rw-r--r--usr/src/cmd/svc/configd/rc_node.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/usr/src/cmd/svc/configd/rc_node.c b/usr/src/cmd/svc/configd/rc_node.c
index 57b7ebcc69..3cc30e3e67 100644
--- a/usr/src/cmd/svc/configd/rc_node.c
+++ b/usr/src/cmd/svc/configd/rc_node.c
@@ -21,6 +21,7 @@
/*
* Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, Joyent, Inc. All rights reserved.
*/
/*
@@ -6534,7 +6535,15 @@ rc_iter_next(rc_node_iter_t *iter, rc_node_ptr_t *out, uint32_t type)
}
if (pg == NULL) {
+ (void) pthread_mutex_unlock(&np->rn_lock);
rc_node_rele(res);
+ (void) pthread_mutex_lock(&np->rn_lock);
+ if (!rc_node_wait_flag(np, RC_NODE_DYING)) {
+ (void) pthread_mutex_unlock(&np->
+ rn_lock);
+ rc_node_clear(out, 1);
+ return (REP_PROTOCOL_FAIL_DELETED);
+ }
} else {
rc_node_t *cpg;
@@ -6557,9 +6566,21 @@ rc_iter_next(rc_node_iter_t *iter, rc_node_ptr_t *out, uint32_t type)
case REP_PROTOCOL_FAIL_TYPE_MISMATCH:
/* Nevermind. */
+ (void) pthread_mutex_unlock(&np->
+ rn_lock);
rc_node_destroy(cpg);
rc_node_rele(pg);
rc_node_rele(res);
+ (void) pthread_mutex_lock(&np->
+ rn_lock);
+ if (!rc_node_wait_flag(np,
+ RC_NODE_DYING)) {
+ (void) pthread_mutex_unlock(&
+ np->rn_lock);
+ rc_node_clear(out, 1);
+ return
+ (REP_PROTOCOL_FAIL_DELETED);
+ }
break;
case REP_PROTOCOL_FAIL_NO_RESOURCES: