Lines Matching refs:np

604 static void rc_node_no_client_refs(rc_node_t *np);
644 rc_node_match(rc_node_t *np, rc_node_lookup_t *l) in rc_node_match() argument
646 rc_node_lookup_t *r = &np->rn_id; in rc_node_match()
679 rc_node_hold_ephemeral_locked(rc_node_t *np) in rc_node_hold_ephemeral_locked() argument
681 assert(MUTEX_HELD(&np->rn_lock)); in rc_node_hold_ephemeral_locked()
683 ++np->rn_erefs; in rc_node_hold_ephemeral_locked()
697 rc_node_hold_other(rc_node_t *np) in rc_node_hold_other() argument
699 if (atomic_add_32_nv(&np->rn_other_refs, 1) == 1) { in rc_node_hold_other()
700 atomic_add_32(&np->rn_other_refs_held, 1); in rc_node_hold_other()
701 assert(np->rn_other_refs_held > 0); in rc_node_hold_other()
703 assert(np->rn_other_refs > 0); in rc_node_hold_other()
710 rc_node_rele_other(rc_node_t *np) in rc_node_rele_other() argument
712 assert(np->rn_other_refs > 0); in rc_node_rele_other()
713 if (atomic_add_32_nv(&np->rn_other_refs, -1) == 0) { in rc_node_rele_other()
714 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_rele_other()
715 assert(np->rn_other_refs_held > 0); in rc_node_rele_other()
716 if (atomic_add_32_nv(&np->rn_other_refs_held, -1) == 0 && in rc_node_rele_other()
717 np->rn_refs == 0 && (np->rn_flags & RC_NODE_OLD)) { in rc_node_rele_other()
722 rc_node_no_client_refs(np); in rc_node_rele_other()
724 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_rele_other()
730 rc_node_hold_locked(rc_node_t *np) in rc_node_hold_locked() argument
732 assert(MUTEX_HELD(&np->rn_lock)); in rc_node_hold_locked()
734 if (np->rn_refs == 0 && (np->rn_flags & RC_NODE_PARENT_REF)) in rc_node_hold_locked()
735 rc_node_hold_other(np->rn_parent_ref); in rc_node_hold_locked()
736 np->rn_refs++; in rc_node_hold_locked()
737 assert(np->rn_refs > 0); in rc_node_hold_locked()
741 rc_node_hold(rc_node_t *np) in rc_node_hold() argument
743 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_hold()
744 rc_node_hold_locked(np); in rc_node_hold()
745 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_hold()
749 rc_node_rele_locked(rc_node_t *np) in rc_node_rele_locked() argument
754 assert(MUTEX_HELD(&np->rn_lock)); in rc_node_rele_locked()
755 assert(np->rn_refs > 0); in rc_node_rele_locked()
757 if (--np->rn_refs == 0) { in rc_node_rele_locked()
758 if (np->rn_flags & RC_NODE_PARENT_REF) in rc_node_rele_locked()
759 par_ref = np->rn_parent_ref; in rc_node_rele_locked()
765 if (np->rn_id.rl_type == REP_PROTOCOL_ENTITY_CPROPERTYGRP) in rc_node_rele_locked()
766 np->rn_flags |= RC_NODE_DEAD; in rc_node_rele_locked()
768 if ((np->rn_flags & (RC_NODE_DEAD|RC_NODE_OLD)) && in rc_node_rele_locked()
769 np->rn_other_refs == 0 && np->rn_other_refs_held == 0) in rc_node_rele_locked()
778 rc_node_no_client_refs(np); in rc_node_rele_locked()
786 if (np->rn_erefs > 0) in rc_node_rele_locked()
787 --np->rn_erefs; in rc_node_rele_locked()
788 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_rele_locked()
796 rc_node_rele(rc_node_t *np) in rc_node_rele() argument
798 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_rele()
799 rc_node_rele_locked(np); in rc_node_rele()
820 rc_node_t *np; in cache_lookup_unlocked() local
825 for (np = bp->cb_head; np != NULL; np = np->rn_hash_next) { in cache_lookup_unlocked()
826 if (np->rn_hash == h && rc_node_match(np, lp)) { in cache_lookup_unlocked()
827 rc_node_hold(np); in cache_lookup_unlocked()
828 return (np); in cache_lookup_unlocked()
840 rc_node_t *np; in cache_lookup() local
845 np = cache_lookup_unlocked(bp, lp); in cache_lookup()
849 return (np); in cache_lookup()
853 cache_insert_unlocked(cache_bucket_t *bp, rc_node_t *np) in cache_insert_unlocked() argument
856 assert(np->rn_hash == rc_node_hash(&np->rn_id)); in cache_insert_unlocked()
857 assert(bp == CACHE_BUCKET(np->rn_hash)); in cache_insert_unlocked()
859 assert(np->rn_hash_next == NULL); in cache_insert_unlocked()
861 np->rn_hash_next = bp->cb_head; in cache_insert_unlocked()
862 bp->cb_head = np; in cache_insert_unlocked()
866 cache_remove_unlocked(cache_bucket_t *bp, rc_node_t *np) in cache_remove_unlocked() argument
871 assert(np->rn_hash == rc_node_hash(&np->rn_id)); in cache_remove_unlocked()
872 assert(bp == CACHE_BUCKET(np->rn_hash)); in cache_remove_unlocked()
875 if (*npp == np) in cache_remove_unlocked()
878 assert(*npp == np); in cache_remove_unlocked()
879 *npp = np->rn_hash_next; in cache_remove_unlocked()
880 np->rn_hash_next = NULL; in cache_remove_unlocked()
941 rc_node_free_fmri(rc_node_t *np) in rc_node_free_fmri() argument
943 if (np->rn_fmri != NULL) { in rc_node_free_fmri()
944 free((void *)np->rn_fmri); in rc_node_free_fmri()
945 np->rn_fmri = NULL; in rc_node_free_fmri()
1049 rc_node_get_fmri_or_fragment(rc_node_t *np, char *buf, size_t bufsize, in rc_node_get_fmri_or_fragment() argument
1059 if (np->rn_fmri == NULL) { in rc_node_get_fmri_or_fragment()
1068 assert(np->rn_parent == NULL); in rc_node_get_fmri_or_fragment()
1069 r = rc_concat_fmri_element(buf, bufsize, &fmri_len, np->rn_name, in rc_node_get_fmri_or_fragment()
1070 np->rn_id.rl_type); in rc_node_get_fmri_or_fragment()
1075 fmri_len = strlcpy(buf, np->rn_fmri, bufsize); in rc_node_get_fmri_or_fragment()
1099 rc_node_build_fmri(rc_node_t *np) in rc_node_build_fmri() argument
1106 assert(MUTEX_HELD(&np->rn_lock)); in rc_node_build_fmri()
1107 assert(np->rn_flags & RC_NODE_USING_PARENT); in rc_node_build_fmri()
1109 rc_node_free_fmri(np); in rc_node_build_fmri()
1111 rc = rc_node_get_fmri_or_fragment(np->rn_parent, fmri, sz, &actual); in rc_node_build_fmri()
1114 if (np->rn_name != NULL) { in rc_node_build_fmri()
1115 rc = rc_concat_fmri_element(fmri, sz, &actual, np->rn_name, in rc_node_build_fmri()
1116 np->rn_id.rl_type); in rc_node_build_fmri()
1118 np->rn_fmri = strdup(fmri); in rc_node_build_fmri()
1120 np->rn_fmri = strdup(fmri); in rc_node_build_fmri()
1122 if (np->rn_fmri == NULL) { in rc_node_build_fmri()
1144 rc_get_fmri_and_concat(rc_node_t *np, char *fmri, size_t size, size_t *sz_out, in rc_get_fmri_and_concat() argument
1149 if ((rc = rc_node_get_fmri_or_fragment(np, fmri, size, sz_out)) != in rc_get_fmri_and_concat()
1162 rc_notify_info_interested(rc_notify_info_t *rnip, rc_notify_t *np) in rc_notify_info_interested() argument
1164 rc_node_t *nnp = np->rcn_node; in rc_notify_info_interested()
1169 if (np->rcn_delete != NULL) { in rc_notify_info_interested()
1170 assert(np->rcn_info == NULL && np->rcn_node == NULL); in rc_notify_info_interested()
1173 if (np->rcn_node == NULL) { in rc_notify_info_interested()
1174 assert(np->rcn_info != NULL || np->rcn_delete != NULL); in rc_notify_info_interested()
1177 assert(np->rcn_info == NULL); in rc_notify_info_interested()
1195 rc_notify_t *np = &nnp->rn_notify; in rc_notify_insert_node() local
1199 assert(np->rcn_info == NULL); in rc_notify_insert_node()
1205 np->rcn_node = nnp; in rc_notify_insert_node()
1208 if (rc_notify_info_interested(nip, np)) { in rc_notify_insert_node()
1214 (void) uu_list_insert_before(rc_notify_list, NULL, np); in rc_notify_insert_node()
1216 np->rcn_node = NULL; in rc_notify_insert_node()
1250 rc_notify_t *np = &nnp->rn_notify; in rc_notify_remove_node() local
1252 assert(np->rcn_info == NULL); in rc_notify_remove_node()
1256 while (np->rcn_node != NULL) { in rc_notify_remove_node()
1262 (void) uu_list_remove(rc_notify_list, np); in rc_notify_remove_node()
1263 np->rcn_node = NULL; in rc_notify_remove_node()
1270 rc_notify_remove_locked(rc_notify_t *np) in rc_notify_remove_locked() argument
1275 (void) uu_list_remove(rc_notify_list, np); in rc_notify_remove_locked()
1276 if (np->rcn_node) { in rc_notify_remove_locked()
1277 np->rcn_node = NULL; in rc_notify_remove_locked()
1278 } else if (np->rcn_delete) { in rc_notify_remove_locked()
1279 uu_free(np->rcn_delete); in rc_notify_remove_locked()
1628 rc_node_hold_flag(rc_node_t *np, uint32_t flag) in rc_node_hold_flag() argument
1630 assert(MUTEX_HELD(&np->rn_lock)); in rc_node_hold_flag()
1633 while (!(np->rn_flags & RC_NODE_DEAD) && (np->rn_flags & flag)) { in rc_node_hold_flag()
1634 (void) pthread_cond_wait(&np->rn_cv, &np->rn_lock); in rc_node_hold_flag()
1636 if (np->rn_flags & RC_NODE_DEAD) in rc_node_hold_flag()
1639 np->rn_flags |= flag; in rc_node_hold_flag()
1644 rc_node_rele_flag(rc_node_t *np, uint32_t flag) in rc_node_rele_flag() argument
1647 assert(MUTEX_HELD(&np->rn_lock)); in rc_node_rele_flag()
1648 assert((np->rn_flags & flag) == flag); in rc_node_rele_flag()
1649 np->rn_flags &= ~flag; in rc_node_rele_flag()
1650 (void) pthread_cond_broadcast(&np->rn_cv); in rc_node_rele_flag()
1657 rc_node_wait_flag(rc_node_t *np, uint32_t flag) in rc_node_wait_flag() argument
1659 assert(MUTEX_HELD(&np->rn_lock)); in rc_node_wait_flag()
1660 while (!(np->rn_flags & RC_NODE_DEAD) && (np->rn_flags & flag)) in rc_node_wait_flag()
1661 (void) pthread_cond_wait(&np->rn_cv, &np->rn_lock); in rc_node_wait_flag()
1663 return (!(np->rn_flags & RC_NODE_DEAD)); in rc_node_wait_flag()
1677 rc_node_hold_parent_flag(rc_node_t *np, uint32_t flag) in rc_node_hold_parent_flag() argument
1681 assert(MUTEX_HELD(&np->rn_lock)); in rc_node_hold_parent_flag()
1682 assert(np->rn_flags & RC_NODE_USING_PARENT); in rc_node_hold_parent_flag()
1684 if ((pp = np->rn_parent) == NULL) { in rc_node_hold_parent_flag()
1685 rc_node_rele_flag(np, RC_NODE_USING_PARENT); in rc_node_hold_parent_flag()
1686 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_hold_parent_flag()
1689 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_hold_parent_flag()
1692 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_hold_parent_flag()
1693 rc_node_rele_flag(np, RC_NODE_USING_PARENT); in rc_node_hold_parent_flag()
1694 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_hold_parent_flag()
1706 rc_node_t *np = uu_zalloc(sizeof (*np)); in rc_node_alloc() local
1708 if (np == NULL) in rc_node_alloc()
1711 (void) pthread_mutex_init(&np->rn_lock, NULL); in rc_node_alloc()
1712 (void) pthread_cond_init(&np->rn_cv, NULL); in rc_node_alloc()
1714 np->rn_children = uu_list_create(rc_children_pool, np, 0); in rc_node_alloc()
1715 np->rn_pg_notify_list = uu_list_create(rc_pg_notify_pool, np, 0); in rc_node_alloc()
1717 uu_list_node_init(np, &np->rn_sibling_node, rc_children_pool); in rc_node_alloc()
1719 uu_list_node_init(&np->rn_notify, &np->rn_notify.rcn_list_node, in rc_node_alloc()
1722 return (np); in rc_node_alloc()
1726 rc_node_destroy(rc_node_t *np) in rc_node_destroy() argument
1730 if (np->rn_flags & RC_NODE_UNREFED) in rc_node_destroy()
1733 assert(np->rn_refs == 0 && np->rn_other_refs == 0); in rc_node_destroy()
1734 assert(np->rn_former == NULL); in rc_node_destroy()
1736 if (np->rn_id.rl_type == REP_PROTOCOL_ENTITY_CPROPERTYGRP) { in rc_node_destroy()
1740 if (np->rn_cchain[i] != NULL) in rc_node_destroy()
1741 rc_node_rele(np->rn_cchain[i]); in rc_node_destroy()
1745 if (np->rn_name != NULL) in rc_node_destroy()
1746 free((void *)np->rn_name); in rc_node_destroy()
1747 np->rn_name = NULL; in rc_node_destroy()
1748 if (np->rn_type != NULL) in rc_node_destroy()
1749 free((void *)np->rn_type); in rc_node_destroy()
1750 np->rn_type = NULL; in rc_node_destroy()
1751 if (np->rn_values != NULL) in rc_node_destroy()
1752 object_free_values(np->rn_values, np->rn_valtype, in rc_node_destroy()
1753 np->rn_values_count, np->rn_values_size); in rc_node_destroy()
1754 np->rn_values = NULL; in rc_node_destroy()
1755 rc_node_free_fmri(np); in rc_node_destroy()
1757 if (np->rn_snaplevel != NULL) in rc_node_destroy()
1758 rc_snaplevel_rele(np->rn_snaplevel); in rc_node_destroy()
1759 np->rn_snaplevel = NULL; in rc_node_destroy()
1761 uu_list_node_fini(np, &np->rn_sibling_node, rc_children_pool); in rc_node_destroy()
1763 uu_list_node_fini(&np->rn_notify, &np->rn_notify.rcn_list_node, in rc_node_destroy()
1766 assert(uu_list_first(np->rn_children) == NULL); in rc_node_destroy()
1767 uu_list_destroy(np->rn_children); in rc_node_destroy()
1768 uu_list_destroy(np->rn_pg_notify_list); in rc_node_destroy()
1770 (void) pthread_mutex_destroy(&np->rn_lock); in rc_node_destroy()
1771 (void) pthread_cond_destroy(&np->rn_cv); in rc_node_destroy()
1773 uu_free(np); in rc_node_destroy()
1785 rc_node_link_child(rc_node_t *np, rc_node_t *cp) in rc_node_link_child() argument
1787 assert(!MUTEX_HELD(&np->rn_lock)); in rc_node_link_child()
1790 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_link_child()
1795 assert(rc_check_parent_child(np->rn_id.rl_type, cp->rn_id.rl_type) == in rc_node_link_child()
1798 cp->rn_parent = np; in rc_node_link_child()
1800 (void) uu_list_insert_before(np->rn_children, NULL, cp); in rc_node_link_child()
1803 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_link_child()
1817 rc_node_setup_parent_ref(rc_node_t *np, rc_node_t *pp) in rc_node_setup_parent_ref() argument
1821 assert(MUTEX_HELD(&np->rn_lock)); in rc_node_setup_parent_ref()
1823 for (cp = uu_list_first(np->rn_children); cp != NULL; in rc_node_setup_parent_ref()
1824 cp = uu_list_next(np->rn_children, cp)) { in rc_node_setup_parent_ref()
1859 rc_node_relink_child(rc_node_t *pp, rc_node_t *np, rc_node_t *newp) in rc_node_relink_child() argument
1867 cache_remove_unlocked(bp, np); in rc_node_relink_child()
1882 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_relink_child()
1883 assert(np->rn_flags & RC_NODE_IN_PARENT); in rc_node_relink_child()
1884 assert(np->rn_flags & RC_NODE_OLD); in rc_node_relink_child()
1885 assert(np->rn_flags & RC_NODE_IN_TX); in rc_node_relink_child()
1894 (void) uu_list_insert_after(pp->rn_children, np, newp); in rc_node_relink_child()
1896 (void) uu_list_remove(pp->rn_children, np); in rc_node_relink_child()
1901 newp->rn_former = np; in rc_node_relink_child()
1902 np->rn_parent = NULL; in rc_node_relink_child()
1903 np->rn_flags &= ~RC_NODE_IN_PARENT; in rc_node_relink_child()
1904 np->rn_flags |= RC_NODE_ON_FORMER; in rc_node_relink_child()
1912 rc_node_setup_parent_ref(np, np); in rc_node_relink_child()
1913 rc_node_rele_flag(np, RC_NODE_IN_TX); in rc_node_relink_child()
1914 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_relink_child()
1926 rc_node_t *np; in rc_node_setup() local
1933 if ((np = cache_lookup_unlocked(bp, nip)) != NULL) { in rc_node_setup()
1939 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_setup()
1940 if (rc_node_hold_flag(np, RC_NODE_USING_PARENT)) { in rc_node_setup()
1941 assert(np->rn_parent == pp); in rc_node_setup()
1942 assert(memcmp(&np->rn_id, nip, sizeof (*nip)) == 0); in rc_node_setup()
1943 assert(strcmp(np->rn_name, name) == 0); in rc_node_setup()
1944 assert(np->rn_type == NULL); in rc_node_setup()
1945 assert(np->rn_flags & RC_NODE_IN_PARENT); in rc_node_setup()
1946 rc_node_rele_flag(np, RC_NODE_USING_PARENT); in rc_node_setup()
1948 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_setup()
1951 return (np); in rc_node_setup()
1957 np = cp; in rc_node_setup()
1958 rc_node_hold(np); in rc_node_setup()
1959 np->rn_id = *nip; in rc_node_setup()
1960 np->rn_hash = h; in rc_node_setup()
1961 np->rn_name = strdup(name); in rc_node_setup()
1963 np->rn_flags |= RC_NODE_USING_PARENT; in rc_node_setup()
1965 if (np->rn_id.rl_type == REP_PROTOCOL_ENTITY_INSTANCE) { in rc_node_setup()
1967 np->rn_cchain[0] = np; in rc_node_setup()
1968 np->rn_cchain[1] = pp; in rc_node_setup()
1974 cache_insert_unlocked(bp, np); in rc_node_setup()
1977 rc_node_link_child(pp, np); in rc_node_setup()
1979 return (np); in rc_node_setup()
1991 rc_node_t *np; in rc_node_setup_snapshot() local
1998 if ((np = cache_lookup_unlocked(bp, nip)) != NULL) { in rc_node_setup_snapshot()
2004 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_setup_snapshot()
2005 if (rc_node_hold_flag(np, RC_NODE_USING_PARENT)) { in rc_node_setup_snapshot()
2006 assert(np->rn_parent == pp); in rc_node_setup_snapshot()
2007 assert(memcmp(&np->rn_id, nip, sizeof (*nip)) == 0); in rc_node_setup_snapshot()
2008 assert(strcmp(np->rn_name, name) == 0); in rc_node_setup_snapshot()
2009 assert(np->rn_type == NULL); in rc_node_setup_snapshot()
2010 assert(np->rn_flags & RC_NODE_IN_PARENT); in rc_node_setup_snapshot()
2011 rc_node_rele_flag(np, RC_NODE_USING_PARENT); in rc_node_setup_snapshot()
2013 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_setup_snapshot()
2016 return (np); in rc_node_setup_snapshot()
2022 np = cp; in rc_node_setup_snapshot()
2023 rc_node_hold(np); in rc_node_setup_snapshot()
2024 np->rn_id = *nip; in rc_node_setup_snapshot()
2025 np->rn_hash = h; in rc_node_setup_snapshot()
2026 np->rn_name = strdup(name); in rc_node_setup_snapshot()
2027 np->rn_snapshot_id = snap_id; in rc_node_setup_snapshot()
2029 np->rn_flags |= RC_NODE_USING_PARENT; in rc_node_setup_snapshot()
2031 cache_insert_unlocked(bp, np); in rc_node_setup_snapshot()
2034 rc_node_link_child(pp, np); in rc_node_setup_snapshot()
2036 return (np); in rc_node_setup_snapshot()
2048 rc_node_t *np; in rc_node_setup_snaplevel() local
2055 if ((np = cache_lookup_unlocked(bp, nip)) != NULL) { in rc_node_setup_snaplevel()
2061 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_setup_snaplevel()
2062 if (rc_node_hold_flag(np, RC_NODE_USING_PARENT)) { in rc_node_setup_snaplevel()
2063 assert(np->rn_parent == pp); in rc_node_setup_snaplevel()
2064 assert(memcmp(&np->rn_id, nip, sizeof (*nip)) == 0); in rc_node_setup_snaplevel()
2065 assert(np->rn_name == NULL); in rc_node_setup_snaplevel()
2066 assert(np->rn_type == NULL); in rc_node_setup_snaplevel()
2067 assert(np->rn_flags & RC_NODE_IN_PARENT); in rc_node_setup_snaplevel()
2068 rc_node_rele_flag(np, RC_NODE_USING_PARENT); in rc_node_setup_snaplevel()
2070 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_setup_snaplevel()
2073 return (np); in rc_node_setup_snaplevel()
2079 np = cp; in rc_node_setup_snaplevel()
2080 rc_node_hold(np); /* released in snapshot_fill_children() */ in rc_node_setup_snaplevel()
2081 np->rn_id = *nip; in rc_node_setup_snaplevel()
2082 np->rn_hash = h; in rc_node_setup_snaplevel()
2085 np->rn_snaplevel = lvl; in rc_node_setup_snaplevel()
2087 np->rn_flags |= RC_NODE_USING_PARENT; in rc_node_setup_snaplevel()
2089 cache_insert_unlocked(bp, np); in rc_node_setup_snaplevel()
2094 pp->rn_cchain[lvl->rsl_level_num - 1] = np; in rc_node_setup_snaplevel()
2096 rc_node_link_child(pp, np); in rc_node_setup_snaplevel()
2098 return (np); in rc_node_setup_snaplevel()
2108 rc_node_t *np; in rc_node_setup_pg() local
2113 if ((np = cache_lookup_unlocked(bp, nip)) != NULL) { in rc_node_setup_pg()
2122 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_setup_pg()
2123 if (rc_node_hold_flag(np, RC_NODE_USING_PARENT)) { in rc_node_setup_pg()
2124 assert(memcmp(&np->rn_id, nip, sizeof (*nip)) == 0); in rc_node_setup_pg()
2125 assert(strcmp(np->rn_name, name) == 0); in rc_node_setup_pg()
2126 assert(strcmp(np->rn_type, type) == 0); in rc_node_setup_pg()
2127 assert(np->rn_pgflags == flags); in rc_node_setup_pg()
2128 assert(np->rn_flags & RC_NODE_IN_PARENT); in rc_node_setup_pg()
2129 rc_node_rele_flag(np, RC_NODE_USING_PARENT); in rc_node_setup_pg()
2131 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_setup_pg()
2134 return (np); in rc_node_setup_pg()
2137 np = cp; in rc_node_setup_pg()
2138 rc_node_hold(np); /* released in fill_pg_callback() */ in rc_node_setup_pg()
2139 np->rn_id = *nip; in rc_node_setup_pg()
2140 np->rn_hash = h; in rc_node_setup_pg()
2141 np->rn_name = strdup(name); in rc_node_setup_pg()
2142 if (np->rn_name == NULL) { in rc_node_setup_pg()
2143 rc_node_rele(np); in rc_node_setup_pg()
2146 np->rn_type = strdup(type); in rc_node_setup_pg()
2147 if (np->rn_type == NULL) { in rc_node_setup_pg()
2148 free((void *)np->rn_name); in rc_node_setup_pg()
2149 rc_node_rele(np); in rc_node_setup_pg()
2152 np->rn_pgflags = flags; in rc_node_setup_pg()
2153 np->rn_gen_id = gen_id; in rc_node_setup_pg()
2155 np->rn_flags |= RC_NODE_USING_PARENT; in rc_node_setup_pg()
2157 cache_insert_unlocked(bp, np); in rc_node_setup_pg()
2160 rc_node_link_child(pp, np); in rc_node_setup_pg()
2162 return (np); in rc_node_setup_pg()
2204 rc_node_t *np; in rc_node_create_property() local
2209 if ((np = cache_lookup_unlocked(bp, nip)) != NULL) { in rc_node_create_property()
2214 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_create_property()
2215 if (rc_node_hold_flag(np, RC_NODE_USING_PARENT)) { in rc_node_create_property()
2216 assert(np->rn_parent == pp); in rc_node_create_property()
2217 assert(memcmp(&np->rn_id, nip, sizeof (*nip)) == 0); in rc_node_create_property()
2218 assert(strcmp(np->rn_name, name) == 0); in rc_node_create_property()
2219 assert(np->rn_valtype == type); in rc_node_create_property()
2220 assert(np->rn_values_count == count); in rc_node_create_property()
2221 assert(np->rn_values_size == size); in rc_node_create_property()
2223 memcmp(np->rn_values, vals, size) == 0); in rc_node_create_property()
2224 assert(np->rn_flags & RC_NODE_IN_PARENT); in rc_node_create_property()
2225 rc_node_rele_flag(np, RC_NODE_USING_PARENT); in rc_node_create_property()
2227 rc_node_rele_locked(np); in rc_node_create_property()
2235 np = rc_node_alloc(); in rc_node_create_property()
2236 if (np == NULL) { in rc_node_create_property()
2241 np->rn_id = *nip; in rc_node_create_property()
2242 np->rn_hash = h; in rc_node_create_property()
2243 np->rn_name = strdup(name); in rc_node_create_property()
2244 if (np->rn_name == NULL) { in rc_node_create_property()
2250 np->rn_valtype = type; in rc_node_create_property()
2251 np->rn_values = vals; in rc_node_create_property()
2252 np->rn_values_count = count; in rc_node_create_property()
2253 np->rn_values_size = size; in rc_node_create_property()
2255 np->rn_flags |= RC_NODE_USING_PARENT; in rc_node_create_property()
2257 cache_insert_unlocked(bp, np); in rc_node_create_property()
2260 rc_node_link_child(pp, np); in rc_node_create_property()
2354 rc_node_t *np; in rc_node_init() local
2401 if ((np = rc_node_alloc()) == NULL) in rc_node_init()
2404 rc_node_hold(np); in rc_node_init()
2405 np->rn_id.rl_type = REP_PROTOCOL_ENTITY_SCOPE; in rc_node_init()
2406 np->rn_id.rl_backend = BACKEND_TYPE_NORMAL; in rc_node_init()
2407 np->rn_hash = rc_node_hash(&np->rn_id); in rc_node_init()
2408 np->rn_name = "localhost"; in rc_node_init()
2410 bp = cache_hold(np->rn_hash); in rc_node_init()
2411 cache_insert_unlocked(bp, np); in rc_node_init()
2414 rc_scope = np; in rc_node_init()
2426 rc_node_fill_children(rc_node_t *np, uint32_t type) in rc_node_fill_children() argument
2430 assert(MUTEX_HELD(&np->rn_lock)); in rc_node_fill_children()
2432 if ((rc = rc_check_parent_child(np->rn_id.rl_type, type)) != in rc_node_fill_children()
2436 if (!rc_node_hold_flag(np, RC_NODE_CHILDREN_CHANGING)) in rc_node_fill_children()
2439 if (np->rn_flags & RC_NODE_HAS_CHILDREN) { in rc_node_fill_children()
2440 rc_node_rele_flag(np, RC_NODE_CHILDREN_CHANGING); in rc_node_fill_children()
2444 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_fill_children()
2445 rc = object_fill_children(np); in rc_node_fill_children()
2446 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_fill_children()
2449 np->rn_flags |= RC_NODE_HAS_CHILDREN; in rc_node_fill_children()
2451 rc_node_rele_flag(np, RC_NODE_CHILDREN_CHANGING); in rc_node_fill_children()
2465 rc_node_find_named_child(rc_node_t *np, const char *name, uint32_t type, in rc_node_find_named_child() argument
2471 assert(MUTEX_HELD(&np->rn_lock)); in rc_node_find_named_child()
2472 assert(np->rn_id.rl_type != REP_PROTOCOL_ENTITY_CPROPERTYGRP); in rc_node_find_named_child()
2474 ret = rc_node_fill_children(np, type); in rc_node_find_named_child()
2478 for (cp = uu_list_first(np->rn_children); in rc_node_find_named_child()
2480 cp = uu_list_next(np->rn_children, cp)) { in rc_node_find_named_child()
2502 rc_node_find_ancestor(rc_node_t *np, uint32_t type, rc_node_t **app) in rc_node_find_ancestor() argument
2510 np_orig = np; in rc_node_find_ancestor()
2512 while (np->rn_id.rl_type > type) { in rc_node_find_ancestor()
2513 ret = rc_node_parent(np, &parent); in rc_node_find_ancestor()
2514 if (np != np_orig) in rc_node_find_ancestor()
2515 rc_node_rele(np); in rc_node_find_ancestor()
2518 np = parent; in rc_node_find_ancestor()
2521 if (np->rn_id.rl_type == type) { in rc_node_find_ancestor()
2808 rc_node_check_and_lock(rc_node_t *np) in rc_node_check_and_lock() argument
2811 if (np == NULL) in rc_node_check_and_lock()
2814 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_check_and_lock()
2815 if (!rc_node_wait_flag(np, RC_NODE_DYING)) { in rc_node_check_and_lock()
2817 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_check_and_lock()
2831 rc_node_t *np = npp->rnp_node; in rc_node_ptr_check_and_lock() local
2832 if (np == NULL) { in rc_node_ptr_check_and_lock()
2840 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_ptr_check_and_lock()
2841 if (!rc_node_wait_flag(np, RC_NODE_DYING)) { in rc_node_ptr_check_and_lock()
2842 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_ptr_check_and_lock()
2847 return (np); in rc_node_ptr_check_and_lock()
2867 #define RC_NODE_PTR_GET_CHECK_AND_LOCK(np, npp) { \ argument
2869 if (((np) = rc_node_ptr_check_and_lock(npp, &rc__res)) == NULL) \
2873 #define RC_NODE_PTR_CHECK_LOCK_OR_FREE_RETURN(np, npp, mem) { \ argument
2875 if (((np) = rc_node_ptr_check_and_lock(npp, &rc__res)) == \
2883 #define RC_NODE_PTR_GET_CHECK(np, npp) { \ argument
2884 RC_NODE_PTR_GET_CHECK_AND_LOCK(np, npp); \
2885 (void) pthread_mutex_unlock(&(np)->rn_lock); \
2888 #define RC_NODE_PTR_GET_CHECK_AND_HOLD(np, npp) { \ argument
2889 RC_NODE_PTR_GET_CHECK_AND_LOCK(np, npp); \
2890 rc_node_hold_locked(np); \
2891 (void) pthread_mutex_unlock(&(np)->rn_lock); \
2894 #define HOLD_FLAG_OR_RETURN(np, flag) { \ argument
2895 assert(MUTEX_HELD(&(np)->rn_lock)); \
2896 assert(!((np)->rn_flags & RC_NODE_DEAD)); \
2897 if (!rc_node_hold_flag((np), flag)) { \
2898 (void) pthread_mutex_unlock(&(np)->rn_lock); \
2903 #define HOLD_PTR_FLAG_OR_FREE_AND_RETURN(np, npp, flag, mem) { \ argument
2904 assert(MUTEX_HELD(&(np)->rn_lock)); \
2905 if (!rc_node_hold_flag((np), flag)) { \
2906 (void) pthread_mutex_unlock(&(np)->rn_lock); \
2907 assert((np) == (npp)->rnp_node); \
2941 rc_node_t *np; in rc_scope_parent_scope() local
2945 RC_NODE_PTR_GET_CHECK(np, npp); in rc_scope_parent_scope()
2970 rc_node_t *np; in rc_node_name() local
2974 RC_NODE_PTR_GET_CHECK(np, npp); in rc_node_name()
2976 if (np->rn_id.rl_type == REP_PROTOCOL_ENTITY_CPROPERTYGRP) { in rc_node_name()
2977 np = np->rn_cchain[0]; in rc_node_name()
2978 RC_NODE_CHECK(np); in rc_node_name()
2983 if (np->rn_name == NULL) in rc_node_name()
2985 actual = strlcpy(buf, np->rn_name, sz); in rc_node_name()
2988 if (np->rn_id.rl_type != REP_PROTOCOL_ENTITY_PROPERTYGRP) in rc_node_name()
2990 actual = strlcpy(buf, np->rn_type, sz); in rc_node_name()
2993 if (np->rn_id.rl_type != REP_PROTOCOL_ENTITY_PROPERTYGRP) in rc_node_name()
2995 actual = snprintf(buf, sz, "%d", np->rn_pgflags); in rc_node_name()
2998 if (np->rn_id.rl_type != REP_PROTOCOL_ENTITY_SNAPLEVEL) in rc_node_name()
3000 actual = strlcpy(buf, np->rn_snaplevel->rsl_scope, sz); in rc_node_name()
3003 if (np->rn_id.rl_type != REP_PROTOCOL_ENTITY_SNAPLEVEL) in rc_node_name()
3005 actual = strlcpy(buf, np->rn_snaplevel->rsl_service, sz); in rc_node_name()
3008 if (np->rn_id.rl_type != REP_PROTOCOL_ENTITY_SNAPLEVEL) in rc_node_name()
3010 if (np->rn_snaplevel->rsl_instance == NULL) in rc_node_name()
3012 actual = strlcpy(buf, np->rn_snaplevel->rsl_instance, sz); in rc_node_name()
3018 if (np->rn_id.rl_type != REP_PROTOCOL_ENTITY_PROPERTYGRP) in rc_node_name()
3020 ret = rc_node_pg_check_read_protect(np); in rc_node_name()
3047 rc_node_t *np; in rc_node_get_property_type() local
3049 RC_NODE_PTR_GET_CHECK(np, npp); in rc_node_get_property_type()
3051 if (np->rn_id.rl_type != REP_PROTOCOL_ENTITY_PROPERTY) in rc_node_get_property_type()
3054 *out = np->rn_valtype; in rc_node_get_property_type()
3064 rc_node_parent(rc_node_t *np, rc_node_t **out) in rc_node_parent() argument
3069 if (np->rn_id.rl_type != REP_PROTOCOL_ENTITY_CPROPERTYGRP) { in rc_node_parent()
3070 RC_NODE_CHECK_AND_LOCK(np); in rc_node_parent()
3072 np = np->rn_cchain[0]; in rc_node_parent()
3073 RC_NODE_CHECK_AND_LOCK(np); in rc_node_parent()
3076 np_orig = np; in rc_node_parent()
3077 rc_node_hold_locked(np); /* simplifies the remainder */ in rc_node_parent()
3080 if (!rc_node_wait_flag(np, in rc_node_parent()
3082 rc_node_rele_locked(np); in rc_node_parent()
3086 if (!(np->rn_flags & RC_NODE_OLD)) in rc_node_parent()
3089 rc_node_rele_locked(np); in rc_node_parent()
3090 np = cache_lookup(&np_orig->rn_id); in rc_node_parent()
3091 assert(np != np_orig); in rc_node_parent()
3093 if (np == NULL) in rc_node_parent()
3095 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_parent()
3099 if (!rc_node_hold_flag(np, RC_NODE_USING_PARENT)) { in rc_node_parent()
3100 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_parent()
3102 rc_node_rele(np); in rc_node_parent()
3106 assert(np->rn_parent != NULL); in rc_node_parent()
3107 pnp = np->rn_parent; in rc_node_parent()
3108 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_parent()
3111 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_parent()
3112 rc_node_rele_flag(np, RC_NODE_USING_PARENT); in rc_node_parent()
3113 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_parent()
3119 rc_node_rele(np); in rc_node_parent()
3124 rc_node_rele(np); in rc_node_parent()
3136 rc_node_t *np; in rc_node_ptr_parent() local
3138 RC_NODE_PTR_GET_CHECK(np, npp); in rc_node_ptr_parent()
3140 return (rc_node_parent(np, out)); in rc_node_ptr_parent()
3213 rc_node_t *np, *cp; in rc_node_get_child() local
3217 RC_NODE_PTR_GET_CHECK_AND_LOCK(np, npp); in rc_node_get_child()
3219 if (np->rn_id.rl_type != REP_PROTOCOL_ENTITY_CPROPERTYGRP) { in rc_node_get_child()
3220 ret = rc_node_find_named_child(np, name, type, &child); in rc_node_get_child()
3222 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_get_child()
3225 cp = np->rn_cchain[idx]; in rc_node_get_child()
3240 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_get_child()
3243 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_get_child()
3261 rc_node_t *np = npp->rnp_node; in rc_node_update() local
3265 if (np != NULL && in rc_node_update()
3266 np->rn_id.rl_type == REP_PROTOCOL_ENTITY_CPROPERTYGRP) { in rc_node_update()
3272 cpg = np; in rc_node_update()
3273 np = np->rn_cchain[0]; in rc_node_update()
3276 RC_NODE_CHECK(np); in rc_node_update()
3278 if (np->rn_id.rl_type != REP_PROTOCOL_ENTITY_PROPERTYGRP && in rc_node_update()
3279 np->rn_id.rl_type != REP_PROTOCOL_ENTITY_SNAPSHOT) in rc_node_update()
3283 bp = cache_hold(np->rn_hash); in rc_node_update()
3284 nnp = cache_lookup_unlocked(bp, &np->rn_id); in rc_node_update()
3310 if (nnp != np && cpg == NULL) in rc_node_update()
3319 if (nnp != np && cpg == NULL) in rc_node_update()
3324 return ((nnp == np)? REP_PROTOCOL_SUCCESS : REP_PROTOCOL_DONE); in rc_node_update()
3882 rc_node_t *np; in rc_node_create_child() local
3915 RC_NODE_PTR_CHECK_LOCK_OR_FREE_RETURN(np, npp, audit_data.ed_auth); in rc_node_create_child()
3923 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_create_child()
3928 if (np->rn_id.rl_type == REP_PROTOCOL_ENTITY_CPROPERTYGRP) { in rc_node_create_child()
3929 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_create_child()
3930 np = np->rn_cchain[0]; in rc_node_create_child()
3931 if ((rc = rc_node_check_and_lock(np)) != REP_PROTOCOL_SUCCESS) { in rc_node_create_child()
3937 if ((rc = rc_check_parent_child(np->rn_id.rl_type, type)) != in rc_node_create_child()
3939 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_create_child()
3944 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_create_child()
3949 if ((rc = rc_get_fmri_and_concat(np, fmri, sizeof (fmri), &sz_out, in rc_node_create_child()
3951 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_create_child()
3956 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_create_child()
3963 HOLD_PTR_FLAG_OR_FREE_AND_RETURN(np, npp, RC_NODE_CREATING_CHILD, in rc_node_create_child()
3965 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_create_child()
3967 rc = object_create(np, type, name, &cp); in rc_node_create_child()
3975 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_create_child()
3976 rc_node_rele_flag(np, RC_NODE_CREATING_CHILD); in rc_node_create_child()
3977 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_create_child()
3993 rc_node_t *np; in rc_node_create_child_pg() local
4013 RC_NODE_PTR_GET_CHECK_AND_HOLD(np, npp); in rc_node_create_child_pg()
4016 rc_node_rele(np); in rc_node_create_child_pg()
4020 if ((rc = rc_check_parent_child(np->rn_id.rl_type, type)) != in rc_node_create_child_pg()
4022 rc_node_rele(np); in rc_node_create_child_pg()
4027 rc_node_rele(np); in rc_node_create_child_pg()
4041 if ((rc = rc_get_fmri_and_concat(np, fmri, sizeof (fmri), &sz_out, in rc_node_create_child_pg()
4043 rc_node_rele(np); in rc_node_create_child_pg()
4067 np->rn_id.rl_type == REP_PROTOCOL_ENTITY_INSTANCE && in rc_node_create_child_pg()
4075 rc = perm_add_inst_action_auth(pcp, np); in rc_node_create_child_pg()
4086 rc_node_rele(np); in rc_node_create_child_pg()
4103 rc_node_rele(np); in rc_node_create_child_pg()
4113 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_create_child_pg()
4114 HOLD_PTR_FLAG_OR_FREE_AND_RETURN(np, npp, RC_NODE_CREATING_CHILD, in rc_node_create_child_pg()
4116 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_create_child_pg()
4118 rc = object_create_pg(np, type, name, pgtype, flags, &cp); in rc_node_create_child_pg()
4125 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_create_child_pg()
4126 rc_node_rele_flag(np, RC_NODE_CREATING_CHILD); in rc_node_create_child_pg()
4127 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_create_child_pg()
4161 rc_node_t *np = np_arg; in rc_notify_node_delete() local
4165 (void) pthread_mutex_lock(&np->rn_lock); in rc_notify_node_delete()
4166 if (!rc_node_hold_flag(np, RC_NODE_USING_PARENT)) { in rc_notify_node_delete()
4167 (void) pthread_mutex_unlock(&np->rn_lock); in rc_notify_node_delete()
4170 nnp = np->rn_parent; in rc_notify_node_delete()
4171 rc_node_hold_locked(np); /* hold it in place */ in rc_notify_node_delete()
4173 switch (np->rn_id.rl_type) { in rc_notify_node_delete()
4176 pg = np; in rc_notify_node_delete()
4180 inst = np; in rc_notify_node_delete()
4184 svc = np; in rc_notify_node_delete()
4187 rc_node_rele_flag(np, RC_NODE_USING_PARENT); in rc_notify_node_delete()
4188 rc_node_rele_locked(np); in rc_notify_node_delete()
4192 (void) pthread_mutex_unlock(&np->rn_lock); in rc_notify_node_delete()
4194 np = nnp; in rc_notify_node_delete()
4195 if (np == NULL) in rc_notify_node_delete()
4212 np = svc; in rc_notify_node_delete()
4215 np = inst; in rc_notify_node_delete()
4218 np = pg; in rc_notify_node_delete()
4223 (void) pthread_mutex_lock(&np->rn_lock); in rc_notify_node_delete()
4224 rc_node_rele_flag(np, RC_NODE_USING_PARENT); in rc_notify_node_delete()
4225 rc_node_rele_locked(np); in rc_notify_node_delete()
4234 rc_node_delete_hold(rc_node_t *np, int andformer) in rc_node_delete_hold() argument
4239 assert(MUTEX_HELD(&np->rn_lock)); in rc_node_delete_hold()
4240 assert((np->rn_flags & RC_NODE_DYING_FLAGS) == RC_NODE_DYING_FLAGS); in rc_node_delete_hold()
4242 for (cp = uu_list_first(np->rn_children); cp != NULL; in rc_node_delete_hold()
4243 cp = uu_list_next(np->rn_children, cp)) { in rc_node_delete_hold()
4245 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_delete_hold()
4256 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_delete_hold()
4258 if (andformer && (cp = np->rn_former) != NULL) { in rc_node_delete_hold()
4260 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_delete_hold()
4263 np = cp; in rc_node_delete_hold()
4266 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_delete_hold()
4273 rc_node_delete_rele(rc_node_t *np, int andformer) in rc_node_delete_rele() argument
4278 assert(MUTEX_HELD(&np->rn_lock)); in rc_node_delete_rele()
4279 assert((np->rn_flags & RC_NODE_DYING_FLAGS) == RC_NODE_DYING_FLAGS); in rc_node_delete_rele()
4281 for (cp = uu_list_first(np->rn_children); cp != NULL; in rc_node_delete_rele()
4282 cp = uu_list_next(np->rn_children, cp)) { in rc_node_delete_rele()
4284 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_delete_rele()
4286 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_delete_rele()
4288 if (andformer && (cp = np->rn_former) != NULL) { in rc_node_delete_rele()
4290 rc_node_rele_flag(np, RC_NODE_DYING_FLAGS); in rc_node_delete_rele()
4291 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_delete_rele()
4293 np = cp; in rc_node_delete_rele()
4296 rc_node_rele_flag(np, RC_NODE_DYING_FLAGS); in rc_node_delete_rele()
4297 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_delete_rele()
4347 rc_node_delete_children(rc_node_t *np, int andformer) in rc_node_delete_children() argument
4352 assert(np->rn_refs > 0); in rc_node_delete_children()
4353 assert(MUTEX_HELD(&np->rn_lock)); in rc_node_delete_children()
4354 assert(np->rn_flags & RC_NODE_DEAD); in rc_node_delete_children()
4356 while ((cp = uu_list_first(np->rn_children)) != NULL) { in rc_node_delete_children()
4357 uu_list_remove(np->rn_children, cp); in rc_node_delete_children()
4359 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_delete_children()
4363 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_delete_children()
4370 rc_node_rele_flag(np, RC_NODE_DYING_FLAGS); in rc_node_delete_children()
4371 if (andformer && (cp = np->rn_former) != NULL) { in rc_node_delete_children()
4372 np->rn_former = NULL; /* unlink */ in rc_node_delete_children()
4384 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_delete_children()
4391 rc_node_rele(np); /* drop the old reference */ in rc_node_delete_children()
4393 np = cp; in rc_node_delete_children()
4396 rc_node_rele_locked(np); in rc_node_delete_children()
4406 rc_node_no_client_refs(rc_node_t *np) in rc_node_no_client_refs() argument
4411 assert(MUTEX_HELD(&np->rn_lock)); in rc_node_no_client_refs()
4412 assert(np->rn_refs == 0); in rc_node_no_client_refs()
4413 assert(np->rn_other_refs == 0); in rc_node_no_client_refs()
4414 assert(np->rn_other_refs_held == 0); in rc_node_no_client_refs()
4416 if (np->rn_flags & RC_NODE_DEAD) { in rc_node_no_client_refs()
4425 if (np->rn_erefs > 1) { in rc_node_no_client_refs()
4426 --np->rn_erefs; in rc_node_no_client_refs()
4427 NODE_UNLOCK(np); in rc_node_no_client_refs()
4431 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_no_client_refs()
4432 rc_node_destroy(np); in rc_node_no_client_refs()
4437 assert(np->rn_flags & RC_NODE_OLD); in rc_node_no_client_refs()
4444 if (np->rn_flags & RC_NODE_UNREFED) { in rc_node_no_client_refs()
4445 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_no_client_refs()
4448 np->rn_flags |= RC_NODE_UNREFED; in rc_node_no_client_refs()
4461 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_no_client_refs()
4464 current = cache_lookup(&np->rn_id); in rc_node_no_client_refs()
4467 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_no_client_refs()
4469 if (np->rn_flags & RC_NODE_DEAD) in rc_node_no_client_refs()
4479 np->rn_flags &= ~RC_NODE_UNREFED; in rc_node_no_client_refs()
4480 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_no_client_refs()
4484 if (current == np) { in rc_node_no_client_refs()
4488 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_no_client_refs()
4489 np->rn_flags &= ~RC_NODE_UNREFED; in rc_node_no_client_refs()
4491 rc_node_rele_locked(np); in rc_node_no_client_refs()
4531 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_no_client_refs()
4537 if (!(np->rn_flags & (RC_NODE_OLD | RC_NODE_DEAD)) || in rc_node_no_client_refs()
4538 np->rn_refs != 0 || np->rn_other_refs != 0 || in rc_node_no_client_refs()
4539 np->rn_other_refs_held != 0) { in rc_node_no_client_refs()
4540 np->rn_flags &= ~RC_NODE_UNREFED; in rc_node_no_client_refs()
4549 if (!rc_node_hold_flag(np, RC_NODE_DYING_FLAGS)) { in rc_node_no_client_refs()
4554 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_no_client_refs()
4560 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_no_client_refs()
4565 rc_node_delete_hold(np, 0); /* drops np->rn_lock */ in rc_node_no_client_refs()
4568 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_no_client_refs()
4571 if (!(np->rn_flags & RC_NODE_OLD) || in rc_node_no_client_refs()
4572 np->rn_refs != 0 || np->rn_other_refs != 0 || in rc_node_no_client_refs()
4573 np->rn_other_refs_held != 0) { in rc_node_no_client_refs()
4574 np->rn_flags &= ~RC_NODE_UNREFED; in rc_node_no_client_refs()
4575 rc_node_delete_rele(np, 0); /* drops np's lock */ in rc_node_no_client_refs()
4584 np->rn_flags |= RC_NODE_DEAD; in rc_node_no_client_refs()
4593 rc_node_hold_locked(np); in rc_node_no_client_refs()
4594 rc_node_delete_children(np, 0); /* unlocks np */ in rc_node_no_client_refs()
4598 for (cur = current; cur != NULL && cur->rn_former != np; in rc_node_no_client_refs()
4601 assert(cur != NULL && cur != np); in rc_node_no_client_refs()
4603 cur->rn_former = np->rn_former; in rc_node_no_client_refs()
4604 np->rn_former = NULL; in rc_node_no_client_refs()
4611 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_no_client_refs()
4612 assert(np->rn_flags & RC_NODE_ON_FORMER); in rc_node_no_client_refs()
4613 np->rn_flags &= ~(RC_NODE_UNREFED | RC_NODE_ON_FORMER); in rc_node_no_client_refs()
4615 if (np->rn_erefs > 1) { in rc_node_no_client_refs()
4617 --np->rn_erefs; in rc_node_no_client_refs()
4618 NODE_UNLOCK(np); in rc_node_no_client_refs()
4622 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_no_client_refs()
4623 rc_node_destroy(np); in rc_node_no_client_refs()
4631 np->rn_flags &= ~RC_NODE_UNREFED; in rc_node_no_client_refs()
4633 unrefed = (np->rn_refs == 0 && np->rn_other_refs == 0 && in rc_node_no_client_refs()
4634 np->rn_other_refs_held == 0); in rc_node_no_client_refs()
4636 if (np->rn_erefs > 0) in rc_node_no_client_refs()
4637 --np->rn_erefs; in rc_node_no_client_refs()
4639 if (unrefed && np->rn_erefs > 0) { in rc_node_no_client_refs()
4640 NODE_UNLOCK(np); in rc_node_no_client_refs()
4644 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_no_client_refs()
4647 rc_node_destroy(np); in rc_node_no_client_refs()
4692 rc_node_t *np, *np_orig; in rc_node_delete() local
4705 RC_NODE_PTR_GET_CHECK_AND_LOCK(np, npp); in rc_node_delete()
4712 switch (np->rn_id.rl_type) { in rc_node_delete()
4715 np->rn_pgflags); in rc_node_delete()
4719 np->rn_pgflags); in rc_node_delete()
4723 np->rn_pgflags); in rc_node_delete()
4724 audit_data.ed_snapname = strdup(np->rn_name); in rc_node_delete()
4726 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_delete()
4734 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_delete()
4738 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_delete()
4739 np = np->rn_cchain[0]; in rc_node_delete()
4740 RC_NODE_CHECK_AND_LOCK(np); in rc_node_delete()
4742 np->rn_pgflags); in rc_node_delete()
4746 if (np->rn_id.rl_ids[ID_SNAPSHOT] == 0) { in rc_node_delete()
4749 np->rn_pgflags); in rc_node_delete()
4750 audit_data.ed_type = strdup(np->rn_type); in rc_node_delete()
4752 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_delete()
4759 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_delete()
4763 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_delete()
4777 np_orig = np; in rc_node_delete()
4778 rc_node_hold_locked(np); /* simplifies rest of the code */ in rc_node_delete()
4788 if (!rc_node_wait_flag(np, in rc_node_delete()
4790 rc_node_rele_locked(np); in rc_node_delete()
4795 if (np->rn_flags & RC_NODE_OLD) { in rc_node_delete()
4796 rc_node_rele_locked(np); in rc_node_delete()
4797 np = cache_lookup(&np_orig->rn_id); in rc_node_delete()
4798 assert(np != np_orig); in rc_node_delete()
4800 if (np == NULL) { in rc_node_delete()
4804 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_delete()
4808 if (!rc_node_hold_flag(np, RC_NODE_USING_PARENT)) { in rc_node_delete()
4809 rc_node_rele_locked(np); in rc_node_delete()
4819 pp = rc_node_hold_parent_flag(np, RC_NODE_CHILDREN_CHANGING); in rc_node_delete()
4822 rc_node_rele(np); in rc_node_delete()
4832 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_delete()
4833 if (!(np->rn_flags & RC_NODE_OLD)) in rc_node_delete()
4836 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_delete()
4840 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_delete()
4849 if (!rc_node_hold_flag(np, RC_NODE_DYING_FLAGS)) { in rc_node_delete()
4850 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_delete()
4855 assert(!(np->rn_flags & RC_NODE_OLD)); in rc_node_delete()
4857 if ((rc = rc_node_get_fmri_or_fragment(np, audit_data.ed_fmri, in rc_node_delete()
4859 rc_node_rele_flag(np, RC_NODE_DYING_FLAGS); in rc_node_delete()
4860 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_delete()
4871 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_delete()
4877 if (rc == REP_PROTOCOL_SUCCESS && np->rn_id.rl_type == in rc_node_delete()
4880 perm_auth_for_pgtype(np->rn_type); in rc_node_delete()
4894 rc_node_rele_flag(np, in rc_node_delete()
4907 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_delete()
4914 rc_node_rele_flag(np, RC_NODE_DYING_FLAGS); in rc_node_delete()
4915 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_delete()
4921 rc_node_rele_flag(np, RC_NODE_DYING_FLAGS); in rc_node_delete()
4922 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_delete()
4927 rc_node_delete_hold(np, 1); /* hold entire subgraph, drop lock */ in rc_node_delete()
4929 rc = object_delete(np); in rc_node_delete()
4932 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_delete()
4933 rc_node_delete_rele(np, 1); /* drops lock */ in rc_node_delete()
4945 rc_notify_node_delete(ndp, np); /* frees or uses ndp */ in rc_node_delete()
4947 bp = cache_hold(np->rn_hash); in rc_node_delete()
4949 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_delete()
4950 cache_remove_unlocked(bp, np); in rc_node_delete()
4953 np->rn_flags |= RC_NODE_DEAD; in rc_node_delete()
4960 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_delete()
4962 (void) pthread_mutex_lock(&np->rn_lock); in rc_node_delete()
4964 uu_list_remove(pp->rn_children, np); in rc_node_delete()
4970 np->rn_flags &= ~RC_NODE_IN_PARENT; in rc_node_delete()
4977 rc_node_hold_locked(np); /* hold for delete */ in rc_node_delete()
4978 rc_node_delete_children(np, 1); /* drops DYING_FLAGS, lock, ref */ in rc_node_delete()
4983 while ((pnp = uu_list_first(np->rn_pg_notify_list)) != NULL) in rc_node_delete()
4986 rc_notify_remove_node(np); in rc_node_delete()
4988 rc_node_rele(np); in rc_node_delete()
4999 rc_node_rele(np); in rc_node_delete()
5022 rc_node_t *np; in rc_node_next_snaplevel() local
5028 RC_NODE_PTR_GET_CHECK_AND_LOCK(np, npp); in rc_node_next_snaplevel()
5030 if (np->rn_id.rl_type != REP_PROTOCOL_ENTITY_SNAPSHOT && in rc_node_next_snaplevel()
5031 np->rn_id.rl_type != REP_PROTOCOL_ENTITY_SNAPLEVEL) { in rc_node_next_snaplevel()
5032 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_next_snaplevel()
5036 if (np->rn_id.rl_type == REP_PROTOCOL_ENTITY_SNAPSHOT) { in rc_node_next_snaplevel()
5037 if ((res = rc_node_fill_children(np, in rc_node_next_snaplevel()
5039 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_next_snaplevel()
5043 for (cp = uu_list_first(np->rn_children); in rc_node_next_snaplevel()
5045 cp = uu_list_next(np->rn_children, cp)) { in rc_node_next_snaplevel()
5052 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_next_snaplevel()
5054 if (!rc_node_hold_flag(np, RC_NODE_USING_PARENT)) { in rc_node_next_snaplevel()
5055 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_next_snaplevel()
5065 pp = rc_node_hold_parent_flag(np, RC_NODE_CHILDREN_CHANGING); in rc_node_next_snaplevel()
5076 cp = np; in rc_node_next_snaplevel()
5082 assert((cp == NULL && np->rn_snaplevel->rsl_next == NULL) || in rc_node_next_snaplevel()
5083 (cp != NULL && np->rn_snaplevel->rsl_next == in rc_node_next_snaplevel()
5127 rc_node_t *np, in rc_attach_snapshot() argument
5147 assert(MUTEX_HELD(&np->rn_lock)); in rc_attach_snapshot()
5165 (void) pthread_mutex_unlock(&np->rn_lock); in rc_attach_snapshot()
5171 if (strlcpy(audit_data.ed_snapname, np->rn_name, in rc_attach_snapshot()
5183 if ((rc = rc_node_get_fmri_or_fragment(np, audit_data.ed_fmri, in rc_attach_snapshot()
5185 (void) pthread_mutex_unlock(&np->rn_lock); in rc_attach_snapshot()
5198 (void) pthread_mutex_unlock(&np->rn_lock); in rc_attach_snapshot()
5205 np_orig = np; in rc_attach_snapshot()
5206 rc_node_hold_locked(np); /* simplifies the remainder */ in rc_attach_snapshot()
5208 (void) pthread_mutex_unlock(&np->rn_lock); in rc_attach_snapshot()
5215 rc_node_rele(np); in rc_attach_snapshot()
5221 rc_node_rele(np); in rc_attach_snapshot()
5225 rc_node_rele(np); in rc_attach_snapshot()
5230 (void) pthread_mutex_lock(&np->rn_lock); in rc_attach_snapshot()
5237 if (!(np->rn_flags & RC_NODE_OLD)) { in rc_attach_snapshot()
5238 if (!rc_node_hold_flag(np, RC_NODE_USING_PARENT)) { in rc_attach_snapshot()
5241 pp = rc_node_hold_parent_flag(np, in rc_attach_snapshot()
5244 (void) pthread_mutex_lock(&np->rn_lock); in rc_attach_snapshot()
5248 if (np->rn_flags & RC_NODE_OLD) { in rc_attach_snapshot()
5256 if (!rc_node_hold_flag(np, RC_NODE_IN_TX)) { in rc_attach_snapshot()
5266 rc_node_rele_locked(np); in rc_attach_snapshot()
5267 np = cache_lookup(&np_orig->rn_id); in rc_attach_snapshot()
5269 if (np == NULL) { in rc_attach_snapshot()
5274 (void) pthread_mutex_lock(&np->rn_lock); in rc_attach_snapshot()
5287 if (np->rn_snapshot_id == snapid) { in rc_attach_snapshot()
5288 rc_node_rele_flag(np, RC_NODE_IN_TX); in rc_attach_snapshot()
5289 rc_node_rele_locked(np); in rc_attach_snapshot()
5298 prev = np; in rc_attach_snapshot()
5316 nnp->rn_id = np->rn_id; /* structure assignment */ in rc_attach_snapshot()
5317 nnp->rn_hash = np->rn_hash; in rc_attach_snapshot()
5318 nnp->rn_name = strdup(np->rn_name); in rc_attach_snapshot()
5328 (void) pthread_mutex_unlock(&np->rn_lock); in rc_attach_snapshot()
5330 rc = object_snapshot_attach(&np->rn_id, &snapid, (parentp != NULL)); in rc_attach_snapshot()
5337 (void) pthread_mutex_lock(&np->rn_lock); in rc_attach_snapshot()
5351 np->rn_flags |= RC_NODE_OLD; in rc_attach_snapshot()
5352 (void) pthread_mutex_unlock(&np->rn_lock); in rc_attach_snapshot()
5357 rc_node_relink_child(pp, np, nnp); in rc_attach_snapshot()
5359 rc_node_rele(np); in rc_attach_snapshot()
5370 rc_node_rele_flag(np, RC_NODE_IN_TX); in rc_attach_snapshot()
5371 rc_node_rele_locked(np); in rc_attach_snapshot()
5394 rc_node_t *np; in rc_snapshot_take_new() local
5430 RC_NODE_PTR_CHECK_LOCK_OR_FREE_RETURN(np, npp, audit_data.ed_auth); in rc_snapshot_take_new()
5431 if (np->rn_id.rl_type != REP_PROTOCOL_ENTITY_INSTANCE) { in rc_snapshot_take_new()
5432 (void) pthread_mutex_unlock(&np->rn_lock); in rc_snapshot_take_new()
5439 (void) pthread_mutex_unlock(&np->rn_lock); in rc_snapshot_take_new()
5447 (void) pthread_mutex_unlock(&np->rn_lock); in rc_snapshot_take_new()
5455 (void) pthread_mutex_unlock(&np->rn_lock); in rc_snapshot_take_new()
5463 if ((rc = rc_node_get_fmri_or_fragment(np, fmri, sizeof (fmri), in rc_snapshot_take_new()
5465 (void) pthread_mutex_unlock(&np->rn_lock); in rc_snapshot_take_new()
5470 (void) pthread_mutex_unlock(&np->rn_lock); in rc_snapshot_take_new()
5477 HOLD_PTR_FLAG_OR_FREE_AND_RETURN(np, npp, RC_NODE_CREATING_CHILD, in rc_snapshot_take_new()
5479 (void) pthread_mutex_unlock(&np->rn_lock); in rc_snapshot_take_new()
5481 rc = object_snapshot_take_new(np, svcname, instname, name, &outp); in rc_snapshot_take_new()
5488 (void) pthread_mutex_lock(&np->rn_lock); in rc_snapshot_take_new()
5489 rc_node_rele_flag(np, RC_NODE_CREATING_CHILD); in rc_snapshot_take_new()
5490 (void) pthread_mutex_unlock(&np->rn_lock); in rc_snapshot_take_new()
5504 rc_node_t *np, *outp; in rc_snapshot_take_attach() local
5506 RC_NODE_PTR_GET_CHECK(np, npp); in rc_snapshot_take_attach()
5507 if (np->rn_id.rl_type != REP_PROTOCOL_ENTITY_INSTANCE) { in rc_snapshot_take_attach()
5517 return (rc_attach_snapshot(outp, 0, np, NULL, in rc_snapshot_take_attach()
5524 rc_node_t *np; in rc_snapshot_attach() local
5532 RC_NODE_PTR_GET_CHECK_AND_LOCK(np, npp); in rc_snapshot_attach()
5533 if (np->rn_id.rl_type != REP_PROTOCOL_ENTITY_SNAPSHOT) { in rc_snapshot_attach()
5534 (void) pthread_mutex_unlock(&np->rn_lock); in rc_snapshot_attach()
5537 snapid = np->rn_snapshot_id; in rc_snapshot_attach()
5538 rc = rc_node_get_fmri_or_fragment(np, old_fmri, sizeof (old_fmri), in rc_snapshot_attach()
5540 (void) pthread_mutex_unlock(&np->rn_lock); in rc_snapshot_attach()
5543 if (np->rn_name != NULL) { in rc_snapshot_attach()
5544 if (strlcpy(old_name, np->rn_name, sizeof (old_name)) >= in rc_snapshot_attach()
5733 rc_node_pg_check_read_protect(rc_node_t *np) in rc_node_pg_check_read_protect() argument
5738 assert(!MUTEX_HELD(&np->rn_lock)); in rc_node_pg_check_read_protect()
5740 if (np->rn_id.rl_type != REP_PROTOCOL_ENTITY_PROPERTYGRP) in rc_node_pg_check_read_protect()
5743 if (strcmp(np->rn_type, SCF_GROUP_FRAMEWORK) == 0 || in rc_node_pg_check_read_protect()
5744 strcmp(np->rn_type, SCF_GROUP_DEPENDENCY) == 0 || in rc_node_pg_check_read_protect()
5745 strcmp(np->rn_type, SCF_GROUP_METHOD) == 0) in rc_node_pg_check_read_protect()
5748 ret = rc_node_parent(np, &ent); in rc_node_pg_check_read_protect()
5753 ret = rc_svc_prop_exists(ent, np->rn_name, np->rn_type, in rc_node_pg_check_read_protect()
5782 rc_node_property_may_read(rc_node_t *np) in rc_node_property_may_read() argument
5791 if (np->rn_id.rl_type != REP_PROTOCOL_ENTITY_PROPERTY) in rc_node_property_may_read()
5800 ret = rc_node_parent(np, &pgp); in rc_node_property_may_read()
5847 strcmp(np->rn_name, AUTH_PROP_MODIFY) != 0) in rc_node_property_may_read()
5872 ret = rc_node_get_fmri_or_fragment(np, audit_data.ed_fmri, in rc_node_property_may_read()
5905 rc_iter_filter_name(rc_node_t *np, void *s) in rc_iter_filter_name() argument
5909 return (strcmp(np->rn_name, name) == 0); in rc_iter_filter_name()
5913 rc_iter_filter_type(rc_node_t *np, void *s) in rc_iter_filter_type() argument
5917 return (np->rn_type != NULL && strcmp(np->rn_type, type) == 0); in rc_iter_filter_type()
5922 rc_iter_null_filter(rc_node_t *np, void *s) in rc_iter_null_filter() argument
5943 rc_iter_create(rc_node_iter_t **resp, rc_node_t *np, uint32_t type, in rc_iter_create() argument
5956 if (np->rn_id.rl_type == REP_PROTOCOL_ENTITY_CPROPERTYGRP) in rc_iter_create()
5960 (void) pthread_mutex_lock(&np->rn_lock); in rc_iter_create()
5962 if ((res = rc_node_fill_children(np, type)) != in rc_iter_create()
5964 (void) pthread_mutex_unlock(&np->rn_lock); in rc_iter_create()
5971 nip->rni_iter = uu_list_walk_start(np->rn_children, in rc_iter_create()
5974 nip->rni_iter_node = np; in rc_iter_create()
5975 rc_node_hold_other(np); in rc_iter_create()
5977 (void) pthread_mutex_unlock(&np->rn_lock); in rc_iter_create()
5981 (void) pthread_mutex_unlock(&np->rn_lock); in rc_iter_create()
5985 if (np->rn_id.rl_type == REP_PROTOCOL_ENTITY_SNAPSHOT) { in rc_iter_create()
5987 (void) pthread_mutex_lock(&np->rn_lock); in rc_iter_create()
5988 res = rc_node_fill_children(np, in rc_iter_create()
5990 (void) pthread_mutex_unlock(&np->rn_lock); in rc_iter_create()
5997 if (np->rn_cchain[0] == NULL) in rc_iter_create()
6012 ent = np->rn_cchain[nip->rni_clevel]; in rc_iter_create()
6045 rc_node_hold(np); /* released by rc_iter_end() */ in rc_iter_create()
6046 nip->rni_parent = np; in rc_iter_create()
6057 rc_node_t *np = iter->rni_parent; in rc_iter_end() local
6060 np = np->rn_cchain[iter->rni_clevel]; in rc_iter_end()
6062 assert(MUTEX_HELD(&np->rn_lock)); in rc_iter_end()
6067 (void) pthread_mutex_unlock(&np->rn_lock); in rc_iter_end()
6083 rc_node_t *np; in rc_node_setup_value_iter() local
6089 RC_NODE_PTR_GET_CHECK_AND_LOCK(np, npp); in rc_node_setup_value_iter()
6091 if (np->rn_id.rl_type != REP_PROTOCOL_ENTITY_PROPERTY) { in rc_node_setup_value_iter()
6092 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_setup_value_iter()
6098 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_setup_value_iter()
6102 nip->rni_parent = np; in rc_node_setup_value_iter()
6109 rc_node_hold_locked(np); in rc_node_setup_value_iter()
6112 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_setup_value_iter()
6134 rc_node_t *np; in rc_node_get_property_value() local
6140 RC_NODE_PTR_GET_CHECK_AND_HOLD(np, npp); in rc_node_get_property_value()
6141 ret = rc_node_property_may_read(np); in rc_node_get_property_value()
6142 rc_node_rele(np); in rc_node_get_property_value()
6147 RC_NODE_PTR_GET_CHECK_AND_LOCK(np, npp); in rc_node_get_property_value()
6149 if (np->rn_id.rl_type != REP_PROTOCOL_ENTITY_PROPERTY) { in rc_node_get_property_value()
6150 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_get_property_value()
6154 if (np->rn_values_size == 0) { in rc_node_get_property_value()
6155 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_get_property_value()
6158 out->rpr_type = np->rn_valtype; in rc_node_get_property_value()
6159 w = strlcpy(out->rpr_value, &np->rn_values[0], in rc_node_get_property_value()
6168 ret = (np->rn_values_count != 1)? REP_PROTOCOL_FAIL_TRUNCATED : in rc_node_get_property_value()
6170 (void) pthread_mutex_unlock(&np->rn_lock); in rc_node_get_property_value()
6178 rc_node_t *np = iter->rni_parent; in rc_iter_next_value() local
6195 RC_NODE_CHECK(np); in rc_iter_next_value()
6196 ret = rc_node_property_may_read(np); in rc_iter_next_value()
6201 RC_NODE_CHECK_AND_LOCK(np); in rc_iter_next_value()
6203 vals = np->rn_values; in rc_iter_next_value()
6204 len = np->rn_values_size; in rc_iter_next_value()
6206 out->rpr_type = np->rn_valtype; in rc_iter_next_value()
6234 (void) pthread_mutex_unlock(&np->rn_lock); in rc_iter_next_value()
6257 rc_node_t *np; in rc_node_setup_iter() local
6261 RC_NODE_PTR_GET_CHECK(np, npp); in rc_node_setup_iter()
6267 if (np->rn_id.rl_type != REP_PROTOCOL_ENTITY_PROPERTY) in rc_node_setup_iter()
6277 if ((rc = rc_check_parent_child(np->rn_id.rl_type, type)) != in rc_node_setup_iter()
6287 (np->rn_id.rl_type != REP_PROTOCOL_ENTITY_INSTANCE && in rc_node_setup_iter()
6288 np->rn_id.rl_type != REP_PROTOCOL_ENTITY_SNAPSHOT)) in rc_node_setup_iter()
6319 rc = rc_iter_create(iterp, np, type, f, (void *)pattern, in rc_node_setup_iter()
6349 rc_node_t *np = iter->rni_parent; in rc_iter_next() local
6366 (void) pthread_mutex_lock(&np->rn_lock); /* held by _iter_create() */ in rc_iter_next()
6368 if (!rc_node_wait_flag(np, RC_NODE_CHILDREN_CHANGING)) { in rc_iter_next()
6369 (void) pthread_mutex_unlock(&np->rn_lock); in rc_iter_next()
6376 (void) pthread_mutex_unlock(&np->rn_lock); in rc_iter_next()
6377 np = np->rn_cchain[iter->rni_clevel]; in rc_iter_next()
6387 (void) pthread_mutex_lock(&np->rn_lock); in rc_iter_next()
6389 if (!rc_node_wait_flag(np, RC_NODE_CHILDREN_CHANGING)) { in rc_iter_next()
6390 (void) pthread_mutex_unlock(&np->rn_lock); in rc_iter_next()
6396 assert(np->rn_flags & RC_NODE_HAS_CHILDREN); in rc_iter_next()
6413 (void) pthread_mutex_unlock(&np->rn_lock); in rc_iter_next()
6419 np = parent->rn_cchain[iter->rni_clevel]; in rc_iter_next()
6420 assert(np != NULL); in rc_iter_next()
6425 (void) pthread_mutex_lock(&np->rn_lock); in rc_iter_next()
6427 rc = rc_node_fill_children(np, iter->rni_type); in rc_iter_next()
6431 uu_list_walk_start(np->rn_children, in rc_iter_next()
6437 iter->rni_iter_node = np; in rc_iter_next()
6438 rc_node_hold_other(np); in rc_iter_next()
6443 (void) pthread_mutex_unlock(&np->rn_lock); in rc_iter_next()
6467 (void) pthread_mutex_unlock(&np->rn_lock); in rc_iter_next()
6478 (void) pthread_mutex_lock(&np->rn_lock); in rc_iter_next()
6481 if (!rc_node_wait_flag(np, RC_NODE_DYING)) { in rc_iter_next()
6482 (void) pthread_mutex_unlock(&np->rn_lock); in rc_iter_next()
6509 (void) pthread_mutex_unlock(&np->rn_lock); in rc_iter_next()
6521 (void) pthread_mutex_lock(&np->rn_lock); in rc_iter_next()
6522 if (!rc_node_wait_flag(np, RC_NODE_DYING)) { in rc_iter_next()
6523 (void) pthread_mutex_unlock(&np->rn_lock); in rc_iter_next()
6532 (void) pthread_mutex_unlock(&np->rn_lock); in rc_iter_next()
6534 (void) pthread_mutex_lock(&np->rn_lock); in rc_iter_next()
6535 if (!rc_node_wait_flag(np, RC_NODE_DYING)) { in rc_iter_next()
6536 (void) pthread_mutex_unlock(&np-> in rc_iter_next()
6549 &np->rn_lock); in rc_iter_next()
6563 (void) pthread_mutex_unlock(&np-> in rc_iter_next()
6568 (void) pthread_mutex_lock(&np-> in rc_iter_next()
6570 if (!rc_node_wait_flag(np, in rc_iter_next()
6573 np->rn_lock); in rc_iter_next()
6583 &np->rn_lock); in rc_iter_next()
6600 (void) pthread_mutex_unlock(&np->rn_lock); in rc_iter_next()
6615 rc_node_t *np; in rc_iter_destroy() local
6620 np = nip->rni_parent; in rc_iter_destroy()
6629 (void) pthread_mutex_lock(&np->rn_lock); in rc_iter_destroy()
6632 &np->rn_cchain[nip->rni_clevel]->rn_lock); in rc_iter_destroy()
6644 rc_node_t *np; in rc_node_setup_tx() local
6651 RC_NODE_PTR_GET_CHECK_AND_HOLD(np, npp); in rc_node_setup_tx()
6653 if (np->rn_id.rl_type == REP_PROTOCOL_ENTITY_CPROPERTYGRP) { in rc_node_setup_tx()
6654 rc_node_rele(np); in rc_node_setup_tx()
6655 np = np->rn_cchain[0]; in rc_node_setup_tx()
6656 RC_NODE_CHECK_AND_HOLD(np); in rc_node_setup_tx()
6659 if (np->rn_id.rl_type != REP_PROTOCOL_ENTITY_PROPERTYGRP) { in rc_node_setup_tx()
6660 rc_node_rele(np); in rc_node_setup_tx()
6664 if (np->rn_id.rl_ids[ID_SNAPSHOT] != 0) { in rc_node_setup_tx()
6665 rc_node_rele(np); in rc_node_setup_tx()
6672 rc_node_rele(np); in rc_node_setup_tx()
6681 rc_node_rele(np); in rc_node_setup_tx()
6685 if (np->rn_id.rl_ids[ID_INSTANCE] != 0 && /* instance pg */ in rc_node_setup_tx()
6686 ((strcmp(np->rn_name, AUTH_PG_ACTIONS) == 0 && in rc_node_setup_tx()
6687 strcmp(np->rn_type, AUTH_PG_ACTIONS_TYPE) == 0) || in rc_node_setup_tx()
6688 (strcmp(np->rn_name, AUTH_PG_GENERAL_OVR) == 0 && in rc_node_setup_tx()
6689 strcmp(np->rn_type, AUTH_PG_GENERAL_OVR_TYPE) == 0))) { in rc_node_setup_tx()
6696 rc_node_rele(np); in rc_node_setup_tx()
6705 rc_node_rele(np); in rc_node_setup_tx()
6710 ret = rc_node_parent(np, &instn); in rc_node_setup_tx()
6713 rc_node_rele(np); in rc_node_setup_tx()
6728 rc_node_rele(np); in rc_node_setup_tx()
6736 if (strcmp(np->rn_name, AUTH_PG_ACTIONS) == 0) in rc_node_setup_tx()
6745 perm_auth_for_pgtype(np->rn_type); in rc_node_setup_tx()
6754 perm_add_enabling_values(pcp, np, AUTH_PROP_VALUE); in rc_node_setup_tx()
6758 perm_add_enabling_values(pcp, np, AUTH_PROP_MODIFY); in rc_node_setup_tx()
6762 strcmp(np->rn_name, AUTH_PG_GENERAL) == 0 && in rc_node_setup_tx()
6763 strcmp(np->rn_type, AUTH_PG_GENERAL_TYPE) == 0) in rc_node_setup_tx()
6768 rc_node_rele(np); in rc_node_setup_tx()
6780 rc_node_rele(np); in rc_node_setup_tx()
6798 rc_node_assign(txp, np); in rc_node_setup_tx()
6808 rc_node_rele(np); in rc_node_setup_tx()
6969 rc_node_t *np = txp->rnp_node; in rc_tx_commit() local
6985 RC_NODE_CHECK(np); in rc_tx_commit()
7010 if (strcmp(np->rn_name, AUTH_PG_GENERAL) == 0 && in rc_tx_commit()
7011 strcmp(np->rn_type, AUTH_PG_GENERAL_TYPE) == 0) { in rc_tx_commit()
7034 } else if (np->rn_id.rl_ids[ID_INSTANCE] != 0 && in rc_tx_commit()
7035 strcmp(np->rn_name, AUTH_PG_GENERAL_OVR) == 0 && in rc_tx_commit()
7036 strcmp(np->rn_type, AUTH_PG_GENERAL_OVR_TYPE) == 0) { in rc_tx_commit()
7046 rc = rc_node_parent(np, &instn); in rc_tx_commit()
7082 perm_auth_for_pgtype(np->rn_type); in rc_tx_commit()
7090 rc = perm_add_enabling_values(pcp, np, in rc_tx_commit()
7095 rc = tx_allow_value(cmds, cmds_sz, np); in rc_tx_commit()
7099 rc = perm_add_enabling_values(pcp, np, in rc_tx_commit()
7139 if ((rc = rc_node_get_fmri_or_fragment(np, pg_fmri, in rc_tx_commit()
7166 nnp->rn_id = np->rn_id; /* structure assignment */ in rc_tx_commit()
7167 nnp->rn_hash = np->rn_hash; in rc_tx_commit()
7168 nnp->rn_name = strdup(np->rn_name); in rc_tx_commit()
7169 nnp->rn_type = strdup(np->rn_type); in rc_tx_commit()
7170 nnp->rn_pgflags = np->rn_pgflags; in rc_tx_commit()
7180 (void) pthread_mutex_lock(&np->rn_lock); in rc_tx_commit()
7186 if ((rc = rc_node_fill_children(np, REP_PROTOCOL_ENTITY_PROPERTY)) != in rc_tx_commit()
7188 (void) pthread_mutex_unlock(&np->rn_lock); in rc_tx_commit()
7193 if (!rc_node_hold_flag(np, RC_NODE_USING_PARENT)) { in rc_tx_commit()
7194 (void) pthread_mutex_unlock(&np->rn_lock); in rc_tx_commit()
7200 if (np->rn_flags & RC_NODE_OLD) { in rc_tx_commit()
7201 rc_node_rele_flag(np, RC_NODE_USING_PARENT); in rc_tx_commit()
7202 (void) pthread_mutex_unlock(&np->rn_lock); in rc_tx_commit()
7208 pp = rc_node_hold_parent_flag(np, RC_NODE_CHILDREN_CHANGING); in rc_tx_commit()
7212 (void) pthread_mutex_lock(&np->rn_lock); in rc_tx_commit()
7213 if (np->rn_flags & RC_NODE_OLD) { in rc_tx_commit()
7214 (void) pthread_mutex_unlock(&np->rn_lock); in rc_tx_commit()
7218 (void) pthread_mutex_unlock(&np->rn_lock); in rc_tx_commit()
7227 (void) pthread_mutex_lock(&np->rn_lock); in rc_tx_commit()
7228 if (!rc_node_hold_flag(np, RC_NODE_IN_TX)) { in rc_tx_commit()
7229 (void) pthread_mutex_unlock(&np->rn_lock); in rc_tx_commit()
7237 nnp->rn_gen_id = np->rn_gen_id; in rc_tx_commit()
7238 (void) pthread_mutex_unlock(&np->rn_lock); in rc_tx_commit()
7241 rc = object_tx_commit(&np->rn_id, tx_data, &nnp->rn_gen_id); in rc_tx_commit()
7243 (void) pthread_mutex_lock(&np->rn_lock); in rc_tx_commit()
7245 rc_node_rele_flag(np, RC_NODE_IN_TX); in rc_tx_commit()
7246 (void) pthread_mutex_unlock(&np->rn_lock); in rc_tx_commit()
7261 while ((pnp = uu_list_first(np->rn_pg_notify_list)) != NULL) in rc_tx_commit()
7265 np->rn_flags |= RC_NODE_OLD; in rc_tx_commit()
7266 (void) pthread_mutex_unlock(&np->rn_lock); in rc_tx_commit()
7268 rc_notify_remove_node(np); in rc_tx_commit()
7273 rc_node_relink_child(pp, np, nnp); in rc_tx_commit()
7302 rc_node_t *np; in rc_pg_notify_setup() local
7304 RC_NODE_PTR_GET_CHECK_AND_LOCK(np, npp); in rc_pg_notify_setup()
7306 if (np->rn_id.rl_type != REP_PROTOCOL_ENTITY_PROPERTYGRP) { in rc_pg_notify_setup()
7307 (void) pthread_mutex_unlock(&np->rn_lock); in rc_pg_notify_setup()
7314 if (!rc_node_wait_flag(np, RC_NODE_IN_TX)) { in rc_pg_notify_setup()
7315 (void) pthread_mutex_unlock(&np->rn_lock); in rc_pg_notify_setup()
7319 if (np->rn_flags & RC_NODE_OLD) { in rc_pg_notify_setup()
7320 (void) pthread_mutex_unlock(&np->rn_lock); in rc_pg_notify_setup()
7326 pnp->rnpn_pg = np; in rc_pg_notify_setup()
7328 (void) uu_list_insert_after(np->rn_pg_notify_list, NULL, pnp); in rc_pg_notify_setup()
7331 (void) pthread_mutex_unlock(&np->rn_lock); in rc_pg_notify_setup()
7384 rc_notify_t *np; in rc_notify_info_remove_locked() local
7408 while ((np = uu_list_next(rc_notify_list, me)) != NULL && in rc_notify_info_remove_locked()
7409 np->rcn_info == NULL) in rc_notify_info_remove_locked()
7410 rc_notify_remove_locked(np); in rc_notify_info_remove_locked()
7492 rc_notify_t *np; in rc_notify_info_wait() local
7524 np = uu_list_next(rc_notify_list, me); in rc_notify_info_wait()
7525 while (np != NULL && !rc_notify_info_interested(rnip, np)) { in rc_notify_info_wait()
7526 rc_notify_t *next = uu_list_next(rc_notify_list, np); in rc_notify_info_wait()
7529 if (np->rcn_info) { in rc_notify_info_wait()
7536 rc_notify_remove_locked(np); in rc_notify_info_wait()
7539 np = next; in rc_notify_info_wait()
7545 if (np == NULL) { in rc_notify_info_wait()
7558 (void) uu_list_insert_after(rc_notify_list, np, me); in rc_notify_info_wait()
7560 if ((ndp = np->rcn_delete) != NULL) { in rc_notify_info_wait()
7563 rc_notify_remove_locked(np); in rc_notify_info_wait()
7569 nnp = np->rcn_node; in rc_notify_info_wait()
7599 rc_notify_remove_locked(np); in rc_notify_info_wait()