Print this page

        

*** 19,29 **** * CDDL HEADER END */ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2011, Joyent Inc. All rights reserved. */ /* * Utility functions used by the dlmgmtd daemon. */ --- 19,28 ----
*** 44,57 **** #include "dlmgmt_impl.h" /* * There are three datalink AVL tables. The dlmgmt_name_avl tree contains all * datalinks and is keyed by zoneid and link name. The dlmgmt_id_avl also ! * contains all datalinks, and it is keyed by link ID. */ avl_tree_t dlmgmt_name_avl; avl_tree_t dlmgmt_id_avl; avl_tree_t dlmgmt_dlconf_avl; static pthread_rwlock_t dlmgmt_avl_lock = PTHREAD_RWLOCK_INITIALIZER; static pthread_mutex_t dlmgmt_avl_mutex = PTHREAD_MUTEX_INITIALIZER; --- 43,59 ---- #include "dlmgmt_impl.h" /* * There are three datalink AVL tables. The dlmgmt_name_avl tree contains all * datalinks and is keyed by zoneid and link name. The dlmgmt_id_avl also ! * contains all datalinks, and it is keyed by link ID. The dlmgmt_loan_avl is ! * keyed by link name, and contains the set of global-zone links that are ! * currently on loan to non-global zones. */ avl_tree_t dlmgmt_name_avl; avl_tree_t dlmgmt_id_avl; + avl_tree_t dlmgmt_loan_avl; avl_tree_t dlmgmt_dlconf_avl; static pthread_rwlock_t dlmgmt_avl_lock = PTHREAD_RWLOCK_INITIALIZER; static pthread_mutex_t dlmgmt_avl_mutex = PTHREAD_MUTEX_INITIALIZER;
*** 158,167 **** --- 160,171 ---- avl_create(&dlmgmt_name_avl, cmp_link_by_zname, sizeof (dlmgmt_link_t), offsetof(dlmgmt_link_t, ll_name_node)); avl_create(&dlmgmt_id_avl, cmp_link_by_id, sizeof (dlmgmt_link_t), offsetof(dlmgmt_link_t, ll_id_node)); + avl_create(&dlmgmt_loan_avl, cmp_link_by_name, sizeof (dlmgmt_link_t), + offsetof(dlmgmt_link_t, ll_loan_node)); avl_create(&dlmgmt_dlconf_avl, cmp_dlconf_by_id, sizeof (dlmgmt_dlconf_t), offsetof(dlmgmt_dlconf_t, ld_node)); dlmgmt_nextlinkid = 1; }
*** 175,184 **** --- 179,189 ---- free(lpp); } avl_destroy(&dlmgmt_dlconf_avl); avl_destroy(&dlmgmt_name_avl); + avl_destroy(&dlmgmt_loan_avl); avl_destroy(&dlmgmt_id_avl); } static void linkattr_add(dlmgmt_linkattr_t **headp, dlmgmt_linkattr_t *attrp)
*** 378,387 **** --- 383,393 ---- if (avl_find(&dlmgmt_name_avl, linkp, NULL) != NULL) avl_remove(&dlmgmt_name_avl, linkp); linkp->ll_zoneid = zoneid; avl_add(&dlmgmt_name_avl, linkp); + avl_add(&dlmgmt_loan_avl, linkp); linkp->ll_onloan = B_TRUE; } } else if (linkp->ll_zoneid != GLOBAL_ZONEID) { err = zone_add_datalink(linkp->ll_zoneid, linkp->ll_linkid); }
*** 422,431 **** --- 428,441 ---- dlmgmt_link_t link, *linkp; (void) strlcpy(link.ll_link, name, MAXLINKNAMELEN); link.ll_zoneid = zoneid; linkp = avl_find(&dlmgmt_name_avl, &link, NULL); + if (linkp == NULL && zoneid == GLOBAL_ZONEID) { + /* The link could be on loan to a non-global zone? */ + linkp = avl_find(&dlmgmt_loan_avl, &link, NULL); + } return (linkp); } int dlmgmt_create_common(const char *name, datalink_class_t class, uint32_t media,
*** 500,509 **** --- 510,521 ---- linkp->ll_head = NULL; } if ((flags & DLMGMT_ACTIVE) && linkp->ll_zoneid != GLOBAL_ZONEID) { (void) zone_remove_datalink(linkp->ll_zoneid, linkp->ll_linkid); + if (linkp->ll_onloan) + avl_remove(&dlmgmt_loan_avl, linkp); } if (linkp->ll_flags == 0) { avl_remove(&dlmgmt_id_avl, linkp); avl_remove(&dlmgmt_name_avl, linkp);