mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2025-06-25 10:38:00 +03:00
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 <behlendorf1@llnl.gov> Reviewed-by: Alexander Motin <mav@FreeBSD.org> Reviewed-by: Rob Norris <robn@despairlabs.com> Signed-off-by: Ameer Hamza <ahamza@ixsystems.com> Closes #17368
This commit is contained in:
parent
b048bfa9c1
commit
2a91d577b1
@ -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_load_key(zfs_handle_t *, boolean_t, const char *);
|
||||||
_LIBZFS_H int zfs_crypto_unload_key(zfs_handle_t *);
|
_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 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 {
|
typedef struct zprop_list {
|
||||||
int pl_prop;
|
int pl_prop;
|
||||||
|
@ -997,6 +997,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);
|
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 {
|
typedef struct dmu_objset_stats {
|
||||||
uint64_t dds_num_clones; /* number of clones of this */
|
uint64_t dds_num_clones; /* number of clones of this */
|
||||||
uint64_t dds_creation_txg;
|
uint64_t dds_creation_txg;
|
||||||
@ -1006,6 +1011,7 @@ typedef struct dmu_objset_stats {
|
|||||||
uint8_t dds_inconsistent;
|
uint8_t dds_inconsistent;
|
||||||
uint8_t dds_redacted;
|
uint8_t dds_redacted;
|
||||||
char dds_origin[ZFS_MAX_DATASET_NAME_LEN];
|
char dds_origin[ZFS_MAX_DATASET_NAME_LEN];
|
||||||
|
uint8_t dds_flags; /* dmu_objset_flag_t */
|
||||||
} dmu_objset_stats_t;
|
} dmu_objset_stats_t;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -345,6 +345,7 @@
|
|||||||
<elf-symbol name='zfs_hold' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
<elf-symbol name='zfs_hold' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||||
<elf-symbol name='zfs_hold_nvl' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
<elf-symbol name='zfs_hold_nvl' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||||
<elf-symbol name='zfs_ioctl' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
<elf-symbol name='zfs_ioctl' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||||
|
<elf-symbol name='zfs_is_encrypted' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||||
<elf-symbol name='zfs_is_mounted' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
<elf-symbol name='zfs_is_mounted' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||||
<elf-symbol name='zfs_is_shared' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
<elf-symbol name='zfs_is_shared' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||||
<elf-symbol name='zfs_isnumber' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
<elf-symbol name='zfs_isnumber' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||||
@ -1925,6 +1926,9 @@
|
|||||||
<data-member access='public' layout-offset-in-bits='248'>
|
<data-member access='public' layout-offset-in-bits='248'>
|
||||||
<var-decl name='dds_origin' type-id='d1617432' visibility='default'/>
|
<var-decl name='dds_origin' type-id='d1617432' visibility='default'/>
|
||||||
</data-member>
|
</data-member>
|
||||||
|
<data-member access='public' layout-offset-in-bits='2296'>
|
||||||
|
<var-decl name='dds_flags' type-id='b96825af' visibility='default'/>
|
||||||
|
</data-member>
|
||||||
</class-decl>
|
</class-decl>
|
||||||
<typedef-decl name='dmu_objset_stats_t' type-id='098f0221' id='b2c14f17'/>
|
<typedef-decl name='dmu_objset_stats_t' type-id='098f0221' id='b2c14f17'/>
|
||||||
<enum-decl name='zfs_type_t' naming-typedef-id='2e45de5d' id='5d8f7321'>
|
<enum-decl name='zfs_type_t' naming-typedef-id='2e45de5d' id='5d8f7321'>
|
||||||
@ -3805,6 +3809,10 @@
|
|||||||
<parameter type-id='c19b74c3' name='inheritkey'/>
|
<parameter type-id='c19b74c3' name='inheritkey'/>
|
||||||
<return type-id='95e97e5e'/>
|
<return type-id='95e97e5e'/>
|
||||||
</function-decl>
|
</function-decl>
|
||||||
|
<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'>
|
||||||
|
<parameter type-id='9200a744' name='zhp'/>
|
||||||
|
<return type-id='c19b74c3'/>
|
||||||
|
</function-decl>
|
||||||
<function-decl name='zfs_error_aux' visibility='default' binding='global' size-in-bits='64'>
|
<function-decl name='zfs_error_aux' visibility='default' binding='global' size-in-bits='64'>
|
||||||
<parameter type-id='b0382bb3'/>
|
<parameter type-id='b0382bb3'/>
|
||||||
<parameter type-id='80f4b756'/>
|
<parameter type-id='80f4b756'/>
|
||||||
|
@ -1818,3 +1818,14 @@ error:
|
|||||||
zfs_error(zhp->zfs_hdl, EZFS_CRYPTOFAILED, errbuf);
|
zfs_error(zhp->zfs_hdl, EZFS_CRYPTOFAILED, errbuf);
|
||||||
return (ret);
|
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);
|
||||||
|
}
|
||||||
|
@ -1461,6 +1461,9 @@
|
|||||||
<data-member access='public' layout-offset-in-bits='248'>
|
<data-member access='public' layout-offset-in-bits='248'>
|
||||||
<var-decl name='dds_origin' type-id='d1617432' visibility='default'/>
|
<var-decl name='dds_origin' type-id='d1617432' visibility='default'/>
|
||||||
</data-member>
|
</data-member>
|
||||||
|
<data-member access='public' layout-offset-in-bits='2296'>
|
||||||
|
<var-decl name='dds_flags' type-id='b96825af' visibility='default'/>
|
||||||
|
</data-member>
|
||||||
</class-decl>
|
</class-decl>
|
||||||
<typedef-decl name='dmu_objset_stats_t' type-id='098f0221' id='b2c14f17'/>
|
<typedef-decl name='dmu_objset_stats_t' type-id='098f0221' id='b2c14f17'/>
|
||||||
<enum-decl name='dmu_objset_type' id='6b1b19f9'>
|
<enum-decl name='dmu_objset_type' id='6b1b19f9'>
|
||||||
|
@ -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_guid = dsl_get_guid(ds);
|
||||||
stat->dds_redacted = dsl_get_redacted(ds);
|
stat->dds_redacted = dsl_get_redacted(ds);
|
||||||
stat->dds_origin[0] = '\0';
|
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) {
|
if (ds->ds_is_snapshot) {
|
||||||
stat->dds_is_snapshot = B_TRUE;
|
stat->dds_is_snapshot = B_TRUE;
|
||||||
stat->dds_num_clones = dsl_get_numclones(ds);
|
stat->dds_num_clones = dsl_get_numclones(ds);
|
||||||
|
Loading…
Reference in New Issue
Block a user