diff --git a/include/libzfs.h b/include/libzfs.h
index 8774d490f..301fc339e 100644
--- a/include/libzfs.h
+++ b/include/libzfs.h
@@ -591,6 +591,7 @@ _LIBZFS_H int zfs_crypto_attempt_load_keys(libzfs_handle_t *, const char *);
_LIBZFS_H int zfs_crypto_load_key(zfs_handle_t *, boolean_t, const char *);
_LIBZFS_H int zfs_crypto_unload_key(zfs_handle_t *);
_LIBZFS_H int zfs_crypto_rewrap(zfs_handle_t *, nvlist_t *, boolean_t);
+_LIBZFS_H boolean_t zfs_is_encrypted(zfs_handle_t *);
typedef struct zprop_list {
int pl_prop;
diff --git a/include/sys/dmu.h b/include/sys/dmu.h
index da1fdfd23..0c0c049e9 100644
--- a/include/sys/dmu.h
+++ b/include/sys/dmu.h
@@ -980,6 +980,11 @@ void dmu_object_size_from_db(dmu_buf_t *db, uint32_t *blksize,
void dmu_object_dnsize_from_db(dmu_buf_t *db, int *dnsize);
+typedef enum {
+ DDS_FLAG_ENCRYPTED = (1<<0),
+ DDS_FLAG_HAS_ENCRYPTED = (1<<7),
+} dmu_objset_flag_t;
+
typedef struct dmu_objset_stats {
uint64_t dds_num_clones; /* number of clones of this */
uint64_t dds_creation_txg;
@@ -989,6 +994,7 @@ typedef struct dmu_objset_stats {
uint8_t dds_inconsistent;
uint8_t dds_redacted;
char dds_origin[ZFS_MAX_DATASET_NAME_LEN];
+ uint8_t dds_flags; /* dmu_objset_flag_t */
} dmu_objset_stats_t;
/*
diff --git a/lib/libzfs/libzfs.abi b/lib/libzfs/libzfs.abi
index 1f9fde667..dfebe9d7a 100644
--- a/lib/libzfs/libzfs.abi
+++ b/lib/libzfs/libzfs.abi
@@ -345,6 +345,7 @@
+
@@ -1920,6 +1921,9 @@
+
+
+
@@ -3815,6 +3819,10 @@
+
+
+
+
diff --git a/lib/libzfs/libzfs_crypto.c b/lib/libzfs/libzfs_crypto.c
index da1d1ee29..8907802ec 100644
--- a/lib/libzfs/libzfs_crypto.c
+++ b/lib/libzfs/libzfs_crypto.c
@@ -1818,3 +1818,14 @@ error:
zfs_error(zhp->zfs_hdl, EZFS_CRYPTOFAILED, errbuf);
return (ret);
}
+
+boolean_t
+zfs_is_encrypted(zfs_handle_t *zhp)
+{
+ uint8_t flags = zhp->zfs_dmustats.dds_flags;
+
+ if (flags & DDS_FLAG_HAS_ENCRYPTED)
+ return ((flags & DDS_FLAG_ENCRYPTED) != 0);
+
+ return (zfs_prop_get_int(zhp, ZFS_PROP_ENCRYPTION) != ZIO_CRYPT_OFF);
+}
diff --git a/lib/libzfs_core/libzfs_core.abi b/lib/libzfs_core/libzfs_core.abi
index 6a9c20a2b..32237fb60 100644
--- a/lib/libzfs_core/libzfs_core.abi
+++ b/lib/libzfs_core/libzfs_core.abi
@@ -1494,6 +1494,9 @@
+
+
+
diff --git a/module/zfs/dsl_dataset.c b/module/zfs/dsl_dataset.c
index e4113c604..ae55cf8b8 100644
--- a/module/zfs/dsl_dataset.c
+++ b/module/zfs/dsl_dataset.c
@@ -2886,6 +2886,9 @@ dsl_dataset_fast_stat(dsl_dataset_t *ds, dmu_objset_stats_t *stat)
stat->dds_guid = dsl_get_guid(ds);
stat->dds_redacted = dsl_get_redacted(ds);
stat->dds_origin[0] = '\0';
+ stat->dds_flags = DDS_FLAG_HAS_ENCRYPTED;
+ if (ds->ds_dir->dd_crypto_obj != 0)
+ stat->dds_flags |= DDS_FLAG_ENCRYPTED;
if (ds->ds_is_snapshot) {
stat->dds_is_snapshot = B_TRUE;
stat->dds_num_clones = dsl_get_numclones(ds);