Print this page
4171 clean up spa_feature_*() interfaces
4172 implement extensible_dataset feature for use by other zpool features
Reviewed by: Max Grossman <max.grossman@delphix.com>
Reviewed by: Christopher Siden <christopher.siden@delphix.com>
Reviewed by: George Wilson <george.wilson@delphix.com>
        
*** 90,138 ****
  zfeature_is_supported(const char *guid)
  {
          if (zfeature_checks_disable)
                  return (B_TRUE);
  
!         return (0 == zfeature_lookup_guid(guid, NULL));
! }
! 
! int
! zfeature_lookup_guid(const char *guid, zfeature_info_t **res)
! {
!         for (int i = 0; i < SPA_FEATURES; i++) {
                  zfeature_info_t *feature = &spa_feature_table[i];
!                 if (strcmp(guid, feature->fi_guid) == 0) {
!                         if (res != NULL)
!                                 *res = feature;
!                         return (0);
                  }
!         }
! 
!         return (ENOENT);
  }
  
  int
! zfeature_lookup_name(const char *name, zfeature_info_t **res)
  {
!         for (int i = 0; i < SPA_FEATURES; i++) {
                  zfeature_info_t *feature = &spa_feature_table[i];
                  if (strcmp(name, feature->fi_uname) == 0) {
                          if (res != NULL)
!                                 *res = feature;
                          return (0);
                  }
          }
  
          return (ENOENT);
  }
  
  static void
! zfeature_register(int fid, const char *guid, const char *name, const char *desc,
!     boolean_t readonly, boolean_t mos, zfeature_info_t **deps)
  {
          zfeature_info_t *feature = &spa_feature_table[fid];
!         static zfeature_info_t *nodeps[] = { NULL };
  
          ASSERT(name != NULL);
          ASSERT(desc != NULL);
          ASSERT(!readonly || !mos);
          ASSERT3U(fid, <, SPA_FEATURES);
--- 90,129 ----
  zfeature_is_supported(const char *guid)
  {
          if (zfeature_checks_disable)
                  return (B_TRUE);
  
!         for (spa_feature_t i = 0; i < SPA_FEATURES; i++) {
                  zfeature_info_t *feature = &spa_feature_table[i];
!                 if (strcmp(guid, feature->fi_guid) == 0)
!                         return (B_TRUE);
          }
!         return (B_FALSE);
  }
  
  int
! zfeature_lookup_name(const char *name, spa_feature_t *res)
  {
!         for (spa_feature_t i = 0; i < SPA_FEATURES; i++) {
                  zfeature_info_t *feature = &spa_feature_table[i];
                  if (strcmp(name, feature->fi_uname) == 0) {
                          if (res != NULL)
!                                 *res = i;
                          return (0);
                  }
          }
  
          return (ENOENT);
  }
  
  static void
! zfeature_register(spa_feature_t fid, const char *guid, const char *name,
!     const char *desc, boolean_t readonly, boolean_t mos,
!     const spa_feature_t *deps)
  {
          zfeature_info_t *feature = &spa_feature_table[fid];
!         static spa_feature_t nodeps[] = { SPA_FEATURE_NONE };
  
          ASSERT(name != NULL);
          ASSERT(desc != NULL);
          ASSERT(!readonly || !mos);
          ASSERT3U(fid, <, SPA_FEATURES);
*** 139,148 ****
--- 130,140 ----
          ASSERT(zfeature_is_valid_guid(guid));
  
          if (deps == NULL)
                  deps = nodeps;
  
+         feature->fi_feature = fid;
          feature->fi_guid = guid;
          feature->fi_uname = name;
          feature->fi_desc = desc;
          feature->fi_can_readonly = readonly;
          feature->fi_mos = mos;
*** 165,170 ****
--- 157,166 ----
              "com.joyent:multi_vdev_crash_dump", "multi_vdev_crash_dump",
              "Crash dumps to multiple vdev pools.", B_FALSE, B_FALSE, NULL);
          zfeature_register(SPA_FEATURE_SPACEMAP_HISTOGRAM,
              "com.delphix:spacemap_histogram", "spacemap_histogram",
              "Spacemaps maintain space histograms.", B_TRUE, B_FALSE, NULL);
+         zfeature_register(SPA_FEATURE_EXTENSIBLE_DATASET,
+             "com.delphix:extensible_dataset", "extensible_dataset",
+             "Enhanced dataset functionality, used by other features.",
+             B_FALSE, B_FALSE, NULL);
  }