Print this page
5882 Temporary pool names
Reviewed by: Matt Ahrens <matt@delphix.com>
Reviewed by: Igor Kozhukhov <igor@dilos.org>
Reviewed by: John Kennedy <john.kennedy@delphix.com>
Approved by: Dan McDonald <danmcd@joyent.com>

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/fs/zfs/spa.c
          +++ new/usr/src/uts/common/fs/zfs/spa.c
↓ open down ↓ 4575 lines elided ↑ open up ↑
4576 4576          char *altroot = NULL;
4577 4577          vdev_t *rvd;
4578 4578          dsl_pool_t *dp;
4579 4579          dmu_tx_t *tx;
4580 4580          int error = 0;
4581 4581          uint64_t txg = TXG_INITIAL;
4582 4582          nvlist_t **spares, **l2cache;
4583 4583          uint_t nspares, nl2cache;
4584 4584          uint64_t version, obj;
4585 4585          boolean_t has_features;
     4586 +        char *poolname;
     4587 +        nvlist_t *nvl;
4586 4588  
     4589 +        if (nvlist_lookup_string(props,
     4590 +            zpool_prop_to_name(ZPOOL_PROP_TNAME), &poolname) != 0)
     4591 +                poolname = (char *)pool;
     4592 +
4587 4593          /*
4588 4594           * If this pool already exists, return failure.
4589 4595           */
4590 4596          mutex_enter(&spa_namespace_lock);
4591      -        if (spa_lookup(pool) != NULL) {
     4597 +        if (spa_lookup(poolname) != NULL) {
4592 4598                  mutex_exit(&spa_namespace_lock);
4593 4599                  return (SET_ERROR(EEXIST));
4594 4600          }
4595 4601  
4596 4602          /*
4597 4603           * Allocate a new spa_t structure.
4598 4604           */
     4605 +        nvl = fnvlist_alloc();
     4606 +        fnvlist_add_string(nvl, ZPOOL_CONFIG_POOL_NAME, pool);
4599 4607          (void) nvlist_lookup_string(props,
4600 4608              zpool_prop_to_name(ZPOOL_PROP_ALTROOT), &altroot);
4601      -        spa = spa_add(pool, NULL, altroot);
     4609 +        spa = spa_add(poolname, nvl, altroot);
     4610 +        fnvlist_free(nvl);
4602 4611          spa_activate(spa, spa_mode_global);
4603 4612  
4604 4613          if (props && (error = spa_prop_validate(spa, props))) {
4605 4614                  spa_deactivate(spa);
4606 4615                  spa_remove(spa);
4607 4616                  mutex_exit(&spa_namespace_lock);
4608 4617                  return (error);
4609 4618          }
4610 4619  
     4620 +        /*
     4621 +         * Temporary pool names should never be written to disk.
     4622 +         */
     4623 +        if (poolname != pool)
     4624 +                spa->spa_import_flags |= ZFS_IMPORT_TEMP_NAME;
     4625 +
4611 4626          has_features = B_FALSE;
4612 4627          for (nvpair_t *elem = nvlist_next_nvpair(props, NULL);
4613 4628              elem != NULL; elem = nvlist_next_nvpair(props, elem)) {
4614 4629                  if (zpool_prop_feature(nvpair_name(elem)))
4615 4630                          has_features = B_TRUE;
4616 4631          }
4617 4632  
4618 4633          if (has_features || nvlist_lookup_uint64(props,
4619 4634              zpool_prop_to_name(ZPOOL_PROP_VERSION), &version) != 0) {
4620 4635                  version = SPA_VERSION;
↓ open down ↓ 3471 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX