mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +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
							
								
									2fe0d5df94
								
							
						
					
					
						commit
						1215c3b609
					
				| @ -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; | ||||||
|  | |||||||
| @ -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); | 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; | ||||||
| @ -989,6 +994,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'/> | ||||||
| @ -1920,6 +1921,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'> | ||||||
| @ -3815,6 +3819,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); | ||||||
|  | } | ||||||
|  | |||||||
| @ -1494,6 +1494,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
	 Ameer Hamza
						Ameer Hamza