diff options
author | Robert Mustacchi <rm@joyent.com> | 2013-03-19 00:16:09 +0000 |
---|---|---|
committer | Robert Mustacchi <rm@joyent.com> | 2013-08-01 10:46:59 -0700 |
commit | a29160b0f5f650ae34e2273cacdd3eff15c62fba (patch) | |
tree | 04e0019037d3a4ef0b876a1c59dd201bfb877511 | |
parent | 8f68126c6dc4f2178929233f0c7ccce877e973ca (diff) | |
download | illumos-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.c | 21 |
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: |