diff options
Diffstat (limited to 'sys/contrib/openzfs/lib')
22 files changed, 347 insertions, 436 deletions
| diff --git a/sys/contrib/openzfs/lib/libicp/Makefile.am b/sys/contrib/openzfs/lib/libicp/Makefile.am index ce24d13a760f..23adba10bc44 100644 --- a/sys/contrib/openzfs/lib/libicp/Makefile.am +++ b/sys/contrib/openzfs/lib/libicp/Makefile.am @@ -69,6 +69,7 @@ nodist_libicp_la_SOURCES += \  	module/icp/asm-x86_64/aes/aes_aesni.S \  	module/icp/asm-x86_64/modes/gcm_pclmulqdq.S \  	module/icp/asm-x86_64/modes/aesni-gcm-x86_64.S \ +	module/icp/asm-x86_64/modes/aesni-gcm-avx2-vaes.S \  	module/icp/asm-x86_64/modes/ghash-x86_64.S \  	module/icp/asm-x86_64/sha2/sha256-x86_64.S \  	module/icp/asm-x86_64/sha2/sha512-x86_64.S \ diff --git a/sys/contrib/openzfs/lib/libspl/Makefile.am b/sys/contrib/openzfs/lib/libspl/Makefile.am index 6640ecd582a7..0fd907d3011e 100644 --- a/sys/contrib/openzfs/lib/libspl/Makefile.am +++ b/sys/contrib/openzfs/lib/libspl/Makefile.am @@ -2,6 +2,9 @@ include $(srcdir)/%D%/include/Makefile.am  libspl_assert_la_CFLAGS = $(AM_CFLAGS) $(LIBRARY_CFLAGS) $(LIBUNWIND_CFLAGS)  libspl_la_CFLAGS        = $(libspl_assert_la_CFLAGS) +if TARGET_CPU_I386 +libspl_la_CFLAGS        += $(NO_ATOMIC_ALIGNMENT) +endif  noinst_LTLIBRARIES += libspl_assert.la libspl.la  CPPCHECKTARGETS    += libspl_assert.la libspl.la diff --git a/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/stat.h b/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/stat.h index a605af962a6d..13cc0b46ac93 100644 --- a/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/stat.h +++ b/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/stat.h @@ -33,7 +33,7 @@  #ifdef HAVE_STATX  #include <fcntl.h> -#include <linux/stat.h> +#include <sys/stat.h>  #endif  /* diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/debug.h b/sys/contrib/openzfs/lib/libspl/include/sys/debug.h index cced309bd1bb..02f33a68b75b 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/debug.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/debug.h @@ -38,4 +38,8 @@  #define	__maybe_unused __attribute__((unused))  #endif +#ifndef __must_check +#define	__must_check __attribute__((warn_unused_result)) +#endif +  #endif diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/simd.h b/sys/contrib/openzfs/lib/libspl/include/sys/simd.h index 1ef24f5a7d39..4772a5416b2e 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/simd.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/simd.h @@ -102,7 +102,9 @@ typedef enum cpuid_inst_sets {  	AES,  	PCLMULQDQ,  	MOVBE, -	SHA_NI +	SHA_NI, +	VAES, +	VPCLMULQDQ  } cpuid_inst_sets_t;  /* @@ -127,6 +129,8 @@ typedef struct cpuid_feature_desc {  #define	_AES_BIT		(1U << 25)  #define	_PCLMULQDQ_BIT		(1U << 1)  #define	_MOVBE_BIT		(1U << 22) +#define	_VAES_BIT		(1U << 9) +#define	_VPCLMULQDQ_BIT		(1U << 10)  #define	_SHA_NI_BIT		(1U << 29)  /* @@ -157,6 +161,8 @@ static const cpuid_feature_desc_t cpuid_features[] = {  	[PCLMULQDQ]	= {1U, 0U, _PCLMULQDQ_BIT,	ECX	},  	[MOVBE]		= {1U, 0U, _MOVBE_BIT,		ECX	},  	[SHA_NI]	= {7U, 0U, _SHA_NI_BIT,		EBX	}, +	[VAES]		= {7U, 0U, _VAES_BIT,		ECX	}, +	[VPCLMULQDQ]	= {7U, 0U, _VPCLMULQDQ_BIT,	ECX	},  };  /* @@ -231,6 +237,8 @@ CPUID_FEATURE_CHECK(aes, AES);  CPUID_FEATURE_CHECK(pclmulqdq, PCLMULQDQ);  CPUID_FEATURE_CHECK(movbe, MOVBE);  CPUID_FEATURE_CHECK(shani, SHA_NI); +CPUID_FEATURE_CHECK(vaes, VAES); +CPUID_FEATURE_CHECK(vpclmulqdq, VPCLMULQDQ);  /*   * Detect register set support @@ -382,6 +390,24 @@ zfs_shani_available(void)  }  /* + * Check if VAES instruction is available + */ +static inline boolean_t +zfs_vaes_available(void) +{ +	return (__cpuid_has_vaes()); +} + +/* + * Check if VPCLMULQDQ instruction is available + */ +static inline boolean_t +zfs_vpclmulqdq_available(void) +{ +	return (__cpuid_has_vpclmulqdq()); +} + +/*   * AVX-512 family of instruction sets:   *   * AVX512F	Foundation diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/time.h b/sys/contrib/openzfs/lib/libspl/include/sys/time.h index da80a5852ae5..062c6ec979fc 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/time.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/time.h @@ -98,6 +98,15 @@ gethrestime_sec(void)  }  static inline hrtime_t +getlrtime(void) +{ +	struct timeval tv; +	(void) gettimeofday(&tv, NULL); +	return ((((uint64_t)tv.tv_sec) * NANOSEC) + +	    ((uint64_t)tv.tv_usec * NSEC_PER_USEC)); +} + +static inline hrtime_t  gethrtime(void)  {  	struct timespec ts; diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/uio.h b/sys/contrib/openzfs/lib/libspl/include/sys/uio.h index 93aa4984d734..9ada482be000 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/uio.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/uio.h @@ -41,6 +41,7 @@  #ifndef	_LIBSPL_SYS_UIO_H  #define	_LIBSPL_SYS_UIO_H +#include <sys/sysmacros.h>  #include <sys/types.h>  #include_next <sys/uio.h> diff --git a/sys/contrib/openzfs/lib/libuutil/libuutil.abi b/sys/contrib/openzfs/lib/libuutil/libuutil.abi index 6c736c61e4a5..2a740afa07ca 100644 --- a/sys/contrib/openzfs/lib/libuutil/libuutil.abi +++ b/sys/contrib/openzfs/lib/libuutil/libuutil.abi @@ -616,6 +616,7 @@      <array-type-def dimensions='1' type-id='de572c22' size-in-bits='1472' id='6d3c2f42'>        <subrange length='23' type-id='7359adad' id='fdd0f594'/>      </array-type-def> +    <type-decl name='long long int' size-in-bits='64' id='1eb56b1e'/>      <array-type-def dimensions='1' type-id='3a47d82b' size-in-bits='256' id='a133ec23'>        <subrange length='4' type-id='7359adad' id='16fe7105'/>      </array-type-def> @@ -1020,13 +1021,6 @@      <array-type-def dimensions='1' type-id='03085adc' size-in-bits='192' id='083f8d58'>        <subrange length='3' type-id='7359adad' id='56f209d2'/>      </array-type-def> -    <array-type-def dimensions='1' type-id='d315442e' size-in-bits='16' id='811205dc'> -      <subrange length='1' type-id='7359adad' id='52f813b4'/> -    </array-type-def> -    <array-type-def dimensions='1' type-id='d3130597' size-in-bits='768' id='f63f23b9'> -      <subrange length='12' type-id='7359adad' id='84827bdc'/> -    </array-type-def> -    <type-decl name='long long int' size-in-bits='64' id='1eb56b1e'/>      <class-decl name='mnttab' size-in-bits='256' is-struct='yes' visibility='default' id='1b055409'>        <data-member access='public' layout-offset-in-bits='0'>          <var-decl name='mnt_special' type-id='26a90f95' visibility='default'/> @@ -1061,93 +1055,6 @@          <var-decl name='mnt_minor' type-id='3502e3ff' visibility='default'/>        </data-member>      </class-decl> -    <typedef-decl name='__u16' type-id='8efea9e5' id='d315442e'/> -    <typedef-decl name='__s32' type-id='95e97e5e' id='3158a266'/> -    <typedef-decl name='__u32' type-id='f0981eeb' id='3f1a6b60'/> -    <typedef-decl name='__s64' type-id='1eb56b1e' id='49659421'/> -    <typedef-decl name='__u64' type-id='3a47d82b' id='d3130597'/> -    <class-decl name='statx_timestamp' size-in-bits='128' is-struct='yes' visibility='default' id='94101016'> -      <data-member access='public' layout-offset-in-bits='0'> -        <var-decl name='tv_sec' type-id='49659421' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='64'> -        <var-decl name='tv_nsec' type-id='3f1a6b60' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='96'> -        <var-decl name='__reserved' type-id='3158a266' visibility='default'/> -      </data-member> -    </class-decl> -    <class-decl name='statx' size-in-bits='2048' is-struct='yes' visibility='default' id='720b04c5'> -      <data-member access='public' layout-offset-in-bits='0'> -        <var-decl name='stx_mask' type-id='3f1a6b60' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='32'> -        <var-decl name='stx_blksize' type-id='3f1a6b60' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='64'> -        <var-decl name='stx_attributes' type-id='d3130597' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='128'> -        <var-decl name='stx_nlink' type-id='3f1a6b60' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='160'> -        <var-decl name='stx_uid' type-id='3f1a6b60' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='192'> -        <var-decl name='stx_gid' type-id='3f1a6b60' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='224'> -        <var-decl name='stx_mode' type-id='d315442e' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='240'> -        <var-decl name='__spare0' type-id='811205dc' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='256'> -        <var-decl name='stx_ino' type-id='d3130597' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='320'> -        <var-decl name='stx_size' type-id='d3130597' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='384'> -        <var-decl name='stx_blocks' type-id='d3130597' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='448'> -        <var-decl name='stx_attributes_mask' type-id='d3130597' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='512'> -        <var-decl name='stx_atime' type-id='94101016' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='640'> -        <var-decl name='stx_btime' type-id='94101016' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='768'> -        <var-decl name='stx_ctime' type-id='94101016' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='896'> -        <var-decl name='stx_mtime' type-id='94101016' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='1024'> -        <var-decl name='stx_rdev_major' type-id='3f1a6b60' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='1056'> -        <var-decl name='stx_rdev_minor' type-id='3f1a6b60' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='1088'> -        <var-decl name='stx_dev_major' type-id='3f1a6b60' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='1120'> -        <var-decl name='stx_dev_minor' type-id='3f1a6b60' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='1152'> -        <var-decl name='stx_mnt_id' type-id='d3130597' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='1216'> -        <var-decl name='__spare2' type-id='d3130597' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='1280'> -        <var-decl name='__spare3' type-id='f63f23b9' visibility='default'/> -      </data-member> -    </class-decl>      <class-decl name='mntent' size-in-bits='320' is-struct='yes' visibility='default' id='56fe4a37'>        <data-member access='public' layout-offset-in-bits='0'>          <var-decl name='mnt_fsname' type-id='26a90f95' visibility='default'/> @@ -1237,8 +1144,6 @@      <pointer-type-def type-id='1b055409' size-in-bits='64' id='9d424d31'/>      <pointer-type-def type-id='0bbec9cd' size-in-bits='64' id='62f7a03d'/>      <qualified-type-def type-id='62f7a03d' restrict='yes' id='f1cadedf'/> -    <pointer-type-def type-id='720b04c5' size-in-bits='64' id='936b8e35'/> -    <qualified-type-def type-id='936b8e35' restrict='yes' id='31d265b7'/>      <function-decl name='getmntent_r' visibility='default' binding='global' size-in-bits='64'>        <parameter type-id='e75a27e9'/>        <parameter type-id='3cad23cd'/> @@ -1254,14 +1159,6 @@        <parameter type-id='95e97e5e'/>        <return type-id='26a90f95'/>      </function-decl> -    <function-decl name='statx' visibility='default' binding='global' size-in-bits='64'> -      <parameter type-id='95e97e5e'/> -      <parameter type-id='9d26089a'/> -      <parameter type-id='95e97e5e'/> -      <parameter type-id='f0981eeb'/> -      <parameter type-id='31d265b7'/> -      <return type-id='95e97e5e'/> -    </function-decl>      <function-decl name='__fprintf_chk' visibility='default' binding='global' size-in-bits='64'>        <parameter type-id='e75a27e9'/>        <parameter type-id='95e97e5e'/> diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs.abi b/sys/contrib/openzfs/lib/libzfs/libzfs.abi index ba161d1ef10f..f988d27a286a 100644 --- a/sys/contrib/openzfs/lib/libzfs/libzfs.abi +++ b/sys/contrib/openzfs/lib/libzfs/libzfs.abi @@ -571,6 +571,7 @@      <elf-symbol name='zpool_props_refresh' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>      <elf-symbol name='zpool_read_label' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>      <elf-symbol name='zpool_refresh_stats' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> +    <elf-symbol name='zpool_refresh_stats_from_handle' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>      <elf-symbol name='zpool_reguid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>      <elf-symbol name='zpool_reopen_one' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>      <elf-symbol name='zpool_scan' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> @@ -641,7 +642,7 @@      <elf-symbol name='sa_protocol_names' size='16' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>      <elf-symbol name='spa_feature_table' size='2632' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>      <elf-symbol name='zfeature_checks_disable' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> -    <elf-symbol name='zfs_deleg_perm_tab' size='528' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> +    <elf-symbol name='zfs_deleg_perm_tab' size='544' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>      <elf-symbol name='zfs_history_event_names' size='328' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>      <elf-symbol name='zfs_max_dataset_nesting' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>      <elf-symbol name='zfs_userquota_prop_prefixes' size='96' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> @@ -1458,103 +1459,8 @@      </function-decl>    </abi-instr>    <abi-instr address-size='64' path='lib/libspl/os/linux/getmntany.c' language='LANG_C99'> -    <array-type-def dimensions='1' type-id='d315442e' size-in-bits='16' id='811205dc'> -      <subrange length='1' type-id='7359adad' id='52f813b4'/> -    </array-type-def> -    <array-type-def dimensions='1' type-id='d3130597' size-in-bits='768' id='f63f23b9'> -      <subrange length='12' type-id='7359adad' id='84827bdc'/> -    </array-type-def> -    <typedef-decl name='__u16' type-id='8efea9e5' id='d315442e'/> -    <typedef-decl name='__s32' type-id='95e97e5e' id='3158a266'/> -    <typedef-decl name='__u32' type-id='f0981eeb' id='3f1a6b60'/> -    <typedef-decl name='__s64' type-id='1eb56b1e' id='49659421'/> -    <typedef-decl name='__u64' type-id='3a47d82b' id='d3130597'/> -    <class-decl name='statx_timestamp' size-in-bits='128' is-struct='yes' visibility='default' id='94101016'> -      <data-member access='public' layout-offset-in-bits='0'> -        <var-decl name='tv_sec' type-id='49659421' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='64'> -        <var-decl name='tv_nsec' type-id='3f1a6b60' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='96'> -        <var-decl name='__reserved' type-id='3158a266' visibility='default'/> -      </data-member> -    </class-decl> -    <class-decl name='statx' size-in-bits='2048' is-struct='yes' visibility='default' id='720b04c5'> -      <data-member access='public' layout-offset-in-bits='0'> -        <var-decl name='stx_mask' type-id='3f1a6b60' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='32'> -        <var-decl name='stx_blksize' type-id='3f1a6b60' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='64'> -        <var-decl name='stx_attributes' type-id='d3130597' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='128'> -        <var-decl name='stx_nlink' type-id='3f1a6b60' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='160'> -        <var-decl name='stx_uid' type-id='3f1a6b60' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='192'> -        <var-decl name='stx_gid' type-id='3f1a6b60' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='224'> -        <var-decl name='stx_mode' type-id='d315442e' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='240'> -        <var-decl name='__spare0' type-id='811205dc' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='256'> -        <var-decl name='stx_ino' type-id='d3130597' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='320'> -        <var-decl name='stx_size' type-id='d3130597' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='384'> -        <var-decl name='stx_blocks' type-id='d3130597' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='448'> -        <var-decl name='stx_attributes_mask' type-id='d3130597' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='512'> -        <var-decl name='stx_atime' type-id='94101016' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='640'> -        <var-decl name='stx_btime' type-id='94101016' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='768'> -        <var-decl name='stx_ctime' type-id='94101016' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='896'> -        <var-decl name='stx_mtime' type-id='94101016' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='1024'> -        <var-decl name='stx_rdev_major' type-id='3f1a6b60' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='1056'> -        <var-decl name='stx_rdev_minor' type-id='3f1a6b60' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='1088'> -        <var-decl name='stx_dev_major' type-id='3f1a6b60' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='1120'> -        <var-decl name='stx_dev_minor' type-id='3f1a6b60' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='1152'> -        <var-decl name='stx_mnt_id' type-id='d3130597' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='1216'> -        <var-decl name='__spare2' type-id='d3130597' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='1280'> -        <var-decl name='__spare3' type-id='f63f23b9' visibility='default'/> -      </data-member> -    </class-decl>      <pointer-type-def type-id='56fe4a37' size-in-bits='64' id='b6b61d2f'/>      <qualified-type-def type-id='b6b61d2f' restrict='yes' id='3cad23cd'/> -    <pointer-type-def type-id='720b04c5' size-in-bits='64' id='936b8e35'/> -    <qualified-type-def type-id='936b8e35' restrict='yes' id='31d265b7'/>      <function-decl name='getmntent_r' visibility='default' binding='global' size-in-bits='64'>        <parameter type-id='e75a27e9'/>        <parameter type-id='3cad23cd'/> @@ -1566,14 +1472,6 @@        <parameter type-id='822cd80b'/>        <return type-id='95e97e5e'/>      </function-decl> -    <function-decl name='statx' visibility='default' binding='global' size-in-bits='64'> -      <parameter type-id='95e97e5e'/> -      <parameter type-id='9d26089a'/> -      <parameter type-id='95e97e5e'/> -      <parameter type-id='f0981eeb'/> -      <parameter type-id='31d265b7'/> -      <return type-id='95e97e5e'/> -    </function-decl>    </abi-instr>    <abi-instr address-size='64' path='lib/libspl/timestamp.c' language='LANG_C99'>      <typedef-decl name='nl_item' type-id='95e97e5e' id='03b79a94'/> @@ -3194,6 +3092,10 @@        <parameter type-id='dace003f'/>        <return type-id='80f4b756'/>      </function-decl> +    <function-decl name='fnvlist_dup' visibility='default' binding='global' size-in-bits='64'> +      <parameter type-id='22cce67b'/> +      <return type-id='5ce45b60'/> +    </function-decl>      <function-decl name='fnvpair_value_nvlist' visibility='default' binding='global' size-in-bits='64'>        <parameter type-id='3fa542f0'/>        <return type-id='5ce45b60'/> @@ -3238,6 +3140,11 @@        <parameter type-id='37e3bd22' name='missing'/>        <return type-id='95e97e5e'/>      </function-decl> +    <function-decl name='zpool_refresh_stats_from_handle' mangled-name='zpool_refresh_stats_from_handle' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_refresh_stats_from_handle'> +      <parameter type-id='4c81de99' name='dzhp'/> +      <parameter type-id='4c81de99' name='szhp'/> +      <return type-id='48b5725f'/> +    </function-decl>      <function-decl name='zpool_skip_pool' mangled-name='zpool_skip_pool' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_skip_pool'>        <parameter type-id='80f4b756' name='poolname'/>        <return type-id='c19b74c3'/> @@ -6117,7 +6024,9 @@        <enumerator name='VDEV_PROP_TRIM_SUPPORT' value='49'/>        <enumerator name='VDEV_PROP_TRIM_ERRORS' value='50'/>        <enumerator name='VDEV_PROP_SLOW_IOS' value='51'/> -      <enumerator name='VDEV_NUM_PROPS' value='52'/> +      <enumerator name='VDEV_PROP_SIT_OUT' value='52'/> +      <enumerator name='VDEV_PROP_AUTOSIT' value='53'/> +      <enumerator name='VDEV_NUM_PROPS' value='54'/>      </enum-decl>      <typedef-decl name='vdev_prop_t' type-id='1573bec8' id='5aa5c90c'/>      <class-decl name='zpool_load_policy' size-in-bits='256' is-struct='yes' visibility='default' id='2f65b36f'> @@ -9396,10 +9305,6 @@        <parameter type-id='5ce45b60'/>        <return type-id='48b5725f'/>      </function-decl> -    <function-decl name='fnvlist_dup' visibility='default' binding='global' size-in-bits='64'> -      <parameter type-id='22cce67b'/> -      <return type-id='5ce45b60'/> -    </function-decl>      <function-decl name='spl_pagesize' mangled-name='spl_pagesize' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='spl_pagesize'>        <return type-id='b59d7dce'/>      </function-decl> @@ -9772,8 +9677,8 @@      </function-decl>    </abi-instr>    <abi-instr address-size='64' path='module/zcommon/zfs_deleg.c' language='LANG_C99'> -    <array-type-def dimensions='1' type-id='fa1870fd' size-in-bits='4224' id='55e705e7'> -      <subrange length='33' type-id='7359adad' id='6a5934df'/> +    <array-type-def dimensions='1' type-id='fa1870fd' size-in-bits='4352' id='55f84f08'> +      <subrange length='34' type-id='7359adad' id='6a6a7e00'/>      </array-type-def>      <array-type-def dimensions='1' type-id='fa1870fd' size-in-bits='infinite' id='7c00e69d'>        <subrange length='infinite' id='031f2035'/> @@ -9803,30 +9708,31 @@        <enumerator name='ZFS_DELEG_NOTE_PROMOTE' value='5'/>        <enumerator name='ZFS_DELEG_NOTE_RENAME' value='6'/>        <enumerator name='ZFS_DELEG_NOTE_SEND' value='7'/> -      <enumerator name='ZFS_DELEG_NOTE_RECEIVE' value='8'/> -      <enumerator name='ZFS_DELEG_NOTE_ALLOW' value='9'/> -      <enumerator name='ZFS_DELEG_NOTE_USERPROP' value='10'/> -      <enumerator name='ZFS_DELEG_NOTE_MOUNT' value='11'/> -      <enumerator name='ZFS_DELEG_NOTE_SHARE' value='12'/> -      <enumerator name='ZFS_DELEG_NOTE_USERQUOTA' value='13'/> -      <enumerator name='ZFS_DELEG_NOTE_GROUPQUOTA' value='14'/> -      <enumerator name='ZFS_DELEG_NOTE_USERUSED' value='15'/> -      <enumerator name='ZFS_DELEG_NOTE_GROUPUSED' value='16'/> -      <enumerator name='ZFS_DELEG_NOTE_USEROBJQUOTA' value='17'/> -      <enumerator name='ZFS_DELEG_NOTE_GROUPOBJQUOTA' value='18'/> -      <enumerator name='ZFS_DELEG_NOTE_USEROBJUSED' value='19'/> -      <enumerator name='ZFS_DELEG_NOTE_GROUPOBJUSED' value='20'/> -      <enumerator name='ZFS_DELEG_NOTE_HOLD' value='21'/> -      <enumerator name='ZFS_DELEG_NOTE_RELEASE' value='22'/> -      <enumerator name='ZFS_DELEG_NOTE_DIFF' value='23'/> -      <enumerator name='ZFS_DELEG_NOTE_BOOKMARK' value='24'/> -      <enumerator name='ZFS_DELEG_NOTE_LOAD_KEY' value='25'/> -      <enumerator name='ZFS_DELEG_NOTE_CHANGE_KEY' value='26'/> -      <enumerator name='ZFS_DELEG_NOTE_PROJECTUSED' value='27'/> -      <enumerator name='ZFS_DELEG_NOTE_PROJECTQUOTA' value='28'/> -      <enumerator name='ZFS_DELEG_NOTE_PROJECTOBJUSED' value='29'/> -      <enumerator name='ZFS_DELEG_NOTE_PROJECTOBJQUOTA' value='30'/> -      <enumerator name='ZFS_DELEG_NOTE_NONE' value='31'/> +      <enumerator name='ZFS_DELEG_NOTE_SEND_RAW' value='8'/> +      <enumerator name='ZFS_DELEG_NOTE_RECEIVE' value='9'/> +      <enumerator name='ZFS_DELEG_NOTE_ALLOW' value='10'/> +      <enumerator name='ZFS_DELEG_NOTE_USERPROP' value='11'/> +      <enumerator name='ZFS_DELEG_NOTE_MOUNT' value='12'/> +      <enumerator name='ZFS_DELEG_NOTE_SHARE' value='13'/> +      <enumerator name='ZFS_DELEG_NOTE_USERQUOTA' value='14'/> +      <enumerator name='ZFS_DELEG_NOTE_GROUPQUOTA' value='15'/> +      <enumerator name='ZFS_DELEG_NOTE_USERUSED' value='16'/> +      <enumerator name='ZFS_DELEG_NOTE_GROUPUSED' value='17'/> +      <enumerator name='ZFS_DELEG_NOTE_USEROBJQUOTA' value='18'/> +      <enumerator name='ZFS_DELEG_NOTE_GROUPOBJQUOTA' value='19'/> +      <enumerator name='ZFS_DELEG_NOTE_USEROBJUSED' value='20'/> +      <enumerator name='ZFS_DELEG_NOTE_GROUPOBJUSED' value='21'/> +      <enumerator name='ZFS_DELEG_NOTE_HOLD' value='22'/> +      <enumerator name='ZFS_DELEG_NOTE_RELEASE' value='23'/> +      <enumerator name='ZFS_DELEG_NOTE_DIFF' value='24'/> +      <enumerator name='ZFS_DELEG_NOTE_BOOKMARK' value='25'/> +      <enumerator name='ZFS_DELEG_NOTE_LOAD_KEY' value='26'/> +      <enumerator name='ZFS_DELEG_NOTE_CHANGE_KEY' value='27'/> +      <enumerator name='ZFS_DELEG_NOTE_PROJECTUSED' value='28'/> +      <enumerator name='ZFS_DELEG_NOTE_PROJECTQUOTA' value='29'/> +      <enumerator name='ZFS_DELEG_NOTE_PROJECTOBJUSED' value='30'/> +      <enumerator name='ZFS_DELEG_NOTE_PROJECTOBJQUOTA' value='31'/> +      <enumerator name='ZFS_DELEG_NOTE_NONE' value='32'/>      </enum-decl>      <typedef-decl name='zfs_deleg_note_t' type-id='729d4547' id='4613c173'/>      <class-decl name='zfs_deleg_perm_tab' size-in-bits='128' is-struct='yes' visibility='default' id='5aa05c1f'> diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs_config.c b/sys/contrib/openzfs/lib/libzfs/libzfs_config.c index 0d2102191389..9d704e4303ff 100644 --- a/sys/contrib/openzfs/lib/libzfs/libzfs_config.c +++ b/sys/contrib/openzfs/lib/libzfs/libzfs_config.c @@ -308,6 +308,23 @@ zpool_refresh_stats(zpool_handle_t *zhp, boolean_t *missing)  }  /* + * Copies the pool config and state from szhp to dzhp. szhp and dzhp must + * represent the same pool. Used by pool_list_refresh() to avoid another + * round-trip into the kernel to get stats already collected earlier in the + * function. + */ +void +zpool_refresh_stats_from_handle(zpool_handle_t *dzhp, zpool_handle_t *szhp) +{ +	VERIFY0(strcmp(dzhp->zpool_name, szhp->zpool_name)); +	nvlist_free(dzhp->zpool_old_config); +	dzhp->zpool_old_config = dzhp->zpool_config; +	dzhp->zpool_config = fnvlist_dup(szhp->zpool_config); +	dzhp->zpool_config_size = szhp->zpool_config_size; +	dzhp->zpool_state = szhp->zpool_state; +} + +/*   * The following environment variables are undocumented   * and should be used for testing purposes only:   * diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs_diff.c b/sys/contrib/openzfs/lib/libzfs/libzfs_diff.c index 6aa0375f98d7..5f50bce531f7 100644 --- a/sys/contrib/openzfs/lib/libzfs/libzfs_diff.c +++ b/sys/contrib/openzfs/lib/libzfs/libzfs_diff.c @@ -81,7 +81,7 @@ get_stats_for_obj(differ_info_t *di, const char *dsname, uint64_t obj,  	/* we can get stats even if we failed to get a path */  	(void) memcpy(sb, &zc.zc_stat, sizeof (zfs_stat_t));  	if (error == 0) { -		ASSERT(di->zerr == 0); +		ASSERT0(di->zerr);  		(void) strlcpy(pn, zc.zc_value, maxlen);  		return (0);  	} @@ -404,7 +404,7 @@ write_free_diffs(FILE *fp, differ_info_t *di, dmu_diff_record_t *dr)  	(void) strlcpy(zc.zc_name, di->fromsnap, sizeof (zc.zc_name));  	zc.zc_obj = dr->ddr_first - 1; -	ASSERT(di->zerr == 0); +	ASSERT0(di->zerr);  	while (zc.zc_obj < dr->ddr_last) {  		int err; diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs_import.c b/sys/contrib/openzfs/lib/libzfs/libzfs_import.c index 599e8e6f7819..7f276e9592c9 100644 --- a/sys/contrib/openzfs/lib/libzfs/libzfs_import.c +++ b/sys/contrib/openzfs/lib/libzfs/libzfs_import.c @@ -122,7 +122,7 @@ const pool_config_ops_t libzfs_config_ops = {  static uint64_t  label_offset(uint64_t size, int l)  { -	ASSERT(P2PHASE_TYPED(size, sizeof (vdev_label_t), uint64_t) == 0); +	ASSERT0(P2PHASE_TYPED(size, sizeof (vdev_label_t), uint64_t));  	return (l * sizeof (vdev_label_t) + (l < VDEV_LABELS / 2 ?  	    0 : size - VDEV_LABELS * sizeof (vdev_label_t)));  } diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs_mount.c b/sys/contrib/openzfs/lib/libzfs/libzfs_mount.c index 2a81b658d342..5c9e2199eed4 100644 --- a/sys/contrib/openzfs/lib/libzfs/libzfs_mount.c +++ b/sys/contrib/openzfs/lib/libzfs/libzfs_mount.c @@ -516,7 +516,7 @@ zfs_mount_at(zfs_handle_t *zhp, const char *options, int flags,  		} else if (rc == ENOTSUP) {  			int spa_version; -			VERIFY(zfs_spa_version(zhp, &spa_version) == 0); +			VERIFY0(zfs_spa_version(zhp, &spa_version));  			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,  			    "Can't mount a version %llu "  			    "file system on a version %d pool. Pool must be" diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs_pool.c b/sys/contrib/openzfs/lib/libzfs/libzfs_pool.c index 10b42720e963..ce154ae1a4cd 100644 --- a/sys/contrib/openzfs/lib/libzfs/libzfs_pool.c +++ b/sys/contrib/openzfs/lib/libzfs/libzfs_pool.c @@ -5549,6 +5549,8 @@ zpool_get_vdev_prop_value(nvlist_t *nvprop, vdev_prop_t prop, char *prop_name,  			/* Only use if provided by the RAIDZ VDEV above */  			if (prop == VDEV_PROP_RAIDZ_EXPANDING)  				return (ENOENT); +			if (prop == VDEV_PROP_SIT_OUT) +				return (ENOENT);  		}  		if (vdev_prop_index_to_string(prop, intval,  		    (const char **)&strval) != 0) @@ -5718,8 +5720,16 @@ zpool_set_vdev_prop(zpool_handle_t *zhp, const char *vdevname,  	nvlist_free(nvl);  	nvlist_free(outnvl); -	if (ret) -		(void) zpool_standard_error(zhp->zpool_hdl, errno, errbuf); +	if (ret) { +		if (errno == ENOTSUP) { +			zfs_error_aux(zhp->zpool_hdl, dgettext(TEXT_DOMAIN, +			    "property not supported for this vdev")); +			(void) zfs_error(zhp->zpool_hdl, EZFS_PROPTYPE, errbuf); +		} else { +			(void) zpool_standard_error(zhp->zpool_hdl, errno, +			    errbuf); +		} +	}  	return (ret);  } diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs_sendrecv.c b/sys/contrib/openzfs/lib/libzfs/libzfs_sendrecv.c index 1ad10ebb3c15..77134d197904 100644 --- a/sys/contrib/openzfs/lib/libzfs/libzfs_sendrecv.c +++ b/sys/contrib/openzfs/lib/libzfs/libzfs_sendrecv.c @@ -2505,7 +2505,7 @@ zfs_send_cb_impl(zfs_handle_t *zhp, const char *fromsnap, const char *tosnap,  		err = ENOENT;  	if (sdd.cleanup_fd != -1) { -		VERIFY(0 == close(sdd.cleanup_fd)); +		VERIFY0(close(sdd.cleanup_fd));  		sdd.cleanup_fd = -1;  	} @@ -2531,7 +2531,7 @@ err_out:  	fnvlist_free(sdd.snapholds);  	if (sdd.cleanup_fd != -1) -		VERIFY(0 == close(sdd.cleanup_fd)); +		VERIFY0(close(sdd.cleanup_fd));  	return (err);  } @@ -5108,7 +5108,7 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap,  		nvlist_t *holds, *errors = NULL;  		int cleanup_fd = -1; -		VERIFY(0 == nvlist_alloc(&holds, 0, KM_SLEEP)); +		VERIFY0(nvlist_alloc(&holds, 0, KM_SLEEP));  		for (pair = nvlist_next_nvpair(snapholds_nvlist, NULL);  		    pair != NULL;  		    pair = nvlist_next_nvpair(snapholds_nvlist, pair)) { @@ -5560,7 +5560,7 @@ zfs_receive_impl(libzfs_handle_t *hdl, const char *tosnap,  			if ((cp = strchr(nonpackage_sendfs, '@')) != NULL)  				*cp = '\0';  			sendfs = nonpackage_sendfs; -			VERIFY(finalsnap == NULL); +			VERIFY0P(finalsnap);  		}  		return (zfs_receive_one(hdl, infd, tosnap, originsnap, flags,  		    &drr, &drr_noswap, sendfs, stream_nv, stream_avl, top_zfs, diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs_status.c b/sys/contrib/openzfs/lib/libzfs/libzfs_status.c index bdddefb92165..a589ca6896f0 100644 --- a/sys/contrib/openzfs/lib/libzfs/libzfs_status.c +++ b/sys/contrib/openzfs/lib/libzfs/libzfs_status.c @@ -98,57 +98,57 @@ static const char *const zfs_msgid_table[] = {  #define	NMSGID	(sizeof (zfs_msgid_table) / sizeof (zfs_msgid_table[0]))  static int -vdev_missing(vdev_stat_t *vs, uint_t vsc) +vdev_missing(vdev_stat_t *vs, uint_t vsc, void *arg)  { -	(void) vsc; +	(void) vsc, (void) arg;  	return (vs->vs_state == VDEV_STATE_CANT_OPEN &&  	    vs->vs_aux == VDEV_AUX_OPEN_FAILED);  }  static int -vdev_faulted(vdev_stat_t *vs, uint_t vsc) +vdev_faulted(vdev_stat_t *vs, uint_t vsc, void *arg)  { -	(void) vsc; +	(void) vsc, (void) arg;  	return (vs->vs_state == VDEV_STATE_FAULTED);  }  static int -vdev_errors(vdev_stat_t *vs, uint_t vsc) +vdev_errors(vdev_stat_t *vs, uint_t vsc, void *arg)  { -	(void) vsc; +	(void) vsc, (void) arg;  	return (vs->vs_state == VDEV_STATE_DEGRADED ||  	    vs->vs_read_errors != 0 || vs->vs_write_errors != 0 ||  	    vs->vs_checksum_errors != 0);  }  static int -vdev_broken(vdev_stat_t *vs, uint_t vsc) +vdev_broken(vdev_stat_t *vs, uint_t vsc, void *arg)  { -	(void) vsc; +	(void) vsc, (void) arg;  	return (vs->vs_state == VDEV_STATE_CANT_OPEN);  }  static int -vdev_offlined(vdev_stat_t *vs, uint_t vsc) +vdev_offlined(vdev_stat_t *vs, uint_t vsc, void *arg)  { -	(void) vsc; +	(void) vsc, (void) arg;  	return (vs->vs_state == VDEV_STATE_OFFLINE);  }  static int -vdev_removed(vdev_stat_t *vs, uint_t vsc) +vdev_removed(vdev_stat_t *vs, uint_t vsc, void *arg)  { -	(void) vsc; +	(void) vsc, (void) arg;  	return (vs->vs_state == VDEV_STATE_REMOVED);  }  static int -vdev_non_native_ashift(vdev_stat_t *vs, uint_t vsc) +vdev_non_native_ashift(vdev_stat_t *vs, uint_t vsc, void *arg)  { -	if (getenv("ZPOOL_STATUS_NON_NATIVE_ASHIFT_IGNORE") != NULL) -		return (0); +	uint64_t ashift = *(uint64_t *)arg;  	return (VDEV_STAT_VALID(vs_physical_ashift, vsc) && +	    (ashift == 0 || vs->vs_configured_ashift < ashift) &&  	    vs->vs_configured_ashift < vs->vs_physical_ashift);  } @@ -156,8 +156,8 @@ vdev_non_native_ashift(vdev_stat_t *vs, uint_t vsc)   * Detect if any leaf devices that have seen errors or could not be opened.   */  static boolean_t -find_vdev_problem(nvlist_t *vdev, int (*func)(vdev_stat_t *, uint_t), -    boolean_t ignore_replacing) +find_vdev_problem(nvlist_t *vdev, int (*func)(vdev_stat_t *, uint_t, void *), +    void *arg, boolean_t ignore_replacing)  {  	nvlist_t **child;  	uint_t c, children; @@ -177,14 +177,16 @@ find_vdev_problem(nvlist_t *vdev, int (*func)(vdev_stat_t *, uint_t),  	if (nvlist_lookup_nvlist_array(vdev, ZPOOL_CONFIG_CHILDREN, &child,  	    &children) == 0) { -		for (c = 0; c < children; c++) -			if (find_vdev_problem(child[c], func, ignore_replacing)) +		for (c = 0; c < children; c++) { +			if (find_vdev_problem(child[c], func, arg, +			    ignore_replacing))  				return (B_TRUE); +		}  	} else {  		uint_t vsc;  		vdev_stat_t *vs = (vdev_stat_t *)fnvlist_lookup_uint64_array(  		    vdev, ZPOOL_CONFIG_VDEV_STATS, &vsc); -		if (func(vs, vsc) != 0) +		if (func(vs, vsc, arg) != 0)  			return (B_TRUE);  	} @@ -193,9 +195,11 @@ find_vdev_problem(nvlist_t *vdev, int (*func)(vdev_stat_t *, uint_t),  	 */  	if (nvlist_lookup_nvlist_array(vdev, ZPOOL_CONFIG_L2CACHE, &child,  	    &children) == 0) { -		for (c = 0; c < children; c++) -			if (find_vdev_problem(child[c], func, ignore_replacing)) +		for (c = 0; c < children; c++) { +			if (find_vdev_problem(child[c], func, arg, +			    ignore_replacing))  				return (B_TRUE); +		}  	}  	return (B_FALSE); @@ -220,7 +224,7 @@ find_vdev_problem(nvlist_t *vdev, int (*func)(vdev_stat_t *, uint_t),   */  static zpool_status_t  check_status(nvlist_t *config, boolean_t isimport, -    zpool_errata_t *erratap, const char *compat) +    zpool_errata_t *erratap, const char *compat, uint64_t ashift)  {  	pool_scan_stat_t *ps = NULL;  	uint_t vsc, psc; @@ -371,15 +375,15 @@ check_status(nvlist_t *config, boolean_t isimport,  	 * Bad devices in non-replicated config.  	 */  	if (vs->vs_state == VDEV_STATE_CANT_OPEN && -	    find_vdev_problem(nvroot, vdev_faulted, B_TRUE)) +	    find_vdev_problem(nvroot, vdev_faulted, NULL, B_TRUE))  		return (ZPOOL_STATUS_FAULTED_DEV_NR);  	if (vs->vs_state == VDEV_STATE_CANT_OPEN && -	    find_vdev_problem(nvroot, vdev_missing, B_TRUE)) +	    find_vdev_problem(nvroot, vdev_missing, NULL, B_TRUE))  		return (ZPOOL_STATUS_MISSING_DEV_NR);  	if (vs->vs_state == VDEV_STATE_CANT_OPEN && -	    find_vdev_problem(nvroot, vdev_broken, B_TRUE)) +	    find_vdev_problem(nvroot, vdev_broken, NULL, B_TRUE))  		return (ZPOOL_STATUS_CORRUPT_LABEL_NR);  	/* @@ -402,35 +406,37 @@ check_status(nvlist_t *config, boolean_t isimport,  	/*  	 * Missing devices in a replicated config.  	 */ -	if (find_vdev_problem(nvroot, vdev_faulted, B_TRUE)) +	if (find_vdev_problem(nvroot, vdev_faulted, NULL, B_TRUE))  		return (ZPOOL_STATUS_FAULTED_DEV_R); -	if (find_vdev_problem(nvroot, vdev_missing, B_TRUE)) +	if (find_vdev_problem(nvroot, vdev_missing, NULL, B_TRUE))  		return (ZPOOL_STATUS_MISSING_DEV_R); -	if (find_vdev_problem(nvroot, vdev_broken, B_TRUE)) +	if (find_vdev_problem(nvroot, vdev_broken, NULL, B_TRUE))  		return (ZPOOL_STATUS_CORRUPT_LABEL_R);  	/*  	 * Devices with errors  	 */ -	if (!isimport && find_vdev_problem(nvroot, vdev_errors, B_TRUE)) +	if (!isimport && find_vdev_problem(nvroot, vdev_errors, NULL, B_TRUE))  		return (ZPOOL_STATUS_FAILING_DEV);  	/*  	 * Offlined devices  	 */ -	if (find_vdev_problem(nvroot, vdev_offlined, B_TRUE)) +	if (find_vdev_problem(nvroot, vdev_offlined, NULL, B_TRUE))  		return (ZPOOL_STATUS_OFFLINE_DEV);  	/*  	 * Removed device  	 */ -	if (find_vdev_problem(nvroot, vdev_removed, B_TRUE)) +	if (find_vdev_problem(nvroot, vdev_removed, NULL, B_TRUE))  		return (ZPOOL_STATUS_REMOVED_DEV);  	/*  	 * Suboptimal, but usable, ashift configuration.  	 */ -	if (find_vdev_problem(nvroot, vdev_non_native_ashift, B_FALSE)) +	if (!isimport && +	    getenv("ZPOOL_STATUS_NON_NATIVE_ASHIFT_IGNORE") == NULL && +	    find_vdev_problem(nvroot, vdev_non_native_ashift, &ashift, B_FALSE))  		return (ZPOOL_STATUS_NON_NATIVE_ASHIFT);  	/* @@ -510,8 +516,10 @@ zpool_get_status(zpool_handle_t *zhp, const char **msgid,  	    ZFS_MAXPROPLEN, NULL, B_FALSE) != 0)  		compatibility[0] = '\0'; +	uint64_t ashift = zpool_get_prop_int(zhp, ZPOOL_PROP_ASHIFT, NULL); +  	zpool_status_t ret = check_status(zhp->zpool_config, B_FALSE, errata, -	    compatibility); +	    compatibility, ashift);  	if (msgid != NULL) {  		if (ret >= NMSGID) @@ -526,7 +534,7 @@ zpool_status_t  zpool_import_status(nvlist_t *config, const char **msgid,      zpool_errata_t *errata)  { -	zpool_status_t ret = check_status(config, B_TRUE, errata, NULL); +	zpool_status_t ret = check_status(config, B_TRUE, errata, NULL, 0);  	if (ret >= NMSGID)  		*msgid = NULL; diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs_util.c b/sys/contrib/openzfs/lib/libzfs/libzfs_util.c index 4edddc2a759b..26f5135dff62 100644 --- a/sys/contrib/openzfs/lib/libzfs/libzfs_util.c +++ b/sys/contrib/openzfs/lib/libzfs/libzfs_util.c @@ -776,6 +776,11 @@ zpool_standard_error_fmt(libzfs_handle_t *hdl, int error, const char *fmt, ...)  	case ZFS_ERR_ASHIFT_MISMATCH:  		zfs_verror(hdl, EZFS_ASHIFT_MISMATCH, fmt, ap);  		break; +	case ZFS_ERR_TOO_MANY_SITOUTS: +		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "too many disks " +		    "already sitting out")); +		zfs_verror(hdl, EZFS_BUSY, fmt, ap); +		break;  	default:  		zfs_error_aux(hdl, "%s", zfs_strerror(error));  		zfs_verror(hdl, EZFS_UNKNOWN, fmt, ap); diff --git a/sys/contrib/openzfs/lib/libzfs_core/libzfs_core.abi b/sys/contrib/openzfs/lib/libzfs_core/libzfs_core.abi index 7464b3adb254..263cad045f7a 100644 --- a/sys/contrib/openzfs/lib/libzfs_core/libzfs_core.abi +++ b/sys/contrib/openzfs/lib/libzfs_core/libzfs_core.abi @@ -617,6 +617,7 @@      <array-type-def dimensions='1' type-id='de572c22' size-in-bits='1472' id='6d3c2f42'>        <subrange length='23' type-id='7359adad' id='fdd0f594'/>      </array-type-def> +    <type-decl name='long long int' size-in-bits='64' id='1eb56b1e'/>      <array-type-def dimensions='1' type-id='3a47d82b' size-in-bits='256' id='a133ec23'>        <subrange length='4' type-id='7359adad' id='16fe7105'/>      </array-type-def> @@ -988,13 +989,6 @@      </function-decl>    </abi-instr>    <abi-instr address-size='64' path='lib/libspl/os/linux/getmntany.c' language='LANG_C99'> -    <array-type-def dimensions='1' type-id='d315442e' size-in-bits='16' id='811205dc'> -      <subrange length='1' type-id='7359adad' id='52f813b4'/> -    </array-type-def> -    <array-type-def dimensions='1' type-id='d3130597' size-in-bits='768' id='f63f23b9'> -      <subrange length='12' type-id='7359adad' id='84827bdc'/> -    </array-type-def> -    <type-decl name='long long int' size-in-bits='64' id='1eb56b1e'/>      <class-decl name='mnttab' size-in-bits='256' is-struct='yes' visibility='default' id='1b055409'>        <data-member access='public' layout-offset-in-bits='0'>          <var-decl name='mnt_special' type-id='26a90f95' visibility='default'/> @@ -1029,93 +1023,6 @@          <var-decl name='mnt_minor' type-id='3502e3ff' visibility='default'/>        </data-member>      </class-decl> -    <typedef-decl name='__u16' type-id='8efea9e5' id='d315442e'/> -    <typedef-decl name='__s32' type-id='95e97e5e' id='3158a266'/> -    <typedef-decl name='__u32' type-id='f0981eeb' id='3f1a6b60'/> -    <typedef-decl name='__s64' type-id='1eb56b1e' id='49659421'/> -    <typedef-decl name='__u64' type-id='3a47d82b' id='d3130597'/> -    <class-decl name='statx_timestamp' size-in-bits='128' is-struct='yes' visibility='default' id='94101016'> -      <data-member access='public' layout-offset-in-bits='0'> -        <var-decl name='tv_sec' type-id='49659421' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='64'> -        <var-decl name='tv_nsec' type-id='3f1a6b60' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='96'> -        <var-decl name='__reserved' type-id='3158a266' visibility='default'/> -      </data-member> -    </class-decl> -    <class-decl name='statx' size-in-bits='2048' is-struct='yes' visibility='default' id='720b04c5'> -      <data-member access='public' layout-offset-in-bits='0'> -        <var-decl name='stx_mask' type-id='3f1a6b60' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='32'> -        <var-decl name='stx_blksize' type-id='3f1a6b60' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='64'> -        <var-decl name='stx_attributes' type-id='d3130597' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='128'> -        <var-decl name='stx_nlink' type-id='3f1a6b60' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='160'> -        <var-decl name='stx_uid' type-id='3f1a6b60' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='192'> -        <var-decl name='stx_gid' type-id='3f1a6b60' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='224'> -        <var-decl name='stx_mode' type-id='d315442e' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='240'> -        <var-decl name='__spare0' type-id='811205dc' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='256'> -        <var-decl name='stx_ino' type-id='d3130597' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='320'> -        <var-decl name='stx_size' type-id='d3130597' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='384'> -        <var-decl name='stx_blocks' type-id='d3130597' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='448'> -        <var-decl name='stx_attributes_mask' type-id='d3130597' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='512'> -        <var-decl name='stx_atime' type-id='94101016' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='640'> -        <var-decl name='stx_btime' type-id='94101016' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='768'> -        <var-decl name='stx_ctime' type-id='94101016' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='896'> -        <var-decl name='stx_mtime' type-id='94101016' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='1024'> -        <var-decl name='stx_rdev_major' type-id='3f1a6b60' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='1056'> -        <var-decl name='stx_rdev_minor' type-id='3f1a6b60' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='1088'> -        <var-decl name='stx_dev_major' type-id='3f1a6b60' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='1120'> -        <var-decl name='stx_dev_minor' type-id='3f1a6b60' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='1152'> -        <var-decl name='stx_mnt_id' type-id='d3130597' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='1216'> -        <var-decl name='__spare2' type-id='d3130597' visibility='default'/> -      </data-member> -      <data-member access='public' layout-offset-in-bits='1280'> -        <var-decl name='__spare3' type-id='f63f23b9' visibility='default'/> -      </data-member> -    </class-decl>      <class-decl name='mntent' size-in-bits='320' is-struct='yes' visibility='default' id='56fe4a37'>        <data-member access='public' layout-offset-in-bits='0'>          <var-decl name='mnt_fsname' type-id='26a90f95' visibility='default'/> @@ -1191,8 +1098,6 @@      <pointer-type-def type-id='1b055409' size-in-bits='64' id='9d424d31'/>      <pointer-type-def type-id='0bbec9cd' size-in-bits='64' id='62f7a03d'/>      <qualified-type-def type-id='62f7a03d' restrict='yes' id='f1cadedf'/> -    <pointer-type-def type-id='720b04c5' size-in-bits='64' id='936b8e35'/> -    <qualified-type-def type-id='936b8e35' restrict='yes' id='31d265b7'/>      <function-decl name='getmntent_r' visibility='default' binding='global' size-in-bits='64'>        <parameter type-id='e75a27e9'/>        <parameter type-id='3cad23cd'/> @@ -1208,14 +1113,6 @@        <parameter type-id='95e97e5e'/>        <return type-id='26a90f95'/>      </function-decl> -    <function-decl name='statx' visibility='default' binding='global' size-in-bits='64'> -      <parameter type-id='95e97e5e'/> -      <parameter type-id='9d26089a'/> -      <parameter type-id='95e97e5e'/> -      <parameter type-id='f0981eeb'/> -      <parameter type-id='31d265b7'/> -      <return type-id='95e97e5e'/> -    </function-decl>      <function-decl name='stat64' visibility='default' binding='global' size-in-bits='64'>        <parameter type-id='9d26089a'/>        <parameter type-id='f1cadedf'/> diff --git a/sys/contrib/openzfs/lib/libzpool/abd_os.c b/sys/contrib/openzfs/lib/libzpool/abd_os.c index 0d5795de143a..8bd7a64ab24a 100644 --- a/sys/contrib/openzfs/lib/libzpool/abd_os.c +++ b/sys/contrib/openzfs/lib/libzpool/abd_os.c @@ -302,7 +302,7 @@ abd_iter_at_end(struct abd_iter *aiter)  void  abd_iter_advance(struct abd_iter *aiter, size_t amount)  { -	ASSERT3P(aiter->iter_mapaddr, ==, NULL); +	ASSERT0P(aiter->iter_mapaddr);  	ASSERT0(aiter->iter_mapsize);  	if (abd_iter_at_end(aiter)) @@ -315,7 +315,7 @@ abd_iter_advance(struct abd_iter *aiter, size_t amount)  void  abd_iter_map(struct abd_iter *aiter)  { -	ASSERT3P(aiter->iter_mapaddr, ==, NULL); +	ASSERT0P(aiter->iter_mapaddr);  	ASSERT0(aiter->iter_mapsize);  	if (abd_iter_at_end(aiter)) diff --git a/sys/contrib/openzfs/lib/libzpool/kernel.c b/sys/contrib/openzfs/lib/libzpool/kernel.c index 2e8bf160465a..70eba5099119 100644 --- a/sys/contrib/openzfs/lib/libzpool/kernel.c +++ b/sys/contrib/openzfs/lib/libzpool/kernel.c @@ -23,6 +23,7 @@   * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.   * Copyright (c) 2012, 2018 by Delphix. All rights reserved.   * Copyright (c) 2016 Actifio, Inc. All rights reserved. + * Copyright (c) 2025, Klara, Inc.   */  #include <assert.h> @@ -38,6 +39,7 @@  #include <sys/processor.h>  #include <sys/rrwlock.h>  #include <sys/spa.h> +#include <sys/spa_impl.h>  #include <sys/stat.h>  #include <sys/systeminfo.h>  #include <sys/time.h> @@ -369,7 +371,7 @@ cv_timedwait(kcondvar_t *cv, kmutex_t *mp, clock_t abstime)  	if (delta <= 0)  		return (-1); -	VERIFY(gettimeofday(&tv, NULL) == 0); +	VERIFY0(gettimeofday(&tv, NULL));  	ts.tv_sec = tv.tv_sec + delta / hz;  	ts.tv_nsec = tv.tv_usec * NSEC_PER_USEC + (delta % hz) * (NANOSEC / hz); @@ -644,39 +646,60 @@ __dprintf(boolean_t dprint, const char *file, const char *func,   * cmn_err() and panic()   * =========================================================================   */ -static char ce_prefix[CE_IGNORE][10] = { "", "NOTICE: ", "WARNING: ", "" }; -static char ce_suffix[CE_IGNORE][2] = { "", "\n", "\n", "" }; -__attribute__((noreturn)) void -vpanic(const char *fmt, va_list adx) +static __attribute__((noreturn)) void +panic_stop_or_abort(void)  { -	(void) fprintf(stderr, "error: "); -	(void) vfprintf(stderr, fmt, adx); -	(void) fprintf(stderr, "\n"); +	const char *stopenv = getenv("LIBZPOOL_PANIC_STOP"); +	if (stopenv != NULL && atoi(stopenv)) { +		fputs("libzpool: LIBZPOOL_PANIC_STOP is set, sending " +		    "SIGSTOP to process group\n", stderr); +		fflush(stderr); + +		kill(0, SIGSTOP); + +		fputs("libzpool: continued after panic stop, " +		    "aborting\n", stderr); +	}  	abort();	/* think of it as a "user-level crash dump" */  } -__attribute__((noreturn)) void -panic(const char *fmt, ...) -{ -	va_list adx; +static void +vcmn_msg(int ce, const char *fmt, va_list adx) +{ +	switch (ce) { +	case CE_IGNORE: +		return; +	case CE_CONT: +		break; +	case CE_NOTE: +		fputs("libzpool: NOTICE: ", stderr); +		break; +	case CE_WARN: +		fputs("libzpool: WARNING: ", stderr); +		break; +	case CE_PANIC: +		fputs("libzpool: PANIC: ", stderr); +		break; +	default: +		fputs("libzpool: [unknown severity %d]: ", stderr); +		break; +	} -	va_start(adx, fmt); -	vpanic(fmt, adx); -	va_end(adx); +	vfprintf(stderr, fmt, adx); +	if (ce != CE_CONT) +		fputc('\n', stderr); +	fflush(stderr);  }  void  vcmn_err(int ce, const char *fmt, va_list adx)  { +	vcmn_msg(ce, fmt, adx); +  	if (ce == CE_PANIC) -		vpanic(fmt, adx); -	if (ce != CE_NOTE) {	/* suppress noise in userland stress testing */ -		(void) fprintf(stderr, "%s", ce_prefix[ce]); -		(void) vfprintf(stderr, fmt, adx); -		(void) fprintf(stderr, "%s", ce_suffix[ce]); -	} +		panic_stop_or_abort();  }  void @@ -689,6 +712,25 @@ cmn_err(int ce, const char *fmt, ...)  	va_end(adx);  } +__attribute__((noreturn)) void +panic(const char *fmt, ...) +{ +	va_list adx; + +	va_start(adx, fmt); +	vcmn_msg(CE_PANIC, fmt, adx); +	va_end(adx); + +	panic_stop_or_abort(); +} + +__attribute__((noreturn)) void +vpanic(const char *fmt, va_list adx) +{ +	vcmn_msg(CE_PANIC, fmt, adx); +	panic_stop_or_abort(); +} +  /*   * =========================================================================   * misc routines @@ -811,6 +853,79 @@ umem_out_of_memory(void)  	return (0);  } +static void +spa_config_load(void) +{ +	void *buf = NULL; +	nvlist_t *nvlist, *child; +	nvpair_t *nvpair; +	char *pathname; +	zfs_file_t *fp; +	zfs_file_attr_t zfa; +	uint64_t fsize; +	int err; + +	/* +	 * Open the configuration file. +	 */ +	pathname = kmem_alloc(MAXPATHLEN, KM_SLEEP); + +	(void) snprintf(pathname, MAXPATHLEN, "%s", spa_config_path); + +	err = zfs_file_open(pathname, O_RDONLY, 0, &fp); +	if (err) +		err = zfs_file_open(ZPOOL_CACHE_BOOT, O_RDONLY, 0, &fp); + +	kmem_free(pathname, MAXPATHLEN); + +	if (err) +		return; + +	if (zfs_file_getattr(fp, &zfa)) +		goto out; + +	fsize = zfa.zfa_size; +	buf = kmem_alloc(fsize, KM_SLEEP); + +	/* +	 * Read the nvlist from the file. +	 */ +	if (zfs_file_read(fp, buf, fsize, NULL) < 0) +		goto out; + +	/* +	 * Unpack the nvlist. +	 */ +	if (nvlist_unpack(buf, fsize, &nvlist, KM_SLEEP) != 0) +		goto out; + +	/* +	 * Iterate over all elements in the nvlist, creating a new spa_t for +	 * each one with the specified configuration. +	 */ +	mutex_enter(&spa_namespace_lock); +	nvpair = NULL; +	while ((nvpair = nvlist_next_nvpair(nvlist, nvpair)) != NULL) { +		if (nvpair_type(nvpair) != DATA_TYPE_NVLIST) +			continue; + +		child = fnvpair_value_nvlist(nvpair); + +		if (spa_lookup(nvpair_name(nvpair)) != NULL) +			continue; +		(void) spa_add(nvpair_name(nvpair), child, NULL); +	} +	mutex_exit(&spa_namespace_lock); + +	nvlist_free(nvlist); + +out: +	if (buf != NULL) +		kmem_free(buf, fsize); + +	zfs_file_close(fp); +} +  void  kernel_init(int mode)  { @@ -835,6 +950,7 @@ kernel_init(int mode)  	zstd_init();  	spa_init((spa_mode_t)mode); +	spa_config_load();  	fletcher_4_init(); @@ -1163,7 +1279,7 @@ zfs_file_write(zfs_file_t *fp, const void *buf, size_t count, ssize_t *resid)   */  int  zfs_file_pwrite(zfs_file_t *fp, const void *buf, -    size_t count, loff_t pos, ssize_t *resid) +    size_t count, loff_t pos, uint8_t ashift, ssize_t *resid)  {  	ssize_t rc, split, done;  	int sectors; @@ -1173,8 +1289,8 @@ zfs_file_pwrite(zfs_file_t *fp, const void *buf,  	 * system calls so that the process can be killed in between.  	 * This is used by ztest to simulate realistic failure modes.  	 */ -	sectors = count >> SPA_MINBLOCKSHIFT; -	split = (sectors > 0 ? rand() % sectors : 0) << SPA_MINBLOCKSHIFT; +	sectors = count >> ashift; +	split = (sectors > 0 ? rand() % sectors : 0) << ashift;  	rc = pwrite64(fp->f_fd, buf, split, pos);  	if (rc != -1) {  		done = rc; diff --git a/sys/contrib/openzfs/lib/libzpool/util.c b/sys/contrib/openzfs/lib/libzpool/util.c index 1d0d1a1e56d9..66d6f43967d5 100644 --- a/sys/contrib/openzfs/lib/libzpool/util.c +++ b/sys/contrib/openzfs/lib/libzpool/util.c @@ -137,12 +137,10 @@ show_pool_stats(spa_t *spa)  	nvlist_t *config, *nvroot;  	const char *name; -	VERIFY(spa_get_stats(spa_name(spa), &config, NULL, 0) == 0); +	VERIFY0(spa_get_stats(spa_name(spa), &config, NULL, 0)); -	VERIFY(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, -	    &nvroot) == 0); -	VERIFY(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME, -	    &name) == 0); +	VERIFY0(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, &nvroot)); +	VERIFY0(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME, &name));  	show_vdev_stats(name, ZPOOL_CONFIG_CHILDREN, nvroot, 0);  	show_vdev_stats(NULL, ZPOOL_CONFIG_L2CACHE, nvroot, 0); diff --git a/sys/contrib/openzfs/lib/libzutil/zutil_import.c b/sys/contrib/openzfs/lib/libzutil/zutil_import.c index ccdc874076c3..08367f4c064d 100644 --- a/sys/contrib/openzfs/lib/libzutil/zutil_import.c +++ b/sys/contrib/openzfs/lib/libzutil/zutil_import.c @@ -917,7 +917,7 @@ error:  static uint64_t  label_offset(uint64_t size, int l)  { -	ASSERT(P2PHASE_TYPED(size, sizeof (vdev_label_t), uint64_t) == 0); +	ASSERT0(P2PHASE_TYPED(size, sizeof (vdev_label_t), uint64_t));  	return (l * sizeof (vdev_label_t) + (l < VDEV_LABELS / 2 ?  	    0 : size - VDEV_LABELS * sizeof (vdev_label_t)));  } @@ -1769,7 +1769,7 @@ zpool_find_import_cached(libpc_handle_t *hdl, importargs_t *iarg)  			fnvlist_add_nvlist(pools, nvpair_name(pair),  			    fnvpair_value_nvlist(pair)); -			VERIFY3P(nvlist_next_nvpair(nv, pair), ==, NULL); +			VERIFY0P(nvlist_next_nvpair(nv, pair));  			iarg->guid = saved_guid;  			iarg->poolname = saved_poolname; @@ -1903,30 +1903,43 @@ zpool_find_config(libpc_handle_t *hdl, const char *target, nvlist_t **configp,  		*sepp = '\0';  	pools = zpool_search_import(hdl, args); +	if (pools == NULL) { +		zutil_error_aux(hdl, dgettext(TEXT_DOMAIN, "no pools found")); +		(void) zutil_error_fmt(hdl, LPC_UNKNOWN, dgettext(TEXT_DOMAIN, +		    "failed to find config for pool '%s'"), targetdup); +		free(targetdup); +		return (ENOENT); +	} -	if (pools != NULL) { -		nvpair_t *elem = NULL; -		while ((elem = nvlist_next_nvpair(pools, elem)) != NULL) { -			VERIFY0(nvpair_value_nvlist(elem, &config)); -			if (pool_match(config, targetdup)) { -				count++; -				if (match != NULL) { -					/* multiple matches found */ -					continue; -				} else { -					match = fnvlist_dup(config); -				} +	nvpair_t *elem = NULL; +	while ((elem = nvlist_next_nvpair(pools, elem)) != NULL) { +		VERIFY0(nvpair_value_nvlist(elem, &config)); +		if (pool_match(config, targetdup)) { +			count++; +			if (match != NULL) { +				/* multiple matches found */ +				continue; +			} else { +				match = fnvlist_dup(config);  			}  		} -		fnvlist_free(pools);  	} +	fnvlist_free(pools);  	if (count == 0) { +		zutil_error_aux(hdl, dgettext(TEXT_DOMAIN, +		    "no matching pools")); +		(void) zutil_error_fmt(hdl, LPC_UNKNOWN, dgettext(TEXT_DOMAIN, +		    "failed to find config for pool '%s'"), targetdup);  		free(targetdup);  		return (ENOENT);  	}  	if (count > 1) { +		zutil_error_aux(hdl, dgettext(TEXT_DOMAIN, +		    "more than one matching pool")); +		(void) zutil_error_fmt(hdl, LPC_UNKNOWN, dgettext(TEXT_DOMAIN, +		    "failed to find config for pool '%s'"), targetdup);  		free(targetdup);  		fnvlist_free(match);  		return (EINVAL); | 
