Print this page
usr/src/cmd/dlmgmtd/dlmgmt_door.c

Split Close
Expand all
Collapse all
          --- old/usr/src/cmd/dlmgmtd/dlmgmt_door.c
          +++ new/usr/src/cmd/dlmgmtd/dlmgmt_door.c
↓ open down ↓ 14 lines elided ↑ open up ↑
  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   24   * Copyright 2019 Joyent, Inc.
       25 + * Copyright 2023 Oxide Computer Company
  25   26   */
  26   27  
  27   28  /*
  28   29   * Main door handler functions used by dlmgmtd to process the different door
  29   30   * call requests. Door call requests can come from the user-land applications,
  30   31   * or from the kernel.
  31   32   *
  32   33   * Note on zones handling:
  33   34   *
  34   35   * There are two zoneid's associated with a link.  One is the zoneid of the
↓ open down ↓ 383 lines elided ↑ open up ↑
 418  419          dlmgmt_table_lock(B_FALSE);
 419  420          if ((linkp = link_by_id(getname->ld_linkid, zoneid)) == NULL) {
 420  421                  err = ENOENT;
 421  422          } else if (strlcpy(retvalp->lr_link, linkp->ll_link, MAXLINKNAMELEN) >=
 422  423              MAXLINKNAMELEN) {
 423  424                  err = ENOSPC;
 424  425          } else {
 425  426                  retvalp->lr_flags = linkp->ll_flags;
 426  427                  retvalp->lr_class = linkp->ll_class;
 427  428                  retvalp->lr_media = linkp->ll_media;
 428      -                retvalp->lr_flags |= (linkp->ll_trans == B_TRUE) ?
 429      -                    DLMGMT_TRANSIENT : 0;
      429 +                retvalp->lr_flags |= linkp->ll_transient ? DLMGMT_TRANSIENT : 0;
 430  430          }
 431  431  
 432  432  
 433  433          dlmgmt_table_unlock();
 434  434          retvalp->lr_err = err;
 435  435  }
 436  436  
 437  437  /* ARGSUSED */
 438  438  static void
 439  439  dlmgmt_getlinkid(void *argp, void *retp, size_t *sz, zoneid_t zoneid,
↓ open down ↓ 18 lines elided ↑ open up ↑
 458  458                   * The link does not exist in this zone.
 459  459                   */
 460  460                  err = ENOENT;
 461  461                  goto done;
 462  462          }
 463  463  
 464  464          retvalp->lr_linkid = linkp->ll_linkid;
 465  465          retvalp->lr_flags = linkp->ll_flags;
 466  466          retvalp->lr_class = linkp->ll_class;
 467  467          retvalp->lr_media = linkp->ll_media;
      468 +        retvalp->lr_flags |= linkp->ll_transient ? DLMGMT_TRANSIENT : 0;
 468  469  
 469  470  done:
 470  471          dlmgmt_table_unlock();
 471  472          retvalp->lr_err = err;
 472  473  }
 473  474  
 474  475  /* ARGSUSED */
 475  476  static void
 476  477  dlmgmt_getnext(void *argp, void *retp, size_t *sz, zoneid_t zoneid,
 477  478      ucred_t *cred)
↓ open down ↓ 23 lines elided ↑ open up ↑
 501  502                          break;
 502  503          }
 503  504  
 504  505          if (linkp == NULL) {
 505  506                  err = ENOENT;
 506  507          } else {
 507  508                  retvalp->lr_linkid = linkp->ll_linkid;
 508  509                  retvalp->lr_class = linkp->ll_class;
 509  510                  retvalp->lr_media = linkp->ll_media;
 510  511                  retvalp->lr_flags = linkp->ll_flags;
      512 +                retvalp->lr_flags |= linkp->ll_transient ? DLMGMT_TRANSIENT : 0;
 511  513          }
 512  514  
 513  515          dlmgmt_table_unlock();
 514  516          retvalp->lr_err = err;
 515  517  }
 516  518  
 517  519  /* ARGSUSED */
 518  520  static void
 519  521  dlmgmt_upcall_getattr(void *argp, void *retp, size_t *sz, zoneid_t zoneid,
 520  522      ucred_t *cred)
