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); }