summaryrefslogtreecommitdiff
path: root/usr/src/common
diff options
context:
space:
mode:
authorMatthew Ahrens <mahrens@delphix.com>2013-10-08 09:13:05 -0800
committerChristopher Siden <chris.siden@delphix.com>2013-10-08 10:13:05 -0700
commit2acef22db7808606888f8f92715629ff3ba555b9 (patch)
tree2ede41f971f574fa17ee1718880ab308591d171f /usr/src/common
parent018d3f06fe63d3b8316ef73502fb8f2dd473ffd1 (diff)
downloadillumos-joyent-2acef22db7808606888f8f92715629ff3ba555b9.tar.gz
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> Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com> Approved by: Garrett D'Amore <garrett@damore.org>
Diffstat (limited to 'usr/src/common')
-rw-r--r--usr/src/common/zfs/zfeature_common.c36
-rw-r--r--usr/src/common/zfs/zfeature_common.h27
2 files changed, 31 insertions, 32 deletions
diff --git a/usr/src/common/zfs/zfeature_common.c b/usr/src/common/zfs/zfeature_common.c
index dbd3681547..175f8a51c2 100644
--- a/usr/src/common/zfs/zfeature_common.c
+++ b/usr/src/common/zfs/zfeature_common.c
@@ -92,32 +92,22 @@ 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++) {
+ 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) {
- if (res != NULL)
- *res = feature;
- return (0);
- }
+ if (strcmp(guid, feature->fi_guid) == 0)
+ return (B_TRUE);
}
-
- return (ENOENT);
+ return (B_FALSE);
}
int
-zfeature_lookup_name(const char *name, zfeature_info_t **res)
+zfeature_lookup_name(const char *name, spa_feature_t *res)
{
- for (int i = 0; i < SPA_FEATURES; i++) {
+ 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 = feature;
+ *res = i;
return (0);
}
}
@@ -126,11 +116,12 @@ zfeature_lookup_name(const char *name, zfeature_info_t **res)
}
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_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 zfeature_info_t *nodeps[] = { NULL };
+ static spa_feature_t nodeps[] = { SPA_FEATURE_NONE };
ASSERT(name != NULL);
ASSERT(desc != NULL);
@@ -141,6 +132,7 @@ zfeature_register(int fid, const char *guid, const char *name, const char *desc,
if (deps == NULL)
deps = nodeps;
+ feature->fi_feature = fid;
feature->fi_guid = guid;
feature->fi_uname = name;
feature->fi_desc = desc;
@@ -167,4 +159,8 @@ zpool_feature_init(void)
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);
}
diff --git a/usr/src/common/zfs/zfeature_common.h b/usr/src/common/zfs/zfeature_common.h
index 5f1abf2ecc..861f1db0fd 100644
--- a/usr/src/common/zfs/zfeature_common.h
+++ b/usr/src/common/zfs/zfeature_common.h
@@ -38,35 +38,38 @@ extern "C" {
struct zfeature_info;
+typedef enum spa_feature {
+ SPA_FEATURE_NONE = -1,
+ SPA_FEATURE_ASYNC_DESTROY,
+ SPA_FEATURE_EMPTY_BPOBJ,
+ SPA_FEATURE_LZ4_COMPRESS,
+ SPA_FEATURE_MULTI_VDEV_CRASH_DUMP,
+ SPA_FEATURE_SPACEMAP_HISTOGRAM,
+ SPA_FEATURE_EXTENSIBLE_DATASET,
+ SPA_FEATURES
+} spa_feature_t;
+
typedef struct zfeature_info {
+ spa_feature_t fi_feature;
const char *fi_uname; /* User-facing feature name */
const char *fi_guid; /* On-disk feature identifier */
const char *fi_desc; /* Feature description */
boolean_t fi_can_readonly; /* Can open pool readonly w/o support? */
boolean_t fi_mos; /* Is the feature necessary to read the MOS? */
- struct zfeature_info **fi_depends; /* array; null terminated */
+ /* array of dependencies, terminated by SPA_FEATURE_NONE */
+ const spa_feature_t *fi_depends;
} zfeature_info_t;
typedef int (zfeature_func_t)(zfeature_info_t *fi, void *arg);
#define ZFS_FEATURE_DEBUG
-enum spa_feature {
- SPA_FEATURE_ASYNC_DESTROY,
- SPA_FEATURE_EMPTY_BPOBJ,
- SPA_FEATURE_LZ4_COMPRESS,
- SPA_FEATURE_MULTI_VDEV_CRASH_DUMP,
- SPA_FEATURE_SPACEMAP_HISTOGRAM,
- SPA_FEATURES
-} spa_feature_t;
-
extern zfeature_info_t spa_feature_table[SPA_FEATURES];
extern boolean_t zfeature_is_valid_guid(const char *);
extern boolean_t zfeature_is_supported(const char *);
-extern int zfeature_lookup_guid(const char *, zfeature_info_t **res);
-extern int zfeature_lookup_name(const char *, zfeature_info_t **res);
+extern int zfeature_lookup_name(const char *name, spa_feature_t *res);
extern void zpool_feature_init(void);