Skip to content

Commit 2a91d57

Browse files
authored
Expose dataset encryption status via fast stat path
In truenas_pylibzfs, we query list of encrypted datasets several times, which is expensive. This commit exposes a public API zfs_is_encrypted() to get encryption status from fast stat path without having to refresh the properties. Reviewed-by: Brian Behlendorf <[email protected]> Reviewed-by: Alexander Motin <[email protected]> Reviewed-by: Rob Norris <[email protected]> Signed-off-by: Ameer Hamza <[email protected]> Closes #17368
1 parent b048bfa commit 2a91d57

File tree

6 files changed

+32
-0
lines changed

6 files changed

+32
-0
lines changed

include/libzfs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -591,6 +591,7 @@ _LIBZFS_H int zfs_crypto_attempt_load_keys(libzfs_handle_t *, const char *);
591591
_LIBZFS_H int zfs_crypto_load_key(zfs_handle_t *, boolean_t, const char *);
592592
_LIBZFS_H int zfs_crypto_unload_key(zfs_handle_t *);
593593
_LIBZFS_H int zfs_crypto_rewrap(zfs_handle_t *, nvlist_t *, boolean_t);
594+
_LIBZFS_H boolean_t zfs_is_encrypted(zfs_handle_t *);
594595

595596
typedef struct zprop_list {
596597
int pl_prop;

include/sys/dmu.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -997,6 +997,11 @@ void dmu_object_size_from_db(dmu_buf_t *db, uint32_t *blksize,
997997

998998
void dmu_object_dnsize_from_db(dmu_buf_t *db, int *dnsize);
999999

1000+
typedef enum {
1001+
DDS_FLAG_ENCRYPTED = (1<<0),
1002+
DDS_FLAG_HAS_ENCRYPTED = (1<<7),
1003+
} dmu_objset_flag_t;
1004+
10001005
typedef struct dmu_objset_stats {
10011006
uint64_t dds_num_clones; /* number of clones of this */
10021007
uint64_t dds_creation_txg;
@@ -1006,6 +1011,7 @@ typedef struct dmu_objset_stats {
10061011
uint8_t dds_inconsistent;
10071012
uint8_t dds_redacted;
10081013
char dds_origin[ZFS_MAX_DATASET_NAME_LEN];
1014+
uint8_t dds_flags; /* dmu_objset_flag_t */
10091015
} dmu_objset_stats_t;
10101016

10111017
/*

lib/libzfs/libzfs.abi

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,7 @@
345345
<elf-symbol name='zfs_hold' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
346346
<elf-symbol name='zfs_hold_nvl' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
347347
<elf-symbol name='zfs_ioctl' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
348+
<elf-symbol name='zfs_is_encrypted' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
348349
<elf-symbol name='zfs_is_mounted' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
349350
<elf-symbol name='zfs_is_shared' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
350351
<elf-symbol name='zfs_isnumber' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
@@ -1925,6 +1926,9 @@
19251926
<data-member access='public' layout-offset-in-bits='248'>
19261927
<var-decl name='dds_origin' type-id='d1617432' visibility='default'/>
19271928
</data-member>
1929+
<data-member access='public' layout-offset-in-bits='2296'>
1930+
<var-decl name='dds_flags' type-id='b96825af' visibility='default'/>
1931+
</data-member>
19281932
</class-decl>
19291933
<typedef-decl name='dmu_objset_stats_t' type-id='098f0221' id='b2c14f17'/>
19301934
<enum-decl name='zfs_type_t' naming-typedef-id='2e45de5d' id='5d8f7321'>
@@ -3805,6 +3809,10 @@
38053809
<parameter type-id='c19b74c3' name='inheritkey'/>
38063810
<return type-id='95e97e5e'/>
38073811
</function-decl>
3812+
<function-decl name='zfs_is_encrypted' mangled-name='zfs_is_encrypted' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_is_encrypted'>
3813+
<parameter type-id='9200a744' name='zhp'/>
3814+
<return type-id='c19b74c3'/>
3815+
</function-decl>
38083816
<function-decl name='zfs_error_aux' visibility='default' binding='global' size-in-bits='64'>
38093817
<parameter type-id='b0382bb3'/>
38103818
<parameter type-id='80f4b756'/>

lib/libzfs/libzfs_crypto.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1818,3 +1818,14 @@ zfs_crypto_rewrap(zfs_handle_t *zhp, nvlist_t *raw_props, boolean_t inheritkey)
18181818
zfs_error(zhp->zfs_hdl, EZFS_CRYPTOFAILED, errbuf);
18191819
return (ret);
18201820
}
1821+
1822+
boolean_t
1823+
zfs_is_encrypted(zfs_handle_t *zhp)
1824+
{
1825+
uint8_t flags = zhp->zfs_dmustats.dds_flags;
1826+
1827+
if (flags & DDS_FLAG_HAS_ENCRYPTED)
1828+
return ((flags & DDS_FLAG_ENCRYPTED) != 0);
1829+
1830+
return (zfs_prop_get_int(zhp, ZFS_PROP_ENCRYPTION) != ZIO_CRYPT_OFF);
1831+
}

lib/libzfs_core/libzfs_core.abi

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1461,6 +1461,9 @@
14611461
<data-member access='public' layout-offset-in-bits='248'>
14621462
<var-decl name='dds_origin' type-id='d1617432' visibility='default'/>
14631463
</data-member>
1464+
<data-member access='public' layout-offset-in-bits='2296'>
1465+
<var-decl name='dds_flags' type-id='b96825af' visibility='default'/>
1466+
</data-member>
14641467
</class-decl>
14651468
<typedef-decl name='dmu_objset_stats_t' type-id='098f0221' id='b2c14f17'/>
14661469
<enum-decl name='dmu_objset_type' id='6b1b19f9'>

module/zfs/dsl_dataset.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2886,6 +2886,9 @@ dsl_dataset_fast_stat(dsl_dataset_t *ds, dmu_objset_stats_t *stat)
28862886
stat->dds_guid = dsl_get_guid(ds);
28872887
stat->dds_redacted = dsl_get_redacted(ds);
28882888
stat->dds_origin[0] = '\0';
2889+
stat->dds_flags = DDS_FLAG_HAS_ENCRYPTED;
2890+
if (ds->ds_dir->dd_crypto_obj != 0)
2891+
stat->dds_flags |= DDS_FLAG_ENCRYPTED;
28892892
if (ds->ds_is_snapshot) {
28902893
stat->dds_is_snapshot = B_TRUE;
28912894
stat->dds_num_clones = dsl_get_numclones(ds);

0 commit comments

Comments
 (0)