Print this page


Split Close
Expand all
Collapse all
          --- old/usr/src/cmd/dlmgmtd/dlmgmt_util.c
          +++ new/usr/src/cmd/dlmgmtd/dlmgmt_util.c
↓ open down ↓ 13 lines elided ↑ open up ↑
  14   14   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  
  22   22  /*
  23   23   * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
  24      - * Copyright (c) 2011, Joyent Inc. All rights reserved.
  25   24   */
  26   25  
  27   26  /*
  28   27   * Utility functions used by the dlmgmtd daemon.
  29   28   */
  30   29  
  31   30  #include <assert.h>
  32   31  #include <pthread.h>
  33   32  #include <stddef.h>
  34   33  #include <stdlib.h>
↓ open down ↓ 4 lines elided ↑ open up ↑
  39   38  #include <syslog.h>
  40   39  #include <stdarg.h>
  41   40  #include <zone.h>
  42   41  #include <errno.h>
  43   42  #include <libdlpi.h>
  44   43  #include "dlmgmt_impl.h"
  45   44  
  46   45  /*
  47   46   * There are three datalink AVL tables.  The dlmgmt_name_avl tree contains all
  48   47   * datalinks and is keyed by zoneid and link name.  The dlmgmt_id_avl also
  49      - * contains all datalinks, and it is keyed by link ID.
       48 + * contains all datalinks, and it is keyed by link ID.  The dlmgmt_loan_avl is
       49 + * keyed by link name, and contains the set of global-zone links that are
       50 + * currently on loan to non-global zones.
  50   51   */
  51   52  avl_tree_t      dlmgmt_name_avl;
  52   53  avl_tree_t      dlmgmt_id_avl;
       54 +avl_tree_t      dlmgmt_loan_avl;
  53   55  
  54   56  avl_tree_t      dlmgmt_dlconf_avl;
  55   57  
  56   58  static pthread_rwlock_t dlmgmt_avl_lock = PTHREAD_RWLOCK_INITIALIZER;
  57   59  static pthread_mutex_t  dlmgmt_avl_mutex = PTHREAD_MUTEX_INITIALIZER;
  58   60  static pthread_cond_t   dlmgmt_avl_cv = PTHREAD_COND_INITIALIZER;
  59   61  static pthread_rwlock_t dlmgmt_dlconf_lock = PTHREAD_RWLOCK_INITIALIZER;
  60   62  
  61   63  typedef struct dlmgmt_prefix {
  62   64          struct dlmgmt_prefix    *lp_next;
↓ open down ↓ 90 lines elided ↑ open up ↑
 153  155           */
 154  156          dlmgmt_prefixlist.lp_next = NULL;
 155  157          dlmgmt_prefixlist.lp_zoneid = GLOBAL_ZONEID;
 156  158          dlmgmt_prefixlist.lp_nextppa = 0;
 157  159          (void) strlcpy(dlmgmt_prefixlist.lp_prefix, "net", MAXLINKNAMELEN);
 158  160  
 159  161          avl_create(&dlmgmt_name_avl, cmp_link_by_zname, sizeof (dlmgmt_link_t),
 160  162              offsetof(dlmgmt_link_t, ll_name_node));
 161  163          avl_create(&dlmgmt_id_avl, cmp_link_by_id, sizeof (dlmgmt_link_t),
 162  164              offsetof(dlmgmt_link_t, ll_id_node));
      165 +        avl_create(&dlmgmt_loan_avl, cmp_link_by_name, sizeof (dlmgmt_link_t),
      166 +            offsetof(dlmgmt_link_t, ll_loan_node));
 163  167          avl_create(&dlmgmt_dlconf_avl, cmp_dlconf_by_id,
 164  168              sizeof (dlmgmt_dlconf_t), offsetof(dlmgmt_dlconf_t, ld_node));
 165  169          dlmgmt_nextlinkid = 1;
 166  170  }
 167  171  
 168  172  void
 169  173  dlmgmt_linktable_fini(void)
 170  174  {
 171  175          dlmgmt_prefix_t *lpp, *next;
 172  176  
 173  177          for (lpp = dlmgmt_prefixlist.lp_next; lpp != NULL; lpp = next) {
 174  178                  next = lpp->lp_next;
 175  179                  free(lpp);
 176  180          }
 177  181  
 178  182          avl_destroy(&dlmgmt_dlconf_avl);
 179  183          avl_destroy(&dlmgmt_name_avl);
      184 +        avl_destroy(&dlmgmt_loan_avl);
 180  185          avl_destroy(&dlmgmt_id_avl);
 181  186  }
 182  187  
 183  188  static void
 184  189  linkattr_add(dlmgmt_linkattr_t **headp, dlmgmt_linkattr_t *attrp)
 185  190  {
 186  191          if (*headp == NULL) {
 187  192                  *headp = attrp;
 188  193          } else {
 189  194                  (*headp)->lp_prev = attrp;
↓ open down ↓ 183 lines elided ↑ open up ↑
 373  378                          if (link_by_name(linkp->ll_link, zoneid) != NULL) {
 374  379                                  err = EEXIST;
 375  380                                  goto done;
 376  381                          }
 377  382  
 378  383                          if (avl_find(&dlmgmt_name_avl, linkp, NULL) != NULL)
 379  384                                  avl_remove(&dlmgmt_name_avl, linkp);
 380  385  
 381  386                          linkp->ll_zoneid = zoneid;
 382  387                          avl_add(&dlmgmt_name_avl, linkp);
      388 +                        avl_add(&dlmgmt_loan_avl, linkp);
 383  389                          linkp->ll_onloan = B_TRUE;
 384  390                  }
 385  391          } else if (linkp->ll_zoneid != GLOBAL_ZONEID) {
 386  392                  err = zone_add_datalink(linkp->ll_zoneid, linkp->ll_linkid);
 387  393          }
 388  394  done:
 389  395          if (err == 0)
 390  396                  linkp->ll_flags |= DLMGMT_ACTIVE;
 391  397          return (err);
 392  398  }