↓ open down ↓ 398 lines elided ↑ open up ↑
 919  921  done:
 920  922          dlmgmt_dlconf_table_unlock();
 921  923          retvalp->lr_err = err;
 922  924  }
 923  925  
 924  926  /* ARGSUSED */
 925  927  static void
 926  928  dlmgmt_removeconf(void *argp, void *retp, size_t *sz, zoneid_t zoneid,
 927  929      ucred_t *cred)
 928  930  {
 929      -        dlmgmt_door_removeconf_t        *removeconf = argp;
      931 +        dlmgmt_door_removeconf_t        *removeconf = argp;
 930  932          dlmgmt_removeconf_retval_t      *retvalp = retp;
 931  933          dlmgmt_link_t                   *linkp;
 932  934          int                             err;
 933  935  
 934  936          dlmgmt_table_lock(B_TRUE);
 935  937          if ((linkp = link_by_id(removeconf->ld_linkid, zoneid)) == NULL) {
 936  938                  err = ENOENT;
 937  939                  goto done;
 938  940          }
 939  941          if (zoneid != GLOBAL_ZONEID && linkp->ll_onloan) {
↓ open down ↓ 56 lines elided ↑ open up ↑
 996  998   * ld_gen is used to ensure atomicity across the {dlmgmt_openconf(),
 997  999   * dlmgmt_writeconf()} pair.
 998 1000   */
 999 1001  /* ARGSUSED */
1000 1002  static void
1001 1003  dlmgmt_openconf(void *argp, void *retp, size_t *sz, zoneid_t zoneid,
1002 1004      ucred_t *cred)
1003 1005  {
1004 1006          dlmgmt_door_openconf_t  *openconf = argp;
1005 1007          dlmgmt_openconf_retval_t *retvalp = retp;
1006      -        dlmgmt_link_t           *linkp;
     1008 +        dlmgmt_link_t           *linkp;
1007 1009          datalink_id_t           linkid = openconf->ld_linkid;
1008 1010          dlmgmt_dlconf_t         *dlconfp;
1009 1011          dlmgmt_linkattr_t       *attrp;
1010 1012          int                     err = 0;
1011 1013  
1012 1014          /*
1013 1015           * Hold the writer lock to update the dlconf table.
1014 1016           */
1015 1017          dlmgmt_dlconf_table_lock(B_TRUE);
1016 1018  
↓ open down ↓ 48 lines elided ↑ open up ↑
1065 1067   * If the given size cannot hold all the configuration, set the size
1066 1068   * that is needed, and return ENOSPC.
1067 1069   */
1068 1070  /* ARGSUSED */
1069 1071  static void
1070 1072  dlmgmt_getconfsnapshot(void *argp, void *retp, size_t *sz, zoneid_t zoneid,
1071 1073      ucred_t *cred)
1072 1074  {
1073 1075          dlmgmt_door_getconfsnapshot_t   *snapshot = argp;
1074 1076          dlmgmt_getconfsnapshot_retval_t *retvalp = retp;
1075      -        dlmgmt_link_t                   *linkp;
     1077 +        dlmgmt_link_t                   *linkp;
1076 1078          datalink_id_t                   linkid = snapshot->ld_linkid;
1077 1079          dlmgmt_linkattr_t               *attrp;
1078 1080          char                            *buf;
1079 1081          size_t                          nvlsz;
1080 1082          nvlist_t                        *nvl = NULL;
1081 1083          int                             err = 0;
1082 1084  
1083 1085          assert(*sz >= sizeof (dlmgmt_getconfsnapshot_retval_t));
1084 1086  
1085 1087          /*
↓ open down ↓ 161 lines elided ↑ open up ↑
1247 1249                  goto done;
1248 1250          }
1249 1251  
1250 1252          if (oldzoneid != GLOBAL_ZONEID) {
1251 1253                  if (zone_remove_datalink(oldzoneid, linkid) != 0) {
1252 1254                          err = errno;
1253 1255                          dlmgmt_log(LOG_WARNING, "unable to remove link %d from "
1254 1256                              "zone %d: %s", linkid, oldzoneid, strerror(err));
1255 1257                          goto done;
1256 1258                  }
1257      -
1258 1259                  linkp->ll_onloan = B_FALSE;
1259 1260          }
1260 1261  
1261 1262          if (newzoneid != GLOBAL_ZONEID) {
1262 1263                  if (zone_add_datalink(newzoneid, linkid) != 0) {
1263 1264                          err = errno;
1264 1265                          dlmgmt_log(LOG_WARNING, "unable to add link %d to zone "
1265 1266                              "%d: %s", linkid, newzoneid, strerror(err));
1266 1267                          (void) zone_add_datalink(oldzoneid, linkid);
1267 1268                          goto done;
↓ open down ↓ 194 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX