Print this page
2619 asynchronous destruction of ZFS file systems
2747 SPA versioning with zfs feature flags
Reviewed by: Matt Ahrens <mahrens@delphix.com>
Reviewed by: George Wilson <gwilson@delphix.com>
Reviewed by: Richard Lowe <richlowe@richlowe.net>
Reviewed by: Dan Kruchinin <dan.kruchinin@gmail.com>
Approved by: Dan McDonald <danmcd@nexenta.com>

@@ -289,10 +289,19 @@
         ZPOOL_STATUS_IO_FAILURE_WAIT,   /* failed I/O, failmode 'wait' */
         ZPOOL_STATUS_IO_FAILURE_CONTINUE, /* failed I/O, failmode 'continue' */
         ZPOOL_STATUS_BAD_LOG,           /* cannot read log chain(s) */
 
         /*
+         * If the pool has unsupported features but can still be opened in
+         * read-only mode, its status is ZPOOL_STATUS_UNSUP_FEAT_WRITE. If the
+         * pool has unsupported features but cannot be opened at all, its
+         * status is ZPOOL_STATUS_UNSUP_FEAT_READ.
+         */
+        ZPOOL_STATUS_UNSUP_FEAT_READ,   /* unsupported features for read */
+        ZPOOL_STATUS_UNSUP_FEAT_WRITE,  /* unsupported features for write */
+
+        /*
          * These faults have no corresponding message ID.  At the time we are
          * checking the status, the original reason for the FMA fault (I/O or
          * checksum errors) has been lost.
          */
         ZPOOL_STATUS_FAULTED_DEV_R,     /* faulted device with replicas */

@@ -320,10 +329,11 @@
 
 /*
  * Statistics and configuration functions.
  */
 extern nvlist_t *zpool_get_config(zpool_handle_t *, nvlist_t **);
+extern nvlist_t *zpool_get_features(zpool_handle_t *);
 extern int zpool_refresh_stats(zpool_handle_t *, boolean_t *);
 extern int zpool_get_errlog(zpool_handle_t *, nvlist_t **);
 
 /*
  * Import and export functions

@@ -332,10 +342,11 @@
 extern int zpool_export_force(zpool_handle_t *);
 extern int zpool_import(libzfs_handle_t *, nvlist_t *, const char *,
     char *altroot);
 extern int zpool_import_props(libzfs_handle_t *, nvlist_t *, const char *,
     nvlist_t *, int);
+extern void zpool_print_unsup_feat(nvlist_t *config);
 
 /*
  * Search for pools to import
  */
 

@@ -421,10 +432,12 @@
     char *propbuf, int proplen, boolean_t literal);
 extern int zfs_prop_get_written_int(zfs_handle_t *zhp, const char *propname,
     uint64_t *propvalue);
 extern int zfs_prop_get_written(zfs_handle_t *zhp, const char *propname,
     char *propbuf, int proplen, boolean_t literal);
+extern int zfs_prop_get_feature(zfs_handle_t *zhp, const char *propname,
+    char *buf, size_t len);
 extern int zfs_get_snapused_int(zfs_handle_t *firstsnap, zfs_handle_t *lastsnap,
     uint64_t *usedp);
 extern uint64_t zfs_prop_get_int(zfs_handle_t *, zfs_prop_t);
 extern int zfs_prop_inherit(zfs_handle_t *, const char *, boolean_t);
 extern const char *zfs_prop_values(zfs_prop_t);

@@ -448,14 +461,23 @@
 extern void zfs_prune_proplist(zfs_handle_t *, uint8_t *);
 
 #define ZFS_MOUNTPOINT_NONE     "none"
 #define ZFS_MOUNTPOINT_LEGACY   "legacy"
 
+#define ZFS_FEATURE_DISABLED    "disabled"
+#define ZFS_FEATURE_ENABLED     "enabled"
+#define ZFS_FEATURE_ACTIVE      "active"
+
+#define ZFS_UNSUPPORTED_INACTIVE        "inactive"
+#define ZFS_UNSUPPORTED_READONLY        "readonly"
+
 /*
  * zpool property management
  */
 extern int zpool_expand_proplist(zpool_handle_t *, zprop_list_t **);
+extern int zpool_prop_get_feature(zpool_handle_t *, const char *, char *,
+    size_t);
 extern const char *zpool_prop_default_string(zpool_prop_t);
 extern uint64_t zpool_prop_default_numeric(zpool_prop_t);
 extern const char *zpool_prop_column_name(zpool_prop_t);
 extern boolean_t zpool_prop_align_right(zpool_prop_t);