Print this page
OS-3342+co
OS-249

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.
  24   25   */
  25   26  
  26   27  /*
  27   28   * Utility functions used by the dlmgmtd daemon.
  28   29   */
  29   30  
  30   31  #include <assert.h>
  31   32  #include <pthread.h>
  32   33  #include <stddef.h>
  33   34  #include <stdlib.h>
↓ open down ↓ 4 lines elided ↑ open up ↑
  38   39  #include <syslog.h>
  39   40  #include <stdarg.h>
  40   41  #include <zone.h>
  41   42  #include <errno.h>
  42   43  #include <libdlpi.h>
  43   44  #include "dlmgmt_impl.h"
  44   45  
  45   46  /*
  46   47   * There are three datalink AVL tables.  The dlmgmt_name_avl tree contains all
  47   48   * datalinks and is keyed by zoneid and link name.  The dlmgmt_id_avl also
  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.
       49 + * contains all datalinks, and it is keyed by link ID.
  51   50   */
  52   51  avl_tree_t      dlmgmt_name_avl;
  53   52  avl_tree_t      dlmgmt_id_avl;
  54      -avl_tree_t      dlmgmt_loan_avl;
  55   53  
  56   54  avl_tree_t      dlmgmt_dlconf_avl;
  57   55  
  58   56  static pthread_rwlock_t dlmgmt_avl_lock = PTHREAD_RWLOCK_INITIALIZER;
  59   57  static pthread_mutex_t  dlmgmt_avl_mutex = PTHREAD_MUTEX_INITIALIZER;
  60   58  static pthread_cond_t   dlmgmt_avl_cv = PTHREAD_COND_INITIALIZER;
  61   59  static pthread_rwlock_t dlmgmt_dlconf_lock = PTHREAD_RWLOCK_INITIALIZER;
  62   60  
  63   61  typedef struct dlmgmt_prefix {
  64   62          struct dlmgmt_prefix    *lp_next;
↓ open down ↓ 90 lines elided ↑ open up ↑
 155  153           */
 156  154          dlmgmt_prefixlist.lp_next = NULL;
 157  155          dlmgmt_prefixlist.lp_zoneid = GLOBAL_ZONEID;
 158  156          dlmgmt_prefixlist.lp_nextppa = 0;
 159  157          (void) strlcpy(dlmgmt_prefixlist.lp_prefix, "net", MAXLINKNAMELEN);
 160  158  
 161  159          avl_create(&dlmgmt_name_avl, cmp_link_by_zname, sizeof (dlmgmt_link_t),
 162  160              offsetof(dlmgmt_link_t, ll_name_node));
 163  161          avl_create(&dlmgmt_id_avl, cmp_link_by_id, sizeof (dlmgmt_link_t),
 164  162              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));
 167  163          avl_create(&dlmgmt_dlconf_avl, cmp_dlconf_by_id,
 168  164              sizeof (dlmgmt_dlconf_t), offsetof(dlmgmt_dlconf_t, ld_node));
 169  165          dlmgmt_nextlinkid = 1;
 170  166  }
 171  167  
 172  168  void
 173  169  dlmgmt_linktable_fini(void)
 174  170  {
 175  171          dlmgmt_prefix_t *lpp, *next;
 176  172  
 177  173          for (lpp = dlmgmt_prefixlist.lp_next; lpp != NULL; lpp = next) {
 178  174                  next = lpp->lp_next;
 179  175                  free(lpp);
 180  176          }
 181  177  
 182  178          avl_destroy(&dlmgmt_dlconf_avl);
 183  179          avl_destroy(&dlmgmt_name_avl);
 184      -        avl_destroy(&dlmgmt_loan_avl);
 185  180          avl_destroy(&dlmgmt_id_avl);
 186  181  }
 187  182  
 188  183  static void
 189  184  linkattr_add(dlmgmt_linkattr_t **headp, dlmgmt_linkattr_t *attrp)
 190  185  {
 191  186          if (*headp == NULL) {
 192  187                  *headp = attrp;
 193  188          } else {
 194  189                  (*headp)->lp_prev = attrp;
↓ open down ↓ 183 lines elided ↑ open up ↑
 378  373                          if (link_by_name(linkp->ll_link, zoneid) != NULL) {
 379  374                                  err = EEXIST;
 380  375                                  goto done;
 381  376                          }
 382  377  
 383  378                          if (avl_find(&dlmgmt_name_avl, linkp, NULL) != NULL)
 384  379                                  avl_remove(&dlmgmt_name_avl, linkp);
 385  380  
 386  381                          linkp->ll_zoneid = zoneid;
 387  382                          avl_add(&dlmgmt_name_avl, linkp);
 388      -                        avl_add(&dlmgmt_loan_avl, linkp);
 389  383                          linkp->ll_onloan = B_TRUE;
 390  384                  }
 391  385          } else if (linkp->ll_zoneid != GLOBAL_ZONEID) {
 392  386                  err = zone_add_datalink(linkp->ll_zoneid, linkp->ll_linkid);
 393  387          }
 394  388  done:
 395  389          if (err == 0)
 396  390                  linkp->ll_flags |= DLMGMT_ACTIVE;
 397  391          return (err);
 398  392  }