↓ open down ↓ 24 lines elided ↑ open up ↑
 417  423  }
 418  424  
 419  425  dlmgmt_link_t *
 420  426  link_by_name(const char *name, zoneid_t zoneid)
 421  427  {
 422  428          dlmgmt_link_t   link, *linkp;
 423  429  
 424  430          (void) strlcpy(link.ll_link, name, MAXLINKNAMELEN);
 425  431          link.ll_zoneid = zoneid;
 426  432          linkp = avl_find(&dlmgmt_name_avl, &link, NULL);
      433 +        if (linkp == NULL && zoneid == GLOBAL_ZONEID) {
      434 +                /* The link could be on loan to a non-global zone? */
      435 +                linkp = avl_find(&dlmgmt_loan_avl, &link, NULL);
      436 +        }
 427  437          return (linkp);
 428  438  }
 429  439  
 430  440  int
 431  441  dlmgmt_create_common(const char *name, datalink_class_t class, uint32_t media,
 432  442      zoneid_t zoneid, uint32_t flags, dlmgmt_link_t **linkpp)
 433  443  {
 434  444          dlmgmt_link_t   *linkp = NULL;
 435  445          avl_index_t     name_where, id_where;
 436  446          int             err = 0;
↓ open down ↓ 58 lines elided ↑ open up ↑
 495  505                  for (attrp = linkp->ll_head; attrp != NULL; attrp = next) {
 496  506                          next = attrp->lp_next;
 497  507                          free(attrp->lp_val);
 498  508                          free(attrp);
 499  509                  }
 500  510                  linkp->ll_head = NULL;
 501  511          }
 502  512  
 503  513          if ((flags & DLMGMT_ACTIVE) && linkp->ll_zoneid != GLOBAL_ZONEID) {
 504  514                  (void) zone_remove_datalink(linkp->ll_zoneid, linkp->ll_linkid);
      515 +                if (linkp->ll_onloan)
      516 +                        avl_remove(&dlmgmt_loan_avl, linkp);
 505  517          }
 506  518  
 507  519          if (linkp->ll_flags == 0) {
 508  520                  avl_remove(&dlmgmt_id_avl, linkp);
 509  521                  avl_remove(&dlmgmt_name_avl, linkp);
 510  522                  link_destroy(linkp);
 511  523          }
 512  524  
 513  525          return (0);
 514  526  }
↓ open down ↓ 270 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX