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