↓ open down ↓ 24 lines elided ↑ open up ↑
 423  417  }
 424  418  
 425  419  dlmgmt_link_t *
 426  420  link_by_name(const char *name, zoneid_t zoneid)
 427  421  {
 428  422          dlmgmt_link_t   link, *linkp;
 429  423  
 430  424          (void) strlcpy(link.ll_link, name, MAXLINKNAMELEN);
 431  425          link.ll_zoneid = zoneid;
 432  426          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      -        }
 437  427          return (linkp);
 438  428  }
 439  429  
 440  430  int
 441  431  dlmgmt_create_common(const char *name, datalink_class_t class, uint32_t media,
 442  432      zoneid_t zoneid, uint32_t flags, dlmgmt_link_t **linkpp)
 443  433  {
 444  434          dlmgmt_link_t   *linkp = NULL;
 445  435          avl_index_t     name_where, id_where;
 446  436          int             err = 0;
↓ open down ↓ 7 lines elided ↑ open up ↑
 454  444                  err = ENOMEM;
 455  445                  goto done;
 456  446          }
 457  447  
 458  448          (void) strlcpy(linkp->ll_link, name, MAXLINKNAMELEN);
 459  449          linkp->ll_class = class;
 460  450          linkp->ll_media = media;
 461  451          linkp->ll_linkid = dlmgmt_nextlinkid;
 462  452          linkp->ll_zoneid = zoneid;
 463  453          linkp->ll_gen = 0;
      454 +        linkp->ll_tomb = B_FALSE;
 464  455  
 465  456          if (avl_find(&dlmgmt_name_avl, linkp, &name_where) != NULL ||
 466  457              avl_find(&dlmgmt_id_avl, linkp, &id_where) != NULL) {
 467  458                  err = EEXIST;
 468  459                  goto done;
 469  460          }
 470  461  
 471  462          avl_insert(&dlmgmt_name_avl, linkp, name_where);
 472  463          avl_insert(&dlmgmt_id_avl, linkp, id_where);
 473  464  
↓ open down ↓ 30 lines elided ↑ open up ↑
 504  495                  for (attrp = linkp->ll_head; attrp != NULL; attrp = next) {
 505  496                          next = attrp->lp_next;
 506  497                          free(attrp->lp_val);
 507  498                          free(attrp);
 508  499                  }
 509  500                  linkp->ll_head = NULL;
 510  501          }
 511  502  
 512  503          if ((flags & DLMGMT_ACTIVE) && linkp->ll_zoneid != GLOBAL_ZONEID) {
 513  504                  (void) zone_remove_datalink(linkp->ll_zoneid, linkp->ll_linkid);
 514      -                if (linkp->ll_onloan)
 515      -                        avl_remove(&dlmgmt_loan_avl, linkp);
 516  505          }
 517  506  
 518  507          if (linkp->ll_flags == 0) {
 519  508                  avl_remove(&dlmgmt_id_avl, linkp);
 520  509                  avl_remove(&dlmgmt_name_avl, linkp);
 521  510                  link_destroy(linkp);
 522  511          }
 523  512  
 524  513          return (0);
 525  514  }
↓ open down ↓ 270 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX