diff options
Diffstat (limited to 'sys/contrib/openzfs/lib')
204 files changed, 20995 insertions, 11023 deletions
diff --git a/sys/contrib/openzfs/lib/Makefile.am b/sys/contrib/openzfs/lib/Makefile.am index f07975cc03fc..050a6cac0a37 100644 --- a/sys/contrib/openzfs/lib/Makefile.am +++ b/sys/contrib/openzfs/lib/Makefile.am @@ -9,11 +9,11 @@ # These library interfaces are subject to change at any time. # # -# CMDS: zhack/ztest/zdb/ zfs/zpool/zed/ +# CMDS: zhack/ztest/ zfs/zpool/zed/ # raidz_{test,bench} zinject/zstream # | | # LIBS: | | libzfsbootenv* -# | | | +# |--libzdb--zdb | | # | | | # libzpool libzfs* ----------------+ # | | | \ / | | | @@ -33,50 +33,92 @@ # | | | # \-------- libspl ----+------/ # -# * - A stable ABI is provided for these libraries -# # # NB: GNU Automake Manual, Chapter 8.3.5: Libtool Convenience Libraries # These nine libraries are intermediary build components. # -SUBDIRS = libavl libicp libshare libspl libtpool libzstd -CPPCHECKDIRS = libavl libicp libnvpair libshare libspl libtpool libunicode -CPPCHECKDIRS += libuutil libzfs libzfs_core libzfsbootenv libzpool libzutil +# * - A stable ABI is provided for these libraries; +# when performing an ABI check the following options are applied: +# +# --no-unreferenced-symbols: Exclude symbols which are not referenced by +# any debug information. Without this _init() and _fini() are incorrectly +# reported on CentOS7 for libuutil.so. +# +# --headers-dir1: Limit ABI checks to public OpenZFS headers, otherwise +# changes in public system headers are also reported. +# +# --suppressions: Honor a suppressions file for each library to provide +# a mechanism for suppressing harmless warnings. +# +noinst_LTLIBRARIES = +lib_LTLIBRARIES = +pkgconfig_DATA = +include $(srcdir)/%D%/libavl/Makefile.am +include $(srcdir)/%D%/libicp/Makefile.am +include $(srcdir)/%D%/libnvpair/Makefile.am +include $(srcdir)/%D%/libshare/Makefile.am +include $(srcdir)/%D%/libspl/Makefile.am +include $(srcdir)/%D%/libtpool/Makefile.am +include $(srcdir)/%D%/libunicode/Makefile.am +include $(srcdir)/%D%/libuutil/Makefile.am +include $(srcdir)/%D%/libzdb/Makefile.am +include $(srcdir)/%D%/libzfs_core/Makefile.am +include $(srcdir)/%D%/libzfs/Makefile.am +include $(srcdir)/%D%/libzfsbootenv/Makefile.am +include $(srcdir)/%D%/libzpool/Makefile.am +include $(srcdir)/%D%/libzstd/Makefile.am +include $(srcdir)/%D%/libzutil/Makefile.am if BUILD_LINUX -SUBDIRS += libefi -CPPCHECKDIRS += libefi +include $(srcdir)/%D%/libefi/Makefile.am endif -# libnvpair is installed as part of the final build product -# libzutil depends on it, so it must be compiled before libzutil -SUBDIRS += libnvpair -# libzutil depends on libefi if present -SUBDIRS += libzutil libunicode +PHONY += lib +lib: $(noinst_LTLIBRARIES) $(lib_LTLIBRARIES) -# These five libraries, which are installed as the final build product, -# incorporate the eight convenience libraries given above. -DISTLIBS = libuutil libzfs_core libzfs libzpool libzfsbootenv -SUBDIRS += $(DISTLIBS) -DISTLIBS += libnvpair -# An ABI is stored for each of these libraries. Note that libzpool.so -# is only linked against by ztest and zdb and no stable ABI is provided. -ABILIBS = libnvpair libuutil libzfs_core libzfs libzfsbootenv +PHONY += checkabi storeabi check_libabi_version allow_libabi_only_for_x86_64 -PHONY = checkabi storeabi cppcheck -checkabi: $(ABILIBS) - set -e ; for dir in $(ABILIBS) ; do \ - $(MAKE) -C $$dir checkabi ; \ - done +check_libabi_version: + if [ $$(abidw -v | $(SED) 's/[^0-9]//g') -lt 200 ]; then \ + printf '%s\n' "" \ + "*** Please use libabigail 2.0.0 version or newer;" \ + "*** otherwise results are not consistent!" \ + "(or see https://github.com/openzfs/libabigail-docker)"; \ + exit 1; \ + fi -storeabi: $(ABILIBS) - set -e ; for dir in $(ABILIBS) ; do \ - $(MAKE) -C $$dir storeabi ; \ - done +allow_libabi_only_for_x86_64: + echo '*** ABI definitions provided apply only to x86_64:' + echo '*** not checking or storing ABI and assuming success.' -cppcheck: $(CPPCHECKDIRS) - set -e ; for dir in $(CPPCHECKDIRS) ; do \ - $(MAKE) -C $$dir cppcheck ; \ +if TARGET_CPU_X86_64 +# These should depend on $(lib_LTLIBRARIES), but this breaks on CI when bound into Docker +checkabi: check_libabi_version + err=0; \ + for lib in $(lib_LTLIBRARIES); do \ + lib=$${lib%.la}; \ + [ -f $(srcdir)/lib/$$lib/$$lib.suppr ] || continue; \ + echo $$lib:; \ + abidiff --no-unreferenced-symbols \ + --headers-dir1 include \ + --suppressions $(srcdir)/lib/$$lib/$$lib.suppr \ + $(srcdir)/lib/$$lib/$$lib.abi .libs/$$lib.so || err=$$((err + 1)); \ + done; \ + exit $$err + +storeabi: check_libabi_version + for lib in $(lib_LTLIBRARIES); do \ + lib=$${lib%.la}; \ + [ -f $(srcdir)/lib/$$lib/$$lib.suppr ] || continue; \ + abidw --no-show-locs \ + --no-corpus-path \ + --no-comp-dir-path \ + --type-id-style hash \ + .libs/$$lib.so > $(srcdir)/lib/$$lib/$$lib.abi; \ done +else +checkabi: allow_libabi_only_for_x86_64 +storeabi: allow_libabi_only_for_x86_64 +endif diff --git a/sys/contrib/openzfs/lib/libavl/Makefile.am b/sys/contrib/openzfs/lib/libavl/Makefile.am index 3166febd02c5..3b302ee9deae 100644 --- a/sys/contrib/openzfs/lib/libavl/Makefile.am +++ b/sys/contrib/openzfs/lib/libavl/Makefile.am @@ -1,17 +1,7 @@ -include $(top_srcdir)/config/Rules.am +libavl_la_CFLAGS = $(AM_CFLAGS) $(KERNEL_CFLAGS) $(LIBRARY_CFLAGS) +libavl_la_CFLAGS += -fvisibility=hidden -VPATH = $(top_srcdir)/module/avl/ - -# Includes kernel code, generate warnings for large stack frames -AM_CFLAGS += $(FRAME_LARGER_THAN) -AM_CFLAGS += -fvisibility=hidden - -noinst_LTLIBRARIES = libavl.la - -KERNEL_C = \ - avl.c +noinst_LTLIBRARIES += libavl.la nodist_libavl_la_SOURCES = \ - $(KERNEL_C) - -include $(top_srcdir)/config/CppCheck.am + module/avl/avl.c diff --git a/sys/contrib/openzfs/lib/libefi/Makefile.am b/sys/contrib/openzfs/lib/libefi/Makefile.am index 580319a31495..5c3e57346c86 100644 --- a/sys/contrib/openzfs/lib/libefi/Makefile.am +++ b/sys/contrib/openzfs/lib/libefi/Makefile.am @@ -1,15 +1,11 @@ -include $(top_srcdir)/config/Rules.am +libefi_la_CFLAGS = $(AM_CFLAGS) $(LIBRARY_CFLAGS) +libefi_la_CFLAGS += $(LIBUUID_CFLAGS) $(ZLIB_CFLAGS) +libefi_la_CFLAGS += -fvisibility=hidden -AM_CFLAGS += $(LIBUUID_CFLAGS) $(ZLIB_CFLAGS) -AM_CFLAGS += -fvisibility=hidden +noinst_LTLIBRARIES += libefi.la +CPPCHECKTARGETS += libefi.la -noinst_LTLIBRARIES = libefi.la - -USER_C = \ - rdwr_efi.c - -libefi_la_SOURCES = $(USER_C) +libefi_la_SOURCES = \ + %D%/rdwr_efi.c libefi_la_LIBADD = $(LIBUUID_LIBS) $(ZLIB_LIBS) - -include $(top_srcdir)/config/CppCheck.am diff --git a/sys/contrib/openzfs/lib/libefi/rdwr_efi.c b/sys/contrib/openzfs/lib/libefi/rdwr_efi.c index fd243e230e7d..0a93fd1338f6 100644 --- a/sys/contrib/openzfs/lib/libefi/rdwr_efi.c +++ b/sys/contrib/openzfs/lib/libefi/rdwr_efi.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -29,14 +30,12 @@ #include <stdlib.h> #include <errno.h> #include <string.h> -#include <strings.h> #include <unistd.h> #include <uuid/uuid.h> #include <zlib.h> #include <libintl.h> #include <sys/types.h> #include <sys/dkio.h> -#include <sys/vtoc.h> #include <sys/mhd.h> #include <sys/param.h> #include <sys/dktp/fdisk.h> @@ -425,7 +424,6 @@ efi_alloc_and_read(int fd, struct dk_gpt **vtoc) void *tmp; length = (int) sizeof (struct dk_gpt) + (int) sizeof (struct dk_part) * (vptr->efi_nparts - 1); - nparts = vptr->efi_nparts; if ((tmp = realloc(vptr, length)) == NULL) { /* cppcheck-suppress doubleFree */ free(vptr); @@ -567,10 +565,9 @@ int efi_rescan(int fd) { int retry = 10; - int error; /* Notify the kernel a devices partition table has been updated */ - while ((error = ioctl(fd, BLKRRPART)) != 0) { + while (ioctl(fd, BLKRRPART) != 0) { if ((--retry == 0) || (errno != EBUSY)) { (void) fprintf(stderr, "the kernel failed to rescan " "the partition table: %d\n", errno); @@ -857,7 +854,6 @@ efi_read(int fd, struct dk_gpt *vtoc) } for (i = 0; i < vtoc->efi_nparts; i++) { - UUID_LE_CONVERT(vtoc->efi_parts[i].p_guid, efi_parts[i].efi_gpe_PartitionTypeGUID); @@ -865,7 +861,7 @@ efi_read(int fd, struct dk_gpt *vtoc) j < sizeof (conversion_array) / sizeof (struct uuid_to_ptag); j++) { - if (bcmp(&vtoc->efi_parts[i].p_guid, + if (memcmp(&vtoc->efi_parts[i].p_guid, &conversion_array[j].uuid, sizeof (struct uuid)) == 0) { vtoc->efi_parts[i].p_tag = j; @@ -920,18 +916,17 @@ write_pmbr(int fd, struct dk_gpt *vtoc) /* LINTED -- always longlong aligned */ dk_ioc.dki_data = (efi_gpt_t *)buf; if (efi_ioctl(fd, DKIOCGETEFI, &dk_ioc) == -1) { - (void) memcpy(&mb, buf, sizeof (mb)); - bzero(&mb, sizeof (mb)); + memset(&mb, 0, sizeof (mb)); mb.signature = LE_16(MBB_MAGIC); } else { (void) memcpy(&mb, buf, sizeof (mb)); if (mb.signature != LE_16(MBB_MAGIC)) { - bzero(&mb, sizeof (mb)); + memset(&mb, 0, sizeof (mb)); mb.signature = LE_16(MBB_MAGIC); } } - bzero(&mb.parts, sizeof (mb.parts)); + memset(&mb.parts, 0, sizeof (mb.parts)); cp = (uchar_t *)&mb.parts[0]; /* bootable or not */ *cp++ = 0; @@ -1181,8 +1176,8 @@ efi_use_whole_disk(int fd) * (for performance reasons). The alignment should match the * alignment used by the "zpool_label_disk" function. */ - limit = P2ALIGN(efi_label->efi_last_lba - nblocks - EFI_MIN_RESV_SIZE, - PARTITION_END_ALIGNMENT); + limit = P2ALIGN_TYPED(efi_label->efi_last_lba - nblocks - + EFI_MIN_RESV_SIZE, PARTITION_END_ALIGNMENT, diskaddr_t); if (data_start + data_size != limit || resv_start != limit) sync_needed = B_TRUE; @@ -1368,7 +1363,7 @@ efi_write(int fd, struct dk_gpt *vtoc) if (NBLOCKS(vtoc->efi_nparts, vtoc->efi_lbasize) < 34) { dk_ioc.dki_length = EFI_MIN_ARRAY_SIZE + vtoc->efi_lbasize; } else { - dk_ioc.dki_length = NBLOCKS(vtoc->efi_nparts, + dk_ioc.dki_length = (len_t)NBLOCKS(vtoc->efi_nparts, vtoc->efi_lbasize) * vtoc->efi_lbasize; } @@ -1455,8 +1450,8 @@ efi_write(int fd, struct dk_gpt *vtoc) (void) uuid_generate((uchar_t *) &vtoc->efi_parts[i].p_uguid); } - bcopy(&vtoc->efi_parts[i].p_uguid, - &efi_parts[i].efi_gpe_UniquePartitionGUID, + memcpy(&efi_parts[i].efi_gpe_UniquePartitionGUID, + &vtoc->efi_parts[i].p_uguid, sizeof (uuid_t)); } efi->efi_gpt_PartitionEntryArrayCRC32 = @@ -1541,33 +1536,6 @@ efi_free(struct dk_gpt *ptr) free(ptr); } -/* - * Input: File descriptor - * Output: 1 if disk has an EFI label, or > 2TB with no VTOC or legacy MBR. - * Otherwise 0. - */ -int -efi_type(int fd) -{ -#if 0 - struct vtoc vtoc; - struct extvtoc extvtoc; - - if (ioctl(fd, DKIOCGEXTVTOC, &extvtoc) == -1) { - if (errno == ENOTSUP) - return (1); - else if (errno == ENOTTY) { - if (ioctl(fd, DKIOCGVTOC, &vtoc) == -1) - if (errno == ENOTSUP) - return (1); - } - } - return (0); -#else - return (ENOSYS); -#endif -} - void efi_err_check(struct dk_gpt *vtoc) { diff --git a/sys/contrib/openzfs/lib/libicp/Makefile.am b/sys/contrib/openzfs/lib/libicp/Makefile.am index 0b87a988c07e..ce24d13a760f 100644 --- a/sys/contrib/openzfs/lib/libicp/Makefile.am +++ b/sys/contrib/openzfs/lib/libicp/Makefile.am @@ -1,75 +1,80 @@ -include $(top_srcdir)/config/Rules.am +libicp_la_CCASFLAGS = $(AM_CCASFLAGS) +libicp_la_CFLAGS = $(AM_CFLAGS) $(KERNEL_CFLAGS) $(LIBRARY_CFLAGS) -VPATH = \ - $(top_srcdir)/module/icp \ - $(top_srcdir)/lib/libicp +noinst_LTLIBRARIES += libicp.la -# Includes kernel code, generate warnings for large stack frames -AM_CFLAGS += $(FRAME_LARGER_THAN) - -noinst_LTLIBRARIES = libicp.la +nodist_libicp_la_SOURCES = \ + module/icp/spi/kcf_spi.c \ + module/icp/api/kcf_ctxops.c \ + module/icp/api/kcf_cipher.c \ + module/icp/api/kcf_mac.c \ + module/icp/algs/aes/aes_impl_aesni.c \ + module/icp/algs/aes/aes_impl_generic.c \ + module/icp/algs/aes/aes_impl_x86-64.c \ + module/icp/algs/aes/aes_impl.c \ + module/icp/algs/aes/aes_modes.c \ + module/icp/algs/blake3/blake3.c \ + module/icp/algs/blake3/blake3_generic.c \ + module/icp/algs/blake3/blake3_impl.c \ + module/icp/algs/edonr/edonr.c \ + module/icp/algs/modes/modes.c \ + module/icp/algs/modes/gcm_generic.c \ + module/icp/algs/modes/gcm_pclmulqdq.c \ + module/icp/algs/modes/gcm.c \ + module/icp/algs/modes/ccm.c \ + module/icp/algs/sha2/sha2_generic.c \ + module/icp/algs/sha2/sha256_impl.c \ + module/icp/algs/sha2/sha512_impl.c \ + module/icp/algs/skein/skein.c \ + module/icp/algs/skein/skein_block.c \ + module/icp/algs/skein/skein_iv.c \ + module/icp/illumos-crypto.c \ + module/icp/io/aes.c \ + module/icp/io/sha2_mod.c \ + module/icp/core/kcf_sched.c \ + module/icp/core/kcf_prov_lib.c \ + module/icp/core/kcf_callprov.c \ + module/icp/core/kcf_mech_tabs.c \ + module/icp/core/kcf_prov_tabs.c \ + module/zfs/zfs_impl.c -if TARGET_CPU_X86_64 -ASM_SOURCES_C = asm-x86_64/aes/aeskey.c -ASM_SOURCES_AS = \ - asm-x86_64/aes/aes_amd64.S \ - asm-x86_64/aes/aes_aesni.S \ - asm-x86_64/modes/gcm_pclmulqdq.S \ - asm-x86_64/modes/aesni-gcm-x86_64.S \ - asm-x86_64/modes/ghash-x86_64.S \ - asm-x86_64/sha1/sha1-x86_64.S \ - asm-x86_64/sha2/sha256_impl.S \ - asm-x86_64/sha2/sha512_impl.S -else -ASM_SOURCES_C = -ASM_SOURCES_AS = +if TARGET_CPU_AARCH64 +nodist_libicp_la_SOURCES += \ + module/icp/asm-aarch64/blake3/b3_aarch64_sse2.S \ + module/icp/asm-aarch64/blake3/b3_aarch64_sse41.S \ + module/icp/asm-aarch64/sha2/sha256-armv8.S \ + module/icp/asm-aarch64/sha2/sha512-armv8.S endif -KERNEL_C = \ - spi/kcf_spi.c \ - api/kcf_ctxops.c \ - api/kcf_digest.c \ - api/kcf_cipher.c \ - api/kcf_miscapi.c \ - api/kcf_mac.c \ - algs/aes/aes_impl_aesni.c \ - algs/aes/aes_impl_generic.c \ - algs/aes/aes_impl_x86-64.c \ - algs/aes/aes_impl.c \ - algs/aes/aes_modes.c \ - algs/edonr/edonr.c \ - algs/modes/modes.c \ - algs/modes/cbc.c \ - algs/modes/gcm_generic.c \ - algs/modes/gcm_pclmulqdq.c \ - algs/modes/gcm.c \ - algs/modes/ctr.c \ - algs/modes/ccm.c \ - algs/modes/ecb.c \ - algs/sha1/sha1.c \ - algs/sha2/sha2.c \ - algs/skein/skein.c \ - algs/skein/skein_block.c \ - algs/skein/skein_iv.c \ - illumos-crypto.c \ - io/aes.c \ - io/edonr_mod.c \ - io/sha1_mod.c \ - io/sha2_mod.c \ - io/skein_mod.c \ - os/modhash.c \ - os/modconf.c \ - core/kcf_sched.c \ - core/kcf_prov_lib.c \ - core/kcf_callprov.c \ - core/kcf_mech_tabs.c \ - core/kcf_prov_tabs.c \ - $(ASM_SOURCES_C) +if TARGET_CPU_ARM +nodist_libicp_la_SOURCES += \ + module/icp/asm-arm/sha2/sha256-armv7.S \ + module/icp/asm-arm/sha2/sha512-armv7.S +endif -KERNEL_ASM = $(ASM_SOURCES_AS) +if TARGET_CPU_POWERPC +nodist_libicp_la_SOURCES += \ + module/icp/asm-ppc64/blake3/b3_ppc64le_sse2.S \ + module/icp/asm-ppc64/blake3/b3_ppc64le_sse41.S \ + module/icp/asm-ppc64/sha2/sha256-ppc.S \ + module/icp/asm-ppc64/sha2/sha512-ppc.S \ + module/icp/asm-ppc64/sha2/sha256-p8.S \ + module/icp/asm-ppc64/sha2/sha512-p8.S +endif -nodist_libicp_la_SOURCES = \ - $(KERNEL_C) \ - $(KERNEL_ASM) +if TARGET_CPU_X86_64 +nodist_libicp_la_SOURCES += \ + module/icp/asm-x86_64/aes/aeskey.c \ + module/icp/asm-x86_64/aes/aes_amd64.S \ + 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/ghash-x86_64.S \ + module/icp/asm-x86_64/sha2/sha256-x86_64.S \ + module/icp/asm-x86_64/sha2/sha512-x86_64.S \ + module/icp/asm-x86_64/blake3/blake3_avx2.S \ + module/icp/asm-x86_64/blake3/blake3_avx512.S \ + module/icp/asm-x86_64/blake3/blake3_sse2.S \ + module/icp/asm-x86_64/blake3/blake3_sse41.S +endif -include $(top_srcdir)/config/CppCheck.am diff --git a/sys/contrib/openzfs/lib/libnvpair/Makefile.am b/sys/contrib/openzfs/lib/libnvpair/Makefile.am index 7b9ebebe7906..87b8d32aa175 100644 --- a/sys/contrib/openzfs/lib/libnvpair/Makefile.am +++ b/sys/contrib/openzfs/lib/libnvpair/Makefile.am @@ -1,36 +1,26 @@ -include $(top_srcdir)/config/Rules.am +libnvpair_la_CFLAGS = $(AM_CFLAGS) $(KERNEL_CFLAGS) $(LIBRARY_CFLAGS) +libnvpair_la_CFLAGS += $(LIBTIRPC_CFLAGS) +libnvpair_la_CFLAGS += -fvisibility=hidden -VPATH = \ - $(top_srcdir)/module/nvpair \ - $(top_srcdir)/lib/libnvpair +# wchar_t is undefined-signedness, but we compare to >=0; this warns with unsigned wchar_t +%D%/libnvpair_la-libnvpair_json.$(OBJEXT) : CFLAGS += -Wno-type-limits +%D%/libnvpair_la-libnvpair_json.l$(OBJEXT): CFLAGS += -Wno-type-limits -# Includes kernel code, generate warnings for large stack frames -# and required CFLAGS for libtirpc -AM_CFLAGS += $(FRAME_LARGER_THAN) $(LIBTIRPC_CFLAGS) -AM_CFLAGS += -fvisibility=hidden - -lib_LTLIBRARIES = libnvpair.la - -include $(top_srcdir)/config/Abigail.am - -USER_C = \ - libnvpair.c \ - libnvpair_json.c \ - nvpair_alloc_system.c - -KERNEL_C = \ - nvpair_alloc_fixed.c \ - nvpair.c \ - fnvpair.c +lib_LTLIBRARIES += libnvpair.la +CPPCHECKTARGETS += libnvpair.la dist_libnvpair_la_SOURCES = \ - $(USER_C) + %D%/libnvpair.c \ + %D%/libnvpair_json.c \ + %D%/nvpair_alloc_system.c nodist_libnvpair_la_SOURCES = \ - $(KERNEL_C) + module/nvpair/nvpair_alloc_fixed.c \ + module/nvpair/nvpair.c \ + module/nvpair/fnvpair.c libnvpair_la_LIBADD = \ - $(abs_top_builddir)/lib/libspl/libspl_assert.la + libspl_assert.la libnvpair_la_LIBADD += $(LIBTIRPC_LIBS) $(LTLIBINTL) @@ -42,7 +32,4 @@ endif libnvpair_la_LDFLAGS += -version-info 3:0:0 -include $(top_srcdir)/config/CppCheck.am - -# Library ABI -EXTRA_DIST = libnvpair.abi libnvpair.suppr +dist_noinst_DATA += %D%/libnvpair.abi %D%/libnvpair.suppr diff --git a/sys/contrib/openzfs/lib/libnvpair/libnvpair.abi b/sys/contrib/openzfs/lib/libnvpair/libnvpair.abi index 9c27d178dc05..a7f51f49487d 100644 --- a/sys/contrib/openzfs/lib/libnvpair/libnvpair.abi +++ b/sys/contrib/openzfs/lib/libnvpair/libnvpair.abi @@ -1,5 +1,7 @@ <abi-corpus version='2.0' architecture='elf-amd-x86_64' soname='libnvpair.so.3'> <elf-needed> + <dependency name='libunwind.so.8'/> + <dependency name='libtirpc.so.3'/> <dependency name='libc.so.6'/> </elf-needed> <elf-function-symbols> @@ -78,6 +80,8 @@ <elf-symbol name='fnvpair_value_uint64' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='fnvpair_value_uint8' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='libspl_assertf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='libspl_backtrace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='libspl_set_assert_ok' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='nv_alloc_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='nv_alloc_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='nv_alloc_reset' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> @@ -192,6 +196,7 @@ <elf-symbol name='nvlist_remove_all' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='nvlist_remove_nvpair' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='nvlist_size' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='nvlist_snprintf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='nvlist_unpack' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='nvlist_xalloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='nvlist_xdup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> @@ -230,1083 +235,10 @@ <elf-symbol name='nvpair_value_uint8_array' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> </elf-function-symbols> <elf-variable-symbols> - <elf-symbol name='libspl_assert_ok' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='nv_alloc_nosleep' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='nv_fixed_ops' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> </elf-variable-symbols> - <abi-instr address-size='64' path='../../module/nvpair/fnvpair.c' language='LANG_C99'> - <function-decl name='fnvlist_alloc' mangled-name='fnvlist_alloc' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_alloc'> - <return type-id='5ce45b60'/> - </function-decl> - <function-decl name='fnvlist_free' mangled-name='fnvlist_free' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_free'> - <parameter type-id='5ce45b60' name='nvl'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='fnvlist_size' mangled-name='fnvlist_size' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_size'> - <parameter type-id='5ce45b60' name='nvl'/> - <return type-id='b59d7dce'/> - </function-decl> - <function-decl name='fnvlist_pack' mangled-name='fnvlist_pack' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_pack'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='78c01427' name='sizep'/> - <return type-id='26a90f95'/> - </function-decl> - <function-decl name='fnvlist_pack_free' mangled-name='fnvlist_pack_free' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_pack_free'> - <parameter type-id='26a90f95' name='pack'/> - <parameter type-id='b59d7dce' name='size'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='fnvlist_unpack' mangled-name='fnvlist_unpack' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_unpack'> - <parameter type-id='26a90f95' name='buf'/> - <parameter type-id='b59d7dce' name='buflen'/> - <return type-id='5ce45b60'/> - </function-decl> - <function-decl name='fnvlist_dup' mangled-name='fnvlist_dup' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_dup'> - <parameter type-id='5ce45b60' name='nvl'/> - <return type-id='5ce45b60'/> - </function-decl> - <function-decl name='fnvlist_merge' mangled-name='fnvlist_merge' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_merge'> - <parameter type-id='5ce45b60' name='dst'/> - <parameter type-id='5ce45b60' name='src'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='fnvlist_num_pairs' mangled-name='fnvlist_num_pairs' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_num_pairs'> - <parameter type-id='5ce45b60' name='nvl'/> - <return type-id='b59d7dce'/> - </function-decl> - <function-decl name='fnvlist_add_boolean' mangled-name='fnvlist_add_boolean' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_boolean'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='fnvlist_add_boolean_value' mangled-name='fnvlist_add_boolean_value' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_boolean_value'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='c19b74c3' name='val'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='fnvlist_add_byte' mangled-name='fnvlist_add_byte' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_byte'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='d8bf0010' name='val'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='fnvlist_add_int8' mangled-name='fnvlist_add_int8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_int8'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='ee31ee44' name='val'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='fnvlist_add_uint8' mangled-name='fnvlist_add_uint8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_uint8'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='b96825af' name='val'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='fnvlist_add_int16' mangled-name='fnvlist_add_int16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_int16'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='23bd8cb5' name='val'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='fnvlist_add_uint16' mangled-name='fnvlist_add_uint16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_uint16'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='149c6638' name='val'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='fnvlist_add_int32' mangled-name='fnvlist_add_int32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_int32'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='3ff5601b' name='val'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='fnvlist_add_uint32' mangled-name='fnvlist_add_uint32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_uint32'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='8f92235e' name='val'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='fnvlist_add_int64' mangled-name='fnvlist_add_int64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_int64'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='9da381c4' name='val'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='fnvlist_add_uint64' mangled-name='fnvlist_add_uint64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_uint64'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='9c313c2d' name='val'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='fnvlist_add_string' mangled-name='fnvlist_add_string' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_string'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='80f4b756' name='val'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='fnvlist_add_nvlist' mangled-name='fnvlist_add_nvlist' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_nvlist'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='5ce45b60' name='val'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='fnvlist_add_nvpair' mangled-name='fnvlist_add_nvpair' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_nvpair'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='3fa542f0' name='pair'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='fnvlist_add_boolean_array' mangled-name='fnvlist_add_boolean_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_boolean_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='37e3bd22' name='val'/> - <parameter type-id='3502e3ff' name='n'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='fnvlist_add_byte_array' mangled-name='fnvlist_add_byte_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_byte_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='45b65157' name='val'/> - <parameter type-id='3502e3ff' name='n'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='fnvlist_add_int8_array' mangled-name='fnvlist_add_int8_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_int8_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='256d5229' name='val'/> - <parameter type-id='3502e3ff' name='n'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='fnvlist_add_uint8_array' mangled-name='fnvlist_add_uint8_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_uint8_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='ae3e8ca6' name='val'/> - <parameter type-id='3502e3ff' name='n'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='fnvlist_add_int16_array' mangled-name='fnvlist_add_int16_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_int16_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='f76f73d0' name='val'/> - <parameter type-id='3502e3ff' name='n'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='fnvlist_add_uint16_array' mangled-name='fnvlist_add_uint16_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_uint16_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='8a121f49' name='val'/> - <parameter type-id='3502e3ff' name='n'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='fnvlist_add_int32_array' mangled-name='fnvlist_add_int32_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_int32_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='4aafb922' name='val'/> - <parameter type-id='3502e3ff' name='n'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='fnvlist_add_uint32_array' mangled-name='fnvlist_add_uint32_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_uint32_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='90421557' name='val'/> - <parameter type-id='3502e3ff' name='n'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='fnvlist_add_int64_array' mangled-name='fnvlist_add_int64_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_int64_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='cb785ebf' name='val'/> - <parameter type-id='3502e3ff' name='n'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='fnvlist_add_uint64_array' mangled-name='fnvlist_add_uint64_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_uint64_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='5d6479ae' name='val'/> - <parameter type-id='3502e3ff' name='n'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='fnvlist_add_string_array' mangled-name='fnvlist_add_string_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_string_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='f319fae0' name='val'/> - <parameter type-id='3502e3ff' name='n'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='fnvlist_add_nvlist_array' mangled-name='fnvlist_add_nvlist_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_nvlist_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='857bb57e' name='val'/> - <parameter type-id='3502e3ff' name='n'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='fnvlist_remove' mangled-name='fnvlist_remove' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_remove'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='fnvlist_remove_nvpair' mangled-name='fnvlist_remove_nvpair' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_remove_nvpair'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='3fa542f0' name='pair'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='fnvlist_lookup_nvpair' mangled-name='fnvlist_lookup_nvpair' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_nvpair'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <return type-id='3fa542f0'/> - </function-decl> - <function-decl name='fnvlist_lookup_boolean' mangled-name='fnvlist_lookup_boolean' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_boolean'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='fnvlist_lookup_boolean_value' mangled-name='fnvlist_lookup_boolean_value' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_boolean_value'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='fnvlist_lookup_byte' mangled-name='fnvlist_lookup_byte' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_byte'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <return type-id='d8bf0010'/> - </function-decl> - <function-decl name='fnvlist_lookup_int8' mangled-name='fnvlist_lookup_int8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_int8'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <return type-id='ee31ee44'/> - </function-decl> - <function-decl name='fnvlist_lookup_int16' mangled-name='fnvlist_lookup_int16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_int16'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <return type-id='23bd8cb5'/> - </function-decl> - <function-decl name='fnvlist_lookup_int32' mangled-name='fnvlist_lookup_int32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_int32'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <return type-id='3ff5601b'/> - </function-decl> - <function-decl name='fnvlist_lookup_int64' mangled-name='fnvlist_lookup_int64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_int64'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <return type-id='9da381c4'/> - </function-decl> - <function-decl name='fnvlist_lookup_uint8' mangled-name='fnvlist_lookup_uint8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_uint8'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <return type-id='b96825af'/> - </function-decl> - <function-decl name='fnvlist_lookup_uint16' mangled-name='fnvlist_lookup_uint16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_uint16'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <return type-id='149c6638'/> - </function-decl> - <function-decl name='fnvlist_lookup_uint32' mangled-name='fnvlist_lookup_uint32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_uint32'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <return type-id='8f92235e'/> - </function-decl> - <function-decl name='fnvlist_lookup_uint64' mangled-name='fnvlist_lookup_uint64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_uint64'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <return type-id='9c313c2d'/> - </function-decl> - <function-decl name='fnvlist_lookup_string' mangled-name='fnvlist_lookup_string' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_string'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <return type-id='26a90f95'/> - </function-decl> - <function-decl name='fnvlist_lookup_nvlist' mangled-name='fnvlist_lookup_nvlist' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_nvlist'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <return type-id='5ce45b60'/> - </function-decl> - <function-decl name='fnvlist_lookup_boolean_array' mangled-name='fnvlist_lookup_boolean_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_boolean_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='4dd26a40' name='n'/> - <return type-id='37e3bd22'/> - </function-decl> - <function-decl name='fnvlist_lookup_byte_array' mangled-name='fnvlist_lookup_byte_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_byte_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='4dd26a40' name='n'/> - <return type-id='45b65157'/> - </function-decl> - <function-decl name='fnvlist_lookup_int8_array' mangled-name='fnvlist_lookup_int8_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_int8_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='4dd26a40' name='n'/> - <return type-id='256d5229'/> - </function-decl> - <function-decl name='fnvlist_lookup_uint8_array' mangled-name='fnvlist_lookup_uint8_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_uint8_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='4dd26a40' name='n'/> - <return type-id='ae3e8ca6'/> - </function-decl> - <function-decl name='fnvlist_lookup_int16_array' mangled-name='fnvlist_lookup_int16_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_int16_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='4dd26a40' name='n'/> - <return type-id='f76f73d0'/> - </function-decl> - <function-decl name='fnvlist_lookup_uint16_array' mangled-name='fnvlist_lookup_uint16_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_uint16_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='4dd26a40' name='n'/> - <return type-id='8a121f49'/> - </function-decl> - <function-decl name='fnvlist_lookup_int32_array' mangled-name='fnvlist_lookup_int32_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_int32_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='4dd26a40' name='n'/> - <return type-id='4aafb922'/> - </function-decl> - <function-decl name='fnvlist_lookup_uint32_array' mangled-name='fnvlist_lookup_uint32_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_uint32_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='4dd26a40' name='n'/> - <return type-id='90421557'/> - </function-decl> - <function-decl name='fnvlist_lookup_int64_array' mangled-name='fnvlist_lookup_int64_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_int64_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='4dd26a40' name='n'/> - <return type-id='cb785ebf'/> - </function-decl> - <function-decl name='fnvlist_lookup_uint64_array' mangled-name='fnvlist_lookup_uint64_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_uint64_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='4dd26a40' name='n'/> - <return type-id='5d6479ae'/> - </function-decl> - <function-decl name='fnvpair_value_boolean_value' mangled-name='fnvpair_value_boolean_value' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_boolean_value'> - <parameter type-id='3fa542f0' name='nvp'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='fnvpair_value_byte' mangled-name='fnvpair_value_byte' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_byte'> - <parameter type-id='3fa542f0' name='nvp'/> - <return type-id='d8bf0010'/> - </function-decl> - <function-decl name='fnvpair_value_int8' mangled-name='fnvpair_value_int8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_int8'> - <parameter type-id='3fa542f0' name='nvp'/> - <return type-id='ee31ee44'/> - </function-decl> - <function-decl name='fnvpair_value_int16' mangled-name='fnvpair_value_int16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_int16'> - <parameter type-id='3fa542f0' name='nvp'/> - <return type-id='23bd8cb5'/> - </function-decl> - <function-decl name='fnvpair_value_int32' mangled-name='fnvpair_value_int32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_int32'> - <parameter type-id='3fa542f0' name='nvp'/> - <return type-id='3ff5601b'/> - </function-decl> - <function-decl name='fnvpair_value_int64' mangled-name='fnvpair_value_int64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_int64'> - <parameter type-id='3fa542f0' name='nvp'/> - <return type-id='9da381c4'/> - </function-decl> - <function-decl name='fnvpair_value_uint8' mangled-name='fnvpair_value_uint8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_uint8'> - <parameter type-id='3fa542f0' name='nvp'/> - <return type-id='b96825af'/> - </function-decl> - <function-decl name='fnvpair_value_uint16' mangled-name='fnvpair_value_uint16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_uint16'> - <parameter type-id='3fa542f0' name='nvp'/> - <return type-id='149c6638'/> - </function-decl> - <function-decl name='fnvpair_value_uint32' mangled-name='fnvpair_value_uint32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_uint32'> - <parameter type-id='3fa542f0' name='nvp'/> - <return type-id='8f92235e'/> - </function-decl> - <function-decl name='fnvpair_value_uint64' mangled-name='fnvpair_value_uint64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_uint64'> - <parameter type-id='3fa542f0' name='nvp'/> - <return type-id='9c313c2d'/> - </function-decl> - <function-decl name='fnvpair_value_string' mangled-name='fnvpair_value_string' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_string'> - <parameter type-id='3fa542f0' name='nvp'/> - <return type-id='26a90f95'/> - </function-decl> - <function-decl name='fnvpair_value_nvlist' mangled-name='fnvpair_value_nvlist' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_nvlist'> - <parameter type-id='3fa542f0' name='nvp'/> - <return type-id='5ce45b60'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='../../module/nvpair/nvpair.c' language='LANG_C99'> - <pointer-type-def type-id='37e3bd22' size-in-bits='64' id='03829398'/> - <qualified-type-def type-id='26a90f95' const='yes' id='57de658a'/> - <pointer-type-def type-id='57de658a' size-in-bits='64' id='f319fae0'/> - <pointer-type-def type-id='9b23c9ad' size-in-bits='64' id='c0563f85'/> - <pointer-type-def type-id='a0eb0f08' size-in-bits='64' id='7408d286'/> - <pointer-type-def type-id='cebdd548' size-in-bits='64' id='e379e62d'/> - <pointer-type-def type-id='95e97e5e' size-in-bits='64' id='7292109c'/> - <pointer-type-def type-id='f76f73d0' size-in-bits='64' id='7e73928e'/> - <pointer-type-def type-id='4aafb922' size-in-bits='64' id='9aa04798'/> - <pointer-type-def type-id='cb785ebf' size-in-bits='64' id='e37ce48f'/> - <pointer-type-def type-id='256d5229' size-in-bits='64' id='ee181ab9'/> - <pointer-type-def type-id='857bb57e' size-in-bits='64' id='75be733c'/> - <pointer-type-def type-id='3fa542f0' size-in-bits='64' id='0b283d2e'/> - <pointer-type-def type-id='b59d7dce' size-in-bits='64' id='78c01427'/> - <pointer-type-def type-id='45b65157' size-in-bits='64' id='3b0247c7'/> - <pointer-type-def type-id='8a121f49' size-in-bits='64' id='bd8768d9'/> - <pointer-type-def type-id='90421557' size-in-bits='64' id='9507d3c7'/> - <pointer-type-def type-id='5d6479ae' size-in-bits='64' id='892b4acc'/> - <pointer-type-def type-id='ae3e8ca6' size-in-bits='64' id='d8774064'/> - <pointer-type-def type-id='3502e3ff' size-in-bits='64' id='4dd26a40'/> - <function-decl name='nv_alloc_init' mangled-name='nv_alloc_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nv_alloc_init'> - <parameter type-id='11871392' name='nva'/> - <parameter type-id='ee1d4944' name='nvo'/> - <parameter is-variadic='yes'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nv_alloc_reset' mangled-name='nv_alloc_reset' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nv_alloc_reset'> - <parameter type-id='11871392' name='nva'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='nv_alloc_fini' mangled-name='nv_alloc_fini' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nv_alloc_fini'> - <parameter type-id='11871392' name='nva'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='nvlist_lookup_nv_alloc' mangled-name='nvlist_lookup_nv_alloc' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_nv_alloc'> - <parameter type-id='5ce45b60' name='nvl'/> - <return type-id='11871392'/> - </function-decl> - <function-decl name='nvlist_nvflag' mangled-name='nvlist_nvflag' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_nvflag'> - <parameter type-id='5ce45b60' name='nvl'/> - <return type-id='3502e3ff'/> - </function-decl> - <function-decl name='nvlist_alloc' mangled-name='nvlist_alloc' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_alloc'> - <parameter type-id='857bb57e' name='nvlp'/> - <parameter type-id='3502e3ff' name='nvflag'/> - <parameter type-id='95e97e5e' name='kmflag'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_xalloc' mangled-name='nvlist_xalloc' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_xalloc'> - <parameter type-id='857bb57e' name='nvlp'/> - <parameter type-id='3502e3ff' name='nvflag'/> - <parameter type-id='11871392' name='nva'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_free' mangled-name='nvlist_free' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_free'> - <parameter type-id='5ce45b60' name='nvl'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='nvlist_dup' mangled-name='nvlist_dup' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_dup'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='857bb57e' name='nvlp'/> - <parameter type-id='95e97e5e' name='kmflag'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_xdup' mangled-name='nvlist_xdup' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_xdup'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='857bb57e' name='nvlp'/> - <parameter type-id='11871392' name='nva'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_remove_all' mangled-name='nvlist_remove_all' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_remove_all'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_remove' mangled-name='nvlist_remove' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_remove'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='8d0687d2' name='type'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_remove_nvpair' mangled-name='nvlist_remove_nvpair' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_remove_nvpair'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='3fa542f0' name='nvp'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_add_boolean' mangled-name='nvlist_add_boolean' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_boolean'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_add_boolean_value' mangled-name='nvlist_add_boolean_value' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_boolean_value'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='c19b74c3' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_add_byte' mangled-name='nvlist_add_byte' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_byte'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='d8bf0010' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_add_int8' mangled-name='nvlist_add_int8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_int8'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='ee31ee44' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_add_uint8' mangled-name='nvlist_add_uint8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_uint8'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='b96825af' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_add_int16' mangled-name='nvlist_add_int16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_int16'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='23bd8cb5' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_add_uint16' mangled-name='nvlist_add_uint16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_uint16'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='149c6638' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_add_int32' mangled-name='nvlist_add_int32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_int32'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='3ff5601b' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_add_uint32' mangled-name='nvlist_add_uint32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_uint32'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='8f92235e' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_add_int64' mangled-name='nvlist_add_int64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_int64'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='9da381c4' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_add_uint64' mangled-name='nvlist_add_uint64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_uint64'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='9c313c2d' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_add_double' mangled-name='nvlist_add_double' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_double'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='a0eb0f08' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_add_string' mangled-name='nvlist_add_string' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_string'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='80f4b756' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_add_boolean_array' mangled-name='nvlist_add_boolean_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_boolean_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='37e3bd22' name='a'/> - <parameter type-id='3502e3ff' name='n'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_add_byte_array' mangled-name='nvlist_add_byte_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_byte_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='45b65157' name='a'/> - <parameter type-id='3502e3ff' name='n'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_add_int8_array' mangled-name='nvlist_add_int8_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_int8_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='256d5229' name='a'/> - <parameter type-id='3502e3ff' name='n'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_add_uint8_array' mangled-name='nvlist_add_uint8_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_uint8_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='ae3e8ca6' name='a'/> - <parameter type-id='3502e3ff' name='n'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_add_int16_array' mangled-name='nvlist_add_int16_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_int16_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='f76f73d0' name='a'/> - <parameter type-id='3502e3ff' name='n'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_add_uint16_array' mangled-name='nvlist_add_uint16_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_uint16_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='8a121f49' name='a'/> - <parameter type-id='3502e3ff' name='n'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_add_int32_array' mangled-name='nvlist_add_int32_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_int32_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='4aafb922' name='a'/> - <parameter type-id='3502e3ff' name='n'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_add_uint32_array' mangled-name='nvlist_add_uint32_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_uint32_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='90421557' name='a'/> - <parameter type-id='3502e3ff' name='n'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_add_int64_array' mangled-name='nvlist_add_int64_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_int64_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='cb785ebf' name='a'/> - <parameter type-id='3502e3ff' name='n'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_add_uint64_array' mangled-name='nvlist_add_uint64_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_uint64_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='5d6479ae' name='a'/> - <parameter type-id='3502e3ff' name='n'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_add_string_array' mangled-name='nvlist_add_string_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_string_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='f319fae0' name='a'/> - <parameter type-id='3502e3ff' name='n'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_add_hrtime' mangled-name='nvlist_add_hrtime' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_hrtime'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='cebdd548' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_add_nvlist' mangled-name='nvlist_add_nvlist' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_nvlist'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='5ce45b60' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_add_nvlist_array' mangled-name='nvlist_add_nvlist_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_nvlist_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='857bb57e' name='a'/> - <parameter type-id='3502e3ff' name='n'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_next_nvpair' mangled-name='nvlist_next_nvpair' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_next_nvpair'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='3fa542f0' name='nvp'/> - <return type-id='3fa542f0'/> - </function-decl> - <function-decl name='nvlist_prev_nvpair' mangled-name='nvlist_prev_nvpair' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_prev_nvpair'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='3fa542f0' name='nvp'/> - <return type-id='3fa542f0'/> - </function-decl> - <function-decl name='nvlist_empty' mangled-name='nvlist_empty' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_empty'> - <parameter type-id='5ce45b60' name='nvl'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='nvpair_name' mangled-name='nvpair_name' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_name'> - <parameter type-id='3fa542f0' name='nvp'/> - <return type-id='26a90f95'/> - </function-decl> - <function-decl name='nvpair_type' mangled-name='nvpair_type' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_type'> - <parameter type-id='3fa542f0' name='nvp'/> - <return type-id='8d0687d2'/> - </function-decl> - <function-decl name='nvpair_type_is_array' mangled-name='nvpair_type_is_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_type_is_array'> - <parameter type-id='3fa542f0' name='nvp'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_lookup_boolean' mangled-name='nvlist_lookup_boolean' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_boolean'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_lookup_boolean_value' mangled-name='nvlist_lookup_boolean_value' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_boolean_value'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='37e3bd22' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_lookup_byte' mangled-name='nvlist_lookup_byte' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_byte'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='45b65157' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_lookup_int8' mangled-name='nvlist_lookup_int8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_int8'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='256d5229' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_lookup_uint8' mangled-name='nvlist_lookup_uint8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_uint8'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='ae3e8ca6' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_lookup_int16' mangled-name='nvlist_lookup_int16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_int16'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='f76f73d0' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_lookup_uint16' mangled-name='nvlist_lookup_uint16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_uint16'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='8a121f49' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_lookup_int32' mangled-name='nvlist_lookup_int32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_int32'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='4aafb922' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_lookup_uint32' mangled-name='nvlist_lookup_uint32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_uint32'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='90421557' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_lookup_int64' mangled-name='nvlist_lookup_int64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_int64'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='cb785ebf' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_lookup_uint64' mangled-name='nvlist_lookup_uint64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_uint64'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='5d6479ae' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_lookup_double' mangled-name='nvlist_lookup_double' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_double'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='7408d286' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_lookup_string' mangled-name='nvlist_lookup_string' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_string'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='9b23c9ad' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_lookup_nvlist' mangled-name='nvlist_lookup_nvlist' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_nvlist'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='857bb57e' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_lookup_boolean_array' mangled-name='nvlist_lookup_boolean_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_boolean_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='03829398' name='a'/> - <parameter type-id='4dd26a40' name='n'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_lookup_byte_array' mangled-name='nvlist_lookup_byte_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_byte_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='3b0247c7' name='a'/> - <parameter type-id='4dd26a40' name='n'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_lookup_int8_array' mangled-name='nvlist_lookup_int8_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_int8_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='ee181ab9' name='a'/> - <parameter type-id='4dd26a40' name='n'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_lookup_uint8_array' mangled-name='nvlist_lookup_uint8_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_uint8_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='d8774064' name='a'/> - <parameter type-id='4dd26a40' name='n'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_lookup_int16_array' mangled-name='nvlist_lookup_int16_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_int16_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='7e73928e' name='a'/> - <parameter type-id='4dd26a40' name='n'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_lookup_uint16_array' mangled-name='nvlist_lookup_uint16_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_uint16_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='bd8768d9' name='a'/> - <parameter type-id='4dd26a40' name='n'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_lookup_int32_array' mangled-name='nvlist_lookup_int32_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_int32_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='9aa04798' name='a'/> - <parameter type-id='4dd26a40' name='n'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_lookup_uint32_array' mangled-name='nvlist_lookup_uint32_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_uint32_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='9507d3c7' name='a'/> - <parameter type-id='4dd26a40' name='n'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_lookup_int64_array' mangled-name='nvlist_lookup_int64_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_int64_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='e37ce48f' name='a'/> - <parameter type-id='4dd26a40' name='n'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_lookup_uint64_array' mangled-name='nvlist_lookup_uint64_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_uint64_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='892b4acc' name='a'/> - <parameter type-id='4dd26a40' name='n'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_lookup_string_array' mangled-name='nvlist_lookup_string_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_string_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='c0563f85' name='a'/> - <parameter type-id='4dd26a40' name='n'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_lookup_nvlist_array' mangled-name='nvlist_lookup_nvlist_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_nvlist_array'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='75be733c' name='a'/> - <parameter type-id='4dd26a40' name='n'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_lookup_hrtime' mangled-name='nvlist_lookup_hrtime' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_hrtime'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='e379e62d' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_lookup_pairs' mangled-name='nvlist_lookup_pairs' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_pairs'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='95e97e5e' name='flag'/> - <parameter is-variadic='yes'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_lookup_nvpair' mangled-name='nvlist_lookup_nvpair' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_nvpair'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='0b283d2e' name='ret'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_lookup_nvpair_embedded_index' mangled-name='nvlist_lookup_nvpair_embedded_index' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_nvpair_embedded_index'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='0b283d2e' name='ret'/> - <parameter type-id='7292109c' name='ip'/> - <parameter type-id='9b23c9ad' name='ep'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_exists' mangled-name='nvlist_exists' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_exists'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='80f4b756' name='name'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='nvpair_value_boolean_value' mangled-name='nvpair_value_boolean_value' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_boolean_value'> - <parameter type-id='3fa542f0' name='nvp'/> - <parameter type-id='37e3bd22' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvpair_value_byte' mangled-name='nvpair_value_byte' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_byte'> - <parameter type-id='3fa542f0' name='nvp'/> - <parameter type-id='45b65157' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvpair_value_int8' mangled-name='nvpair_value_int8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_int8'> - <parameter type-id='3fa542f0' name='nvp'/> - <parameter type-id='256d5229' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvpair_value_uint8' mangled-name='nvpair_value_uint8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_uint8'> - <parameter type-id='3fa542f0' name='nvp'/> - <parameter type-id='ae3e8ca6' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvpair_value_int16' mangled-name='nvpair_value_int16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_int16'> - <parameter type-id='3fa542f0' name='nvp'/> - <parameter type-id='f76f73d0' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvpair_value_uint16' mangled-name='nvpair_value_uint16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_uint16'> - <parameter type-id='3fa542f0' name='nvp'/> - <parameter type-id='8a121f49' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvpair_value_int32' mangled-name='nvpair_value_int32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_int32'> - <parameter type-id='3fa542f0' name='nvp'/> - <parameter type-id='4aafb922' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvpair_value_uint32' mangled-name='nvpair_value_uint32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_uint32'> - <parameter type-id='3fa542f0' name='nvp'/> - <parameter type-id='90421557' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvpair_value_int64' mangled-name='nvpair_value_int64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_int64'> - <parameter type-id='3fa542f0' name='nvp'/> - <parameter type-id='cb785ebf' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvpair_value_uint64' mangled-name='nvpair_value_uint64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_uint64'> - <parameter type-id='3fa542f0' name='nvp'/> - <parameter type-id='5d6479ae' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvpair_value_double' mangled-name='nvpair_value_double' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_double'> - <parameter type-id='3fa542f0' name='nvp'/> - <parameter type-id='7408d286' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvpair_value_string' mangled-name='nvpair_value_string' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_string'> - <parameter type-id='3fa542f0' name='nvp'/> - <parameter type-id='9b23c9ad' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvpair_value_nvlist' mangled-name='nvpair_value_nvlist' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_nvlist'> - <parameter type-id='3fa542f0' name='nvp'/> - <parameter type-id='857bb57e' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvpair_value_boolean_array' mangled-name='nvpair_value_boolean_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_boolean_array'> - <parameter type-id='3fa542f0' name='nvp'/> - <parameter type-id='03829398' name='val'/> - <parameter type-id='4dd26a40' name='nelem'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvpair_value_byte_array' mangled-name='nvpair_value_byte_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_byte_array'> - <parameter type-id='3fa542f0' name='nvp'/> - <parameter type-id='3b0247c7' name='val'/> - <parameter type-id='4dd26a40' name='nelem'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvpair_value_int8_array' mangled-name='nvpair_value_int8_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_int8_array'> - <parameter type-id='3fa542f0' name='nvp'/> - <parameter type-id='ee181ab9' name='val'/> - <parameter type-id='4dd26a40' name='nelem'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvpair_value_uint8_array' mangled-name='nvpair_value_uint8_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_uint8_array'> - <parameter type-id='3fa542f0' name='nvp'/> - <parameter type-id='d8774064' name='val'/> - <parameter type-id='4dd26a40' name='nelem'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvpair_value_int16_array' mangled-name='nvpair_value_int16_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_int16_array'> - <parameter type-id='3fa542f0' name='nvp'/> - <parameter type-id='7e73928e' name='val'/> - <parameter type-id='4dd26a40' name='nelem'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvpair_value_uint16_array' mangled-name='nvpair_value_uint16_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_uint16_array'> - <parameter type-id='3fa542f0' name='nvp'/> - <parameter type-id='bd8768d9' name='val'/> - <parameter type-id='4dd26a40' name='nelem'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvpair_value_int32_array' mangled-name='nvpair_value_int32_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_int32_array'> - <parameter type-id='3fa542f0' name='nvp'/> - <parameter type-id='9aa04798' name='val'/> - <parameter type-id='4dd26a40' name='nelem'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvpair_value_uint32_array' mangled-name='nvpair_value_uint32_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_uint32_array'> - <parameter type-id='3fa542f0' name='nvp'/> - <parameter type-id='9507d3c7' name='val'/> - <parameter type-id='4dd26a40' name='nelem'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvpair_value_int64_array' mangled-name='nvpair_value_int64_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_int64_array'> - <parameter type-id='3fa542f0' name='nvp'/> - <parameter type-id='e37ce48f' name='val'/> - <parameter type-id='4dd26a40' name='nelem'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvpair_value_uint64_array' mangled-name='nvpair_value_uint64_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_uint64_array'> - <parameter type-id='3fa542f0' name='nvp'/> - <parameter type-id='892b4acc' name='val'/> - <parameter type-id='4dd26a40' name='nelem'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvpair_value_string_array' mangled-name='nvpair_value_string_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_string_array'> - <parameter type-id='3fa542f0' name='nvp'/> - <parameter type-id='c0563f85' name='val'/> - <parameter type-id='4dd26a40' name='nelem'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvpair_value_nvlist_array' mangled-name='nvpair_value_nvlist_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_nvlist_array'> - <parameter type-id='3fa542f0' name='nvp'/> - <parameter type-id='75be733c' name='val'/> - <parameter type-id='4dd26a40' name='nelem'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvpair_value_hrtime' mangled-name='nvpair_value_hrtime' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_hrtime'> - <parameter type-id='3fa542f0' name='nvp'/> - <parameter type-id='e379e62d' name='val'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_add_nvpair' mangled-name='nvlist_add_nvpair' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_nvpair'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='3fa542f0' name='nvp'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_merge' mangled-name='nvlist_merge' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_merge'> - <parameter type-id='5ce45b60' name='dst'/> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='95e97e5e' name='flag'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_size' mangled-name='nvlist_size' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_size'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='78c01427' name='size'/> - <parameter type-id='95e97e5e' name='encoding'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_pack' mangled-name='nvlist_pack' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_pack'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='9b23c9ad' name='bufp'/> - <parameter type-id='78c01427' name='buflen'/> - <parameter type-id='95e97e5e' name='encoding'/> - <parameter type-id='95e97e5e' name='kmflag'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_xpack' mangled-name='nvlist_xpack' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_xpack'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='9b23c9ad' name='bufp'/> - <parameter type-id='78c01427' name='buflen'/> - <parameter type-id='95e97e5e' name='encoding'/> - <parameter type-id='11871392' name='nva'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_unpack' mangled-name='nvlist_unpack' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_unpack'> - <parameter type-id='26a90f95' name='buf'/> - <parameter type-id='b59d7dce' name='buflen'/> - <parameter type-id='857bb57e' name='nvlp'/> - <parameter type-id='95e97e5e' name='kmflag'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='nvlist_xunpack' mangled-name='nvlist_xunpack' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_xunpack'> - <parameter type-id='26a90f95' name='buf'/> - <parameter type-id='b59d7dce' name='buflen'/> - <parameter type-id='857bb57e' name='nvlp'/> - <parameter type-id='11871392' name='nva'/> - <return type-id='95e97e5e'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='../../module/nvpair/nvpair_alloc_fixed.c' language='LANG_C99'> - <var-decl name='nv_fixed_ops' type-id='ee1d4944' mangled-name='nv_fixed_ops' visibility='default' elf-symbol-id='nv_fixed_ops'/> - </abi-instr> - <abi-instr address-size='64' path='libnvpair.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libnvpair/libnvpair.c' language='LANG_C99'> <type-decl name='char' size-in-bits='8' id='a84c031d'/> <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='8' id='89feb1ec'> <subrange length='1' type-id='7359adad' id='52f813b4'/> @@ -1314,6 +246,9 @@ <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='160' id='664ac0b7'> <subrange length='20' type-id='7359adad' id='fdca39cf'/> </array-type-def> + <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='infinite' id='e84913bd'> + <subrange length='infinite' type-id='7359adad' id='031f2035'/> + </array-type-def> <class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='a4036571'/> <class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='010ae0b9'/> <class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='79bd3751'/> @@ -1392,6 +327,9 @@ <data-member access='public' layout-offset-in-bits='96'> <var-decl name='nvp_type' type-id='8d0687d2' visibility='default'/> </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='nvp_name' type-id='e84913bd' visibility='default'/> + </data-member> </class-decl> <typedef-decl name='nvpair_t' type-id='1c34e459' id='57928edf'/> <class-decl name='nvlist' size-in-bits='192' is-struct='yes' visibility='default' id='ac266fd9'> @@ -1421,6 +359,173 @@ <typedef-decl name='uchar_t' type-id='002ac4a6' id='d8bf0010'/> <typedef-decl name='uint_t' type-id='f0981eeb' id='3502e3ff'/> <typedef-decl name='hrtime_t' type-id='1eb56b1e' id='cebdd548'/> + <typedef-decl name='__re_long_size_t' type-id='7359adad' id='ba516949'/> + <typedef-decl name='reg_syntax_t' type-id='7359adad' id='1b72c3b3'/> + <class-decl name='re_pattern_buffer' size-in-bits='512' is-struct='yes' visibility='default' id='19fc9a8c'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='buffer' type-id='33976309' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='allocated' type-id='ba516949' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='used' type-id='ba516949' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='syntax' type-id='1b72c3b3' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='fastmap' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='translate' type-id='cf536864' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='re_nsub' type-id='b59d7dce' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='can_be_null' type-id='f0981eeb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='449'> + <var-decl name='regs_allocated' type-id='f0981eeb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='451'> + <var-decl name='fastmap_accurate' type-id='f0981eeb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='452'> + <var-decl name='no_sub' type-id='f0981eeb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='453'> + <var-decl name='not_bol' type-id='f0981eeb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='454'> + <var-decl name='not_eol' type-id='f0981eeb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='455'> + <var-decl name='newline_anchor' type-id='f0981eeb' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='regex_t' type-id='19fc9a8c' id='aca3bac8'/> + <typedef-decl name='regoff_t' type-id='95e97e5e' id='54a2a2a8'/> + <class-decl name='regmatch_t' size-in-bits='64' is-struct='yes' naming-typedef-id='1b941664' visibility='default' id='4f932615'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='rm_so' type-id='54a2a2a8' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='rm_eo' type-id='54a2a2a8' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='regmatch_t' type-id='4f932615' id='1b941664'/> + <typedef-decl name='int8_t' type-id='2171a512' id='ee31ee44'/> + <typedef-decl name='int16_t' type-id='03896e23' id='23bd8cb5'/> + <typedef-decl name='int32_t' type-id='33f57a65' id='3ff5601b'/> + <typedef-decl name='int64_t' type-id='0c9942d2' id='9da381c4'/> + <typedef-decl name='uint8_t' type-id='c51d6389' id='b96825af'/> + <typedef-decl name='uint16_t' type-id='253c2d2a' id='149c6638'/> + <typedef-decl name='uint32_t' type-id='62f1140c' id='8f92235e'/> + <typedef-decl name='uint64_t' type-id='8910171f' id='9c313c2d'/> + <typedef-decl name='__int8_t' type-id='28577a57' id='2171a512'/> + <typedef-decl name='__uint8_t' type-id='002ac4a6' id='c51d6389'/> + <typedef-decl name='__int16_t' type-id='a2185560' id='03896e23'/> + <typedef-decl name='__uint16_t' type-id='8efea9e5' id='253c2d2a'/> + <typedef-decl name='__int32_t' type-id='95e97e5e' id='33f57a65'/> + <typedef-decl name='__uint32_t' type-id='f0981eeb' id='62f1140c'/> + <typedef-decl name='__int64_t' type-id='bd54fe1a' id='0c9942d2'/> + <typedef-decl name='__uint64_t' type-id='7359adad' id='8910171f'/> + <typedef-decl name='__off_t' type-id='bd54fe1a' id='79989e9c'/> + <typedef-decl name='__off64_t' type-id='bd54fe1a' id='724e4de6'/> + <typedef-decl name='FILE' type-id='ec1ed955' id='aa12d1ba'/> + <typedef-decl name='_IO_lock_t' type-id='48b5725f' id='bb4788fa'/> + <class-decl name='_IO_FILE' size-in-bits='1728' is-struct='yes' visibility='default' id='ec1ed955'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_flags' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='_IO_read_ptr' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='_IO_read_end' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='_IO_read_base' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='_IO_write_base' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_IO_write_ptr' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='_IO_write_end' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='_IO_buf_base' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='_IO_buf_end' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='_IO_save_base' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='640'> + <var-decl name='_IO_backup_base' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='_IO_save_end' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='768'> + <var-decl name='_markers' type-id='e4c6fa61' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='832'> + <var-decl name='_chain' type-id='dca988a5' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='896'> + <var-decl name='_fileno' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='928'> + <var-decl name='_flags2' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='960'> + <var-decl name='_old_offset' type-id='79989e9c' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1024'> + <var-decl name='_cur_column' type-id='8efea9e5' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1040'> + <var-decl name='_vtable_offset' type-id='28577a57' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1048'> + <var-decl name='_shortbuf' type-id='89feb1ec' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1088'> + <var-decl name='_lock' type-id='cecf4ea7' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1152'> + <var-decl name='_offset' type-id='724e4de6' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1216'> + <var-decl name='_codecvt' type-id='570f8c59' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1280'> + <var-decl name='_wide_data' type-id='c65a1f29' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1344'> + <var-decl name='_freeres_list' type-id='dca988a5' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1408'> + <var-decl name='_freeres_buf' type-id='eaa32e2f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1472'> + <var-decl name='__pad5' type-id='b59d7dce' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1536'> + <var-decl name='_mode' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1568'> + <var-decl name='_unused2' type-id='664ac0b7' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='size_t' type-id='7359adad' id='b59d7dce'/> <class-decl name='nvlist_printops' size-in-bits='3456' is-struct='yes' visibility='default' id='ebc6735b'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='print_boolean' type-id='e7f43f72' visibility='default'/> @@ -1602,7 +707,7 @@ </class-decl> <class-decl name='__anonymous_struct__12' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f7e'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='op' type-id='c0d0f877' visibility='default'/> + <var-decl name='op' type-id='bfc48fe4' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> <var-decl name='arg' type-id='eaa32e2f' visibility='default'/> @@ -1706,7 +811,7 @@ </class-decl> <class-decl name='__anonymous_struct__25' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f8b'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='op' type-id='de20bf07' visibility='default'/> + <var-decl name='op' type-id='337f4a72' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> <var-decl name='arg' type-id='eaa32e2f' visibility='default'/> @@ -1752,177 +857,31 @@ <var-decl name='nvprt_custops' type-id='7be54adb' visibility='default'/> </data-member> </class-decl> - <typedef-decl name='__re_long_size_t' type-id='7359adad' id='ba516949'/> - <typedef-decl name='reg_syntax_t' type-id='7359adad' id='1b72c3b3'/> - <class-decl name='re_pattern_buffer' size-in-bits='512' is-struct='yes' visibility='default' id='19fc9a8c'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='buffer' type-id='33976309' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='allocated' type-id='ba516949' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='used' type-id='ba516949' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='syntax' type-id='1b72c3b3' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='fastmap' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='translate' type-id='cf536864' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='re_nsub' type-id='b59d7dce' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='can_be_null' type-id='f0981eeb' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='449'> - <var-decl name='regs_allocated' type-id='f0981eeb' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='451'> - <var-decl name='fastmap_accurate' type-id='f0981eeb' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='452'> - <var-decl name='no_sub' type-id='f0981eeb' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='453'> - <var-decl name='not_bol' type-id='f0981eeb' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='454'> - <var-decl name='not_eol' type-id='f0981eeb' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='455'> - <var-decl name='newline_anchor' type-id='f0981eeb' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='regex_t' type-id='19fc9a8c' id='aca3bac8'/> - <typedef-decl name='int8_t' type-id='2171a512' id='ee31ee44'/> - <typedef-decl name='int16_t' type-id='03896e23' id='23bd8cb5'/> - <typedef-decl name='int32_t' type-id='33f57a65' id='3ff5601b'/> - <typedef-decl name='int64_t' type-id='0c9942d2' id='9da381c4'/> - <typedef-decl name='uint8_t' type-id='c51d6389' id='b96825af'/> - <typedef-decl name='uint16_t' type-id='253c2d2a' id='149c6638'/> - <typedef-decl name='uint32_t' type-id='62f1140c' id='8f92235e'/> - <typedef-decl name='uint64_t' type-id='8910171f' id='9c313c2d'/> - <typedef-decl name='__int8_t' type-id='28577a57' id='2171a512'/> - <typedef-decl name='__uint8_t' type-id='002ac4a6' id='c51d6389'/> - <typedef-decl name='__int16_t' type-id='a2185560' id='03896e23'/> - <typedef-decl name='__uint16_t' type-id='8efea9e5' id='253c2d2a'/> - <typedef-decl name='__int32_t' type-id='95e97e5e' id='33f57a65'/> - <typedef-decl name='__uint32_t' type-id='f0981eeb' id='62f1140c'/> - <typedef-decl name='__int64_t' type-id='bd54fe1a' id='0c9942d2'/> - <typedef-decl name='__uint64_t' type-id='7359adad' id='8910171f'/> - <typedef-decl name='__off_t' type-id='bd54fe1a' id='79989e9c'/> - <typedef-decl name='__off64_t' type-id='bd54fe1a' id='724e4de6'/> - <typedef-decl name='FILE' type-id='ec1ed955' id='aa12d1ba'/> - <typedef-decl name='_IO_lock_t' type-id='48b5725f' id='bb4788fa'/> - <class-decl name='_IO_FILE' size-in-bits='1728' is-struct='yes' visibility='default' id='ec1ed955'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_flags' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='_IO_read_ptr' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='_IO_read_end' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='_IO_read_base' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='_IO_write_base' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_IO_write_ptr' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='_IO_write_end' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='_IO_buf_base' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='_IO_buf_end' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='_IO_save_base' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='_IO_backup_base' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='_IO_save_end' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='_markers' type-id='e4c6fa61' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='_chain' type-id='dca988a5' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='_fileno' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='928'> - <var-decl name='_flags2' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='960'> - <var-decl name='_old_offset' type-id='79989e9c' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1024'> - <var-decl name='_cur_column' type-id='8efea9e5' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1040'> - <var-decl name='_vtable_offset' type-id='28577a57' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1048'> - <var-decl name='_shortbuf' type-id='89feb1ec' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1088'> - <var-decl name='_lock' type-id='cecf4ea7' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1152'> - <var-decl name='_offset' type-id='724e4de6' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1216'> - <var-decl name='_codecvt' type-id='570f8c59' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1280'> - <var-decl name='_wide_data' type-id='c65a1f29' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1344'> - <var-decl name='_freeres_list' type-id='dca988a5' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1408'> - <var-decl name='_freeres_buf' type-id='eaa32e2f' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1472'> - <var-decl name='__pad5' type-id='b59d7dce' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1536'> - <var-decl name='_mode' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1568'> - <var-decl name='_unused2' type-id='664ac0b7' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='size_t' type-id='7359adad' id='b59d7dce'/> <pointer-type-def type-id='aa12d1ba' size-in-bits='64' id='822cd80b'/> + <qualified-type-def type-id='822cd80b' restrict='yes' id='e75a27e9'/> <pointer-type-def type-id='ec1ed955' size-in-bits='64' id='dca988a5'/> <pointer-type-def type-id='a4036571' size-in-bits='64' id='570f8c59'/> <pointer-type-def type-id='bb4788fa' size-in-bits='64' id='cecf4ea7'/> <pointer-type-def type-id='010ae0b9' size-in-bits='64' id='e4c6fa61'/> <pointer-type-def type-id='79bd3751' size-in-bits='64' id='c65a1f29'/> <pointer-type-def type-id='c19b74c3' size-in-bits='64' id='37e3bd22'/> + <pointer-type-def type-id='37e3bd22' size-in-bits='64' id='03829398'/> <pointer-type-def type-id='a84c031d' size-in-bits='64' id='26a90f95'/> - <pointer-type-def type-id='26a90f95' size-in-bits='64' id='9b23c9ad'/> <qualified-type-def type-id='a84c031d' const='yes' id='9b45d938'/> <pointer-type-def type-id='9b45d938' size-in-bits='64' id='80f4b756'/> + <qualified-type-def type-id='80f4b756' restrict='yes' id='9d26089a'/> + <pointer-type-def type-id='80f4b756' size-in-bits='64' id='7d3cd834'/> + <pointer-type-def type-id='7d3cd834' size-in-bits='64' id='44c8373a'/> + <qualified-type-def type-id='57928edf' const='yes' id='642ee20f'/> + <pointer-type-def type-id='642ee20f' size-in-bits='64' id='dace003f'/> + <qualified-type-def type-id='aca3bac8' const='yes' id='2498fd78'/> + <pointer-type-def type-id='2498fd78' size-in-bits='64' id='eed6c816'/> + <qualified-type-def type-id='eed6c816' restrict='yes' id='a431a9da'/> + <pointer-type-def type-id='a0eb0f08' size-in-bits='64' id='7408d286'/> + <pointer-type-def type-id='cebdd548' size-in-bits='64' id='e379e62d'/> <pointer-type-def type-id='9f88f76e' size-in-bits='64' id='7ef0e988'/> - <pointer-type-def type-id='c5bb1a2b' size-in-bits='64' id='c0d0f877'/> - <pointer-type-def type-id='573fea1b' size-in-bits='64' id='de20bf07'/> + <pointer-type-def type-id='889f3b42' size-in-bits='64' id='bfc48fe4'/> + <pointer-type-def type-id='49055dd8' size-in-bits='64' id='337f4a72'/> <pointer-type-def type-id='70284cc6' size-in-bits='64' id='3be4d568'/> <pointer-type-def type-id='700c3bca' size-in-bits='64' id='6d994334'/> <pointer-type-def type-id='18ac1860' size-in-bits='64' id='506ab59a'/> @@ -1948,8 +907,8 @@ <pointer-type-def type-id='3bd73b0c' size-in-bits='64' id='7e85a9b6'/> <pointer-type-def type-id='0d445e26' size-in-bits='64' id='330cc0d0'/> <pointer-type-def type-id='e4b89f30' size-in-bits='64' id='ed8aa8ba'/> - <pointer-type-def type-id='be7f4941' size-in-bits='64' id='2809de35'/> - <pointer-type-def type-id='fe5ae69d' size-in-bits='64' id='90d5edb9'/> + <pointer-type-def type-id='78e3bec8' size-in-bits='64' id='b38a1022'/> + <pointer-type-def type-id='a5193bb2' size-in-bits='64' id='6263eda4'/> <pointer-type-def type-id='2783af3c' size-in-bits='64' id='e44553b6'/> <pointer-type-def type-id='33c6e3d8' size-in-bits='64' id='1263777a'/> <pointer-type-def type-id='dadb9eca' size-in-bits='64' id='cbda43ac'/> @@ -1975,27 +934,259 @@ <pointer-type-def type-id='b2fbf64a' size-in-bits='64' id='470a7fd4'/> <pointer-type-def type-id='cc22d314' size-in-bits='64' id='eddda806'/> <pointer-type-def type-id='23bd8cb5' size-in-bits='64' id='f76f73d0'/> + <pointer-type-def type-id='f76f73d0' size-in-bits='64' id='7e73928e'/> <pointer-type-def type-id='3ff5601b' size-in-bits='64' id='4aafb922'/> + <pointer-type-def type-id='4aafb922' size-in-bits='64' id='9aa04798'/> <pointer-type-def type-id='9da381c4' size-in-bits='64' id='cb785ebf'/> + <pointer-type-def type-id='cb785ebf' size-in-bits='64' id='e37ce48f'/> <pointer-type-def type-id='ee31ee44' size-in-bits='64' id='256d5229'/> + <pointer-type-def type-id='256d5229' size-in-bits='64' id='ee181ab9'/> <pointer-type-def type-id='ebc6735b' size-in-bits='64' id='7be54adb'/> <pointer-type-def type-id='d2e8bad9' size-in-bits='64' id='196db161'/> <pointer-type-def type-id='8e8d4be3' size-in-bits='64' id='5ce45b60'/> <pointer-type-def type-id='5ce45b60' size-in-bits='64' id='857bb57e'/> + <pointer-type-def type-id='857bb57e' size-in-bits='64' id='75be733c'/> <pointer-type-def type-id='57928edf' size-in-bits='64' id='3fa542f0'/> <pointer-type-def type-id='b48d2441' size-in-bits='64' id='33976309'/> <pointer-type-def type-id='aca3bac8' size-in-bits='64' id='d33f11cb'/> + <pointer-type-def type-id='1b941664' size-in-bits='64' id='7e2979d5'/> + <qualified-type-def type-id='7e2979d5' restrict='yes' id='fc212857'/> <pointer-type-def type-id='d8bf0010' size-in-bits='64' id='45b65157'/> + <pointer-type-def type-id='45b65157' size-in-bits='64' id='3b0247c7'/> <pointer-type-def type-id='149c6638' size-in-bits='64' id='8a121f49'/> + <pointer-type-def type-id='8a121f49' size-in-bits='64' id='bd8768d9'/> <pointer-type-def type-id='8f92235e' size-in-bits='64' id='90421557'/> + <pointer-type-def type-id='90421557' size-in-bits='64' id='9507d3c7'/> <pointer-type-def type-id='9c313c2d' size-in-bits='64' id='5d6479ae'/> + <pointer-type-def type-id='5d6479ae' size-in-bits='64' id='892b4acc'/> <pointer-type-def type-id='b96825af' size-in-bits='64' id='ae3e8ca6'/> + <pointer-type-def type-id='ae3e8ca6' size-in-bits='64' id='d8774064'/> + <pointer-type-def type-id='3502e3ff' size-in-bits='64' id='4dd26a40'/> <pointer-type-def type-id='002ac4a6' size-in-bits='64' id='cf536864'/> <pointer-type-def type-id='48b5725f' size-in-bits='64' id='eaa32e2f'/> <class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='a4036571'/> <class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='010ae0b9'/> <class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='79bd3751'/> <class-decl name='re_dfa_t' is-struct='yes' visibility='default' is-declaration-only='yes' id='b48d2441'/> + <function-decl name='nvlist_snprintf' mangled-name='nvlist_snprintf' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_snprintf'> + <parameter type-id='26a90f95'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='5ce45b60'/> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_next_nvpair' mangled-name='nvlist_next_nvpair' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_next_nvpair'> + <parameter type-id='5ce45b60'/> + <parameter type-id='dace003f'/> + <return type-id='3fa542f0'/> + </function-decl> + <function-decl name='nvpair_name' mangled-name='nvpair_name' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_name'> + <parameter type-id='dace003f'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='nvpair_type' mangled-name='nvpair_type' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_type'> + <parameter type-id='dace003f'/> + <return type-id='8d0687d2'/> + </function-decl> + <function-decl name='nvpair_type_is_array' mangled-name='nvpair_type_is_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_type_is_array'> + <parameter type-id='dace003f'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvpair_value_boolean_value' mangled-name='nvpair_value_boolean_value' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_boolean_value'> + <parameter type-id='dace003f'/> + <parameter type-id='37e3bd22'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvpair_value_byte' mangled-name='nvpair_value_byte' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_byte'> + <parameter type-id='dace003f'/> + <parameter type-id='45b65157'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvpair_value_int8' mangled-name='nvpair_value_int8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_int8'> + <parameter type-id='dace003f'/> + <parameter type-id='256d5229'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvpair_value_uint8' mangled-name='nvpair_value_uint8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_uint8'> + <parameter type-id='dace003f'/> + <parameter type-id='ae3e8ca6'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvpair_value_int16' mangled-name='nvpair_value_int16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_int16'> + <parameter type-id='dace003f'/> + <parameter type-id='f76f73d0'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvpair_value_uint16' mangled-name='nvpair_value_uint16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_uint16'> + <parameter type-id='dace003f'/> + <parameter type-id='8a121f49'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvpair_value_int32' mangled-name='nvpair_value_int32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_int32'> + <parameter type-id='dace003f'/> + <parameter type-id='4aafb922'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvpair_value_uint32' mangled-name='nvpair_value_uint32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_uint32'> + <parameter type-id='dace003f'/> + <parameter type-id='90421557'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvpair_value_int64' mangled-name='nvpair_value_int64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_int64'> + <parameter type-id='dace003f'/> + <parameter type-id='cb785ebf'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvpair_value_uint64' mangled-name='nvpair_value_uint64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_uint64'> + <parameter type-id='dace003f'/> + <parameter type-id='5d6479ae'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvpair_value_string' mangled-name='nvpair_value_string' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_string'> + <parameter type-id='dace003f'/> + <parameter type-id='7d3cd834'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvpair_value_nvlist' mangled-name='nvpair_value_nvlist' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_nvlist'> + <parameter type-id='3fa542f0'/> + <parameter type-id='857bb57e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvpair_value_boolean_array' mangled-name='nvpair_value_boolean_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_boolean_array'> + <parameter type-id='3fa542f0'/> + <parameter type-id='03829398'/> + <parameter type-id='4dd26a40'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvpair_value_byte_array' mangled-name='nvpair_value_byte_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_byte_array'> + <parameter type-id='3fa542f0'/> + <parameter type-id='3b0247c7'/> + <parameter type-id='4dd26a40'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvpair_value_int8_array' mangled-name='nvpair_value_int8_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_int8_array'> + <parameter type-id='3fa542f0'/> + <parameter type-id='ee181ab9'/> + <parameter type-id='4dd26a40'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvpair_value_uint8_array' mangled-name='nvpair_value_uint8_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_uint8_array'> + <parameter type-id='3fa542f0'/> + <parameter type-id='d8774064'/> + <parameter type-id='4dd26a40'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvpair_value_int16_array' mangled-name='nvpair_value_int16_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_int16_array'> + <parameter type-id='3fa542f0'/> + <parameter type-id='7e73928e'/> + <parameter type-id='4dd26a40'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvpair_value_uint16_array' mangled-name='nvpair_value_uint16_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_uint16_array'> + <parameter type-id='3fa542f0'/> + <parameter type-id='bd8768d9'/> + <parameter type-id='4dd26a40'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvpair_value_int32_array' mangled-name='nvpair_value_int32_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_int32_array'> + <parameter type-id='3fa542f0'/> + <parameter type-id='9aa04798'/> + <parameter type-id='4dd26a40'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvpair_value_uint32_array' mangled-name='nvpair_value_uint32_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_uint32_array'> + <parameter type-id='3fa542f0'/> + <parameter type-id='9507d3c7'/> + <parameter type-id='4dd26a40'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvpair_value_int64_array' mangled-name='nvpair_value_int64_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_int64_array'> + <parameter type-id='3fa542f0'/> + <parameter type-id='e37ce48f'/> + <parameter type-id='4dd26a40'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvpair_value_uint64_array' mangled-name='nvpair_value_uint64_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_uint64_array'> + <parameter type-id='3fa542f0'/> + <parameter type-id='892b4acc'/> + <parameter type-id='4dd26a40'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvpair_value_string_array' mangled-name='nvpair_value_string_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_string_array'> + <parameter type-id='3fa542f0'/> + <parameter type-id='44c8373a'/> + <parameter type-id='4dd26a40'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvpair_value_nvlist_array' mangled-name='nvpair_value_nvlist_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_nvlist_array'> + <parameter type-id='3fa542f0'/> + <parameter type-id='75be733c'/> + <parameter type-id='4dd26a40'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvpair_value_hrtime' mangled-name='nvpair_value_hrtime' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_hrtime'> + <parameter type-id='3fa542f0'/> + <parameter type-id='e379e62d'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvpair_value_double' mangled-name='nvpair_value_double' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_double'> + <parameter type-id='dace003f'/> + <parameter type-id='7408d286'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='regexec' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='a431a9da'/> + <parameter type-id='9d26089a'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='fc212857'/> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='fputs' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='9d26089a'/> + <parameter type-id='e75a27e9'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='malloc' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b59d7dce'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='calloc' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b59d7dce'/> + <parameter type-id='b59d7dce'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='free' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='eaa32e2f'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='strcmp' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='strchr' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='95e97e5e'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='strcspn' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='strspn' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='__fprintf_chk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='e75a27e9'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='9d26089a'/> + <parameter is-variadic='yes'/> + <return type-id='95e97e5e'/> + </function-decl> <function-decl name='nvlist_prtctl_setdest' mangled-name='nvlist_prtctl_setdest' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_prtctl_setdest'> <parameter type-id='b0c1ff8d' name='pctl'/> <parameter type-id='822cd80b' name='fp'/> @@ -2103,7 +1294,7 @@ </function-decl> <function-decl name='nvlist_prtctlop_string' mangled-name='nvlist_prtctlop_string' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_prtctlop_string'> <parameter type-id='b0c1ff8d' name='pctl'/> - <parameter type-id='2809de35' name='func'/> + <parameter type-id='b38a1022' name='func'/> <parameter type-id='eaa32e2f' name='private'/> <return type-id='48b5725f'/> </function-decl> @@ -2181,7 +1372,7 @@ </function-decl> <function-decl name='nvlist_prtctlop_string_array' mangled-name='nvlist_prtctlop_string_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_prtctlop_string_array'> <parameter type-id='b0c1ff8d' name='pctl'/> - <parameter type-id='90d5edb9' name='func'/> + <parameter type-id='6263eda4' name='func'/> <parameter type-id='eaa32e2f' name='private'/> <return type-id='48b5725f'/> </function-decl> @@ -2208,26 +1399,26 @@ <parameter type-id='b0c1ff8d' name='pctl'/> <return type-id='48b5725f'/> </function-decl> - <function-decl name='dump_nvlist' mangled-name='dump_nvlist' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dump_nvlist'> - <parameter type-id='5ce45b60' name='list'/> - <parameter type-id='95e97e5e' name='indent'/> - <return type-id='48b5725f'/> - </function-decl> <function-decl name='nvpair_value_match_regex' mangled-name='nvpair_value_match_regex' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_match_regex'> <parameter type-id='3fa542f0' name='nvp'/> <parameter type-id='95e97e5e' name='ai'/> - <parameter type-id='26a90f95' name='value'/> + <parameter type-id='80f4b756' name='value'/> <parameter type-id='d33f11cb' name='value_regex'/> - <parameter type-id='9b23c9ad' name='ep'/> + <parameter type-id='7d3cd834' name='ep'/> <return type-id='95e97e5e'/> </function-decl> <function-decl name='nvpair_value_match' mangled-name='nvpair_value_match' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvpair_value_match'> <parameter type-id='3fa542f0' name='nvp'/> <parameter type-id='95e97e5e' name='ai'/> - <parameter type-id='26a90f95' name='value'/> - <parameter type-id='9b23c9ad' name='ep'/> + <parameter type-id='80f4b756' name='value'/> + <parameter type-id='7d3cd834' name='ep'/> <return type-id='95e97e5e'/> </function-decl> + <function-decl name='dump_nvlist' mangled-name='dump_nvlist' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dump_nvlist'> + <parameter type-id='5ce45b60' name='list'/> + <parameter type-id='95e97e5e' name='indent'/> + <return type-id='48b5725f'/> + </function-decl> <function-type size-in-bits='64' id='9f88f76e'> <parameter type-id='196db161'/> <parameter type-id='eaa32e2f'/> @@ -2237,20 +1428,20 @@ <parameter type-id='3502e3ff'/> <return type-id='95e97e5e'/> </function-type> - <function-type size-in-bits='64' id='c5bb1a2b'> + <function-type size-in-bits='64' id='889f3b42'> <parameter type-id='196db161'/> <parameter type-id='eaa32e2f'/> <parameter type-id='5ce45b60'/> <parameter type-id='80f4b756'/> - <parameter type-id='26a90f95'/> + <parameter type-id='80f4b756'/> <return type-id='95e97e5e'/> </function-type> - <function-type size-in-bits='64' id='573fea1b'> + <function-type size-in-bits='64' id='49055dd8'> <parameter type-id='196db161'/> <parameter type-id='eaa32e2f'/> <parameter type-id='5ce45b60'/> <parameter type-id='80f4b756'/> - <parameter type-id='9b23c9ad'/> + <parameter type-id='7d3cd834'/> <parameter type-id='3502e3ff'/> <return type-id='95e97e5e'/> </function-type> @@ -2465,20 +1656,20 @@ <parameter type-id='3502e3ff'/> <return type-id='95e97e5e'/> </function-type> - <function-type size-in-bits='64' id='be7f4941'> + <function-type size-in-bits='64' id='78e3bec8'> <parameter type-id='b0c1ff8d'/> <parameter type-id='eaa32e2f'/> <parameter type-id='5ce45b60'/> <parameter type-id='80f4b756'/> - <parameter type-id='26a90f95'/> + <parameter type-id='80f4b756'/> <return type-id='95e97e5e'/> </function-type> - <function-type size-in-bits='64' id='fe5ae69d'> + <function-type size-in-bits='64' id='a5193bb2'> <parameter type-id='b0c1ff8d'/> <parameter type-id='eaa32e2f'/> <parameter type-id='5ce45b60'/> <parameter type-id='80f4b756'/> - <parameter type-id='9b23c9ad'/> + <parameter type-id='7d3cd834'/> <parameter type-id='3502e3ff'/> <return type-id='95e97e5e'/> </function-type> @@ -2685,14 +1876,106 @@ <return type-id='95e97e5e'/> </function-type> </abi-instr> - <abi-instr address-size='64' path='libnvpair_json.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libnvpair/libnvpair_json.c' language='LANG_C99'> + <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='32' id='8e0573fd'> + <subrange length='4' type-id='7359adad' id='16fe7105'/> + </array-type-def> + <class-decl name='__mbstate_t' size-in-bits='64' is-struct='yes' naming-typedef-id='55e5b2b5' visibility='default' id='87447a2e'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='__count' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='__value' type-id='ac5ab595' visibility='default'/> + </data-member> + </class-decl> + <union-decl name='__anonymous_union__' size-in-bits='32' is-anonymous='yes' visibility='default' id='ac5ab595'> + <data-member access='public'> + <var-decl name='__wch' type-id='f0981eeb' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='__wchb' type-id='8e0573fd' visibility='default'/> + </data-member> + </union-decl> + <typedef-decl name='__mbstate_t' type-id='87447a2e' id='55e5b2b5'/> + <typedef-decl name='mbstate_t' type-id='55e5b2b5' id='3d7d8cbf'/> + <typedef-decl name='wchar_t' type-id='95e97e5e' id='928221d2'/> + <pointer-type-def type-id='3d7d8cbf' size-in-bits='64' id='a68021ce'/> + <qualified-type-def type-id='a68021ce' restrict='yes' id='03aaab72'/> + <pointer-type-def type-id='928221d2' size-in-bits='64' id='323d93c1'/> + <qualified-type-def type-id='323d93c1' restrict='yes' id='f1358bc3'/> + <function-decl name='fnvpair_value_boolean_value' mangled-name='fnvpair_value_boolean_value' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_boolean_value'> + <parameter type-id='dace003f'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='fnvpair_value_byte' mangled-name='fnvpair_value_byte' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_byte'> + <parameter type-id='dace003f'/> + <return type-id='d8bf0010'/> + </function-decl> + <function-decl name='fnvpair_value_int8' mangled-name='fnvpair_value_int8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_int8'> + <parameter type-id='dace003f'/> + <return type-id='ee31ee44'/> + </function-decl> + <function-decl name='fnvpair_value_int16' mangled-name='fnvpair_value_int16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_int16'> + <parameter type-id='dace003f'/> + <return type-id='23bd8cb5'/> + </function-decl> + <function-decl name='fnvpair_value_int32' mangled-name='fnvpair_value_int32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_int32'> + <parameter type-id='dace003f'/> + <return type-id='3ff5601b'/> + </function-decl> + <function-decl name='fnvpair_value_int64' mangled-name='fnvpair_value_int64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_int64'> + <parameter type-id='dace003f'/> + <return type-id='9da381c4'/> + </function-decl> + <function-decl name='fnvpair_value_uint8' mangled-name='fnvpair_value_uint8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_uint8'> + <parameter type-id='dace003f'/> + <return type-id='b96825af'/> + </function-decl> + <function-decl name='fnvpair_value_uint16' mangled-name='fnvpair_value_uint16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_uint16'> + <parameter type-id='dace003f'/> + <return type-id='149c6638'/> + </function-decl> + <function-decl name='fnvpair_value_uint32' mangled-name='fnvpair_value_uint32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_uint32'> + <parameter type-id='dace003f'/> + <return type-id='8f92235e'/> + </function-decl> + <function-decl name='fnvpair_value_uint64' mangled-name='fnvpair_value_uint64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_uint64'> + <parameter type-id='dace003f'/> + <return type-id='9c313c2d'/> + </function-decl> + <function-decl name='fnvpair_value_string' mangled-name='fnvpair_value_string' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_string'> + <parameter type-id='dace003f'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='fnvpair_value_nvlist' mangled-name='fnvpair_value_nvlist' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvpair_value_nvlist'> + <parameter type-id='3fa542f0'/> + <return type-id='5ce45b60'/> + </function-decl> + <function-decl name='libspl_assertf' mangled-name='libspl_assertf' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libspl_assertf'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='80f4b756'/> + <parameter is-variadic='yes'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='__ctype_get_mb_cur_max' visibility='default' binding='global' size-in-bits='64'> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='mbrtowc' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='f1358bc3'/> + <parameter type-id='9d26089a'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='03aaab72'/> + <return type-id='b59d7dce'/> + </function-decl> <function-decl name='nvlist_print_json' mangled-name='nvlist_print_json' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_print_json'> <parameter type-id='822cd80b' name='fp'/> <parameter type-id='5ce45b60' name='nvl'/> <return type-id='95e97e5e'/> </function-decl> </abi-instr> - <abi-instr address-size='64' path='nvpair_alloc_system.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libnvpair/nvpair_alloc_system.c' language='LANG_C99'> <class-decl name='__va_list_tag' size-in-bits='192' is-struct='yes' visibility='default' id='d5027220'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='gp_offset' type-id='f0981eeb' visibility='default'/> @@ -2739,10 +2022,11 @@ <pointer-type-def type-id='aca16c06' size-in-bits='64' id='ee1d4944'/> <pointer-type-def type-id='e9ff7293' size-in-bits='64' id='76da8447'/> <pointer-type-def type-id='cca08635' size-in-bits='64' id='11871392'/> + <qualified-type-def type-id='11871392' const='yes' id='e1cbfe1d'/> <pointer-type-def type-id='51a21b4b' size-in-bits='64' id='fe356f6f'/> <pointer-type-def type-id='1169c032' size-in-bits='64' id='520da3f4'/> <pointer-type-def type-id='9fff962e' size-in-bits='64' id='9ff7f508'/> - <var-decl name='nv_alloc_nosleep' type-id='11871392' mangled-name='nv_alloc_nosleep' visibility='default' elf-symbol-id='nv_alloc_nosleep'/> + <var-decl name='nv_alloc_nosleep' type-id='e1cbfe1d' mangled-name='nv_alloc_nosleep' visibility='default' elf-symbol-id='nv_alloc_nosleep'/> <function-type size-in-bits='64' id='e9ff7293'> <parameter type-id='11871392'/> <parameter type-id='b7f2d5e6'/> @@ -2764,15 +2048,1396 @@ <return type-id='eaa32e2f'/> </function-type> </abi-instr> - <abi-instr address-size='64' path='assert.c' language='LANG_C99'> - <var-decl name='libspl_assert_ok' type-id='95e97e5e' mangled-name='libspl_assert_ok' visibility='default' elf-symbol-id='libspl_assert_ok'/> - <function-decl name='libspl_assertf' mangled-name='libspl_assertf' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libspl_assertf'> - <parameter type-id='80f4b756' name='file'/> - <parameter type-id='80f4b756' name='func'/> - <parameter type-id='95e97e5e' name='line'/> - <parameter type-id='80f4b756' name='format'/> + <abi-instr address-size='64' path='lib/libspl/assert.c' language='LANG_C99'> + <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='320' id='36c46961'> + <subrange length='40' type-id='7359adad' id='8f80b239'/> + </array-type-def> + <union-decl name='pthread_mutex_t' size-in-bits='320' naming-typedef-id='7a6844eb' visibility='default' id='70681f9b'> + <data-member access='public'> + <var-decl name='__data' type-id='4c734837' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='__size' type-id='36c46961' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='__align' type-id='bd54fe1a' visibility='default'/> + </data-member> + </union-decl> + <typedef-decl name='pthread_mutex_t' type-id='70681f9b' id='7a6844eb'/> + <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' id='4c734837'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='__lock' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='__count' type-id='f0981eeb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='__owner' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='__nusers' type-id='f0981eeb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='__kind' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160'> + <var-decl name='__spins' type-id='a2185560' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='176'> + <var-decl name='__elision' type-id='a2185560' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='__list' type-id='518fb49c' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' id='0e01899c'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='__prev' type-id='4d98cd5a' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='__next' type-id='4d98cd5a' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='__pthread_list_t' type-id='0e01899c' id='518fb49c'/> + <typedef-decl name='__pid_t' type-id='95e97e5e' id='3629bad8'/> + <pointer-type-def type-id='0e01899c' size-in-bits='64' id='4d98cd5a'/> + <pointer-type-def type-id='7a6844eb' size-in-bits='64' id='18c91f9e'/> + <function-decl name='libspl_backtrace' mangled-name='libspl_backtrace' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libspl_backtrace'> + <parameter type-id='95e97e5e'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='pthread_mutex_lock' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='18c91f9e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='pthread_mutex_unlock' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='18c91f9e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='abort' visibility='default' binding='global' size-in-bits='64'> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='getpid' visibility='default' binding='global' size-in-bits='64'> + <return type-id='3629bad8'/> + </function-decl> + <function-decl name='__vfprintf_chk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='e75a27e9'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='9d26089a'/> + <parameter type-id='b7f2d5e6'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='gettid' visibility='default' binding='global' size-in-bits='64'> + <return type-id='3629bad8'/> + </function-decl> + <function-decl name='prctl' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> <parameter is-variadic='yes'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='libspl_set_assert_ok' mangled-name='libspl_set_assert_ok' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libspl_set_assert_ok'> + <parameter type-id='c19b74c3' name='val'/> + <return type-id='48b5725f'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='lib/libspl/backtrace.c' language='LANG_C99'> + <array-type-def dimensions='1' type-id='62f1140c' size-in-bits='768' id='b80f3d9b'> + <subrange length='24' type-id='7359adad' id='fdd3342b'/> + </array-type-def> + <array-type-def dimensions='1' type-id='62f1140c' size-in-bits='128' id='bc19e735'> + <subrange length='4' type-id='7359adad' id='16fe7105'/> + </array-type-def> + <array-type-def dimensions='1' type-id='22c546af' size-in-bits='1024' id='498c040b'> + <subrange length='8' type-id='7359adad' id='56e0c0b1'/> + </array-type-def> + <array-type-def dimensions='1' type-id='4ea07cdb' size-in-bits='2048' id='4811c35e'> + <subrange length='16' type-id='7359adad' id='848d0938'/> + </array-type-def> + <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 unsigned int' size-in-bits='64' id='3a47d82b'/> + <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> + <array-type-def dimensions='1' type-id='3a47d82b' size-in-bits='512' id='a13e797f'> + <subrange length='8' type-id='7359adad' id='56e0c0b1'/> + </array-type-def> + <array-type-def dimensions='1' type-id='7359adad' size-in-bits='1024' id='d2baa450'> + <subrange length='16' type-id='7359adad' id='848d0938'/> + </array-type-def> + <array-type-def dimensions='1' type-id='8efea9e5' size-in-bits='48' id='ff2536e2'> + <subrange length='3' type-id='7359adad' id='56f209d2'/> + </array-type-def> + <array-type-def dimensions='1' type-id='8efea9e5' size-in-bits='64' id='3f30d495'> + <subrange length='4' type-id='7359adad' id='16fe7105'/> + </array-type-def> + <array-type-def dimensions='1' type-id='73d941c6' size-in-bits='8128' id='dc70ec0b'> + <subrange length='127' type-id='7359adad' id='5ed08de5'/> + </array-type-def> + <typedef-decl name='__ssize_t' type-id='bd54fe1a' id='41060289'/> + <class-decl name='__sigset_t' size-in-bits='1024' is-struct='yes' naming-typedef-id='b9c97942' visibility='default' id='2616147f'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='__val' type-id='d2baa450' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='__sigset_t' type-id='2616147f' id='b9c97942'/> + <typedef-decl name='sigset_t' type-id='b9c97942' id='daf33c64'/> + <class-decl name='stack_t' size-in-bits='192' is-struct='yes' naming-typedef-id='ac5e685f' visibility='default' id='380f9954'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ss_sp' type-id='eaa32e2f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='ss_flags' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='ss_size' type-id='b59d7dce' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='stack_t' type-id='380f9954' id='ac5e685f'/> + <typedef-decl name='unw_regnum_t' type-id='95e97e5e' id='c53620f0'/> + <class-decl name='unw_cursor' size-in-bits='8128' is-struct='yes' visibility='default' id='384a1f22'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='opaque' type-id='dc70ec0b' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='unw_cursor_t' type-id='384a1f22' id='1203d35c'/> + <typedef-decl name='unw_context_t' type-id='190d09ef' id='8f527367'/> + <typedef-decl name='unw_word_t' type-id='9c313c2d' id='73d941c6'/> + <typedef-decl name='unw_tdep_context_t' type-id='c4daa689' id='190d09ef'/> + <typedef-decl name='ssize_t' type-id='41060289' id='79a0948f'/> + <typedef-decl name='greg_t' type-id='1eb56b1e' id='de572c22'/> + <typedef-decl name='gregset_t' type-id='6d3c2f42' id='a66f139c'/> + <class-decl name='_libc_fpxreg' size-in-bits='128' is-struct='yes' visibility='default' id='22c546af'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='significand' type-id='3f30d495' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='exponent' type-id='8efea9e5' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='80'> + <var-decl name='__glibc_reserved1' type-id='ff2536e2' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='_libc_xmmreg' size-in-bits='128' is-struct='yes' visibility='default' id='4ea07cdb'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='element' type-id='bc19e735' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='_libc_fpstate' size-in-bits='4096' is-struct='yes' visibility='default' id='81cbe5ca'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='cwd' type-id='253c2d2a' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='16'> + <var-decl name='swd' type-id='253c2d2a' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='ftw' type-id='253c2d2a' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='48'> + <var-decl name='fop' type-id='253c2d2a' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='rip' type-id='8910171f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='rdp' type-id='8910171f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='mxcsr' type-id='62f1140c' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='224'> + <var-decl name='mxcr_mask' type-id='62f1140c' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='_st' type-id='498c040b' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1280'> + <var-decl name='_xmm' type-id='4811c35e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3328'> + <var-decl name='__glibc_reserved1' type-id='b80f3d9b' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='fpregset_t' type-id='5b1ab9a8' id='6e5851bb'/> + <class-decl name='mcontext_t' size-in-bits='2048' is-struct='yes' naming-typedef-id='bacab071' visibility='default' id='76fab990'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='gregs' type-id='a66f139c' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1472'> + <var-decl name='fpregs' type-id='6e5851bb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1536'> + <var-decl name='__reserved1' type-id='a13e797f' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='mcontext_t' type-id='76fab990' id='bacab071'/> + <class-decl name='ucontext_t' size-in-bits='7744' is-struct='yes' visibility='default' id='1ba65dc8'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='uc_flags' type-id='7359adad' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='uc_link' type-id='4ed508de' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='uc_stack' type-id='ac5e685f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='uc_mcontext' type-id='bacab071' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2368'> + <var-decl name='uc_sigmask' type-id='daf33c64' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3392'> + <var-decl name='__fpregs_mem' type-id='81cbe5ca' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7488'> + <var-decl name='__ssp' type-id='a133ec23' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='ucontext_t' type-id='1ba65dc8' id='c4daa689'/> + <pointer-type-def type-id='81cbe5ca' size-in-bits='64' id='5b1ab9a8'/> + <pointer-type-def type-id='1ba65dc8' size-in-bits='64' id='4ed508de'/> + <pointer-type-def type-id='8f527367' size-in-bits='64' id='2e408b96'/> + <pointer-type-def type-id='1203d35c' size-in-bits='64' id='3946e4d1'/> + <pointer-type-def type-id='190d09ef' size-in-bits='64' id='3e0601f0'/> + <pointer-type-def type-id='73d941c6' size-in-bits='64' id='42f5faab'/> + <function-decl name='write' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter type-id='eaa32e2f'/> + <parameter type-id='b59d7dce'/> + <return type-id='79a0948f'/> + </function-decl> + <function-decl name='_Ux86_64_regname' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='c53620f0'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='_ULx86_64_init_local' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='3946e4d1'/> + <parameter type-id='2e408b96'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='_ULx86_64_step' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='3946e4d1'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='_ULx86_64_get_reg' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='3946e4d1'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='42f5faab'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='_ULx86_64_get_proc_name' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='3946e4d1'/> + <parameter type-id='26a90f95'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='42f5faab'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='_Ux86_64_getcontext' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='3e0601f0'/> + <return type-id='95e97e5e'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='module/nvpair/fnvpair.c' language='LANG_C99'> + <function-decl name='fnvlist_alloc' mangled-name='fnvlist_alloc' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_alloc'> + <return type-id='5ce45b60'/> + </function-decl> + <function-decl name='fnvlist_free' mangled-name='fnvlist_free' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_free'> + <parameter type-id='5ce45b60' name='nvl'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_size' mangled-name='fnvlist_size' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_size'> + <parameter type-id='5ce45b60' name='nvl'/> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='fnvlist_pack' mangled-name='fnvlist_pack' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_pack'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='78c01427' name='sizep'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='fnvlist_pack_free' mangled-name='fnvlist_pack_free' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_pack_free'> + <parameter type-id='26a90f95' name='pack'/> + <parameter type-id='b59d7dce' name='size'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_unpack' mangled-name='fnvlist_unpack' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_unpack'> + <parameter type-id='26a90f95' name='buf'/> + <parameter type-id='b59d7dce' name='buflen'/> + <return type-id='5ce45b60'/> + </function-decl> + <function-decl name='fnvlist_dup' mangled-name='fnvlist_dup' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_dup'> + <parameter type-id='22cce67b' name='nvl'/> + <return type-id='5ce45b60'/> + </function-decl> + <function-decl name='fnvlist_merge' mangled-name='fnvlist_merge' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_merge'> + <parameter type-id='5ce45b60' name='dst'/> + <parameter type-id='5ce45b60' name='src'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_num_pairs' mangled-name='fnvlist_num_pairs' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_num_pairs'> + <parameter type-id='5ce45b60' name='nvl'/> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='fnvlist_add_boolean' mangled-name='fnvlist_add_boolean' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_boolean'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_boolean_value' mangled-name='fnvlist_add_boolean_value' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_boolean_value'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='c19b74c3' name='val'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_byte' mangled-name='fnvlist_add_byte' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_byte'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='d8bf0010' name='val'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_int8' mangled-name='fnvlist_add_int8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_int8'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='ee31ee44' name='val'/> <return type-id='48b5725f'/> </function-decl> + <function-decl name='fnvlist_add_uint8' mangled-name='fnvlist_add_uint8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_uint8'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='b96825af' name='val'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_int16' mangled-name='fnvlist_add_int16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_int16'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='23bd8cb5' name='val'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_uint16' mangled-name='fnvlist_add_uint16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_uint16'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='149c6638' name='val'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_int32' mangled-name='fnvlist_add_int32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_int32'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='3ff5601b' name='val'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_uint32' mangled-name='fnvlist_add_uint32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_uint32'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='8f92235e' name='val'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_int64' mangled-name='fnvlist_add_int64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_int64'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='9da381c4' name='val'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_uint64' mangled-name='fnvlist_add_uint64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_uint64'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='9c313c2d' name='val'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_string' mangled-name='fnvlist_add_string' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_string'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='80f4b756' name='val'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_nvlist' mangled-name='fnvlist_add_nvlist' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_nvlist'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='5ce45b60' name='val'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_nvpair' mangled-name='fnvlist_add_nvpair' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_nvpair'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='3fa542f0' name='pair'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_boolean_array' mangled-name='fnvlist_add_boolean_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_boolean_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='c5f6c15b' name='val'/> + <parameter type-id='3502e3ff' name='n'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_byte_array' mangled-name='fnvlist_add_byte_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_byte_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='d1db479e' name='val'/> + <parameter type-id='3502e3ff' name='n'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_int8_array' mangled-name='fnvlist_add_int8_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_int8_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='a06445da' name='val'/> + <parameter type-id='3502e3ff' name='n'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_uint8_array' mangled-name='fnvlist_add_uint8_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_uint8_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='9f7200cf' name='val'/> + <parameter type-id='3502e3ff' name='n'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_int16_array' mangled-name='fnvlist_add_int16_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_int16_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='a3eb883d' name='val'/> + <parameter type-id='3502e3ff' name='n'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_uint16_array' mangled-name='fnvlist_add_uint16_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_uint16_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='1b7d11c6' name='val'/> + <parameter type-id='3502e3ff' name='n'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_int32_array' mangled-name='fnvlist_add_int32_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_int32_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='1f526493' name='val'/> + <parameter type-id='3502e3ff' name='n'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_uint32_array' mangled-name='fnvlist_add_uint32_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_uint32_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='a6798dcc' name='val'/> + <parameter type-id='3502e3ff' name='n'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_int64_array' mangled-name='fnvlist_add_int64_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_int64_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='505bed1a' name='val'/> + <parameter type-id='3502e3ff' name='n'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_uint64_array' mangled-name='fnvlist_add_uint64_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_uint64_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='713a56f5' name='val'/> + <parameter type-id='3502e3ff' name='n'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_string_array' mangled-name='fnvlist_add_string_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_string_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='13956559' name='val'/> + <parameter type-id='3502e3ff' name='n'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_nvlist_array' mangled-name='fnvlist_add_nvlist_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_add_nvlist_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='3bbfee2e' name='val'/> + <parameter type-id='3502e3ff' name='n'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_remove' mangled-name='fnvlist_remove' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_remove'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_remove_nvpair' mangled-name='fnvlist_remove_nvpair' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_remove_nvpair'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='3fa542f0' name='pair'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_lookup_nvpair' mangled-name='fnvlist_lookup_nvpair' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_nvpair'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <return type-id='3fa542f0'/> + </function-decl> + <function-decl name='fnvlist_lookup_boolean' mangled-name='fnvlist_lookup_boolean' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_boolean'> + <parameter type-id='22cce67b' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='fnvlist_lookup_boolean_value' mangled-name='fnvlist_lookup_boolean_value' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_boolean_value'> + <parameter type-id='22cce67b' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='fnvlist_lookup_byte' mangled-name='fnvlist_lookup_byte' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_byte'> + <parameter type-id='22cce67b' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <return type-id='d8bf0010'/> + </function-decl> + <function-decl name='fnvlist_lookup_int8' mangled-name='fnvlist_lookup_int8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_int8'> + <parameter type-id='22cce67b' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <return type-id='ee31ee44'/> + </function-decl> + <function-decl name='fnvlist_lookup_int16' mangled-name='fnvlist_lookup_int16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_int16'> + <parameter type-id='22cce67b' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <return type-id='23bd8cb5'/> + </function-decl> + <function-decl name='fnvlist_lookup_int32' mangled-name='fnvlist_lookup_int32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_int32'> + <parameter type-id='22cce67b' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <return type-id='3ff5601b'/> + </function-decl> + <function-decl name='fnvlist_lookup_int64' mangled-name='fnvlist_lookup_int64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_int64'> + <parameter type-id='22cce67b' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <return type-id='9da381c4'/> + </function-decl> + <function-decl name='fnvlist_lookup_uint8' mangled-name='fnvlist_lookup_uint8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_uint8'> + <parameter type-id='22cce67b' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <return type-id='b96825af'/> + </function-decl> + <function-decl name='fnvlist_lookup_uint16' mangled-name='fnvlist_lookup_uint16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_uint16'> + <parameter type-id='22cce67b' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <return type-id='149c6638'/> + </function-decl> + <function-decl name='fnvlist_lookup_uint32' mangled-name='fnvlist_lookup_uint32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_uint32'> + <parameter type-id='22cce67b' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <return type-id='8f92235e'/> + </function-decl> + <function-decl name='fnvlist_lookup_uint64' mangled-name='fnvlist_lookup_uint64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_uint64'> + <parameter type-id='22cce67b' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <return type-id='9c313c2d'/> + </function-decl> + <function-decl name='fnvlist_lookup_string' mangled-name='fnvlist_lookup_string' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_string'> + <parameter type-id='22cce67b' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='fnvlist_lookup_nvlist' mangled-name='fnvlist_lookup_nvlist' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_nvlist'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <return type-id='5ce45b60'/> + </function-decl> + <function-decl name='fnvlist_lookup_boolean_array' mangled-name='fnvlist_lookup_boolean_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_boolean_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='4dd26a40' name='n'/> + <return type-id='37e3bd22'/> + </function-decl> + <function-decl name='fnvlist_lookup_byte_array' mangled-name='fnvlist_lookup_byte_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_byte_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='4dd26a40' name='n'/> + <return type-id='45b65157'/> + </function-decl> + <function-decl name='fnvlist_lookup_int8_array' mangled-name='fnvlist_lookup_int8_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_int8_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='4dd26a40' name='n'/> + <return type-id='256d5229'/> + </function-decl> + <function-decl name='fnvlist_lookup_uint8_array' mangled-name='fnvlist_lookup_uint8_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_uint8_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='4dd26a40' name='n'/> + <return type-id='ae3e8ca6'/> + </function-decl> + <function-decl name='fnvlist_lookup_int16_array' mangled-name='fnvlist_lookup_int16_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_int16_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='4dd26a40' name='n'/> + <return type-id='f76f73d0'/> + </function-decl> + <function-decl name='fnvlist_lookup_uint16_array' mangled-name='fnvlist_lookup_uint16_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_uint16_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='4dd26a40' name='n'/> + <return type-id='8a121f49'/> + </function-decl> + <function-decl name='fnvlist_lookup_int32_array' mangled-name='fnvlist_lookup_int32_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_int32_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='4dd26a40' name='n'/> + <return type-id='4aafb922'/> + </function-decl> + <function-decl name='fnvlist_lookup_uint32_array' mangled-name='fnvlist_lookup_uint32_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_uint32_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='4dd26a40' name='n'/> + <return type-id='90421557'/> + </function-decl> + <function-decl name='fnvlist_lookup_int64_array' mangled-name='fnvlist_lookup_int64_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_int64_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='4dd26a40' name='n'/> + <return type-id='cb785ebf'/> + </function-decl> + <function-decl name='fnvlist_lookup_uint64_array' mangled-name='fnvlist_lookup_uint64_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fnvlist_lookup_uint64_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='4dd26a40' name='n'/> + <return type-id='5d6479ae'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='module/nvpair/nvpair.c' language='LANG_C99'> + <typedef-decl name='bool_t' type-id='3ff5601b' id='310a70df'/> + <enum-decl name='xdr_op' id='6badf1b8'> + <underlying-type type-id='9cac1fee'/> + <enumerator name='XDR_ENCODE' value='0'/> + <enumerator name='XDR_DECODE' value='1'/> + <enumerator name='XDR_FREE' value='2'/> + </enum-decl> + <class-decl name='__rpc_xdr' size-in-bits='384' is-struct='yes' visibility='default' id='755707df'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='x_op' type-id='6badf1b8' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='x_ops' type-id='3457e9c5' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='x_public' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='x_private' type-id='eaa32e2f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='x_base' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='x_handy' type-id='48f7c3f5' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='xdr_ops' size-in-bits='576' is-struct='yes' visibility='default' id='ea1474f2'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='x_getlong' type-id='a4e6dd3f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='x_putlong' type-id='d447b08c' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='x_getbytes' type-id='b0b6ccaa' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='x_putbytes' type-id='581c24b7' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='x_getpostn' type-id='1c77bdb0' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='x_setpostn' type-id='13fdb43e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='x_inline' type-id='788e1f25' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='x_destroy' type-id='d781e3b2' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='x_control' type-id='733fc725' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='XDR' type-id='755707df' id='bc407f0e'/> + <typedef-decl name='xdrproc_t' type-id='94d188f0' id='c28db3e9'/> + <typedef-decl name='__u_short' type-id='8efea9e5' id='46c660f8'/> + <typedef-decl name='__u_int' type-id='f0981eeb' id='8ae6822f'/> + <typedef-decl name='__quad_t' type-id='bd54fe1a' id='2632227a'/> + <typedef-decl name='__u_quad_t' type-id='7359adad' id='5f3d50a6'/> + <typedef-decl name='u_short' type-id='46c660f8' id='32580e96'/> + <typedef-decl name='u_int' type-id='8ae6822f' id='48f7c3f5'/> + <typedef-decl name='quad_t' type-id='2632227a' id='f5ef0660'/> + <typedef-decl name='u_quad_t' type-id='5f3d50a6' id='bd226ac0'/> + <pointer-type-def type-id='bc407f0e' size-in-bits='64' id='17fd1621'/> + <pointer-type-def type-id='755707df' size-in-bits='64' id='812c6697'/> + <pointer-type-def type-id='26a90f95' size-in-bits='64' id='9b23c9ad'/> + <qualified-type-def type-id='9b23c9ad' restrict='yes' id='8c85230f'/> + <pointer-type-def type-id='9b23c9ad' size-in-bits='64' id='c0563f85'/> + <qualified-type-def type-id='c19b74c3' const='yes' id='12373e33'/> + <pointer-type-def type-id='12373e33' size-in-bits='64' id='c5f6c15b'/> + <qualified-type-def type-id='80f4b756' const='yes' id='b99c00c9'/> + <pointer-type-def type-id='b99c00c9' size-in-bits='64' id='13956559'/> + <qualified-type-def type-id='23bd8cb5' const='yes' id='75f7b0c5'/> + <pointer-type-def type-id='75f7b0c5' size-in-bits='64' id='a3eb883d'/> + <qualified-type-def type-id='3ff5601b' const='yes' id='922df12b'/> + <pointer-type-def type-id='922df12b' size-in-bits='64' id='1f526493'/> + <qualified-type-def type-id='9da381c4' const='yes' id='f07b7694'/> + <pointer-type-def type-id='f07b7694' size-in-bits='64' id='505bed1a'/> + <qualified-type-def type-id='ee31ee44' const='yes' id='721c32d4'/> + <pointer-type-def type-id='721c32d4' size-in-bits='64' id='a06445da'/> + <qualified-type-def type-id='bd54fe1a' const='yes' id='9cb2385f'/> + <pointer-type-def type-id='9cb2385f' size-in-bits='64' id='218ee02f'/> + <qualified-type-def type-id='8e8d4be3' const='yes' id='693c3853'/> + <pointer-type-def type-id='693c3853' size-in-bits='64' id='22cce67b'/> + <qualified-type-def type-id='22cce67b' const='yes' id='d2816df0'/> + <pointer-type-def type-id='d2816df0' size-in-bits='64' id='3bbfee2e'/> + <qualified-type-def type-id='d8bf0010' const='yes' id='a9125480'/> + <pointer-type-def type-id='a9125480' size-in-bits='64' id='d1db479e'/> + <qualified-type-def type-id='149c6638' const='yes' id='b01a5ac8'/> + <pointer-type-def type-id='b01a5ac8' size-in-bits='64' id='1b7d11c6'/> + <qualified-type-def type-id='8f92235e' const='yes' id='b9930aae'/> + <pointer-type-def type-id='b9930aae' size-in-bits='64' id='a6798dcc'/> + <qualified-type-def type-id='9c313c2d' const='yes' id='c3b7ba7d'/> + <pointer-type-def type-id='c3b7ba7d' size-in-bits='64' id='713a56f5'/> + <qualified-type-def type-id='b96825af' const='yes' id='2b61797f'/> + <pointer-type-def type-id='2b61797f' size-in-bits='64' id='9f7200cf'/> + <qualified-type-def type-id='ea1474f2' const='yes' id='485ede6d'/> + <pointer-type-def type-id='485ede6d' size-in-bits='64' id='3457e9c5'/> + <pointer-type-def type-id='95e97e5e' size-in-bits='64' id='7292109c'/> + <pointer-type-def type-id='441e0c31' size-in-bits='64' id='788e1f25'/> + <pointer-type-def type-id='bd54fe1a' size-in-bits='64' id='3ccc2590'/> + <pointer-type-def type-id='3fa542f0' size-in-bits='64' id='0b283d2e'/> + <pointer-type-def type-id='f5ef0660' size-in-bits='64' id='de23782d'/> + <pointer-type-def type-id='a2185560' size-in-bits='64' id='764e437e'/> + <pointer-type-def type-id='b59d7dce' size-in-bits='64' id='78c01427'/> + <pointer-type-def type-id='e80b47fe' size-in-bits='64' id='94d188f0'/> + <pointer-type-def type-id='1c7a4858' size-in-bits='64' id='b0b6ccaa'/> + <pointer-type-def type-id='f6358b93' size-in-bits='64' id='581c24b7'/> + <pointer-type-def type-id='45354e42' size-in-bits='64' id='d447b08c'/> + <pointer-type-def type-id='0760d6d1' size-in-bits='64' id='733fc725'/> + <pointer-type-def type-id='be0f9e0b' size-in-bits='64' id='a4e6dd3f'/> + <pointer-type-def type-id='16eb5704' size-in-bits='64' id='13fdb43e'/> + <pointer-type-def type-id='46870456' size-in-bits='64' id='1c77bdb0'/> + <pointer-type-def type-id='48f7c3f5' size-in-bits='64' id='b4c2e924'/> + <pointer-type-def type-id='bd226ac0' size-in-bits='64' id='fce59795'/> + <pointer-type-def type-id='32580e96' size-in-bits='64' id='ede2c2f5'/> + <pointer-type-def type-id='c87cb1d0' size-in-bits='64' id='d781e3b2'/> + <function-decl name='strtol' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='9d26089a'/> + <parameter type-id='8c85230f'/> + <parameter type-id='95e97e5e'/> + <return type-id='bd54fe1a'/> + </function-decl> + <function-decl name='strncmp' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <parameter type-id='b59d7dce'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='strlen' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='xdr_int' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='17fd1621'/> + <parameter type-id='7292109c'/> + <return type-id='310a70df'/> + </function-decl> + <function-decl name='xdr_u_int' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='17fd1621'/> + <parameter type-id='b4c2e924'/> + <return type-id='310a70df'/> + </function-decl> + <function-decl name='xdr_short' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='17fd1621'/> + <parameter type-id='764e437e'/> + <return type-id='310a70df'/> + </function-decl> + <function-decl name='xdr_u_short' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='17fd1621'/> + <parameter type-id='ede2c2f5'/> + <return type-id='310a70df'/> + </function-decl> + <function-decl name='xdr_array' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='17fd1621'/> + <parameter type-id='9b23c9ad'/> + <parameter type-id='b4c2e924'/> + <parameter type-id='48f7c3f5'/> + <parameter type-id='48f7c3f5'/> + <parameter type-id='c28db3e9'/> + <return type-id='310a70df'/> + </function-decl> + <function-decl name='xdr_opaque' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='17fd1621'/> + <parameter type-id='26a90f95'/> + <parameter type-id='48f7c3f5'/> + <return type-id='310a70df'/> + </function-decl> + <function-decl name='xdr_string' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='17fd1621'/> + <parameter type-id='9b23c9ad'/> + <parameter type-id='48f7c3f5'/> + <return type-id='310a70df'/> + </function-decl> + <function-decl name='xdr_char' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='17fd1621'/> + <parameter type-id='26a90f95'/> + <return type-id='310a70df'/> + </function-decl> + <function-decl name='xdr_double' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='17fd1621'/> + <parameter type-id='7408d286'/> + <return type-id='310a70df'/> + </function-decl> + <function-decl name='xdr_longlong_t' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='17fd1621'/> + <parameter type-id='de23782d'/> + <return type-id='310a70df'/> + </function-decl> + <function-decl name='xdr_u_longlong_t' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='17fd1621'/> + <parameter type-id='fce59795'/> + <return type-id='310a70df'/> + </function-decl> + <function-decl name='xdrmem_create' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='17fd1621'/> + <parameter type-id='26a90f95'/> + <parameter type-id='48f7c3f5'/> + <parameter type-id='6badf1b8'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='nv_alloc_init' mangled-name='nv_alloc_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nv_alloc_init'> + <parameter type-id='11871392' name='nva'/> + <parameter type-id='ee1d4944' name='nvo'/> + <parameter is-variadic='yes'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nv_alloc_reset' mangled-name='nv_alloc_reset' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nv_alloc_reset'> + <parameter type-id='11871392' name='nva'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='nv_alloc_fini' mangled-name='nv_alloc_fini' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nv_alloc_fini'> + <parameter type-id='11871392' name='nva'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='nvlist_lookup_nv_alloc' mangled-name='nvlist_lookup_nv_alloc' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_nv_alloc'> + <parameter type-id='5ce45b60' name='nvl'/> + <return type-id='11871392'/> + </function-decl> + <function-decl name='nvlist_nvflag' mangled-name='nvlist_nvflag' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_nvflag'> + <parameter type-id='5ce45b60' name='nvl'/> + <return type-id='3502e3ff'/> + </function-decl> + <function-decl name='nvlist_alloc' mangled-name='nvlist_alloc' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_alloc'> + <parameter type-id='857bb57e' name='nvlp'/> + <parameter type-id='3502e3ff' name='nvflag'/> + <parameter type-id='95e97e5e' name='kmflag'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_xalloc' mangled-name='nvlist_xalloc' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_xalloc'> + <parameter type-id='857bb57e' name='nvlp'/> + <parameter type-id='3502e3ff' name='nvflag'/> + <parameter type-id='11871392' name='nva'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_free' mangled-name='nvlist_free' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_free'> + <parameter type-id='5ce45b60' name='nvl'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='nvlist_dup' mangled-name='nvlist_dup' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_dup'> + <parameter type-id='22cce67b' name='nvl'/> + <parameter type-id='857bb57e' name='nvlp'/> + <parameter type-id='95e97e5e' name='kmflag'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_xdup' mangled-name='nvlist_xdup' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_xdup'> + <parameter type-id='22cce67b' name='nvl'/> + <parameter type-id='857bb57e' name='nvlp'/> + <parameter type-id='11871392' name='nva'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_remove_all' mangled-name='nvlist_remove_all' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_remove_all'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_remove' mangled-name='nvlist_remove' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_remove'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='8d0687d2' name='type'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_remove_nvpair' mangled-name='nvlist_remove_nvpair' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_remove_nvpair'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='3fa542f0' name='nvp'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_boolean' mangled-name='nvlist_add_boolean' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_boolean'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_boolean_value' mangled-name='nvlist_add_boolean_value' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_boolean_value'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='c19b74c3' name='val'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_byte' mangled-name='nvlist_add_byte' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_byte'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='d8bf0010' name='val'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_int8' mangled-name='nvlist_add_int8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_int8'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='ee31ee44' name='val'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_uint8' mangled-name='nvlist_add_uint8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_uint8'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='b96825af' name='val'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_int16' mangled-name='nvlist_add_int16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_int16'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='23bd8cb5' name='val'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_uint16' mangled-name='nvlist_add_uint16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_uint16'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='149c6638' name='val'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_int32' mangled-name='nvlist_add_int32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_int32'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='3ff5601b' name='val'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_uint32' mangled-name='nvlist_add_uint32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_uint32'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='8f92235e' name='val'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_int64' mangled-name='nvlist_add_int64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_int64'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='9da381c4' name='val'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_uint64' mangled-name='nvlist_add_uint64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_uint64'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='9c313c2d' name='val'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_double' mangled-name='nvlist_add_double' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_double'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='a0eb0f08' name='val'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_string' mangled-name='nvlist_add_string' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_string'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='80f4b756' name='val'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_boolean_array' mangled-name='nvlist_add_boolean_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_boolean_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='c5f6c15b' name='a'/> + <parameter type-id='3502e3ff' name='n'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_byte_array' mangled-name='nvlist_add_byte_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_byte_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='d1db479e' name='a'/> + <parameter type-id='3502e3ff' name='n'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_int8_array' mangled-name='nvlist_add_int8_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_int8_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='a06445da' name='a'/> + <parameter type-id='3502e3ff' name='n'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_uint8_array' mangled-name='nvlist_add_uint8_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_uint8_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='9f7200cf' name='a'/> + <parameter type-id='3502e3ff' name='n'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_int16_array' mangled-name='nvlist_add_int16_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_int16_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='a3eb883d' name='a'/> + <parameter type-id='3502e3ff' name='n'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_uint16_array' mangled-name='nvlist_add_uint16_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_uint16_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='1b7d11c6' name='a'/> + <parameter type-id='3502e3ff' name='n'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_int32_array' mangled-name='nvlist_add_int32_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_int32_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='1f526493' name='a'/> + <parameter type-id='3502e3ff' name='n'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_uint32_array' mangled-name='nvlist_add_uint32_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_uint32_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='a6798dcc' name='a'/> + <parameter type-id='3502e3ff' name='n'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_int64_array' mangled-name='nvlist_add_int64_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_int64_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='505bed1a' name='a'/> + <parameter type-id='3502e3ff' name='n'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_uint64_array' mangled-name='nvlist_add_uint64_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_uint64_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='713a56f5' name='a'/> + <parameter type-id='3502e3ff' name='n'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_string_array' mangled-name='nvlist_add_string_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_string_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='13956559' name='a'/> + <parameter type-id='3502e3ff' name='n'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_hrtime' mangled-name='nvlist_add_hrtime' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_hrtime'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='cebdd548' name='val'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_nvlist' mangled-name='nvlist_add_nvlist' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_nvlist'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='22cce67b' name='val'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_nvlist_array' mangled-name='nvlist_add_nvlist_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_nvlist_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='3bbfee2e' name='a'/> + <parameter type-id='3502e3ff' name='n'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_prev_nvpair' mangled-name='nvlist_prev_nvpair' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_prev_nvpair'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='dace003f' name='nvp'/> + <return type-id='3fa542f0'/> + </function-decl> + <function-decl name='nvlist_empty' mangled-name='nvlist_empty' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_empty'> + <parameter type-id='22cce67b' name='nvl'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='nvlist_lookup_boolean' mangled-name='nvlist_lookup_boolean' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_boolean'> + <parameter type-id='22cce67b' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_boolean_value' mangled-name='nvlist_lookup_boolean_value' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_boolean_value'> + <parameter type-id='22cce67b' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='37e3bd22' name='val'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_byte' mangled-name='nvlist_lookup_byte' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_byte'> + <parameter type-id='22cce67b' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='45b65157' name='val'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_int8' mangled-name='nvlist_lookup_int8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_int8'> + <parameter type-id='22cce67b' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='256d5229' name='val'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_uint8' mangled-name='nvlist_lookup_uint8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_uint8'> + <parameter type-id='22cce67b' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='ae3e8ca6' name='val'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_int16' mangled-name='nvlist_lookup_int16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_int16'> + <parameter type-id='22cce67b' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='f76f73d0' name='val'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_uint16' mangled-name='nvlist_lookup_uint16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_uint16'> + <parameter type-id='22cce67b' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='8a121f49' name='val'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_int32' mangled-name='nvlist_lookup_int32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_int32'> + <parameter type-id='22cce67b' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='4aafb922' name='val'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_uint32' mangled-name='nvlist_lookup_uint32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_uint32'> + <parameter type-id='22cce67b' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='90421557' name='val'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_int64' mangled-name='nvlist_lookup_int64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_int64'> + <parameter type-id='22cce67b' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='cb785ebf' name='val'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_uint64' mangled-name='nvlist_lookup_uint64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_uint64'> + <parameter type-id='22cce67b' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='5d6479ae' name='val'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_double' mangled-name='nvlist_lookup_double' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_double'> + <parameter type-id='22cce67b' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='7408d286' name='val'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_string' mangled-name='nvlist_lookup_string' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_string'> + <parameter type-id='22cce67b' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='7d3cd834' name='val'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_nvlist' mangled-name='nvlist_lookup_nvlist' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_nvlist'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='857bb57e' name='val'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_boolean_array' mangled-name='nvlist_lookup_boolean_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_boolean_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='03829398' name='a'/> + <parameter type-id='4dd26a40' name='n'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_byte_array' mangled-name='nvlist_lookup_byte_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_byte_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='3b0247c7' name='a'/> + <parameter type-id='4dd26a40' name='n'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_int8_array' mangled-name='nvlist_lookup_int8_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_int8_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='ee181ab9' name='a'/> + <parameter type-id='4dd26a40' name='n'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_uint8_array' mangled-name='nvlist_lookup_uint8_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_uint8_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='d8774064' name='a'/> + <parameter type-id='4dd26a40' name='n'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_int16_array' mangled-name='nvlist_lookup_int16_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_int16_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='7e73928e' name='a'/> + <parameter type-id='4dd26a40' name='n'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_uint16_array' mangled-name='nvlist_lookup_uint16_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_uint16_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='bd8768d9' name='a'/> + <parameter type-id='4dd26a40' name='n'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_int32_array' mangled-name='nvlist_lookup_int32_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_int32_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='9aa04798' name='a'/> + <parameter type-id='4dd26a40' name='n'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_uint32_array' mangled-name='nvlist_lookup_uint32_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_uint32_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='9507d3c7' name='a'/> + <parameter type-id='4dd26a40' name='n'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_int64_array' mangled-name='nvlist_lookup_int64_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_int64_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='e37ce48f' name='a'/> + <parameter type-id='4dd26a40' name='n'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_uint64_array' mangled-name='nvlist_lookup_uint64_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_uint64_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='892b4acc' name='a'/> + <parameter type-id='4dd26a40' name='n'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_string_array' mangled-name='nvlist_lookup_string_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_string_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='c0563f85' name='a'/> + <parameter type-id='4dd26a40' name='n'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_nvlist_array' mangled-name='nvlist_lookup_nvlist_array' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_nvlist_array'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='75be733c' name='a'/> + <parameter type-id='4dd26a40' name='n'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_hrtime' mangled-name='nvlist_lookup_hrtime' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_hrtime'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='e379e62d' name='val'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_pairs' mangled-name='nvlist_lookup_pairs' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_pairs'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='95e97e5e' name='flag'/> + <parameter is-variadic='yes'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_nvpair' mangled-name='nvlist_lookup_nvpair' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_nvpair'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='0b283d2e' name='ret'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_nvpair_embedded_index' mangled-name='nvlist_lookup_nvpair_embedded_index' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_lookup_nvpair_embedded_index'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='0b283d2e' name='ret'/> + <parameter type-id='7292109c' name='ip'/> + <parameter type-id='7d3cd834' name='ep'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_exists' mangled-name='nvlist_exists' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_exists'> + <parameter type-id='22cce67b' name='nvl'/> + <parameter type-id='80f4b756' name='name'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='nvlist_add_nvpair' mangled-name='nvlist_add_nvpair' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_add_nvpair'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='3fa542f0' name='nvp'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_merge' mangled-name='nvlist_merge' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_merge'> + <parameter type-id='5ce45b60' name='dst'/> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='95e97e5e' name='flag'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_size' mangled-name='nvlist_size' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_size'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='78c01427' name='size'/> + <parameter type-id='95e97e5e' name='encoding'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_pack' mangled-name='nvlist_pack' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_pack'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='9b23c9ad' name='bufp'/> + <parameter type-id='78c01427' name='buflen'/> + <parameter type-id='95e97e5e' name='encoding'/> + <parameter type-id='95e97e5e' name='kmflag'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_xpack' mangled-name='nvlist_xpack' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_xpack'> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='9b23c9ad' name='bufp'/> + <parameter type-id='78c01427' name='buflen'/> + <parameter type-id='95e97e5e' name='encoding'/> + <parameter type-id='11871392' name='nva'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_unpack' mangled-name='nvlist_unpack' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_unpack'> + <parameter type-id='26a90f95' name='buf'/> + <parameter type-id='b59d7dce' name='buflen'/> + <parameter type-id='857bb57e' name='nvlp'/> + <parameter type-id='95e97e5e' name='kmflag'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_xunpack' mangled-name='nvlist_xunpack' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nvlist_xunpack'> + <parameter type-id='26a90f95' name='buf'/> + <parameter type-id='b59d7dce' name='buflen'/> + <parameter type-id='857bb57e' name='nvlp'/> + <parameter type-id='11871392' name='nva'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-type size-in-bits='64' id='441e0c31'> + <parameter type-id='812c6697'/> + <parameter type-id='48f7c3f5'/> + <return type-id='4aafb922'/> + </function-type> + <function-type size-in-bits='64' id='e80b47fe'> + <parameter type-id='17fd1621'/> + <parameter is-variadic='yes'/> + <return type-id='310a70df'/> + </function-type> + <function-type size-in-bits='64' id='1c7a4858'> + <parameter type-id='812c6697'/> + <parameter type-id='26a90f95'/> + <parameter type-id='48f7c3f5'/> + <return type-id='310a70df'/> + </function-type> + <function-type size-in-bits='64' id='f6358b93'> + <parameter type-id='812c6697'/> + <parameter type-id='80f4b756'/> + <parameter type-id='48f7c3f5'/> + <return type-id='310a70df'/> + </function-type> + <function-type size-in-bits='64' id='45354e42'> + <parameter type-id='812c6697'/> + <parameter type-id='218ee02f'/> + <return type-id='310a70df'/> + </function-type> + <function-type size-in-bits='64' id='0760d6d1'> + <parameter type-id='812c6697'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='eaa32e2f'/> + <return type-id='310a70df'/> + </function-type> + <function-type size-in-bits='64' id='be0f9e0b'> + <parameter type-id='812c6697'/> + <parameter type-id='3ccc2590'/> + <return type-id='310a70df'/> + </function-type> + <function-type size-in-bits='64' id='16eb5704'> + <parameter type-id='812c6697'/> + <parameter type-id='48f7c3f5'/> + <return type-id='310a70df'/> + </function-type> + <function-type size-in-bits='64' id='46870456'> + <parameter type-id='812c6697'/> + <return type-id='48f7c3f5'/> + </function-type> + <function-type size-in-bits='64' id='c87cb1d0'> + <parameter type-id='812c6697'/> + <return type-id='48b5725f'/> + </function-type> + </abi-instr> + <abi-instr address-size='64' path='module/nvpair/nvpair_alloc_fixed.c' language='LANG_C99'> + <qualified-type-def type-id='ee1d4944' const='yes' id='4b95388f'/> + <var-decl name='nv_fixed_ops' type-id='4b95388f' mangled-name='nv_fixed_ops' visibility='default' elf-symbol-id='nv_fixed_ops'/> </abi-instr> </abi-corpus> diff --git a/sys/contrib/openzfs/lib/libnvpair/libnvpair.c b/sys/contrib/openzfs/lib/libnvpair/libnvpair.c index fd43a44c1c0d..41be7c678d25 100644 --- a/sys/contrib/openzfs/lib/libnvpair/libnvpair.c +++ b/sys/contrib/openzfs/lib/libnvpair/libnvpair.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -70,7 +71,7 @@ struct nvlist_printops { DEFINEOP(print_int64, int64_t); DEFINEOP(print_uint64, uint64_t); DEFINEOP(print_double, double); - DEFINEOP(print_string, char *); + DEFINEOP(print_string, const char *); DEFINEOP(print_hrtime, hrtime_t); DEFINEOP(print_nvlist, nvlist_t *); DEFINEARROP(print_boolean_array, boolean_t *); @@ -83,7 +84,7 @@ struct nvlist_printops { DEFINEARROP(print_uint32_array, uint32_t *); DEFINEARROP(print_int64_array, int64_t *); DEFINEARROP(print_uint64_array, uint64_t *); - DEFINEARROP(print_string_array, char **); + DEFINEARROP(print_string_array, const char **); DEFINEARROP(print_nvlist_array, nvlist_t **); }; @@ -199,6 +200,17 @@ nvprint_##type_and_variant(nvlist_prtctl_t pctl, void *private, \ return (1); \ } +/* + * Workaround for GCC 12+ with UBSan enabled deficencies. + * + * GCC 12+ invoked with -fsanitize=undefined incorrectly reports the code + * below as violating -Wformat-overflow. + */ +#if defined(__GNUC__) && !defined(__clang__) && \ + defined(ZFS_UBSAN_ENABLED) && defined(HAVE_FORMAT_OVERFLOW) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wformat-overflow" +#endif NVLIST_PRTFUNC(boolean, int, int, "%d") NVLIST_PRTFUNC(boolean_value, boolean_t, int, "%d") NVLIST_PRTFUNC(byte, uchar_t, uchar_t, "0x%2.2x") @@ -211,8 +223,12 @@ NVLIST_PRTFUNC(uint32, uint32_t, uint32_t, "0x%x") NVLIST_PRTFUNC(int64, int64_t, longlong_t, "%lld") NVLIST_PRTFUNC(uint64, uint64_t, u_longlong_t, "0x%llx") NVLIST_PRTFUNC(double, double, double, "0x%f") -NVLIST_PRTFUNC(string, char *, char *, "%s") +NVLIST_PRTFUNC(string, const char *, const char *, "%s") NVLIST_PRTFUNC(hrtime, hrtime_t, hrtime_t, "0x%llx") +#if defined(__GNUC__) && !defined(__clang__) && \ + defined(ZFS_UBSAN_ENABLED) && defined(HAVE_FORMAT_OVERFLOW) +#pragma GCC diagnostic pop +#endif /* * Generate functions to print array-valued nvlist members. @@ -251,13 +267,13 @@ NVLIST_ARRPRTFUNC(int32_array, int32_t, int32_t, "%d") NVLIST_ARRPRTFUNC(uint32_array, uint32_t, uint32_t, "0x%x") NVLIST_ARRPRTFUNC(int64_array, int64_t, longlong_t, "%lld") NVLIST_ARRPRTFUNC(uint64_array, uint64_t, u_longlong_t, "0x%llx") -NVLIST_ARRPRTFUNC(string_array, char *, char *, "%s") +NVLIST_ARRPRTFUNC(string_array, const char *, const char *, "%s") -/*ARGSUSED*/ static int nvprint_nvlist(nvlist_prtctl_t pctl, void *private, nvlist_t *nvl, const char *name, nvlist_t *value) { + (void) private, (void) nvl; FILE *fp = pctl->nvprt_fp; indent(pctl, 1); @@ -273,11 +289,11 @@ nvprint_nvlist(nvlist_prtctl_t pctl, void *private, return (1); } -/*ARGSUSED*/ static int nvaprint_nvlist_array(nvlist_prtctl_t pctl, void *private, nvlist_t *nvl, const char *name, nvlist_t **valuep, uint_t count) { + (void) private, (void) nvl; FILE *fp = pctl->nvprt_fp; uint_t i; @@ -368,7 +384,7 @@ nvlist_prtctl_setfmt(nvlist_prtctl_t pctl, enum nvlist_prtctl_fmt which, pctl->nvprt_btwnarrfmt_nl = 0; } else { pctl->nvprt_btwnarrfmt = fmt; - pctl->nvprt_btwnarrfmt_nl = (strstr(fmt, "\n") != NULL); + pctl->nvprt_btwnarrfmt_nl = (strchr(fmt, '\n') != NULL); } break; @@ -383,13 +399,13 @@ nvlist_prtctl_dofmt(nvlist_prtctl_t pctl, enum nvlist_prtctl_fmt which, ...) { FILE *fp = pctl->nvprt_fp; va_list ap; - char *name; + const char *name; va_start(ap, which); switch (which) { case NVLIST_FMT_MEMBER_NAME: - name = va_arg(ap, char *); + name = va_arg(ap, const char *); (void) fprintf(fp, pctl->nvprt_nmfmt, name); break; @@ -438,7 +454,7 @@ NVLIST_PRINTCTL_REPLACE(uint32, uint32_t) NVLIST_PRINTCTL_REPLACE(int64, int64_t) NVLIST_PRINTCTL_REPLACE(uint64, uint64_t) NVLIST_PRINTCTL_REPLACE(double, double) -NVLIST_PRINTCTL_REPLACE(string, char *) +NVLIST_PRINTCTL_REPLACE(string, const char *) NVLIST_PRINTCTL_REPLACE(hrtime, hrtime_t) NVLIST_PRINTCTL_REPLACE(nvlist, nvlist_t *) @@ -462,7 +478,7 @@ NVLIST_PRINTCTL_AREPLACE(int32_array, int32_t *) NVLIST_PRINTCTL_AREPLACE(uint32_array, uint32_t *) NVLIST_PRINTCTL_AREPLACE(int64_array, int64_t *) NVLIST_PRINTCTL_AREPLACE(uint64_array, uint64_t *) -NVLIST_PRINTCTL_AREPLACE(string_array, char **) +NVLIST_PRINTCTL_AREPLACE(string_array, const char **) NVLIST_PRINTCTL_AREPLACE(nvlist_array, nvlist_t **) /* @@ -565,7 +581,7 @@ static void nvlist_print_with_indent(nvlist_t *nvl, nvlist_prtctl_t pctl) { FILE *fp = pctl->nvprt_fp; - char *name; + const char *name; uint_t nelem; nvpair_t *nvp; @@ -655,7 +671,7 @@ nvlist_print_with_indent(nvlist_t *nvl, nvlist_prtctl_t pctl) break; } case DATA_TYPE_STRING: { - char *val; + const char *val; (void) nvpair_value_string(nvp, &val); RENDER(pctl, string, nvl, name, val); break; @@ -721,7 +737,7 @@ nvlist_print_with_indent(nvlist_t *nvl, nvlist_prtctl_t pctl) break; } case DATA_TYPE_STRING_ARRAY: { - char **val; + const char **val; (void) nvpair_value_string_array(nvp, &val, &nelem); ARENDER(pctl, string_array, nvl, name, val, nelem); break; @@ -767,159 +783,6 @@ nvlist_prt(nvlist_t *nvl, nvlist_prtctl_t pctl) nvlist_print_with_indent(nvl, pctl); } -#define NVP(elem, type, vtype, ptype, format) { \ - vtype value; \ -\ - (void) nvpair_value_##type(elem, &value); \ - (void) printf("%*s%s: " format "\n", indent, "", \ - nvpair_name(elem), (ptype)value); \ -} - -#define NVPA(elem, type, vtype, ptype, format) { \ - uint_t i, count; \ - vtype *value; \ -\ - (void) nvpair_value_##type(elem, &value, &count); \ - for (i = 0; i < count; i++) { \ - (void) printf("%*s%s[%d]: " format "\n", indent, "", \ - nvpair_name(elem), i, (ptype)value[i]); \ - } \ -} - -/* - * Similar to nvlist_print() but handles arrays slightly differently. - */ -void -dump_nvlist(nvlist_t *list, int indent) -{ - nvpair_t *elem = NULL; - boolean_t bool_value; - nvlist_t *nvlist_value; - nvlist_t **nvlist_array_value; - uint_t i, count; - - if (list == NULL) { - return; - } - - while ((elem = nvlist_next_nvpair(list, elem)) != NULL) { - switch (nvpair_type(elem)) { - case DATA_TYPE_BOOLEAN: - (void) printf("%*s%s\n", indent, "", nvpair_name(elem)); - break; - - case DATA_TYPE_BOOLEAN_VALUE: - (void) nvpair_value_boolean_value(elem, &bool_value); - (void) printf("%*s%s: %s\n", indent, "", - nvpair_name(elem), bool_value ? "true" : "false"); - break; - - case DATA_TYPE_BYTE: - NVP(elem, byte, uchar_t, int, "%u"); - break; - - case DATA_TYPE_INT8: - NVP(elem, int8, int8_t, int, "%d"); - break; - - case DATA_TYPE_UINT8: - NVP(elem, uint8, uint8_t, int, "%u"); - break; - - case DATA_TYPE_INT16: - NVP(elem, int16, int16_t, int, "%d"); - break; - - case DATA_TYPE_UINT16: - NVP(elem, uint16, uint16_t, int, "%u"); - break; - - case DATA_TYPE_INT32: - NVP(elem, int32, int32_t, long, "%ld"); - break; - - case DATA_TYPE_UINT32: - NVP(elem, uint32, uint32_t, ulong_t, "%lu"); - break; - - case DATA_TYPE_INT64: - NVP(elem, int64, int64_t, longlong_t, "%lld"); - break; - - case DATA_TYPE_UINT64: - NVP(elem, uint64, uint64_t, u_longlong_t, "%llu"); - break; - - case DATA_TYPE_STRING: - NVP(elem, string, char *, char *, "'%s'"); - break; - - case DATA_TYPE_BYTE_ARRAY: - NVPA(elem, byte_array, uchar_t, int, "%u"); - break; - - case DATA_TYPE_INT8_ARRAY: - NVPA(elem, int8_array, int8_t, int, "%d"); - break; - - case DATA_TYPE_UINT8_ARRAY: - NVPA(elem, uint8_array, uint8_t, int, "%u"); - break; - - case DATA_TYPE_INT16_ARRAY: - NVPA(elem, int16_array, int16_t, int, "%d"); - break; - - case DATA_TYPE_UINT16_ARRAY: - NVPA(elem, uint16_array, uint16_t, int, "%u"); - break; - - case DATA_TYPE_INT32_ARRAY: - NVPA(elem, int32_array, int32_t, long, "%ld"); - break; - - case DATA_TYPE_UINT32_ARRAY: - NVPA(elem, uint32_array, uint32_t, ulong_t, "%lu"); - break; - - case DATA_TYPE_INT64_ARRAY: - NVPA(elem, int64_array, int64_t, longlong_t, "%lld"); - break; - - case DATA_TYPE_UINT64_ARRAY: - NVPA(elem, uint64_array, uint64_t, u_longlong_t, - "%llu"); - break; - - case DATA_TYPE_STRING_ARRAY: - NVPA(elem, string_array, char *, char *, "'%s'"); - break; - - case DATA_TYPE_NVLIST: - (void) nvpair_value_nvlist(elem, &nvlist_value); - (void) printf("%*s%s:\n", indent, "", - nvpair_name(elem)); - dump_nvlist(nvlist_value, indent + 4); - break; - - case DATA_TYPE_NVLIST_ARRAY: - (void) nvpair_value_nvlist_array(elem, - &nvlist_array_value, &count); - for (i = 0; i < count; i++) { - (void) printf("%*s%s[%u]:\n", indent, "", - nvpair_name(elem), i); - dump_nvlist(nvlist_array_value[i], indent + 4); - } - break; - - default: - (void) printf(dgettext(TEXT_DOMAIN, "bad config type " - "%d for %s\n"), nvpair_type(elem), - nvpair_name(elem)); - } - } -} - /* * ====================================================================== * | | @@ -946,11 +809,11 @@ dump_nvlist(nvlist_t *list, int indent) */ int nvpair_value_match_regex(nvpair_t *nvp, int ai, - char *value, regex_t *value_regex, char **ep) + const char *value, regex_t *value_regex, const char **ep) { - char *evalue; - uint_t a_len; - int sr; + const char *evalue; + uint_t a_len; + int sr; if (ep) *ep = NULL; @@ -978,7 +841,7 @@ nvpair_value_match_regex(nvpair_t *nvp, int ai, sr = EOF; switch (nvpair_type(nvp)) { case DATA_TYPE_STRING: { - char *val; + const char *val; /* check string value for match */ if (nvpair_value_string(nvp, &val) == 0) { @@ -994,7 +857,7 @@ nvpair_value_match_regex(nvpair_t *nvp, int ai, break; } case DATA_TYPE_STRING_ARRAY: { - char **val_array; + const char **val_array; /* check indexed string value of array for match */ if ((nvpair_value_string_array(nvp, &val_array, &a_len) == 0) && @@ -1270,7 +1133,34 @@ nvpair_value_match_regex(nvpair_t *nvp, int ai, } int -nvpair_value_match(nvpair_t *nvp, int ai, char *value, char **ep) +nvpair_value_match(nvpair_t *nvp, int ai, const char *value, const char **ep) { return (nvpair_value_match_regex(nvp, ai, value, NULL, ep)); } + +/* + * Similar to nvlist_print() but handles arrays slightly differently. + */ +void +dump_nvlist(nvlist_t *list, int indent) +{ + int len; + char *buf; + + len = nvlist_snprintf(NULL, 0, list, indent); + len++; /* Add null terminator */ + + buf = malloc(len); + if (buf == NULL) + return; + + (void) nvlist_snprintf(buf, len, list, indent); + + /* + * fputs does not have limitations on the size of the buffer being + * printed (unlike printf). + */ + fputs(buf, stdout); + + free(buf); +} diff --git a/sys/contrib/openzfs/lib/libnvpair/libnvpair_json.c b/sys/contrib/openzfs/lib/libnvpair/libnvpair_json.c index 15b6f4afaf73..6ed984698b59 100644 --- a/sys/contrib/openzfs/lib/libnvpair/libnvpair_json.c +++ b/sys/contrib/openzfs/lib/libnvpair/libnvpair_json.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * This file and its contents are supplied under the terms of the * Common Development and Distribution License ("CDDL"), version 1.0. @@ -15,7 +16,7 @@ #include <stdio.h> #include <stdlib.h> -#include <strings.h> +#include <string.h> #include <wchar.h> #include <sys/debug.h> @@ -46,12 +47,10 @@ static int nvlist_print_json_string(FILE *fp, const char *input) { - mbstate_t mbr; + mbstate_t mbr = {0}; wchar_t c; size_t sz; - bzero(&mbr, sizeof (mbr)); - FPRINTF(fp, "\""); while ((sz = mbrtowc(&c, input, MB_CUR_MAX, &mbr)) > 0) { if (sz == (size_t)-1 || sz == (size_t)-2) { @@ -136,7 +135,7 @@ nvlist_print_json(FILE *fp, nvlist_t *nvl) switch (type) { case DATA_TYPE_STRING: { - char *string = fnvpair_value_string(curr); + const char *string = fnvpair_value_string(curr); if (nvlist_print_json_string(fp, string) == -1) return (-1); break; @@ -222,7 +221,7 @@ nvlist_print_json(FILE *fp, nvlist_t *nvl) } case DATA_TYPE_STRING_ARRAY: { - char **val; + const char **val; uint_t valsz, i; VERIFY0(nvpair_value_string_array(curr, &val, &valsz)); FPRINTF(fp, "["); diff --git a/sys/contrib/openzfs/lib/libnvpair/nvpair_alloc_system.c b/sys/contrib/openzfs/lib/libnvpair/nvpair_alloc_system.c index 54dde1ee644f..293233df443a 100644 --- a/sys/contrib/openzfs/lib/libnvpair/nvpair_alloc_system.c +++ b/sys/contrib/openzfs/lib/libnvpair/nvpair_alloc_system.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -36,10 +37,10 @@ nv_alloc_sys(nv_alloc_t *nva, size_t size) return (kmem_alloc(size, (int)(uintptr_t)nva->nva_arg)); } -/*ARGSUSED*/ static void nv_free_sys(nv_alloc_t *nva, void *buf, size_t size) { + (void) nva; kmem_free(buf, size); } @@ -51,15 +52,15 @@ static const nv_alloc_ops_t system_ops = { NULL /* nv_ao_reset() */ }; -nv_alloc_t nv_alloc_sleep_def = { +static nv_alloc_t nv_alloc_sleep_def = { &system_ops, (void *)KM_SLEEP }; -nv_alloc_t nv_alloc_nosleep_def = { +static nv_alloc_t nv_alloc_nosleep_def = { &system_ops, (void *)KM_NOSLEEP }; -nv_alloc_t *nv_alloc_sleep = &nv_alloc_sleep_def; -nv_alloc_t *nv_alloc_nosleep = &nv_alloc_nosleep_def; +nv_alloc_t *const nv_alloc_sleep = &nv_alloc_sleep_def; +nv_alloc_t *const nv_alloc_nosleep = &nv_alloc_nosleep_def; diff --git a/sys/contrib/openzfs/lib/libshare/Makefile.am b/sys/contrib/openzfs/lib/libshare/Makefile.am index dff3e5382d6e..48d8cb832428 100644 --- a/sys/contrib/openzfs/lib/libshare/Makefile.am +++ b/sys/contrib/openzfs/lib/libshare/Makefile.am @@ -1,30 +1,27 @@ -include $(top_srcdir)/config/Rules.am +libshare_la_CFLAGS = $(AM_CFLAGS) $(LIBRARY_CFLAGS) +libshare_la_CFLAGS += -fvisibility=hidden -DEFAULT_INCLUDES += -I$(srcdir) +libshare_la_CPPFLAGS = $(AM_CPPFLAGS) +libshare_la_CPPFLAGS += -I$(srcdir)/%D% -AM_CFLAGS += -fvisibility=hidden +noinst_LTLIBRARIES += libshare.la +CPPCHECKTARGETS += libshare.la -noinst_LTLIBRARIES = libshare.la - -USER_C = \ - libshare_impl.h \ - libshare.c \ - nfs.c \ - nfs.h \ - smb.h +libshare_la_SOURCES = \ + %D%/libshare_impl.h \ + %D%/libshare.c \ + %D%/nfs.c \ + %D%/nfs.h \ + %D%/smb.h if BUILD_LINUX -USER_C += \ - os/linux/nfs.c \ - os/linux/smb.c +libshare_la_SOURCES += \ + %D%/os/linux/nfs.c \ + %D%/os/linux/smb.c endif if BUILD_FREEBSD -USER_C += \ - os/freebsd/nfs.c \ - os/freebsd/smb.c +libshare_la_SOURCES += \ + %D%/os/freebsd/nfs.c \ + %D%/os/freebsd/smb.c endif - -libshare_la_SOURCES = $(USER_C) - -include $(top_srcdir)/config/CppCheck.am diff --git a/sys/contrib/openzfs/lib/libshare/libshare.c b/sys/contrib/openzfs/lib/libshare/libshare.c index a228645fbf8f..3695207e6fe7 100644 --- a/sys/contrib/openzfs/lib/libshare/libshare.c +++ b/sys/contrib/openzfs/lib/libshare/libshare.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -22,13 +23,14 @@ /* * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011 Gunnar Beutner - * Copyright (c) 2018, 2020 by Delphix. All rights reserved. + * Copyright (c) 2018, 2022 by Delphix. All rights reserved. */ #include <stdio.h> #include <stdlib.h> +#include <stddef.h> +#include <string.h> #include <errno.h> -#include <strings.h> #include <libintl.h> #include <sys/file.h> #include <sys/types.h> @@ -37,139 +39,80 @@ #include <libzfs.h> #include <libshare.h> #include "libshare_impl.h" -#include "nfs.h" -#include "smb.h" -static sa_share_impl_t alloc_share(const char *zfsname, const char *path); -static void free_share(sa_share_impl_t share); - -static int fstypes_count; -static sa_fstype_t *fstypes; - -sa_fstype_t * -register_fstype(const char *name, const sa_share_ops_t *ops) -{ - sa_fstype_t *fstype; - - fstype = calloc(1, sizeof (sa_fstype_t)); - - if (fstype == NULL) - return (NULL); - - fstype->name = name; - fstype->ops = ops; - fstype->fsinfo_index = fstypes_count; +#define init_share(zfsname, path, shareopts) \ + { \ + .sa_zfsname = zfsname, \ + .sa_mountpoint = path, \ + .sa_shareopts = shareopts, \ + } - fstypes_count++; +#define VALIDATE_PROTOCOL(proto, ...) \ + if ((proto) < 0 || (proto) >= SA_PROTOCOL_COUNT) \ + return __VA_ARGS__ - fstype->next = fstypes; - fstypes = fstype; +const char *const sa_protocol_names[SA_PROTOCOL_COUNT] = { + [SA_PROTOCOL_NFS] = "nfs", + [SA_PROTOCOL_SMB] = "smb", +}; - return (fstype); -} - -__attribute__((constructor)) static void -libshare_init(void) -{ - libshare_nfs_init(); - libshare_smb_init(); -} +static const sa_fstype_t *fstypes[SA_PROTOCOL_COUNT] = + {&libshare_nfs_type, &libshare_smb_type}; int sa_enable_share(const char *zfsname, const char *mountpoint, - const char *shareopts, char *protocol) + const char *shareopts, enum sa_protocol protocol) { - int rc, ret = SA_OK; - boolean_t found_protocol = B_FALSE; - sa_fstype_t *fstype; - - sa_share_impl_t impl_share = alloc_share(zfsname, mountpoint); - if (impl_share == NULL) - return (SA_NO_MEMORY); - - fstype = fstypes; - while (fstype != NULL) { - if (strcmp(fstype->name, protocol) == 0) { - - rc = fstype->ops->update_shareopts(impl_share, - shareopts); - if (rc != SA_OK) - break; - - rc = fstype->ops->enable_share(impl_share); - if (rc != SA_OK) - ret = rc; + VALIDATE_PROTOCOL(protocol, SA_INVALID_PROTOCOL); - found_protocol = B_TRUE; - } - - fstype = fstype->next; - } - free_share(impl_share); - - return (found_protocol ? ret : SA_INVALID_PROTOCOL); + const struct sa_share_impl args = + init_share(zfsname, mountpoint, shareopts); + return (fstypes[protocol]->enable_share(&args)); } int -sa_disable_share(const char *mountpoint, char *protocol) +sa_disable_share(const char *mountpoint, enum sa_protocol protocol) { - int rc, ret = SA_OK; - boolean_t found_protocol = B_FALSE; - sa_fstype_t *fstype; - - sa_share_impl_t impl_share = alloc_share(NULL, mountpoint); - if (impl_share == NULL) - return (SA_NO_MEMORY); + VALIDATE_PROTOCOL(protocol, SA_INVALID_PROTOCOL); - fstype = fstypes; - while (fstype != NULL) { - if (strcmp(fstype->name, protocol) == 0) { + const struct sa_share_impl args = init_share(NULL, mountpoint, NULL); + return (fstypes[protocol]->disable_share(&args)); +} - rc = fstype->ops->disable_share(impl_share); - if (rc != SA_OK) - ret = rc; +boolean_t +sa_is_shared(const char *mountpoint, enum sa_protocol protocol) +{ + VALIDATE_PROTOCOL(protocol, B_FALSE); - found_protocol = B_TRUE; - } + const struct sa_share_impl args = init_share(NULL, mountpoint, NULL); + return (fstypes[protocol]->is_shared(&args)); +} - fstype = fstype->next; - } - free_share(impl_share); +void +sa_commit_shares(enum sa_protocol protocol) +{ + /* CSTYLED */ + VALIDATE_PROTOCOL(protocol, ); - return (found_protocol ? ret : SA_INVALID_PROTOCOL); + fstypes[protocol]->commit_shares(); } -boolean_t -sa_is_shared(const char *mountpoint, char *protocol) +void +sa_truncate_shares(enum sa_protocol protocol) { - sa_fstype_t *fstype; - boolean_t ret = B_FALSE; - - /* guid value is not used */ - sa_share_impl_t impl_share = alloc_share(NULL, mountpoint); - if (impl_share == NULL) - return (B_FALSE); + /* CSTYLED */ + VALIDATE_PROTOCOL(protocol, ); - fstype = fstypes; - while (fstype != NULL) { - if (strcmp(fstype->name, protocol) == 0) { - ret = fstype->ops->is_shared(impl_share); - } - fstype = fstype->next; - } - free_share(impl_share); - return (ret); + if (fstypes[protocol]->truncate_shares != NULL) + fstypes[protocol]->truncate_shares(); } -void -sa_commit_shares(const char *protocol) +int +sa_validate_shareopts(const char *options, enum sa_protocol protocol) { - sa_fstype_t *fstype = fstypes; - while (fstype != NULL) { - if (strcmp(fstype->name, protocol) == 0) - fstype->ops->commit_shares(); - fstype = fstype->next; - } + VALIDATE_PROTOCOL(protocol, SA_INVALID_PROTOCOL); + + return (fstypes[protocol]->validate_shareopts(options)); } /* @@ -177,189 +120,85 @@ sa_commit_shares(const char *protocol) * * convert an error value to an error string */ -char * +const char * sa_errorstr(int err) { static char errstr[32]; - char *ret = NULL; switch (err) { case SA_OK: - ret = dgettext(TEXT_DOMAIN, "ok"); - break; + return (dgettext(TEXT_DOMAIN, "ok")); case SA_NO_SUCH_PATH: - ret = dgettext(TEXT_DOMAIN, "path doesn't exist"); - break; + return (dgettext(TEXT_DOMAIN, "path doesn't exist")); case SA_NO_MEMORY: - ret = dgettext(TEXT_DOMAIN, "no memory"); - break; + return (dgettext(TEXT_DOMAIN, "no memory")); case SA_DUPLICATE_NAME: - ret = dgettext(TEXT_DOMAIN, "name in use"); - break; + return (dgettext(TEXT_DOMAIN, "name in use")); case SA_BAD_PATH: - ret = dgettext(TEXT_DOMAIN, "bad path"); - break; + return (dgettext(TEXT_DOMAIN, "bad path")); case SA_NO_SUCH_GROUP: - ret = dgettext(TEXT_DOMAIN, "no such group"); - break; + return (dgettext(TEXT_DOMAIN, "no such group")); case SA_CONFIG_ERR: - ret = dgettext(TEXT_DOMAIN, "configuration error"); - break; + return (dgettext(TEXT_DOMAIN, "configuration error")); case SA_SYSTEM_ERR: - ret = dgettext(TEXT_DOMAIN, "system error"); - break; + return (dgettext(TEXT_DOMAIN, "system error")); case SA_SYNTAX_ERR: - ret = dgettext(TEXT_DOMAIN, "syntax error"); - break; + return (dgettext(TEXT_DOMAIN, "syntax error")); case SA_NO_PERMISSION: - ret = dgettext(TEXT_DOMAIN, "no permission"); - break; + return (dgettext(TEXT_DOMAIN, "no permission")); case SA_BUSY: - ret = dgettext(TEXT_DOMAIN, "busy"); - break; + return (dgettext(TEXT_DOMAIN, "busy")); case SA_NO_SUCH_PROP: - ret = dgettext(TEXT_DOMAIN, "no such property"); - break; + return (dgettext(TEXT_DOMAIN, "no such property")); case SA_INVALID_NAME: - ret = dgettext(TEXT_DOMAIN, "invalid name"); - break; + return (dgettext(TEXT_DOMAIN, "invalid name")); case SA_INVALID_PROTOCOL: - ret = dgettext(TEXT_DOMAIN, "invalid protocol"); - break; + return (dgettext(TEXT_DOMAIN, "invalid protocol")); case SA_NOT_ALLOWED: - ret = dgettext(TEXT_DOMAIN, "operation not allowed"); - break; + return (dgettext(TEXT_DOMAIN, "operation not allowed")); case SA_BAD_VALUE: - ret = dgettext(TEXT_DOMAIN, "bad property value"); - break; + return (dgettext(TEXT_DOMAIN, "bad property value")); case SA_INVALID_SECURITY: - ret = dgettext(TEXT_DOMAIN, "invalid security type"); - break; + return (dgettext(TEXT_DOMAIN, "invalid security type")); case SA_NO_SUCH_SECURITY: - ret = dgettext(TEXT_DOMAIN, "security type not found"); - break; + return (dgettext(TEXT_DOMAIN, "security type not found")); case SA_VALUE_CONFLICT: - ret = dgettext(TEXT_DOMAIN, "property value conflict"); - break; + return (dgettext(TEXT_DOMAIN, "property value conflict")); case SA_NOT_IMPLEMENTED: - ret = dgettext(TEXT_DOMAIN, "not implemented"); - break; + return (dgettext(TEXT_DOMAIN, "not implemented")); case SA_INVALID_PATH: - ret = dgettext(TEXT_DOMAIN, "invalid path"); - break; + return (dgettext(TEXT_DOMAIN, "invalid path")); case SA_NOT_SUPPORTED: - ret = dgettext(TEXT_DOMAIN, "operation not supported"); - break; + return (dgettext(TEXT_DOMAIN, "operation not supported")); case SA_PROP_SHARE_ONLY: - ret = dgettext(TEXT_DOMAIN, "property not valid for group"); - break; + return (dgettext(TEXT_DOMAIN, "property not valid for group")); case SA_NOT_SHARED: - ret = dgettext(TEXT_DOMAIN, "not shared"); - break; + return (dgettext(TEXT_DOMAIN, "not shared")); case SA_NO_SUCH_RESOURCE: - ret = dgettext(TEXT_DOMAIN, "no such resource"); - break; + return (dgettext(TEXT_DOMAIN, "no such resource")); case SA_RESOURCE_REQUIRED: - ret = dgettext(TEXT_DOMAIN, "resource name required"); - break; + return (dgettext(TEXT_DOMAIN, "resource name required")); case SA_MULTIPLE_ERROR: - ret = dgettext(TEXT_DOMAIN, "errors from multiple protocols"); - break; + return (dgettext(TEXT_DOMAIN, + "errors from multiple protocols")); case SA_PATH_IS_SUBDIR: - ret = dgettext(TEXT_DOMAIN, "path is a subpath of share"); - break; + return (dgettext(TEXT_DOMAIN, "path is a subpath of share")); case SA_PATH_IS_PARENTDIR: - ret = dgettext(TEXT_DOMAIN, "path is parent of a share"); - break; + return (dgettext(TEXT_DOMAIN, "path is parent of a share")); case SA_NO_SECTION: - ret = dgettext(TEXT_DOMAIN, "protocol requires a section"); - break; + return (dgettext(TEXT_DOMAIN, "protocol requires a section")); case SA_NO_PROPERTIES: - ret = dgettext(TEXT_DOMAIN, "properties not found"); - break; + return (dgettext(TEXT_DOMAIN, "properties not found")); case SA_NO_SUCH_SECTION: - ret = dgettext(TEXT_DOMAIN, "section not found"); - break; + return (dgettext(TEXT_DOMAIN, "section not found")); case SA_PASSWORD_ENC: - ret = dgettext(TEXT_DOMAIN, "passwords must be encrypted"); - break; + return (dgettext(TEXT_DOMAIN, "passwords must be encrypted")); case SA_SHARE_EXISTS: - ret = dgettext(TEXT_DOMAIN, "path or file is already shared"); - break; + return (dgettext(TEXT_DOMAIN, + "path or file is already shared")); default: (void) snprintf(errstr, sizeof (errstr), dgettext(TEXT_DOMAIN, "unknown %d"), err); - ret = errstr; - } - return (ret); -} - -int -sa_validate_shareopts(char *options, char *proto) -{ - sa_fstype_t *fstype; - - fstype = fstypes; - while (fstype != NULL) { - if (strcmp(fstype->name, proto) != 0) { - fstype = fstype->next; - continue; - } - - return (fstype->ops->validate_shareopts(options)); - } - - return (SA_INVALID_PROTOCOL); -} - -static sa_share_impl_t -alloc_share(const char *zfsname, const char *mountpoint) -{ - sa_share_impl_t impl_share; - - impl_share = calloc(1, sizeof (struct sa_share_impl)); - - if (impl_share == NULL) - return (NULL); - - if (mountpoint != NULL && - ((impl_share->sa_mountpoint = strdup(mountpoint)) == NULL)) { - free(impl_share); - return (NULL); - } - - if (zfsname != NULL && - ((impl_share->sa_zfsname = strdup(zfsname)) == NULL)) { - free(impl_share->sa_mountpoint); - free(impl_share); - return (NULL); - } - - impl_share->sa_fsinfo = calloc(fstypes_count, - sizeof (sa_share_fsinfo_t)); - if (impl_share->sa_fsinfo == NULL) { - free(impl_share->sa_mountpoint); - free(impl_share->sa_zfsname); - free(impl_share); - return (NULL); + return (errstr); } - - return (impl_share); -} - -static void -free_share(sa_share_impl_t impl_share) -{ - sa_fstype_t *fstype; - - fstype = fstypes; - while (fstype != NULL) { - fstype->ops->clear_shareopts(impl_share); - fstype = fstype->next; - } - - free(impl_share->sa_mountpoint); - free(impl_share->sa_zfsname); - free(impl_share->sa_fsinfo); - free(impl_share); } diff --git a/sys/contrib/openzfs/lib/libshare/libshare_impl.h b/sys/contrib/openzfs/lib/libshare/libshare_impl.h index 63a6907539e0..79f081bb8312 100644 --- a/sys/contrib/openzfs/lib/libshare/libshare_impl.h +++ b/sys/contrib/openzfs/lib/libshare/libshare_impl.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -22,44 +23,26 @@ /* * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011 Gunnar Beutner - * Copyright (c) 2019, 2020 by Delphix. All rights reserved. + * Copyright (c) 2019, 2022 by Delphix. All rights reserved. */ #ifndef _LIBSPL_LIBSHARE_IMPL_H #define _LIBSPL_LIBSHARE_IMPL_H -typedef struct sa_share_fsinfo { - char *shareopts; -} sa_share_fsinfo_t; - -typedef struct sa_share_impl { - char *sa_mountpoint; - char *sa_zfsname; - - sa_share_fsinfo_t *sa_fsinfo; /* per-fstype information */ +typedef const struct sa_share_impl { + const char *sa_zfsname; + const char *sa_mountpoint; + const char *sa_shareopts; } *sa_share_impl_t; -#define FSINFO(impl_share, fstype) \ - (&(impl_share->sa_fsinfo[fstype->fsinfo_index])) - -typedef struct sa_share_ops { - int (*enable_share)(sa_share_impl_t share); - int (*disable_share)(sa_share_impl_t share); - boolean_t (*is_shared)(sa_share_impl_t share); - int (*validate_shareopts)(const char *shareopts); - int (*update_shareopts)(sa_share_impl_t impl_share, - const char *shareopts); - void (*clear_shareopts)(sa_share_impl_t impl_share); - int (*commit_shares)(void); -} sa_share_ops_t; - -typedef struct sa_fstype { - struct sa_fstype *next; - - const char *name; - const sa_share_ops_t *ops; - int fsinfo_index; +typedef struct { + int (*const enable_share)(sa_share_impl_t share); + int (*const disable_share)(sa_share_impl_t share); + boolean_t (*const is_shared)(sa_share_impl_t share); + int (*const validate_shareopts)(const char *shareopts); + int (*const commit_shares)(void); + void (*const truncate_shares)(void); } sa_fstype_t; -sa_fstype_t *register_fstype(const char *name, const sa_share_ops_t *ops); +extern const sa_fstype_t libshare_nfs_type, libshare_smb_type; #endif /* _LIBSPL_LIBSHARE_IMPL_H */ diff --git a/sys/contrib/openzfs/lib/libshare/nfs.c b/sys/contrib/openzfs/lib/libshare/nfs.c index e339ebc81f1b..e4c5b904f51f 100644 --- a/sys/contrib/openzfs/lib/libshare/nfs.c +++ b/sys/contrib/openzfs/lib/libshare/nfs.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -24,37 +25,41 @@ #include <sys/stat.h> #include <sys/file.h> #include <fcntl.h> +#include <ctype.h> #include <stdio.h> #include <errno.h> #include <libshare.h> +#include <unistd.h> +#include <libzutil.h> #include "nfs.h" -static int nfs_lock_fd = -1; - - /* * nfs_exports_[lock|unlock] are used to guard against conconcurrent * updates to the exports file. Each protocol is responsible for * providing the necessary locking to ensure consistency. */ static int -nfs_exports_lock(const char *name) +nfs_exports_lock(const char *name, int *nfs_lock_fd) { int err; - nfs_lock_fd = open(name, O_RDWR | O_CREAT | O_CLOEXEC, 0600); - if (nfs_lock_fd == -1) { + *nfs_lock_fd = open(name, O_RDWR | O_CREAT | O_CLOEXEC, 0600); + if (*nfs_lock_fd == -1) { err = errno; - fprintf(stderr, "failed to lock %s: %s\n", name, strerror(err)); + fprintf(stderr, "failed to lock %s: %s\n", name, + zfs_strerror(err)); return (err); } - if (flock(nfs_lock_fd, LOCK_EX) != 0) { + while ((err = flock(*nfs_lock_fd, LOCK_EX)) != 0 && errno == EINTR) + ; + if (err != 0) { err = errno; - fprintf(stderr, "failed to lock %s: %s\n", name, strerror(err)); - (void) close(nfs_lock_fd); - nfs_lock_fd = -1; + fprintf(stderr, "failed to lock %s: %s\n", name, + zfs_strerror(err)); + (void) close(*nfs_lock_fd); + *nfs_lock_fd = -1; return (err); } @@ -62,96 +67,252 @@ nfs_exports_lock(const char *name) } static void -nfs_exports_unlock(const char *name) +nfs_exports_unlock(const char *name, int *nfs_lock_fd) { - verify(nfs_lock_fd > 0); + verify(*nfs_lock_fd > 0); - if (flock(nfs_lock_fd, LOCK_UN) != 0) { + if (flock(*nfs_lock_fd, LOCK_UN) != 0) fprintf(stderr, "failed to unlock %s: %s\n", - name, strerror(errno)); - } + name, zfs_strerror(errno)); - (void) close(nfs_lock_fd); - nfs_lock_fd = -1; + (void) close(*nfs_lock_fd); + *nfs_lock_fd = -1; } -static char * -nfs_init_tmpfile(const char *prefix, const char *mdir) -{ - char *tmpfile = NULL; - struct stat sb; +struct tmpfile { + /* + * This only needs to be as wide as ZFS_EXPORTS_FILE and mktemp suffix, + * 64 is more than enough. + */ + char name[64]; + FILE *fp; +}; +static boolean_t +nfs_init_tmpfile(const char *prefix, const char *mdir, struct tmpfile *tmpf) +{ if (mdir != NULL && - stat(mdir, &sb) < 0 && - mkdir(mdir, 0755) < 0) { + mkdir(mdir, 0755) < 0 && + errno != EEXIST) { fprintf(stderr, "failed to create %s: %s\n", - mdir, strerror(errno)); - return (NULL); + // cppcheck-suppress uninitvar + mdir, zfs_strerror(errno)); + return (B_FALSE); } - if (asprintf(&tmpfile, "%s.XXXXXXXX", prefix) == -1) { - fprintf(stderr, "Unable to allocate temporary file\n"); - return (NULL); - } + strlcpy(tmpf->name, prefix, sizeof (tmpf->name)); + strlcat(tmpf->name, ".XXXXXXXX", sizeof (tmpf->name)); - int fd = mkostemp(tmpfile, O_CLOEXEC); + int fd = mkostemp(tmpf->name, O_CLOEXEC); if (fd == -1) { fprintf(stderr, "Unable to create temporary file: %s", - strerror(errno)); - free(tmpfile); - return (NULL); + zfs_strerror(errno)); + return (B_FALSE); + } + + tmpf->fp = fdopen(fd, "w+"); + if (tmpf->fp == NULL) { + fprintf(stderr, "Unable to reopen temporary file: %s", + zfs_strerror(errno)); + close(fd); + return (B_FALSE); } - close(fd); - return (tmpfile); + + return (B_TRUE); +} + +static void +nfs_abort_tmpfile(struct tmpfile *tmpf) +{ + unlink(tmpf->name); + fclose(tmpf->fp); } static int -nfs_fini_tmpfile(const char *exports, char *tmpfile) +nfs_fini_tmpfile(const char *exports, struct tmpfile *tmpf) { - if (rename(tmpfile, exports) == -1) { - fprintf(stderr, "Unable to rename %s: %s\n", tmpfile, - strerror(errno)); - unlink(tmpfile); - free(tmpfile); + if (fflush(tmpf->fp) != 0) { + fprintf(stderr, "Failed to write to temporary file: %s\n", + zfs_strerror(errno)); + nfs_abort_tmpfile(tmpf); + return (SA_SYSTEM_ERR); + } + + if (rename(tmpf->name, exports) == -1) { + fprintf(stderr, "Unable to rename %s -> %s: %s\n", + tmpf->name, exports, zfs_strerror(errno)); + nfs_abort_tmpfile(tmpf); return (SA_SYSTEM_ERR); } - free(tmpfile); + + (void) fchmod(fileno(tmpf->fp), 0644); + fclose(tmpf->fp); return (SA_OK); } int +nfs_escape_mountpoint(const char *mp, char **out, boolean_t *need_free) +{ + if (strpbrk(mp, "\t\n\v\f\r \\") == NULL) { + *out = (char *)mp; + *need_free = B_FALSE; + return (SA_OK); + } else { + size_t len = strlen(mp); + *out = malloc(len * 4 + 1); + if (!*out) + return (SA_NO_MEMORY); + *need_free = B_TRUE; + + char *oc = *out; + for (const char *c = mp; c < mp + len; ++c) + if (memchr("\t\n\v\f\r \\", *c, + strlen("\t\n\v\f\r \\"))) { + sprintf(oc, "\\%03hho", *c); + oc += 4; + } else + *oc++ = *c; + *oc = '\0'; + } + + return (SA_OK); +} + +static int +nfs_process_exports(const char *exports, const char *mountpoint, + boolean_t (*cbk)(void *userdata, char *line, boolean_t found_mountpoint), + void *userdata) +{ + int error = SA_OK; + boolean_t cont = B_TRUE; + + FILE *oldfp = fopen(exports, "re"); + if (oldfp != NULL) { + boolean_t need_mp_free; + char *mp; + if ((error = nfs_escape_mountpoint(mountpoint, + &mp, &need_mp_free)) != SA_OK) { + (void) fclose(oldfp); + return (error); + } + + char *buf = NULL, *sep; + size_t buflen = 0, mplen = strlen(mp); + + while (cont && getline(&buf, &buflen, oldfp) != -1) { + if (buf[0] == '\n' || buf[0] == '#') + continue; + + cont = cbk(userdata, buf, + (sep = strpbrk(buf, "\t \n")) != NULL && + sep - buf == mplen && + strncmp(buf, mp, mplen) == 0); + } + free(buf); + if (need_mp_free) + free(mp); + + if (ferror(oldfp) != 0) + error = ferror(oldfp); + + if (fclose(oldfp) != 0) { + fprintf(stderr, "Unable to close file %s: %s\n", + exports, zfs_strerror(errno)); + error = error != SA_OK ? error : SA_SYSTEM_ERR; + } + } + + return (error); +} + +static boolean_t +nfs_copy_entries_cb(void *userdata, char *line, boolean_t found_mountpoint) +{ + FILE *newfp = userdata; + if (!found_mountpoint) + fputs(line, newfp); + return (B_TRUE); +} + +/* + * Copy all entries from the exports file (if it exists) to newfp, + * omitting any entries for the specified mountpoint. + */ +static int +nfs_copy_entries(FILE *newfp, const char *exports, const char *mountpoint) +{ + fputs(FILE_HEADER, newfp); + + int error = nfs_process_exports( + exports, mountpoint, nfs_copy_entries_cb, newfp); + + if (error == SA_OK && ferror(newfp) != 0) + error = ferror(newfp); + + return (error); +} + +int nfs_toggle_share(const char *lockfile, const char *exports, const char *expdir, sa_share_impl_t impl_share, - int(*cbk)(sa_share_impl_t impl_share, char *filename)) + int(*cbk)(sa_share_impl_t impl_share, FILE *tmpfile)) { - int error; - char *filename; + int error, nfs_lock_fd = -1; + struct tmpfile tmpf; - if ((filename = nfs_init_tmpfile(exports, expdir)) == NULL) + if (!nfs_init_tmpfile(exports, expdir, &tmpf)) return (SA_SYSTEM_ERR); - error = nfs_exports_lock(lockfile); + error = nfs_exports_lock(lockfile, &nfs_lock_fd); if (error != 0) { - unlink(filename); - free(filename); + nfs_abort_tmpfile(&tmpf); return (error); } - error = nfs_copy_entries(filename, impl_share->sa_mountpoint); + error = nfs_copy_entries(tmpf.fp, exports, impl_share->sa_mountpoint); if (error != SA_OK) goto fullerr; - error = cbk(impl_share, filename); + error = cbk(impl_share, tmpf.fp); if (error != SA_OK) goto fullerr; - error = nfs_fini_tmpfile(exports, filename); - nfs_exports_unlock(lockfile); + error = nfs_fini_tmpfile(exports, &tmpf); + nfs_exports_unlock(lockfile, &nfs_lock_fd); return (error); fullerr: - unlink(filename); - free(filename); - nfs_exports_unlock(lockfile); + nfs_abort_tmpfile(&tmpf); + nfs_exports_unlock(lockfile, &nfs_lock_fd); return (error); } + +void +nfs_reset_shares(const char *lockfile, const char *exports) +{ + int nfs_lock_fd = -1; + + if (nfs_exports_lock(lockfile, &nfs_lock_fd) == 0) { + (void) ! truncate(exports, 0); + nfs_exports_unlock(lockfile, &nfs_lock_fd); + } +} + +static boolean_t +nfs_is_shared_cb(void *userdata, char *line, boolean_t found_mountpoint) +{ + (void) line; + + boolean_t *found = userdata; + *found = found_mountpoint; + return (!found_mountpoint); +} + +boolean_t +nfs_is_shared_impl(const char *exports, sa_share_impl_t impl_share) +{ + boolean_t found = B_FALSE; + nfs_process_exports(exports, impl_share->sa_mountpoint, + nfs_is_shared_cb, &found); + return (found); +} diff --git a/sys/contrib/openzfs/lib/libshare/nfs.h b/sys/contrib/openzfs/lib/libshare/nfs.h index 4dbcdf59859d..1b8ed890d7bd 100644 --- a/sys/contrib/openzfs/lib/libshare/nfs.h +++ b/sys/contrib/openzfs/lib/libshare/nfs.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -22,15 +23,16 @@ /* * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011 Gunnar Beutner + * Copyright (c) 2022 by Delphix. All rights reserved. */ #include "libshare_impl.h" #define FILE_HEADER "# !!! DO NOT EDIT THIS FILE MANUALLY !!!\n\n" -void libshare_nfs_init(void); - -int nfs_copy_entries(char *filename, const char *mountpoint); +int nfs_escape_mountpoint(const char *mp, char **out, boolean_t *need_free); +boolean_t nfs_is_shared_impl(const char *exports, sa_share_impl_t impl_share); int nfs_toggle_share(const char *lockfile, const char *exports, const char *expdir, sa_share_impl_t impl_share, - int(*cbk)(sa_share_impl_t impl_share, char *filename)); + int(*cbk)(sa_share_impl_t impl_share, FILE *tmpfile)); +void nfs_reset_shares(const char *lockfile, const char *exports); diff --git a/sys/contrib/openzfs/lib/libshare/os/freebsd/nfs.c b/sys/contrib/openzfs/lib/libshare/os/freebsd/nfs.c index 0041bc228bb5..969194f2881a 100644 --- a/sys/contrib/openzfs/lib/libshare/os/freebsd/nfs.c +++ b/sys/contrib/openzfs/lib/libshare/os/freebsd/nfs.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: BSD-2-Clause /* * Copyright (c) 2007 Pawel Jakub Dawidek <pjd@FreeBSD.org> * All rights reserved. @@ -23,12 +24,9 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * Copyright (c) 2020 by Delphix. All rights reserved. + * Copyright (c) 2020, 2022 by Delphix. All rights reserved. */ -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - #include <sys/param.h> #include <sys/vfs.h> @@ -47,51 +45,11 @@ __FBSDID("$FreeBSD$"); #include "nfs.h" #define _PATH_MOUNTDPID "/var/run/mountd.pid" -#define OPTSSIZE 1024 -#define MAXLINESIZE (PATH_MAX + OPTSSIZE) #define ZFS_EXPORTS_FILE "/etc/zfs/exports" #define ZFS_EXPORTS_LOCK ZFS_EXPORTS_FILE".lock" -static sa_fstype_t *nfs_fstype; - /* - * Read one line from a file. Skip comments, empty lines and a line with a - * mountpoint specified in the 'skip' argument. - * - * NOTE: This function returns a static buffer and thus is not thread-safe. - */ -static char * -zgetline(FILE *fd, const char *skip) -{ - static char line[MAXLINESIZE]; - size_t len, skiplen = 0; - char *s, last; - - if (skip != NULL) - skiplen = strlen(skip); - for (;;) { - s = fgets(line, sizeof (line), fd); - if (s == NULL) - return (NULL); - /* Skip empty lines and comments. */ - if (line[0] == '\n' || line[0] == '#') - continue; - len = strlen(line); - if (line[len - 1] == '\n') - line[len - 1] = '\0'; - last = line[skiplen]; - /* Skip the given mountpoint. */ - if (skip != NULL && strncmp(skip, line, skiplen) == 0 && - (last == '\t' || last == ' ' || last == '\0')) { - continue; - } - break; - } - return (line); -} - -/* - * This function translate options to a format acceptable by exports(5), eg. + * This function translates options to a format acceptable by exports(5), eg. * * -ro -network=192.168.0.0 -mask=255.255.255.0 -maproot=0 \ * zfs.freebsd.org 69.147.83.54 @@ -108,118 +66,98 @@ zgetline(FILE *fd, const char *skip) * * ro, maproot, mapall, mask, network, sec, alldirs, public, webnfs, * index, quiet - * - * NOTE: This function returns a static buffer and thus is not thread-safe. */ -static char * -translate_opts(const char *shareopts) +static int +translate_opts(char *oldopts, FILE *out) { - static const char *known_opts[] = { "ro", "maproot", "mapall", "mask", - "network", "sec", "alldirs", "public", "webnfs", "index", "quiet", - NULL }; - static char newopts[OPTSSIZE]; - char oldopts[OPTSSIZE]; - char *o, *s = NULL; + static const char *const known_opts[] = { "ro", "maproot", "mapall", + "mask", "network", "sec", "alldirs", "public", "webnfs", "index", + "quiet" }; + char *newopts, *o, *s = NULL; unsigned int i; - size_t len; + size_t len, newopts_len; + int ret; - strlcpy(oldopts, shareopts, sizeof (oldopts)); + /* + * Calculate the length needed for the worst case of a single + * character option: + * - Add one to strlen(oldopts) so that the trailing nul is counted + * as a separator. + * - Multiply by 3/2 since the single character option plus separator + * is expanded to 3 characters. + * - Add one for the trailing nul. Needed for a single repetition of + * the single character option and certain other cases. + */ + newopts_len = (strlen(oldopts) + 1) * 3 / 2 + 1; + newopts = malloc(newopts_len); + if (newopts == NULL) + return (EOF); newopts[0] = '\0'; s = oldopts; - while ((o = strsep(&s, "-, ")) != NULL) { + while ((o = strsep(&s, ", ")) != NULL) { + if (o[0] == '-') + o++; if (o[0] == '\0') continue; - for (i = 0; known_opts[i] != NULL; i++) { + for (i = 0; i < ARRAY_SIZE(known_opts); ++i) { len = strlen(known_opts[i]); if (strncmp(known_opts[i], o, len) == 0 && (o[len] == '\0' || o[len] == '=')) { - strlcat(newopts, "-", sizeof (newopts)); + strlcat(newopts, "-", newopts_len); break; } } - strlcat(newopts, o, sizeof (newopts)); - strlcat(newopts, " ", sizeof (newopts)); + strlcat(newopts, o, newopts_len); + strlcat(newopts, " ", newopts_len); } - return (newopts); -} - -/* - * This function copies all entries from the exports file to "filename", - * omitting any entries for the specified mountpoint. - */ -int -nfs_copy_entries(char *filename, const char *mountpoint) -{ - int error = SA_OK; - char *line; - - FILE *oldfp = fopen(ZFS_EXPORTS_FILE, "re"); - FILE *newfp = fopen(filename, "w+e"); - if (newfp == NULL) { - fprintf(stderr, "failed to open %s file: %s", filename, - strerror(errno)); - fclose(oldfp); - return (SA_SYSTEM_ERR); - } - fputs(FILE_HEADER, newfp); - - /* - * The ZFS_EXPORTS_FILE may not exist yet. If that's the - * case then just write out the new file. - */ - if (oldfp != NULL) { - while ((line = zgetline(oldfp, mountpoint)) != NULL) - fprintf(newfp, "%s\n", line); - if (ferror(oldfp) != 0) { - error = ferror(oldfp); - } - if (fclose(oldfp) != 0) { - fprintf(stderr, "Unable to close file %s: %s\n", - filename, strerror(errno)); - error = error != 0 ? error : SA_SYSTEM_ERR; - } - } - - if (error == 0 && ferror(newfp) != 0) { - error = ferror(newfp); - } - - if (fclose(newfp) != 0) { - fprintf(stderr, "Unable to close file %s: %s\n", - filename, strerror(errno)); - error = error != 0 ? error : SA_SYSTEM_ERR; - } - return (error); + ret = fputs(newopts, out); + free(newopts); + return (ret); } static int -nfs_enable_share_impl(sa_share_impl_t impl_share, char *filename) +nfs_enable_share_impl(sa_share_impl_t impl_share, FILE *tmpfile) { - FILE *fp = fopen(filename, "a+e"); - if (fp == NULL) { - fprintf(stderr, "failed to open %s file: %s", filename, - strerror(errno)); - return (SA_SYSTEM_ERR); - } - - char *shareopts = FSINFO(impl_share, nfs_fstype)->shareopts; + const char *shareopts = impl_share->sa_shareopts; if (strcmp(shareopts, "on") == 0) shareopts = ""; - if (fprintf(fp, "%s\t%s\n", impl_share->sa_mountpoint, - translate_opts(shareopts)) < 0) { - fprintf(stderr, "failed to write to %s\n", filename); - fclose(fp); - return (SA_SYSTEM_ERR); - } + boolean_t need_free, fnd_semi; + char *mp, *lineopts, *exportopts, *s; + size_t whitelen; + int rc = nfs_escape_mountpoint(impl_share->sa_mountpoint, &mp, + &need_free); + if (rc != SA_OK) + return (rc); - if (fclose(fp) != 0) { - fprintf(stderr, "Unable to close file %s: %s\n", - filename, strerror(errno)); + lineopts = strdup(shareopts); + if (lineopts == NULL) return (SA_SYSTEM_ERR); + s = lineopts; + fnd_semi = B_FALSE; + while ((exportopts = strsep(&s, ";")) != NULL) { + if (s != NULL) + fnd_semi = B_TRUE; + /* Ignore only whitespace between ';' separated option sets. */ + if (fnd_semi) { + whitelen = strspn(exportopts, "\t "); + if (exportopts[whitelen] == '\0') + continue; + } + if (fputs(mp, tmpfile) == EOF || + fputc('\t', tmpfile) == EOF || + translate_opts(exportopts, tmpfile) == EOF || + fputc('\n', tmpfile) == EOF) { + fprintf(stderr, "failed to write to temporary file\n"); + rc = SA_SYSTEM_ERR; + break; + } } + free(lineopts); - return (SA_OK); + if (need_free) + free(mp); + return (rc); } static int @@ -231,8 +169,9 @@ nfs_enable_share(sa_share_impl_t impl_share) } static int -nfs_disable_share_impl(sa_share_impl_t impl_share, char *filename) +nfs_disable_share_impl(sa_share_impl_t impl_share, FILE *tmpfile) { + (void) impl_share, (void) tmpfile; return (SA_OK); } @@ -247,56 +186,17 @@ nfs_disable_share(sa_share_impl_t impl_share) static boolean_t nfs_is_shared(sa_share_impl_t impl_share) { - char *s, last, line[MAXLINESIZE]; - size_t len; - char *mntpoint = impl_share->sa_mountpoint; - size_t mntlen = strlen(mntpoint); - - FILE *fp = fopen(ZFS_EXPORTS_FILE, "re"); - if (fp == NULL) - return (B_FALSE); - - for (;;) { - s = fgets(line, sizeof (line), fp); - if (s == NULL) - return (B_FALSE); - /* Skip empty lines and comments. */ - if (line[0] == '\n' || line[0] == '#') - continue; - len = strlen(line); - if (line[len - 1] == '\n') - line[len - 1] = '\0'; - last = line[mntlen]; - /* Skip the given mountpoint. */ - if (strncmp(mntpoint, line, mntlen) == 0 && - (last == '\t' || last == ' ' || last == '\0')) { - fclose(fp); - return (B_TRUE); - } - } - fclose(fp); - return (B_FALSE); + return (nfs_is_shared_impl(ZFS_EXPORTS_FILE, impl_share)); } static int nfs_validate_shareopts(const char *shareopts) { + if (strlen(shareopts) == 0) + return (SA_SYNTAX_ERR); return (SA_OK); } -static int -nfs_update_shareopts(sa_share_impl_t impl_share, const char *shareopts) -{ - FSINFO(impl_share, nfs_fstype)->shareopts = (char *)shareopts; - return (SA_OK); -} - -static void -nfs_clear_shareopts(sa_share_impl_t impl_share) -{ - FSINFO(impl_share, nfs_fstype)->shareopts = NULL; -} - /* * Commit the shares by restarting mountd. */ @@ -306,9 +206,10 @@ nfs_commit_shares(void) struct pidfh *pfh; pid_t mountdpid; +start: pfh = pidfile_open(_PATH_MOUNTDPID, 0600, &mountdpid); if (pfh != NULL) { - /* Mountd is not running. */ + /* mountd(8) is not running. */ pidfile_remove(pfh); return (SA_OK); } @@ -316,27 +217,28 @@ nfs_commit_shares(void) /* Cannot open pidfile for some reason. */ return (SA_SYSTEM_ERR); } + if (mountdpid == -1) { + /* mountd(8) exists, but didn't write the PID yet */ + usleep(500); + goto start; + } /* We have mountd(8) PID in mountdpid variable. */ kill(mountdpid, SIGHUP); return (SA_OK); } -static const sa_share_ops_t nfs_shareops = { +static void +nfs_truncate_shares(void) +{ + nfs_reset_shares(ZFS_EXPORTS_LOCK, ZFS_EXPORTS_FILE); +} + +const sa_fstype_t libshare_nfs_type = { .enable_share = nfs_enable_share, .disable_share = nfs_disable_share, .is_shared = nfs_is_shared, .validate_shareopts = nfs_validate_shareopts, - .update_shareopts = nfs_update_shareopts, - .clear_shareopts = nfs_clear_shareopts, .commit_shares = nfs_commit_shares, + .truncate_shares = nfs_truncate_shares, }; - -/* - * Initializes the NFS functionality of libshare. - */ -void -libshare_nfs_init(void) -{ - nfs_fstype = register_fstype("nfs", &nfs_shareops); -} diff --git a/sys/contrib/openzfs/lib/libshare/os/freebsd/smb.c b/sys/contrib/openzfs/lib/libshare/os/freebsd/smb.c index 5b606ab96955..c6b8bdde2d41 100644 --- a/sys/contrib/openzfs/lib/libshare/os/freebsd/smb.c +++ b/sys/contrib/openzfs/lib/libshare/os/freebsd/smb.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -23,23 +24,9 @@ * Copyright (c) 2020 by Delphix. All rights reserved. */ -#include <time.h> -#include <stdlib.h> #include <stdio.h> -#include <string.h> -#include <strings.h> -#include <fcntl.h> -#include <sys/wait.h> -#include <unistd.h> -#include <dirent.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <libzfs.h> #include <libshare.h> #include "libshare_impl.h" -#include "smb.h" - -static sa_fstype_t *smb_fstype; /* * Enables SMB sharing for the specified share. @@ -47,7 +34,8 @@ static sa_fstype_t *smb_fstype; static int smb_enable_share(sa_share_impl_t impl_share) { - fprintf(stderr, "No SMB support in FreeBSD yet.\n"); + (void) impl_share; + fputs("No SMB support in FreeBSD yet.\n", stderr); return (SA_NOT_SUPPORTED); } /* @@ -56,7 +44,8 @@ smb_enable_share(sa_share_impl_t impl_share) static int smb_disable_share(sa_share_impl_t impl_share) { - fprintf(stderr, "No SMB support in FreeBSD yet.\n"); + (void) impl_share; + fputs("No SMB support in FreeBSD yet.\n", stderr); return (SA_NOT_SUPPORTED); } @@ -66,7 +55,8 @@ smb_disable_share(sa_share_impl_t impl_share) static int smb_validate_shareopts(const char *shareopts) { - fprintf(stderr, "No SMB support in FreeBSD yet.\n"); + (void) shareopts; + fputs("No SMB support in FreeBSD yet.\n", stderr); return (SA_NOT_SUPPORTED); } @@ -76,53 +66,22 @@ smb_validate_shareopts(const char *shareopts) static boolean_t smb_is_share_active(sa_share_impl_t impl_share) { + (void) impl_share; return (B_FALSE); } -/* - * Called to update a share's options. A share's options might be out of - * date if the share was loaded from disk and the "sharesmb" dataset - * property has changed in the meantime. This function also takes care - * of re-enabling the share if necessary. - */ -static int -smb_update_shareopts(sa_share_impl_t impl_share, const char *shareopts) -{ - return (SA_OK); -} - static int smb_update_shares(void) { /* Not implemented */ return (0); } -/* - * Clears a share's SMB options. Used by libshare to - * clean up shares that are about to be free()'d. - */ -static void -smb_clear_shareopts(sa_share_impl_t impl_share) -{ - FSINFO(impl_share, smb_fstype)->shareopts = NULL; -} -static const sa_share_ops_t smb_shareops = { +const sa_fstype_t libshare_smb_type = { .enable_share = smb_enable_share, .disable_share = smb_disable_share, .is_shared = smb_is_share_active, .validate_shareopts = smb_validate_shareopts, - .update_shareopts = smb_update_shareopts, - .clear_shareopts = smb_clear_shareopts, .commit_shares = smb_update_shares, }; - -/* - * Initializes the SMB functionality of libshare. - */ -void -libshare_smb_init(void) -{ - smb_fstype = register_fstype("smb", &smb_shareops); -} diff --git a/sys/contrib/openzfs/lib/libshare/os/linux/nfs.c b/sys/contrib/openzfs/lib/libshare/os/linux/nfs.c index 4f754aabd3a3..6a9bb3788523 100644 --- a/sys/contrib/openzfs/lib/libshare/os/linux/nfs.c +++ b/sys/contrib/openzfs/lib/libshare/os/linux/nfs.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -23,13 +24,12 @@ * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011 Gunnar Beutner * Copyright (c) 2012 Cyril Plisko. All rights reserved. - * Copyright (c) 2019, 2020 by Delphix. All rights reserved. + * Copyright (c) 2019, 2022 by Delphix. All rights reserved. */ #include <dirent.h> #include <stdio.h> #include <string.h> -#include <strings.h> #include <errno.h> #include <fcntl.h> #include <sys/file.h> @@ -46,12 +46,14 @@ #define ZFS_EXPORTS_FILE ZFS_EXPORTS_DIR"/zfs.exports" #define ZFS_EXPORTS_LOCK ZFS_EXPORTS_FILE".lock" -static sa_fstype_t *nfs_fstype; + +static boolean_t nfs_available(void); +static boolean_t exports_available(void); typedef int (*nfs_shareopt_callback_t)(const char *opt, const char *value, void *cookie); -typedef int (*nfs_host_callback_t)(const char *sharepath, const char *filename, +typedef int (*nfs_host_callback_t)(FILE *tmpfile, const char *sharepath, const char *host, const char *security, const char *access, void *cookie); /* @@ -122,7 +124,7 @@ typedef struct nfs_host_cookie_s { nfs_host_callback_t callback; const char *sharepath; void *cookie; - const char *filename; + FILE *tmpfile; const char *security; } nfs_host_cookie_t; @@ -203,7 +205,7 @@ foreach_nfs_host_cb(const char *opt, const char *value, void *pcookie) } } - error = udata->callback(udata->filename, + error = udata->callback(udata->tmpfile, udata->sharepath, host, udata->security, access, udata->cookie); @@ -226,29 +228,26 @@ foreach_nfs_host_cb(const char *opt, const char *value, void *pcookie) * Invokes a callback function for all NFS hosts that are set for a share. */ static int -foreach_nfs_host(sa_share_impl_t impl_share, char *filename, +foreach_nfs_host(sa_share_impl_t impl_share, FILE *tmpfile, nfs_host_callback_t callback, void *cookie) { nfs_host_cookie_t udata; - char *shareopts; udata.callback = callback; udata.sharepath = impl_share->sa_mountpoint; udata.cookie = cookie; - udata.filename = filename; + udata.tmpfile = tmpfile; udata.security = "sys"; - shareopts = FSINFO(impl_share, nfs_fstype)->shareopts; - - return (foreach_nfs_shareopt(shareopts, foreach_nfs_host_cb, - &udata)); + return (foreach_nfs_shareopt(impl_share->sa_shareopts, + foreach_nfs_host_cb, &udata)); } /* * Converts a Solaris NFS host specification to its Linux equivalent. */ -static int -get_linux_hostspec(const char *solaris_hostspec, char **plinux_hostspec) +static const char * +get_linux_hostspec(const char *solaris_hostspec) { /* * For now we just support CIDR masks (e.g. @192.168.0.0/16) and host @@ -259,16 +258,10 @@ get_linux_hostspec(const char *solaris_hostspec, char **plinux_hostspec) * Solaris host specifier, e.g. @192.168.0.0/16; we just need * to skip the @ in this case */ - *plinux_hostspec = strdup(solaris_hostspec + 1); + return (solaris_hostspec + 1); } else { - *plinux_hostspec = strdup(solaris_hostspec); + return (solaris_hostspec); } - - if (*plinux_hostspec == NULL) { - return (SA_NO_MEMORY); - } - - return (SA_OK); } /* @@ -306,6 +299,11 @@ add_linux_shareopt(char **plinux_opts, const char *key, const char *value) return (SA_OK); } +static int string_cmp(const void *lhs, const void *rhs) { + const char *const *l = lhs, *const *r = rhs; + return (strcmp(*l, *r)); +} + /* * Validates and converts a single Solaris share option to its Linux * equivalent. @@ -313,12 +311,58 @@ add_linux_shareopt(char **plinux_opts, const char *key, const char *value) static int get_linux_shareopts_cb(const char *key, const char *value, void *cookie) { + /* This list must remain sorted, since we bsearch() it */ + static const char *const valid_keys[] = { "all_squash", "anongid", + "anonuid", "async", "auth_nlm", "crossmnt", "fsid", "fsuid", "hide", + "insecure", "insecure_locks", "mountpoint", "mp", "no_acl", + "no_all_squash", "no_auth_nlm", "no_root_squash", + "no_subtree_check", "no_wdelay", "nohide", "refer", "replicas", + "root_squash", "secure", "secure_locks", "subtree_check", "sync", + "wdelay" }; + char **plinux_opts = (char **)cookie; + char *host, *val_dup, *literal, *next; - /* host-specific options, these are taken care of elsewhere */ - if (strcmp(key, "ro") == 0 || strcmp(key, "rw") == 0 || - strcmp(key, "sec") == 0) + if (strcmp(key, "sec") == 0) + return (SA_OK); + + if (strcmp(key, "ro") == 0 || strcmp(key, "rw") == 0) { + if (value == NULL || strlen(value) == 0) + return (SA_OK); + val_dup = strdup(value); + host = val_dup; + if (host == NULL) + return (SA_NO_MEMORY); + do { + if (*host == '[') { + host++; + literal = strchr(host, ']'); + if (literal == NULL) { + free(val_dup); + return (SA_SYNTAX_ERR); + } + if (literal[1] == '\0') + next = NULL; + else if (literal[1] == '/') { + next = strchr(literal + 2, ':'); + if (next != NULL) + ++next; + } else if (literal[1] == ':') + next = literal + 2; + else { + free(val_dup); + return (SA_SYNTAX_ERR); + } + } else { + next = strchr(host, ':'); + if (next != NULL) + ++next; + } + host = next; + } while (host != NULL); + free(val_dup); return (SA_OK); + } if (strcmp(key, "anon") == 0) key = "anonuid"; @@ -331,26 +375,9 @@ get_linux_shareopts_cb(const char *key, const char *value, void *cookie) if (strcmp(key, "nosub") == 0) key = "subtree_check"; - if (strcmp(key, "insecure") != 0 && strcmp(key, "secure") != 0 && - strcmp(key, "async") != 0 && strcmp(key, "sync") != 0 && - strcmp(key, "no_wdelay") != 0 && strcmp(key, "wdelay") != 0 && - strcmp(key, "nohide") != 0 && strcmp(key, "hide") != 0 && - strcmp(key, "crossmnt") != 0 && - strcmp(key, "no_subtree_check") != 0 && - strcmp(key, "subtree_check") != 0 && - strcmp(key, "insecure_locks") != 0 && - strcmp(key, "secure_locks") != 0 && - strcmp(key, "no_auth_nlm") != 0 && strcmp(key, "auth_nlm") != 0 && - strcmp(key, "no_acl") != 0 && strcmp(key, "mountpoint") != 0 && - strcmp(key, "mp") != 0 && strcmp(key, "fsuid") != 0 && - strcmp(key, "refer") != 0 && strcmp(key, "replicas") != 0 && - strcmp(key, "root_squash") != 0 && - strcmp(key, "no_root_squash") != 0 && - strcmp(key, "all_squash") != 0 && - strcmp(key, "no_all_squash") != 0 && strcmp(key, "fsid") != 0 && - strcmp(key, "anonuid") != 0 && strcmp(key, "anongid") != 0) { + if (bsearch(&key, valid_keys, ARRAY_SIZE(valid_keys), + sizeof (*valid_keys), string_cmp) == NULL) return (SA_SYNTAX_ERR); - } (void) add_linux_shareopt(plinux_opts, key, value); @@ -393,128 +420,44 @@ get_linux_shareopts(const char *shareopts, char **plinux_opts) * automatically exported upon boot or whenever the nfs server restarts. */ static int -nfs_add_entry(const char *filename, const char *sharepath, +nfs_add_entry(FILE *tmpfile, const char *sharepath, const char *host, const char *security, const char *access_opts, void *pcookie) { - int error; - char *linuxhost; const char *linux_opts = (const char *)pcookie; - error = get_linux_hostspec(host, &linuxhost); - if (error != SA_OK) - return (error); - if (linux_opts == NULL) linux_opts = ""; - FILE *fp = fopen(filename, "a+e"); - if (fp == NULL) { - fprintf(stderr, "failed to open %s file: %s", filename, - strerror(errno)); - free(linuxhost); - return (SA_SYSTEM_ERR); - } - - if (fprintf(fp, "%s %s(sec=%s,%s,%s)\n", sharepath, linuxhost, - security, access_opts, linux_opts) < 0) { - fprintf(stderr, "failed to write to %s\n", filename); - free(linuxhost); - fclose(fp); - return (SA_SYSTEM_ERR); - } - - free(linuxhost); - if (fclose(fp) != 0) { - fprintf(stderr, "Unable to close file %s: %s\n", - filename, strerror(errno)); - return (SA_SYSTEM_ERR); - } - return (SA_OK); -} - -/* - * This function copies all entries from the exports file to "filename", - * omitting any entries for the specified mountpoint. - */ -int -nfs_copy_entries(char *filename, const char *mountpoint) -{ - char *buf = NULL; - size_t buflen = 0; - int error = SA_OK; - - FILE *oldfp = fopen(ZFS_EXPORTS_FILE, "re"); - FILE *newfp = fopen(filename, "w+e"); - if (newfp == NULL) { - fprintf(stderr, "failed to open %s file: %s", filename, - strerror(errno)); - fclose(oldfp); - return (SA_SYSTEM_ERR); - } - fputs(FILE_HEADER, newfp); - - /* - * The ZFS_EXPORTS_FILE may not exist yet. If that's the - * case then just write out the new file. - */ - if (oldfp != NULL) { - while (getline(&buf, &buflen, oldfp) != -1) { - char *space = NULL; - - if (buf[0] == '\n' || buf[0] == '#') - continue; - - if ((space = strchr(buf, ' ')) != NULL) { - int mountpoint_len = strlen(mountpoint); - - if (space - buf == mountpoint_len && - strncmp(mountpoint, buf, - mountpoint_len) == 0) { - continue; - } - } - fputs(buf, newfp); - } - - if (ferror(oldfp) != 0) { - error = ferror(oldfp); - } - if (fclose(oldfp) != 0) { - fprintf(stderr, "Unable to close file %s: %s\n", - filename, strerror(errno)); - error = error != 0 ? error : SA_SYSTEM_ERR; - } + boolean_t need_free; + char *mp; + int rc = nfs_escape_mountpoint(sharepath, &mp, &need_free); + if (rc != SA_OK) + return (rc); + if (fprintf(tmpfile, "%s %s(sec=%s,%s,%s)\n", mp, + get_linux_hostspec(host), security, access_opts, + linux_opts) < 0) { + fprintf(stderr, "failed to write to temporary file\n"); + rc = SA_SYSTEM_ERR; } - if (error == 0 && ferror(newfp) != 0) { - error = ferror(newfp); - } - - free(buf); - if (fclose(newfp) != 0) { - fprintf(stderr, "Unable to close file %s: %s\n", - filename, strerror(errno)); - error = error != 0 ? error : SA_SYSTEM_ERR; - } - return (error); + if (need_free) + free(mp); + return (rc); } /* * Enables NFS sharing for the specified share. */ static int -nfs_enable_share_impl(sa_share_impl_t impl_share, char *filename) +nfs_enable_share_impl(sa_share_impl_t impl_share, FILE *tmpfile) { - char *shareopts, *linux_opts; - int error; - - shareopts = FSINFO(impl_share, nfs_fstype)->shareopts; - error = get_linux_shareopts(shareopts, &linux_opts); + char *linux_opts = NULL; + int error = get_linux_shareopts(impl_share->sa_shareopts, &linux_opts); if (error != SA_OK) return (error); - error = foreach_nfs_host(impl_share, filename, nfs_add_entry, + error = foreach_nfs_host(impl_share, tmpfile, nfs_add_entry, linux_opts); free(linux_opts); return (error); @@ -523,6 +466,9 @@ nfs_enable_share_impl(sa_share_impl_t impl_share, char *filename) static int nfs_enable_share(sa_share_impl_t impl_share) { + if (!nfs_available()) + return (SA_SYSTEM_ERR); + return (nfs_toggle_share( ZFS_EXPORTS_LOCK, ZFS_EXPORTS_FILE, ZFS_EXPORTS_DIR, impl_share, nfs_enable_share_impl)); @@ -532,14 +478,18 @@ nfs_enable_share(sa_share_impl_t impl_share) * Disables NFS sharing for the specified share. */ static int -nfs_disable_share_impl(sa_share_impl_t impl_share, char *filename) +nfs_disable_share_impl(sa_share_impl_t impl_share, FILE *tmpfile) { + (void) impl_share, (void) tmpfile; return (SA_OK); } static int nfs_disable_share(sa_share_impl_t impl_share) { + if (!nfs_available()) + return (SA_OK); + return (nfs_toggle_share( ZFS_EXPORTS_LOCK, ZFS_EXPORTS_FILE, ZFS_EXPORTS_DIR, impl_share, nfs_disable_share_impl)); @@ -548,31 +498,10 @@ nfs_disable_share(sa_share_impl_t impl_share) static boolean_t nfs_is_shared(sa_share_impl_t impl_share) { - size_t buflen = 0; - char *buf = NULL; + if (!nfs_available()) + return (SA_SYSTEM_ERR); - FILE *fp = fopen(ZFS_EXPORTS_FILE, "re"); - if (fp == NULL) { - return (B_FALSE); - } - while ((getline(&buf, &buflen, fp)) != -1) { - char *space = NULL; - - if ((space = strchr(buf, ' ')) != NULL) { - int mountpoint_len = strlen(impl_share->sa_mountpoint); - - if (space - buf == mountpoint_len && - strncmp(impl_share->sa_mountpoint, buf, - mountpoint_len) == 0) { - fclose(fp); - free(buf); - return (B_TRUE); - } - } - } - free(buf); - fclose(fp); - return (B_FALSE); + return (nfs_is_shared_impl(ZFS_EXPORTS_FILE, impl_share)); } /* @@ -581,11 +510,12 @@ nfs_is_shared(sa_share_impl_t impl_share) static int nfs_validate_shareopts(const char *shareopts) { - char *linux_opts; - int error; + char *linux_opts = NULL; - error = get_linux_shareopts(shareopts, &linux_opts); + if (strlen(shareopts) == 0) + return (SA_SYNTAX_ERR); + int error = get_linux_shareopts(shareopts, &linux_opts); if (error != SA_OK) return (error); @@ -594,50 +524,64 @@ nfs_validate_shareopts(const char *shareopts) } static int -nfs_update_shareopts(sa_share_impl_t impl_share, const char *shareopts) -{ - FSINFO(impl_share, nfs_fstype)->shareopts = (char *)shareopts; - return (SA_OK); -} - -/* - * Clears a share's NFS options. Used by libshare to - * clean up shares that are about to be free()'d. - */ -static void -nfs_clear_shareopts(sa_share_impl_t impl_share) -{ - FSINFO(impl_share, nfs_fstype)->shareopts = NULL; -} - -static int nfs_commit_shares(void) { + if (!nfs_available()) + return (SA_SYSTEM_ERR); + char *argv[] = { - "/usr/sbin/exportfs", - "-ra", + (char *)"/usr/sbin/exportfs", + (char *)"-ra", NULL }; return (libzfs_run_process(argv[0], argv, 0)); } -static const sa_share_ops_t nfs_shareops = { +static void +nfs_truncate_shares(void) +{ + if (!exports_available()) + return; + nfs_reset_shares(ZFS_EXPORTS_LOCK, ZFS_EXPORTS_FILE); +} + +const sa_fstype_t libshare_nfs_type = { .enable_share = nfs_enable_share, .disable_share = nfs_disable_share, .is_shared = nfs_is_shared, .validate_shareopts = nfs_validate_shareopts, - .update_shareopts = nfs_update_shareopts, - .clear_shareopts = nfs_clear_shareopts, .commit_shares = nfs_commit_shares, + .truncate_shares = nfs_truncate_shares, }; -/* - * Initializes the NFS functionality of libshare. - */ -void -libshare_nfs_init(void) +static boolean_t +nfs_available(void) { - nfs_fstype = register_fstype("nfs", &nfs_shareops); + static int avail; + + if (!avail) { + if (access("/usr/sbin/exportfs", F_OK) != 0) + avail = -1; + else + avail = 1; + } + + return (avail == 1); +} + +static boolean_t +exports_available(void) +{ + static int avail; + + if (!avail) { + if (access(ZFS_EXPORTS_DIR, F_OK) != 0) + avail = -1; + else + avail = 1; + } + + return (avail == 1); } diff --git a/sys/contrib/openzfs/lib/libshare/os/linux/smb.c b/sys/contrib/openzfs/lib/libshare/os/linux/smb.c index 9b18848e09cf..40996ecc8f89 100644 --- a/sys/contrib/openzfs/lib/libshare/os/linux/smb.c +++ b/sys/contrib/openzfs/lib/libshare/os/linux/smb.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -50,7 +51,6 @@ #include <stdlib.h> #include <stdio.h> #include <string.h> -#include <strings.h> #include <fcntl.h> #include <sys/wait.h> #include <unistd.h> @@ -64,9 +64,7 @@ static boolean_t smb_available(void); -static sa_fstype_t *smb_fstype; - -smb_share_t *smb_shares; +static smb_share_t *smb_shares; static int smb_disable_share(sa_share_impl_t impl_share); static boolean_t smb_is_share_active(sa_share_impl_t impl_share); @@ -93,21 +91,32 @@ smb_retrieve_shares(void) /* Go through the directory, looking for shares */ while ((directory = readdir(shares_dir))) { + int fd; + if (directory->d_name[0] == '.') continue; snprintf(file_path, sizeof (file_path), "%s/%s", SHARE_DIR, directory->d_name); - if (stat(file_path, &eStat) == -1) { + if ((fd = open(file_path, O_RDONLY | O_CLOEXEC)) == -1) { + rc = SA_SYSTEM_ERR; + goto out; + } + + if (fstat(fd, &eStat) == -1) { + close(fd); rc = SA_SYSTEM_ERR; goto out; } - if (!S_ISREG(eStat.st_mode)) + if (!S_ISREG(eStat.st_mode)) { + close(fd); continue; + } - if ((share_file_fp = fopen(file_path, "re")) == NULL) { + if ((share_file_fp = fdopen(fd, "r")) == NULL) { + close(fd); rc = SA_SYSTEM_ERR; goto out; } @@ -219,46 +228,39 @@ out: static int smb_enable_share_one(const char *sharename, const char *sharepath) { - char *argv[10], *pos; char name[SMB_NAME_MAX], comment[SMB_COMMENT_MAX]; - int rc; /* Support ZFS share name regexp '[[:alnum:]_-.: ]' */ strlcpy(name, sharename, sizeof (name)); - name [sizeof (name)-1] = '\0'; - - pos = name; - while (*pos != '\0') { - switch (*pos) { + for (char *itr = name; *itr != '\0'; ++itr) + switch (*itr) { case '/': case '-': case ':': case ' ': - *pos = '_'; + *itr = '_'; } - ++pos; - } - /* * CMD: net -S NET_CMD_ARG_HOST usershare add Test1 /share/Test1 \ * "Comment" "Everyone:F" */ snprintf(comment, sizeof (comment), "Comment: %s", sharepath); - argv[0] = NET_CMD_PATH; - argv[1] = (char *)"-S"; - argv[2] = NET_CMD_ARG_HOST; - argv[3] = (char *)"usershare"; - argv[4] = (char *)"add"; - argv[5] = (char *)name; - argv[6] = (char *)sharepath; - argv[7] = (char *)comment; - argv[8] = "Everyone:F"; - argv[9] = NULL; - - rc = libzfs_run_process(argv[0], argv, 0); - if (rc < 0) + char *argv[] = { + (char *)NET_CMD_PATH, + (char *)"-S", + (char *)NET_CMD_ARG_HOST, + (char *)"usershare", + (char *)"add", + name, + (char *)sharepath, + comment, + (char *)"Everyone:F", + NULL, + }; + + if (libzfs_run_process(argv[0], argv, 0) != 0) return (SA_SYSTEM_ERR); /* Reload the share file */ @@ -273,19 +275,16 @@ smb_enable_share_one(const char *sharename, const char *sharepath) static int smb_enable_share(sa_share_impl_t impl_share) { - char *shareopts; - if (!smb_available()) return (SA_SYSTEM_ERR); if (smb_is_share_active(impl_share)) smb_disable_share(impl_share); - shareopts = FSINFO(impl_share, smb_fstype)->shareopts; - if (shareopts == NULL) /* on/off */ + if (impl_share->sa_shareopts == NULL) /* on/off */ return (SA_SYSTEM_ERR); - if (strcmp(shareopts, "off") == 0) + if (strcmp(impl_share->sa_shareopts, "off") == 0) return (SA_OK); /* Magic: Enable (i.e., 'create new') share */ @@ -299,20 +298,18 @@ smb_enable_share(sa_share_impl_t impl_share) static int smb_disable_share_one(const char *sharename) { - int rc; - char *argv[7]; - /* CMD: net -S NET_CMD_ARG_HOST usershare delete Test1 */ - argv[0] = NET_CMD_PATH; - argv[1] = (char *)"-S"; - argv[2] = NET_CMD_ARG_HOST; - argv[3] = (char *)"usershare"; - argv[4] = (char *)"delete"; - argv[5] = (char *)sharename; - argv[6] = NULL; - - rc = libzfs_run_process(argv[0], argv, 0); - if (rc < 0) + char *argv[] = { + (char *)NET_CMD_PATH, + (char *)"-S", + (char *)NET_CMD_ARG_HOST, + (char *)"usershare", + (char *)"delete", + (char *)sharename, + NULL, + }; + + if (libzfs_run_process(argv[0], argv, 0) != 0) return (SA_SYSTEM_ERR); else return (SA_OK); @@ -324,8 +321,6 @@ smb_disable_share_one(const char *sharename) static int smb_disable_share(sa_share_impl_t impl_share) { - smb_share_t *shares = smb_shares; - if (!smb_available()) { /* * The share can't possibly be active, so nothing @@ -334,12 +329,9 @@ smb_disable_share(sa_share_impl_t impl_share) return (SA_OK); } - while (shares != NULL) { - if (strcmp(impl_share->sa_mountpoint, shares->path) == 0) - return (smb_disable_share_one(shares->name)); - - shares = shares->next; - } + for (const smb_share_t *i = smb_shares; i != NULL; i = i->next) + if (strcmp(impl_share->sa_mountpoint, i->path) == 0) + return (smb_disable_share_one(i->name)); return (SA_OK); } @@ -363,40 +355,19 @@ smb_validate_shareopts(const char *shareopts) static boolean_t smb_is_share_active(sa_share_impl_t impl_share) { - smb_share_t *iter = smb_shares; - if (!smb_available()) return (B_FALSE); /* Retrieve the list of (possible) active shares */ smb_retrieve_shares(); - while (iter != NULL) { - if (strcmp(impl_share->sa_mountpoint, iter->path) == 0) + for (const smb_share_t *i = smb_shares; i != NULL; i = i->next) + if (strcmp(impl_share->sa_mountpoint, i->path) == 0) return (B_TRUE); - iter = iter->next; - } - return (B_FALSE); } -/* - * Called to update a share's options. A share's options might be out of - * date if the share was loaded from disk and the "sharesmb" dataset - * property has changed in the meantime. This function also takes care - * of re-enabling the share if necessary. - */ -static int -smb_update_shareopts(sa_share_impl_t impl_share, const char *shareopts) -{ - if (!impl_share) - return (SA_SYSTEM_ERR); - - FSINFO(impl_share, smb_fstype)->shareopts = (char *)shareopts; - return (SA_OK); -} - static int smb_update_shares(void) { @@ -404,24 +375,12 @@ smb_update_shares(void) return (0); } -/* - * Clears a share's SMB options. Used by libshare to - * clean up shares that are about to be free()'d. - */ -static void -smb_clear_shareopts(sa_share_impl_t impl_share) -{ - FSINFO(impl_share, smb_fstype)->shareopts = NULL; -} - -static const sa_share_ops_t smb_shareops = { +const sa_fstype_t libshare_smb_type = { .enable_share = smb_enable_share, .disable_share = smb_disable_share, .is_shared = smb_is_share_active, .validate_shareopts = smb_validate_shareopts, - .update_shareopts = smb_update_shareopts, - .clear_shareopts = smb_clear_shareopts, .commit_shares = smb_update_shares, }; @@ -431,23 +390,18 @@ static const sa_share_ops_t smb_shareops = { static boolean_t smb_available(void) { - struct stat statbuf; + static int avail; - if (lstat(SHARE_DIR, &statbuf) != 0 || - !S_ISDIR(statbuf.st_mode)) - return (B_FALSE); - - if (access(NET_CMD_PATH, F_OK) != 0) - return (B_FALSE); + if (!avail) { + struct stat statbuf; - return (B_TRUE); -} + if (access(NET_CMD_PATH, F_OK) != 0 || + lstat(SHARE_DIR, &statbuf) != 0 || + !S_ISDIR(statbuf.st_mode)) + avail = -1; + else + avail = 1; + } -/* - * Initializes the SMB functionality of libshare. - */ -void -libshare_smb_init(void) -{ - smb_fstype = register_fstype("smb", &smb_shareops); + return (avail == 1); } diff --git a/sys/contrib/openzfs/lib/libshare/smb.h b/sys/contrib/openzfs/lib/libshare/smb.h index 8ea44677f9ae..79e67bd7c45a 100644 --- a/sys/contrib/openzfs/lib/libshare/smb.h +++ b/sys/contrib/openzfs/lib/libshare/smb.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -43,7 +44,3 @@ typedef struct smb_share_s { struct smb_share_s *next; } smb_share_t; - -extern smb_share_t *smb_shares; - -void libshare_smb_init(void); diff --git a/sys/contrib/openzfs/lib/libspl/Makefile.am b/sys/contrib/openzfs/lib/libspl/Makefile.am index 8457df6dcdf4..f8943572bf29 100644 --- a/sys/contrib/openzfs/lib/libspl/Makefile.am +++ b/sys/contrib/openzfs/lib/libspl/Makefile.am @@ -1,47 +1,52 @@ -include $(top_srcdir)/config/Rules.am +include $(srcdir)/%D%/include/Makefile.am -SUBDIRS = include +libspl_assert_la_CFLAGS = $(AM_CFLAGS) $(LIBRARY_CFLAGS) $(LIBUNWIND_CFLAGS) +libspl_la_CFLAGS = $(libspl_assert_la_CFLAGS) -noinst_LTLIBRARIES = libspl_assert.la libspl.la +noinst_LTLIBRARIES += libspl_assert.la libspl.la +CPPCHECKTARGETS += libspl_assert.la libspl.la libspl_assert_la_SOURCES = \ - assert.c - -USER_C = \ - libspl_impl.h \ - atomic.c \ - getexecname.c \ - list.c \ - mkdirp.c \ - page.c \ - strlcat.c \ - strlcpy.c \ - timestamp.c \ - include/sys/list.h \ - include/sys/list_impl.h + %D%/assert.c \ + %D%/backtrace.c + +libspl_la_SOURCES = \ + %D%/libspl_impl.h \ + %D%/atomic.c \ + %D%/getexecname.c \ + %D%/list.c \ + %D%/mkdirp.c \ + %D%/page.c \ + %D%/strlcat.c \ + %D%/strlcpy.c \ + %D%/timestamp.c \ + %D%/include/sys/list.h \ + %D%/include/sys/list_impl.h if BUILD_LINUX -USER_C += \ - os/linux/getexecname.c \ - os/linux/gethostid.c \ - os/linux/getmntany.c \ - os/linux/zone.c +libspl_la_SOURCES += \ + %D%/os/linux/getexecname.c \ + %D%/os/linux/gethostid.c \ + %D%/os/linux/getmntany.c \ + %D%/os/linux/zone.c endif if BUILD_FREEBSD -USER_C += \ - os/freebsd/getexecname.c \ - os/freebsd/gethostid.c \ - os/freebsd/getmntany.c \ - os/freebsd/mnttab.c \ - os/freebsd/zone.c +libspl_la_SOURCES += \ + %D%/os/freebsd/getexecname.c \ + %D%/os/freebsd/gethostid.c \ + %D%/os/freebsd/getmntany.c \ + %D%/os/freebsd/mnttab.c \ + %D%/os/freebsd/zone.c endif -libspl_la_SOURCES = $(USER_C) - libspl_la_LIBADD = \ libspl_assert.la libspl_la_LIBADD += $(LIBATOMIC_LIBS) $(LIBCLOCK_GETTIME) -include $(top_srcdir)/config/CppCheck.am +libspl_assert_la_LIBADD = $(BACKTRACE_LIBS) $(LIBUNWIND_LIBS) + +if BUILD_FREEBSD +libspl_assert_la_LIBADD += -lpthread +endif diff --git a/sys/contrib/openzfs/lib/libspl/assert.c b/sys/contrib/openzfs/lib/libspl/assert.c index 8e4333976f95..54d931104814 100644 --- a/sys/contrib/openzfs/lib/libspl/assert.c +++ b/sys/contrib/openzfs/lib/libspl/assert.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -22,25 +23,94 @@ * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ +/* + * Copyright (c) 2024, Rob Norris <robn@despairlabs.com> + */ #include <assert.h> +#include <pthread.h> +#include <sys/backtrace.h> + +#if defined(__linux__) +#include <errno.h> +#include <sys/prctl.h> +#ifdef HAVE_GETTID +#define libspl_gettid() gettid() +#else +#include <sys/syscall.h> +#define libspl_gettid() ((pid_t)syscall(__NR_gettid)) +#endif +#define libspl_getprogname() (program_invocation_short_name) +#define libspl_getthreadname(buf, len) \ + prctl(PR_GET_NAME, (unsigned long)(buf), 0, 0, 0) +#elif defined(__FreeBSD__) || defined(__APPLE__) +#if !defined(__APPLE__) +#include <pthread_np.h> +#define libspl_gettid() pthread_getthreadid_np() +#endif +#define libspl_getprogname() getprogname() +#define libspl_getthreadname(buf, len) \ + pthread_getname_np(pthread_self(), buf, len); +#endif + +#if defined(__APPLE__) +static inline uint64_t +libspl_gettid(void) +{ + uint64_t tid; -int libspl_assert_ok = 0; + if (pthread_threadid_np(NULL, &tid) != 0) + tid = 0; + + return (tid); +} +#endif + +static boolean_t libspl_assert_ok = B_FALSE; + +void +libspl_set_assert_ok(boolean_t val) +{ + libspl_assert_ok = val; +} + +static pthread_mutex_t assert_lock = PTHREAD_MUTEX_INITIALIZER; /* printf version of libspl_assert */ void libspl_assertf(const char *file, const char *func, int line, const char *format, ...) { + pthread_mutex_lock(&assert_lock); + va_list args; + char tname[64]; + + libspl_getthreadname(tname, sizeof (tname)); + + fprintf(stderr, "ASSERT at %s:%d:%s()\n", file, line, func); va_start(args, format); vfprintf(stderr, format, args); - fprintf(stderr, "\n"); - fprintf(stderr, "ASSERT at %s:%d:%s()", file, line, func); va_end(args); + + fprintf(stderr, "\n" + " PID: %-8u COMM: %s\n" +#if defined(__APPLE__) + " TID: %-8" PRIu64 " NAME: %s\n", +#else + " TID: %-8u NAME: %s\n", +#endif + getpid(), libspl_getprogname(), + libspl_gettid(), tname); + + libspl_backtrace(STDERR_FILENO); + +#if !__has_feature(attribute_analyzer_noreturn) && !defined(__COVERITY__) if (libspl_assert_ok) { + pthread_mutex_unlock(&assert_lock); return; } +#endif abort(); } diff --git a/sys/contrib/openzfs/lib/libspl/atomic.c b/sys/contrib/openzfs/lib/libspl/atomic.c index 4717d818ce5c..b5cc4ab2a55f 100644 --- a/sys/contrib/openzfs/lib/libspl/atomic.c +++ b/sys/contrib/openzfs/lib/libspl/atomic.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -29,7 +30,6 @@ /* * These are the void returning variants */ -/* BEGIN CSTYLED */ #define ATOMIC_INC(name, type) \ void atomic_inc_##name(volatile type *target) \ { \ @@ -37,13 +37,13 @@ } ATOMIC_INC(8, uint8_t) -ATOMIC_INC(uchar, uchar_t) ATOMIC_INC(16, uint16_t) -ATOMIC_INC(ushort, ushort_t) ATOMIC_INC(32, uint32_t) +ATOMIC_INC(64, uint64_t) +ATOMIC_INC(uchar, uchar_t) +ATOMIC_INC(ushort, ushort_t) ATOMIC_INC(uint, uint_t) ATOMIC_INC(ulong, ulong_t) -ATOMIC_INC(64, uint64_t) #define ATOMIC_DEC(name, type) \ @@ -53,13 +53,13 @@ ATOMIC_INC(64, uint64_t) } ATOMIC_DEC(8, uint8_t) -ATOMIC_DEC(uchar, uchar_t) ATOMIC_DEC(16, uint16_t) -ATOMIC_DEC(ushort, ushort_t) ATOMIC_DEC(32, uint32_t) +ATOMIC_DEC(64, uint64_t) +ATOMIC_DEC(uchar, uchar_t) +ATOMIC_DEC(ushort, ushort_t) ATOMIC_DEC(uint, uint_t) ATOMIC_DEC(ulong, ulong_t) -ATOMIC_DEC(64, uint64_t) #define ATOMIC_ADD(name, type1, type2) \ @@ -68,21 +68,21 @@ ATOMIC_DEC(64, uint64_t) (void) __atomic_add_fetch(target, bits, __ATOMIC_SEQ_CST); \ } -ATOMIC_ADD(8, uint8_t, int8_t) -ATOMIC_ADD(char, uchar_t, signed char) -ATOMIC_ADD(16, uint16_t, int16_t) -ATOMIC_ADD(short, ushort_t, short) -ATOMIC_ADD(32, uint32_t, int32_t) -ATOMIC_ADD(int, uint_t, int) -ATOMIC_ADD(long, ulong_t, long) -ATOMIC_ADD(64, uint64_t, int64_t) - void atomic_add_ptr(volatile void *target, ssize_t bits) { (void) __atomic_add_fetch((void **)target, bits, __ATOMIC_SEQ_CST); } +ATOMIC_ADD(8, uint8_t, int8_t) +ATOMIC_ADD(16, uint16_t, int16_t) +ATOMIC_ADD(32, uint32_t, int32_t) +ATOMIC_ADD(64, uint64_t, int64_t) +ATOMIC_ADD(char, uchar_t, signed char) +ATOMIC_ADD(short, ushort_t, short) +ATOMIC_ADD(int, uint_t, int) +ATOMIC_ADD(long, ulong_t, long) + #define ATOMIC_SUB(name, type1, type2) \ void atomic_sub_##name(volatile type1 *target, type2 bits) \ @@ -90,21 +90,21 @@ atomic_add_ptr(volatile void *target, ssize_t bits) (void) __atomic_sub_fetch(target, bits, __ATOMIC_SEQ_CST); \ } -ATOMIC_SUB(8, uint8_t, int8_t) -ATOMIC_SUB(char, uchar_t, signed char) -ATOMIC_SUB(16, uint16_t, int16_t) -ATOMIC_SUB(short, ushort_t, short) -ATOMIC_SUB(32, uint32_t, int32_t) -ATOMIC_SUB(int, uint_t, int) -ATOMIC_SUB(long, ulong_t, long) -ATOMIC_SUB(64, uint64_t, int64_t) - void atomic_sub_ptr(volatile void *target, ssize_t bits) { (void) __atomic_sub_fetch((void **)target, bits, __ATOMIC_SEQ_CST); } +ATOMIC_SUB(8, uint8_t, int8_t) +ATOMIC_SUB(16, uint16_t, int16_t) +ATOMIC_SUB(32, uint32_t, int32_t) +ATOMIC_SUB(64, uint64_t, int64_t) +ATOMIC_SUB(char, uchar_t, signed char) +ATOMIC_SUB(short, ushort_t, short) +ATOMIC_SUB(int, uint_t, int) +ATOMIC_SUB(long, ulong_t, long) + #define ATOMIC_OR(name, type) \ void atomic_or_##name(volatile type *target, type bits) \ @@ -113,13 +113,13 @@ atomic_sub_ptr(volatile void *target, ssize_t bits) } ATOMIC_OR(8, uint8_t) -ATOMIC_OR(uchar, uchar_t) ATOMIC_OR(16, uint16_t) -ATOMIC_OR(ushort, ushort_t) ATOMIC_OR(32, uint32_t) +ATOMIC_OR(64, uint64_t) +ATOMIC_OR(uchar, uchar_t) +ATOMIC_OR(ushort, ushort_t) ATOMIC_OR(uint, uint_t) ATOMIC_OR(ulong, ulong_t) -ATOMIC_OR(64, uint64_t) #define ATOMIC_AND(name, type) \ @@ -129,13 +129,13 @@ ATOMIC_OR(64, uint64_t) } ATOMIC_AND(8, uint8_t) -ATOMIC_AND(uchar, uchar_t) ATOMIC_AND(16, uint16_t) -ATOMIC_AND(ushort, ushort_t) ATOMIC_AND(32, uint32_t) +ATOMIC_AND(64, uint64_t) +ATOMIC_AND(uchar, uchar_t) +ATOMIC_AND(ushort, ushort_t) ATOMIC_AND(uint, uint_t) ATOMIC_AND(ulong, ulong_t) -ATOMIC_AND(64, uint64_t) /* @@ -149,13 +149,13 @@ ATOMIC_AND(64, uint64_t) } ATOMIC_INC_NV(8, uint8_t) -ATOMIC_INC_NV(uchar, uchar_t) ATOMIC_INC_NV(16, uint16_t) -ATOMIC_INC_NV(ushort, ushort_t) ATOMIC_INC_NV(32, uint32_t) +ATOMIC_INC_NV(64, uint64_t) +ATOMIC_INC_NV(uchar, uchar_t) +ATOMIC_INC_NV(ushort, ushort_t) ATOMIC_INC_NV(uint, uint_t) ATOMIC_INC_NV(ulong, ulong_t) -ATOMIC_INC_NV(64, uint64_t) #define ATOMIC_DEC_NV(name, type) \ @@ -165,13 +165,13 @@ ATOMIC_INC_NV(64, uint64_t) } ATOMIC_DEC_NV(8, uint8_t) -ATOMIC_DEC_NV(uchar, uchar_t) ATOMIC_DEC_NV(16, uint16_t) -ATOMIC_DEC_NV(ushort, ushort_t) ATOMIC_DEC_NV(32, uint32_t) +ATOMIC_DEC_NV(64, uint64_t) +ATOMIC_DEC_NV(uchar, uchar_t) +ATOMIC_DEC_NV(ushort, ushort_t) ATOMIC_DEC_NV(uint, uint_t) ATOMIC_DEC_NV(ulong, ulong_t) -ATOMIC_DEC_NV(64, uint64_t) #define ATOMIC_ADD_NV(name, type1, type2) \ @@ -180,21 +180,21 @@ ATOMIC_DEC_NV(64, uint64_t) return (__atomic_add_fetch(target, bits, __ATOMIC_SEQ_CST)); \ } -ATOMIC_ADD_NV(8, uint8_t, int8_t) -ATOMIC_ADD_NV(char, uchar_t, signed char) -ATOMIC_ADD_NV(16, uint16_t, int16_t) -ATOMIC_ADD_NV(short, ushort_t, short) -ATOMIC_ADD_NV(32, uint32_t, int32_t) -ATOMIC_ADD_NV(int, uint_t, int) -ATOMIC_ADD_NV(long, ulong_t, long) -ATOMIC_ADD_NV(64, uint64_t, int64_t) - void * atomic_add_ptr_nv(volatile void *target, ssize_t bits) { return (__atomic_add_fetch((void **)target, bits, __ATOMIC_SEQ_CST)); } +ATOMIC_ADD_NV(8, uint8_t, int8_t) +ATOMIC_ADD_NV(16, uint16_t, int16_t) +ATOMIC_ADD_NV(32, uint32_t, int32_t) +ATOMIC_ADD_NV(64, uint64_t, int64_t) +ATOMIC_ADD_NV(char, uchar_t, signed char) +ATOMIC_ADD_NV(short, ushort_t, short) +ATOMIC_ADD_NV(int, uint_t, int) +ATOMIC_ADD_NV(long, ulong_t, long) + #define ATOMIC_SUB_NV(name, type1, type2) \ type1 atomic_sub_##name##_nv(volatile type1 *target, type2 bits) \ @@ -202,6 +202,12 @@ atomic_add_ptr_nv(volatile void *target, ssize_t bits) return (__atomic_sub_fetch(target, bits, __ATOMIC_SEQ_CST)); \ } +void * +atomic_sub_ptr_nv(volatile void *target, ssize_t bits) +{ + return (__atomic_sub_fetch((void **)target, bits, __ATOMIC_SEQ_CST)); +} + ATOMIC_SUB_NV(8, uint8_t, int8_t) ATOMIC_SUB_NV(char, uchar_t, signed char) ATOMIC_SUB_NV(16, uint16_t, int16_t) @@ -211,12 +217,6 @@ ATOMIC_SUB_NV(int, uint_t, int) ATOMIC_SUB_NV(long, ulong_t, long) ATOMIC_SUB_NV(64, uint64_t, int64_t) -void * -atomic_sub_ptr_nv(volatile void *target, ssize_t bits) -{ - return (__atomic_sub_fetch((void **)target, bits, __ATOMIC_SEQ_CST)); -} - #define ATOMIC_OR_NV(name, type) \ type atomic_or_##name##_nv(volatile type *target, type bits) \ @@ -225,13 +225,13 @@ atomic_sub_ptr_nv(volatile void *target, ssize_t bits) } ATOMIC_OR_NV(8, uint8_t) -ATOMIC_OR_NV(uchar, uchar_t) ATOMIC_OR_NV(16, uint16_t) -ATOMIC_OR_NV(ushort, ushort_t) ATOMIC_OR_NV(32, uint32_t) +ATOMIC_OR_NV(64, uint64_t) +ATOMIC_OR_NV(uchar, uchar_t) +ATOMIC_OR_NV(ushort, ushort_t) ATOMIC_OR_NV(uint, uint_t) ATOMIC_OR_NV(ulong, ulong_t) -ATOMIC_OR_NV(64, uint64_t) #define ATOMIC_AND_NV(name, type) \ @@ -241,13 +241,13 @@ ATOMIC_OR_NV(64, uint64_t) } ATOMIC_AND_NV(8, uint8_t) -ATOMIC_AND_NV(uchar, uchar_t) ATOMIC_AND_NV(16, uint16_t) -ATOMIC_AND_NV(ushort, ushort_t) ATOMIC_AND_NV(32, uint32_t) +ATOMIC_AND_NV(64, uint64_t) +ATOMIC_AND_NV(uchar, uchar_t) +ATOMIC_AND_NV(ushort, ushort_t) ATOMIC_AND_NV(uint, uint_t) ATOMIC_AND_NV(ulong, ulong_t) -ATOMIC_AND_NV(64, uint64_t) /* @@ -268,15 +268,6 @@ ATOMIC_AND_NV(64, uint64_t) return (exp); \ } -ATOMIC_CAS(8, uint8_t) -ATOMIC_CAS(uchar, uchar_t) -ATOMIC_CAS(16, uint16_t) -ATOMIC_CAS(ushort, ushort_t) -ATOMIC_CAS(32, uint32_t) -ATOMIC_CAS(uint, uint_t) -ATOMIC_CAS(ulong, ulong_t) -ATOMIC_CAS(64, uint64_t) - void * atomic_cas_ptr(volatile void *target, void *exp, void *des) { @@ -286,6 +277,15 @@ atomic_cas_ptr(volatile void *target, void *exp, void *des) return (exp); } +ATOMIC_CAS(8, uint8_t) +ATOMIC_CAS(16, uint16_t) +ATOMIC_CAS(32, uint32_t) +ATOMIC_CAS(64, uint64_t) +ATOMIC_CAS(uchar, uchar_t) +ATOMIC_CAS(ushort, ushort_t) +ATOMIC_CAS(uint, uint_t) +ATOMIC_CAS(ulong, ulong_t) + /* * Swap target and return old value @@ -298,14 +298,13 @@ atomic_cas_ptr(volatile void *target, void *exp, void *des) } ATOMIC_SWAP(8, uint8_t) -ATOMIC_SWAP(uchar, uchar_t) ATOMIC_SWAP(16, uint16_t) -ATOMIC_SWAP(ushort, ushort_t) ATOMIC_SWAP(32, uint32_t) +ATOMIC_SWAP(64, uint64_t) +ATOMIC_SWAP(uchar, uchar_t) +ATOMIC_SWAP(ushort, ushort_t) ATOMIC_SWAP(uint, uint_t) ATOMIC_SWAP(ulong, ulong_t) -ATOMIC_SWAP(64, uint64_t) -/* END CSTYLED */ void * atomic_swap_ptr(volatile void *target, void *bits) @@ -356,6 +355,12 @@ membar_exit(void) } void +membar_sync(void) +{ + __atomic_thread_fence(__ATOMIC_SEQ_CST); +} + +void membar_producer(void) { __atomic_thread_fence(__ATOMIC_RELEASE); diff --git a/sys/contrib/openzfs/lib/libspl/backtrace.c b/sys/contrib/openzfs/lib/libspl/backtrace.c new file mode 100644 index 000000000000..c4a7006a9692 --- /dev/null +++ b/sys/contrib/openzfs/lib/libspl/backtrace.c @@ -0,0 +1,303 @@ +// SPDX-License-Identifier: CDDL-1.0 +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or https://opensource.org/licenses/CDDL-1.0. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright (c) 2024, Rob Norris <robn@despairlabs.com> + * Copyright (c) 2024, Klara Inc. + */ + +#include <sys/backtrace.h> +#include <sys/types.h> +#include <sys/debug.h> +#include <unistd.h> + +/* + * Output helpers. libspl_backtrace() must not block, must be thread-safe and + * must be safe to call from a signal handler. At least, that means not having + * printf, so we end up having to call write() directly on the fd. That's + * awkward, as we always have to pass through a length, and some systems will + * complain if we don't consume the return. So we have some macros to make + * things a little more palatable. + */ +#define spl_bt_write_n(fd, s, n) \ + do { ssize_t r __maybe_unused = write(fd, s, n); } while (0) +#define spl_bt_write(fd, s) spl_bt_write_n(fd, s, sizeof (s)-1) + +#ifdef HAVE_LIBUNWIND +/* + * libunwind-gcc and libunwind-llvm both list registers using an enum, + * unw_regnum_t, however they indicate the highest numbered register for + * a given architecture in different ways. We can check which one is defined + * and mark which libunwind is in use + */ +#ifdef IS_LIBUNWIND_LLVM +#include <libunwind.h> +#define LAST_REG_INDEX _LIBUNWIND_HIGHEST_DWARF_REGISTER +#else +/* + * Need to define UNW_LOCAL_ONLY before importing libunwind.h + * if using libgcc libunwind. + */ +#define UNW_LOCAL_ONLY +#include <libunwind.h> +#define LAST_REG_INDEX UNW_TDEP_LAST_REG +#endif + + +/* + * Convert `v` to ASCII hex characters. The bottom `n` nybbles (4-bits ie one + * hex digit) will be written, up to `buflen`. The buffer will not be + * null-terminated. Returns the number of digits written. + */ +static size_t +spl_bt_u64_to_hex_str(uint64_t v, size_t n, char *buf, size_t buflen) +{ + static const char hexdigits[] = { + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' + }; + + size_t pos = 0; + boolean_t want = (n == 0); + for (int i = 15; i >= 0; i--) { + const uint64_t d = v >> (i * 4) & 0xf; + if (!want && (d != 0 || n > i)) + want = B_TRUE; + if (want) { + buf[pos++] = hexdigits[d]; + if (pos == buflen) + break; + } + } + return (pos); +} + +void +libspl_backtrace(int fd) +{ + unw_context_t uc; + unw_cursor_t cp; + unw_word_t v; + char buf[128]; + size_t n; + int err; + + /* Snapshot the current frame and state. */ + unw_getcontext(&uc); + + /* + * TODO: walk back to the frame that tripped the assertion / the place + * where the signal was recieved. + */ + + /* + * Register dump. We're going to loop over all the registers in the + * top frame, and show them, with names, in a nice three-column + * layout, which keeps us within 80 columns. + */ + spl_bt_write(fd, "Registers:\n"); + + /* Initialise a frame cursor, starting at the current frame */ + unw_init_local(&cp, &uc); + + /* + * Iterate over all registers for the architecture. We've figured + * out the highest number above, however, not all register numbers in + * this range are defined by the architecture, and not all defined + * registers will be present on every implementation of that + * architecture. Moreover, libunwind provides nice names for most, but + * not all registers, but these are hardcoded; a name being available + * does not mean that register is available. + * + * So, we have to pull this all together here. We try to get the value + * of every possible register. If we get a value for it, then the + * register must exist, and so we get its name. If libunwind has no + * name for it, we synthesize something. These cases should be rare, + * and they're usually for uninteresting or niche registers, so it + * shouldn't really matter. We can see the value, and that's the main + * thing. + */ + uint_t cols = 0; + for (uint_t regnum = 0; regnum <= LAST_REG_INDEX; regnum++) { + /* + * Get the value. Any error probably means the register + * doesn't exist, and we skip it. LLVM libunwind iterates over + * fp registers in the same list, however they have to be + * accessed using unw_get_fpreg instead. Here, we just ignore + * them. + */ +#ifdef IS_LIBUNWIND_LLVM + if (unw_is_fpreg(&cp, regnum) || + unw_get_reg(&cp, regnum, &v) < 0) + continue; +#else + if (unw_get_reg(&cp, regnum, &v) < 0) + continue; +#endif + + /* + * Register name. If GCC libunwind doesn't have a name for it, + * it will return "???". As a shortcut, we just treat '?' + * is an alternate end-of-string character. LLVM libunwind will + * return the string 'unknown register', which we detect by + * checking if the register name is longer than 5 characters. + */ +#ifdef IS_LIBUNWIND_LLVM + const char *name = unw_regname(&cp, regnum); +#else + const char *name = unw_regname(regnum); +#endif + for (n = 0; name[n] != '\0' && name[n] != '?'; n++) {} + if (n == 0 || n > 5) { + /* + * No valid name, or likely llvm_libunwind returned + * unknown_register, so make one of the form "?xx", + * where "xx" is the two-char hex of libunwind's + * register number. + */ + buf[0] = '?'; + n = spl_bt_u64_to_hex_str(regnum, 2, + &buf[1], sizeof (buf)-1) + 1; + name = buf; + } + + /* + * Two spaces of padding before each column, plus extra + * spaces to align register names shorter than three chars. + */ + spl_bt_write_n(fd, " ", 5-MIN(n, 3)); + + /* Register name and column punctuation */ + spl_bt_write_n(fd, name, n); + spl_bt_write(fd, ": 0x"); + + /* + * Convert register value (from unw_get_reg()) to hex. We're + * assuming that all registers are 64-bits wide, which is + * probably fine for any general-purpose registers on any + * machine currently in use. A more generic way would be to + * look at the width of unw_word_t, but that would also + * complicate the column code a bit. This is fine. + */ + n = spl_bt_u64_to_hex_str(v, 16, buf, sizeof (buf)); + spl_bt_write_n(fd, buf, n); + + /* Every third column, emit a newline */ + if (!(++cols % 3)) + spl_bt_write(fd, "\n"); + } + + /* If we finished before the third column, emit a newline. */ + if (cols % 3) + spl_bt_write(fd, "\n"); + + /* Now the main event, the backtrace. */ + spl_bt_write(fd, "Call trace:\n"); + + /* Reset the cursor to the top again. */ + unw_init_local(&cp, &uc); + + do { + /* + * Getting the IP should never fail; libunwind handles it + * specially, because its used a lot internally. Still, no + * point being silly about it, as the last thing we want is + * our crash handler to crash. So if it ever does fail, we'll + * show an error line, but keep going to the next frame. + */ + if (unw_get_reg(&cp, UNW_REG_IP, &v) < 0) { + spl_bt_write(fd, " [couldn't get IP register; " + "corrupt frame?]"); + continue; + } + + /* IP & punctuation */ + n = spl_bt_u64_to_hex_str(v, 16, buf, sizeof (buf)); + spl_bt_write(fd, " [0x"); + spl_bt_write_n(fd, buf, n); + spl_bt_write(fd, "] "); + + /* + * Function ("procedure") name for the current frame. `v` + * receives the offset from the named function to the IP, which + * we show as a "+offset" suffix. + * + * If libunwind can't determine the name, we just show "???" + * instead. We've already displayed the IP above; that will + * have to do. + * + * unw_get_proc_name() will return ENOMEM if the buffer is too + * small, instead truncating the name. So we treat that as a + * success and use whatever is in the buffer. + */ + err = unw_get_proc_name(&cp, buf, sizeof (buf), &v); + if (err == 0 || err == -UNW_ENOMEM) { + for (n = 0; n < sizeof (buf) && buf[n] != '\0'; n++) {} + spl_bt_write_n(fd, buf, n); + + /* Offset from proc name */ + spl_bt_write(fd, "+0x"); + n = spl_bt_u64_to_hex_str(v, 2, buf, sizeof (buf)); + spl_bt_write_n(fd, buf, n); + } else + spl_bt_write(fd, "???"); + +#ifdef HAVE_LIBUNWIND_ELF + /* + * Newer libunwind has unw_get_elf_filename(), which gets + * the name of the ELF object that the frame was executing in. + * Like `unw_get_proc_name()`, `v` recieves the offset within + * the file, and UNW_ENOMEM indicates that a truncate filename + * was left in the buffer. + */ + err = unw_get_elf_filename(&cp, buf, sizeof (buf), &v); + if (err == 0 || err == -UNW_ENOMEM) { + for (n = 0; n < sizeof (buf) && buf[n] != '\0'; n++) {} + spl_bt_write(fd, " (in "); + spl_bt_write_n(fd, buf, n); + + /* Offset within file */ + spl_bt_write(fd, " +0x"); + n = spl_bt_u64_to_hex_str(v, 2, buf, sizeof (buf)); + spl_bt_write_n(fd, buf, n); + spl_bt_write(fd, ")"); + } +#endif + spl_bt_write(fd, "\n"); + } while (unw_step(&cp) > 0); +} +#elif defined(HAVE_BACKTRACE) +#include <execinfo.h> + +void +libspl_backtrace(int fd) +{ + void *btptrs[64]; + size_t nptrs = backtrace(btptrs, 64); + spl_bt_write(fd, "Call trace:\n"); + backtrace_symbols_fd(btptrs, nptrs, fd); +} +#else +void +libspl_backtrace(int fd __maybe_unused) +{ +} +#endif diff --git a/sys/contrib/openzfs/lib/libspl/getexecname.c b/sys/contrib/openzfs/lib/libspl/getexecname.c index dca7162034f7..56ba5aa86058 100644 --- a/sys/contrib/openzfs/lib/libspl/getexecname.c +++ b/sys/contrib/openzfs/lib/libspl/getexecname.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/Makefile.am b/sys/contrib/openzfs/lib/libspl/include/Makefile.am index 9ca08b2bc0f7..8c286142f298 100644 --- a/sys/contrib/openzfs/lib/libspl/include/Makefile.am +++ b/sys/contrib/openzfs/lib/libspl/include/Makefile.am @@ -1,22 +1,106 @@ -SUBDIRS = ia32 rpc sys util os - libspldir = $(includedir)/libspl libspl_HEADERS = \ - assert.h \ - atomic.h \ - libdevinfo.h \ - libgen.h \ - libshare.h \ - limits.h \ - locale.h \ - statcommon.h \ - stdio.h \ - stdlib.h \ - string.h \ - stropts.h \ - thread.h \ - tzfile.h \ - ucred.h \ - umem.h \ - unistd.h \ - zone.h + %D%/assert.h \ + %D%/atomic.h \ + %D%/libgen.h \ + %D%/libshare.h \ + %D%/statcommon.h \ + %D%/stdlib.h \ + %D%/string.h \ + %D%/umem.h \ + %D%/unistd.h \ + %D%/zone.h + +if BUILD_FREEBSD +libspl_HEADERS += \ + %D%/os/freebsd/fcntl.h +endif + + +libspl_rpcdir = $(libspldir)/rpc +libspl_rpc_HEADERS = \ + %D%/rpc/xdr.h + + +libspl_sysdir = $(libspldir)/sys +libspl_sys_HEADERS = \ + %D%/sys/abd_os.h \ + %D%/sys/abd_impl_os.h \ + %D%/sys/acl.h \ + %D%/sys/acl_impl.h \ + %D%/sys/asm_linkage.h \ + %D%/sys/backtrace.h \ + %D%/sys/callb.h \ + %D%/sys/cmn_err.h \ + %D%/sys/cred.h \ + %D%/sys/debug.h \ + %D%/sys/dkio.h \ + %D%/sys/dklabel.h \ + %D%/sys/feature_tests.h \ + %D%/sys/inttypes.h \ + %D%/sys/isa_defs.h \ + %D%/sys/kmem.h \ + %D%/sys/kstat.h \ + %D%/sys/list.h \ + %D%/sys/list_impl.h \ + %D%/sys/mhd.h \ + %D%/sys/mkdev.h \ + %D%/sys/policy.h \ + %D%/sys/poll.h \ + %D%/sys/priv.h \ + %D%/sys/processor.h \ + %D%/sys/simd.h \ + %D%/sys/stack.h \ + %D%/sys/stdtypes.h \ + %D%/sys/string.h \ + %D%/sys/sunddi.h \ + %D%/sys/systeminfo.h \ + %D%/sys/time.h \ + %D%/sys/trace_spl.h \ + %D%/sys/trace_zfs.h \ + %D%/sys/types.h \ + %D%/sys/types32.h \ + %D%/sys/uio.h \ + %D%/sys/vnode.h \ + %D%/sys/wmsum.h \ + %D%/sys/zone.h + +libspl_ia32dir = $(libspldir)/sys/ia32 + +if BUILD_LINUX +libspl_sys_HEADERS += \ + %D%/os/linux/sys/byteorder.h \ + %D%/os/linux/sys/errno.h \ + %D%/os/linux/sys/mnttab.h \ + %D%/os/linux/sys/mount.h \ + %D%/os/linux/sys/param.h \ + %D%/os/linux/sys/stat.h \ + %D%/os/linux/sys/sysmacros.h \ + %D%/os/linux/sys/zfs_context_os.h + +libspl_ia32_HEADERS = \ + %D%/os/linux/sys/ia32/asm_linkage.h +endif + +if BUILD_FREEBSD +libspl_sys_HEADERS += \ + %D%/os/freebsd/sys/byteorder.h \ + %D%/os/freebsd/sys/fcntl.h \ + %D%/os/freebsd/sys/file.h \ + %D%/os/freebsd/sys/mnttab.h \ + %D%/os/freebsd/sys/mount.h \ + %D%/os/freebsd/sys/param.h \ + %D%/os/freebsd/sys/stat.h \ + %D%/os/freebsd/sys/sysmacros.h \ + %D%/os/freebsd/sys/vfs.h \ + %D%/os/freebsd/sys/zfs_context_os.h + +libspl_ia32_HEADERS = \ + %D%/os/freebsd/sys/ia32/asm_linkage.h +endif + + +libspl_sys_dktpdir = $(libspl_sysdir)/dktp +libspl_sys_dktp_HEADERS = \ + %D%/sys/dktp/fdisk.h + diff --git a/sys/contrib/openzfs/lib/libspl/include/assert.h b/sys/contrib/openzfs/lib/libspl/include/assert.h index 84dbccdc4a12..e704a899e748 100644 --- a/sys/contrib/openzfs/lib/libspl/include/assert.h +++ b/sys/contrib/openzfs/lib/libspl/include/assert.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -32,13 +33,26 @@ #include <stdio.h> #include <stdlib.h> #include <stdarg.h> +#include <sys/types.h> + +/* Workaround for non-Clang compilers */ +#ifndef __has_feature +#define __has_feature(x) 0 +#endif + +/* We need to workaround libspl_set_assert_ok() that we have for zdb */ +#if __has_feature(attribute_analyzer_noreturn) || defined(__COVERITY__) +#define NORETURN __attribute__((__noreturn__)) +#else +#define NORETURN +#endif /* Set to non-zero to avoid abort()ing on an assertion failure */ -extern int libspl_assert_ok; +extern void libspl_set_assert_ok(boolean_t val); /* printf version of libspl_assert */ extern void libspl_assertf(const char *file, const char *func, int line, - const char *format, ...); + const char *format, ...) NORETURN __attribute__((format(printf, 4, 5))); static inline int libspl_assert(const char *buf, const char *file, const char *func, int line) @@ -51,21 +65,34 @@ libspl_assert(const char *buf, const char *file, const char *func, int line) #undef verify #endif +#define PANIC(fmt, a...) \ + libspl_assertf(__FILE__, __FUNCTION__, __LINE__, fmt, ## a) + #define VERIFY(cond) \ (void) ((!(cond)) && \ libspl_assert(#cond, __FILE__, __FUNCTION__, __LINE__)) + +#define VERIFYF(cond, STR, ...) \ +do { \ + if (!(cond)) \ + libspl_assertf(__FILE__, __FUNCTION__, __LINE__, \ + "%s " STR, #cond, \ + __VA_ARGS__); \ +} while (0) + #define verify(cond) \ (void) ((!(cond)) && \ libspl_assert(#cond, __FILE__, __FUNCTION__, __LINE__)) #define VERIFY3B(LEFT, OP, RIGHT) \ do { \ - const boolean_t __left = (boolean_t)(LEFT); \ - const boolean_t __right = (boolean_t)(RIGHT); \ + const boolean_t __left = (boolean_t)!!(LEFT); \ + const boolean_t __right = (boolean_t)!!(RIGHT); \ if (!(__left OP __right)) \ libspl_assertf(__FILE__, __FUNCTION__, __LINE__, \ - "%s %s %s (0x%llx %s 0x%llx)", #LEFT, #OP, #RIGHT, \ - (u_longlong_t)__left, #OP, (u_longlong_t)__right); \ + "VERIFY3B(%s, %s, %s) failed " \ + "(%d %s %d)", #LEFT, #OP, #RIGHT, \ + __left, #OP, __right); \ } while (0) #define VERIFY3S(LEFT, OP, RIGHT) \ @@ -74,8 +101,9 @@ do { \ const int64_t __right = (int64_t)(RIGHT); \ if (!(__left OP __right)) \ libspl_assertf(__FILE__, __FUNCTION__, __LINE__, \ - "%s %s %s (0x%llx %s 0x%llx)", #LEFT, #OP, #RIGHT, \ - (u_longlong_t)__left, #OP, (u_longlong_t)__right); \ + "VERIFY3S(%s, %s, %s) failed " \ + "(%lld %s 0x%lld)", #LEFT, #OP, #RIGHT, \ + (longlong_t)__left, #OP, (longlong_t)__right); \ } while (0) #define VERIFY3U(LEFT, OP, RIGHT) \ @@ -84,7 +112,8 @@ do { \ const uint64_t __right = (uint64_t)(RIGHT); \ if (!(__left OP __right)) \ libspl_assertf(__FILE__, __FUNCTION__, __LINE__, \ - "%s %s %s (0x%llx %s 0x%llx)", #LEFT, #OP, #RIGHT, \ + "VERIFY3U(%s, %s, %s) failed " \ + "(%llu %s %llu)", #LEFT, #OP, #RIGHT, \ (u_longlong_t)__left, #OP, (u_longlong_t)__right); \ } while (0) @@ -94,8 +123,9 @@ do { \ const uintptr_t __right = (uintptr_t)(RIGHT); \ if (!(__left OP __right)) \ libspl_assertf(__FILE__, __FUNCTION__, __LINE__, \ - "%s %s %s (0x%llx %s 0x%llx)", #LEFT, #OP, #RIGHT, \ - (u_longlong_t)__left, #OP, (u_longlong_t)__right); \ + "VERIFY3P(%s, %s, %s) failed " \ + "(%p %s %p)", #LEFT, #OP, #RIGHT, \ + (void *)__left, #OP, (void *)__right); \ } while (0) #define VERIFY0(LEFT) \ @@ -103,48 +133,142 @@ do { \ const uint64_t __left = (uint64_t)(LEFT); \ if (!(__left == 0)) \ libspl_assertf(__FILE__, __FUNCTION__, __LINE__, \ - "%s == 0 (0x%llx == 0)", #LEFT, \ + "VERIFY0(%s) failed (%lld)", #LEFT, \ (u_longlong_t)__left); \ } while (0) +#define VERIFY0P(LEFT) \ +do { \ + const uintptr_t __left = (uintptr_t)(LEFT); \ + if (!(__left == 0)) \ + libspl_assertf(__FILE__, __FUNCTION__, __LINE__, \ + "VERIFY0P(%s) failed (%p)", #LEFT, \ + (void *)__left); \ +} while (0) + +/* + * This is just here because cstyle gets upset about #LEFT + * on a newline. + */ + +/* BEGIN CSTYLED */ +#define VERIFY3BF(LEFT, OP, RIGHT, STR, ...) \ +do { \ + const boolean_t __left = (boolean_t)!!(LEFT); \ + const boolean_t __right = (boolean_t)!!(RIGHT); \ + if (!(__left OP __right)) \ + libspl_assertf(__FILE__, __FUNCTION__, __LINE__, \ + "VERIFY3B(%s, %s, %s) failed " \ + "(%d %s %d) " STR, #LEFT, #OP, #RIGHT, \ + __left, #OP, __right, \ + __VA_ARGS__); \ +} while (0) + +#define VERIFY3SF(LEFT, OP, RIGHT, STR, ...) \ +do { \ + const int64_t __left = (int64_t)(LEFT); \ + const int64_t __right = (int64_t)(RIGHT); \ + if (!(__left OP __right)) \ + libspl_assertf(__FILE__, __FUNCTION__, __LINE__, \ + "VERIFY3S(%s, %s, %s) failed " \ + "(%lld %s %lld) " STR, #LEFT, #OP, #RIGHT, \ + (longlong_t)__left, #OP, (longlong_t)__right, \ + __VA_ARGS__); \ +} while (0) + +#define VERIFY3UF(LEFT, OP, RIGHT, STR, ...) \ +do { \ + const uint64_t __left = (uint64_t)(LEFT); \ + const uint64_t __right = (uint64_t)(RIGHT); \ + if (!(__left OP __right)) \ + libspl_assertf(__FILE__, __FUNCTION__, __LINE__, \ + "VERIFY3U(%s, %s, %s) failed " \ + "(%llu %s %llu) " STR, #LEFT, #OP, #RIGHT, \ + (u_longlong_t)__left, #OP, (u_longlong_t)__right, \ + __VA_ARGS__); \ +} while (0) + +#define VERIFY3PF(LEFT, OP, RIGHT, STR, ...) \ +do { \ + const uintptr_t __left = (uintptr_t)(LEFT); \ + const uintptr_t __right = (uintptr_t)(RIGHT); \ + if (!(__left OP __right)) \ + libspl_assertf(__FILE__, __FUNCTION__, __LINE__, \ + "VERIFY3P(%s, %s, %s) failed " \ + "(%p %s %p) " STR, #LEFT, #OP, #RIGHT, \ + (void *)__left, #OP, (void *)__right, \ + __VA_ARGS__); \ +} while (0) +/* END CSTYLED */ + +#define VERIFY0F(LEFT, STR, ...) \ +do { \ + const int64_t __left = (int64_t)(LEFT); \ + if (!(__left == 0)) \ + libspl_assertf(__FILE__, __FUNCTION__, __LINE__, \ + "VERIFY0(%s) failed (%lld) " STR, #LEFT, \ + (longlong_t)__left, __VA_ARGS__); \ +} while (0) + +#define VERIFY0PF(LEFT, STR, ...) \ +do { \ + const uintptr_t __left = (uintptr_t)(LEFT); \ + if (!(__left == 0)) \ + libspl_assertf(__FILE__, __FUNCTION__, __LINE__, \ + "VERIFY0P(%s) failed (%p) " STR, #LEFT, \ + (void *)__left, __VA_ARGS__); \ +} while (0) + #ifdef assert #undef assert #endif -/* Compile time assert */ -#define CTASSERT_GLOBAL(x) _CTASSERT(x, __LINE__) -#define CTASSERT(x) { _CTASSERT(x, __LINE__); } -#define _CTASSERT(x, y) __CTASSERT(x, y) -#define __CTASSERT(x, y) \ - typedef char __attribute__((unused)) \ - __compile_time_assertion__ ## y[(x) ? 1 : -1] - #ifdef NDEBUG -#define ASSERT3B(x, y, z) ((void)0) -#define ASSERT3S(x, y, z) ((void)0) -#define ASSERT3U(x, y, z) ((void)0) -#define ASSERT3P(x, y, z) ((void)0) -#define ASSERT0(x) ((void)0) -#define ASSERT(x) ((void)0) -#define assert(x) ((void)0) -#define IMPLY(A, B) ((void)0) -#define EQUIV(A, B) ((void)0) +#define ASSERT3B(x, y, z) \ + ((void) sizeof ((uintptr_t)(x)), (void) sizeof ((uintptr_t)(z))) +#define ASSERT3S(x, y, z) \ + ((void) sizeof ((uintptr_t)(x)), (void) sizeof ((uintptr_t)(z))) +#define ASSERT3U(x, y, z) \ + ((void) sizeof ((uintptr_t)(x)), (void) sizeof ((uintptr_t)(z))) +#define ASSERT3P(x, y, z) \ + ((void) sizeof ((uintptr_t)(x)), (void) sizeof ((uintptr_t)(z))) +#define ASSERT0(x) ((void) sizeof ((uintptr_t)(x))) +#define ASSERT0P(x) ((void) sizeof ((uintptr_t)(x))) +#define ASSERT3BF(x, y, z, str, ...) ASSERT3B(x, y, z) +#define ASSERT3SF(x, y, z, str, ...) ASSERT3S(x, y, z) +#define ASSERT3UF(x, y, z, str, ...) ASSERT3U(x, y, z) +#define ASSERT3PF(x, y, z, str, ...) ASSERT3P(x, y, z) +#define ASSERT0P(x) ((void) sizeof ((uintptr_t)(x))) +#define ASSERT0PF(x, str, ...) ASSERT0P(x) +#define ASSERT0F(x, str, ...) ASSERT0(x) +#define ASSERT(x) ((void) sizeof ((uintptr_t)(x))) +#define ASSERTF(x, str, ...) ASSERT(x) +#define assert(x) ((void) sizeof ((uintptr_t)(x))) +#define IMPLY(A, B) \ + ((void) sizeof ((uintptr_t)(A)), (void) sizeof ((uintptr_t)(B))) +#define EQUIV(A, B) \ + ((void) sizeof ((uintptr_t)(A)), (void) sizeof ((uintptr_t)(B))) #else #define ASSERT3B VERIFY3B #define ASSERT3S VERIFY3S #define ASSERT3U VERIFY3U #define ASSERT3P VERIFY3P #define ASSERT0 VERIFY0 +#define ASSERT0P VERIFY0P +#define ASSERT3BF VERIFY3BF +#define ASSERT3SF VERIFY3SF +#define ASSERT3UF VERIFY3UF +#define ASSERT3PF VERIFY3PF +#define ASSERT0PF VERIFY0PF +#define ASSERT0F VERIFY0F #define ASSERT VERIFY +#define ASSERTF VERIFYF #define assert VERIFY #define IMPLY(A, B) \ ((void)(((!(A)) || (B)) || \ libspl_assert("(" #A ") implies (" #B ")", \ __FILE__, __FUNCTION__, __LINE__))) -#define EQUIV(A, B) \ - ((void)((!!(A) == !!(B)) || \ - libspl_assert("(" #A ") is equivalent to (" #B ")", \ - __FILE__, __FUNCTION__, __LINE__))) +#define EQUIV(A, B) VERIFY3B(A, ==, B) #endif /* NDEBUG */ diff --git a/sys/contrib/openzfs/lib/libspl/include/atomic.h b/sys/contrib/openzfs/lib/libspl/include/atomic.h index 8dd1d654a486..cc6f2e2ce988 100644 --- a/sys/contrib/openzfs/lib/libspl/include/atomic.h +++ b/sys/contrib/openzfs/lib/libspl/include/atomic.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -314,6 +315,13 @@ extern void membar_enter(void); extern void membar_exit(void); /* + * Make all stores and loads emitted prior to the the barrier complete before + * crossing it, while also making sure stores and loads emitted after the + * barrier only start being executed after crossing it. + */ +extern void membar_sync(void); + +/* * Arrange that all stores issued before this point in the code reach * global visibility before any stores that follow; useful in producer * modules that update a data item, then set a flag that it is available. diff --git a/sys/contrib/openzfs/lib/libspl/include/ia32/Makefile.am b/sys/contrib/openzfs/lib/libspl/include/ia32/Makefile.am deleted file mode 100644 index 081839c48c8f..000000000000 --- a/sys/contrib/openzfs/lib/libspl/include/ia32/Makefile.am +++ /dev/null @@ -1 +0,0 @@ -SUBDIRS = sys diff --git a/sys/contrib/openzfs/lib/libspl/include/ia32/sys/Makefile.am b/sys/contrib/openzfs/lib/libspl/include/ia32/sys/Makefile.am deleted file mode 100644 index 683288460cdf..000000000000 --- a/sys/contrib/openzfs/lib/libspl/include/ia32/sys/Makefile.am +++ /dev/null @@ -1,3 +0,0 @@ -libspldir = $(includedir)/libspl/ia32/sys -libspl_HEADERS = \ - asm_linkage.h diff --git a/sys/contrib/openzfs/lib/libspl/include/libdevinfo.h b/sys/contrib/openzfs/lib/libspl/include/libdevinfo.h deleted file mode 100644 index be1d291f4051..000000000000 --- a/sys/contrib/openzfs/lib/libspl/include/libdevinfo.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#ifndef _LIBSPL_LIBDEVINFO_H -#define _LIBSPL_LIBDEVINFO_H - -#endif /* _LIBSPL_LIBDEVINFO_H */ diff --git a/sys/contrib/openzfs/lib/libspl/include/libgen.h b/sys/contrib/openzfs/lib/libspl/include/libgen.h index c46d7454e49f..18d3e1d891b8 100644 --- a/sys/contrib/openzfs/lib/libspl/include/libgen.h +++ b/sys/contrib/openzfs/lib/libspl/include/libgen.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/libshare.h b/sys/contrib/openzfs/lib/libspl/include/libshare.h index 5d06b163a3ba..bfa78bffd461 100644 --- a/sys/contrib/openzfs/lib/libspl/include/libshare.h +++ b/sys/contrib/openzfs/lib/libspl/include/libshare.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -22,33 +23,33 @@ /* * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. - * Copyright (c) 2019, 2020 by Delphix. All rights reserved. + * Copyright (c) 2019, 2022 by Delphix. All rights reserved. */ #ifndef _LIBSPL_LIBSHARE_H #define _LIBSPL_LIBSHARE_H extern __attribute__((visibility("default"))) -/* API Initialization */ -#define SA_INIT_SHARE_API 0x0001 /* init share specific interface */ -#define SA_INIT_CONTROL_API 0x0002 /* init control specific interface */ +#include <sys/types.h> /* * defined error values */ - #define SA_OK 0 -#define SA_NO_SUCH_PATH 1 /* provided path doesn't exist */ +#define SA_SYSTEM_ERR 7 /* system error, use errno */ +#define SA_SYNTAX_ERR 8 /* syntax error on command line */ #define SA_NO_MEMORY 2 /* no memory for data structures */ +#define SA_INVALID_PROTOCOL 13 /* specified protocol not valid */ +#define SA_NOT_SUPPORTED 21 /* operation not supported for proto */ + +/* The following errors are never returned by libshare */ +#define SA_NO_SUCH_PATH 1 /* provided path doesn't exist */ #define SA_DUPLICATE_NAME 3 /* object name is already in use */ #define SA_BAD_PATH 4 /* not a full path */ #define SA_NO_SUCH_GROUP 5 /* group is not defined */ #define SA_CONFIG_ERR 6 /* system configuration error */ -#define SA_SYSTEM_ERR 7 /* system error, use errno */ -#define SA_SYNTAX_ERR 8 /* syntax error on command line */ #define SA_NO_PERMISSION 9 /* no permission for operation */ #define SA_BUSY 10 /* resource is busy */ #define SA_NO_SUCH_PROP 11 /* property doesn't exist */ #define SA_INVALID_NAME 12 /* name of object is invalid */ -#define SA_INVALID_PROTOCOL 13 /* specified protocol not valid */ #define SA_NOT_ALLOWED 14 /* operation not allowed */ #define SA_BAD_VALUE 15 /* bad value for property */ #define SA_INVALID_SECURITY 16 /* invalid security type */ @@ -56,7 +57,6 @@ #define SA_VALUE_CONFLICT 18 /* property value conflict */ #define SA_NOT_IMPLEMENTED 19 /* plugin interface not implemented */ #define SA_INVALID_PATH 20 /* path is sub-dir of existing share */ -#define SA_NOT_SUPPORTED 21 /* operation not supported for proto */ #define SA_PROP_SHARE_ONLY 22 /* property valid on share only */ #define SA_NOT_SHARED 23 /* path is not shared */ #define SA_NO_SUCH_RESOURCE 24 /* resource not found */ @@ -71,16 +71,27 @@ #define SA_SHARE_EXISTS 33 /* path or file is already shared */ /* initialization */ -_LIBSPL_LIBSHARE_H char *sa_errorstr(int); +_LIBSPL_LIBSHARE_H const char *sa_errorstr(int); + +/* available protocols */ +enum sa_protocol { + SA_PROTOCOL_NFS, + SA_PROTOCOL_SMB, /* ABI: add before _COUNT */ + SA_PROTOCOL_COUNT, +}; + +/* lower-case */ +_LIBSPL_LIBSHARE_H const char *const sa_protocol_names[SA_PROTOCOL_COUNT]; /* share control */ _LIBSPL_LIBSHARE_H int sa_enable_share(const char *, const char *, const char *, - char *); -_LIBSPL_LIBSHARE_H int sa_disable_share(const char *, char *); -_LIBSPL_LIBSHARE_H boolean_t sa_is_shared(const char *, char *); -_LIBSPL_LIBSHARE_H void sa_commit_shares(const char *); + enum sa_protocol); +_LIBSPL_LIBSHARE_H int sa_disable_share(const char *, enum sa_protocol); +_LIBSPL_LIBSHARE_H boolean_t sa_is_shared(const char *, enum sa_protocol); +_LIBSPL_LIBSHARE_H void sa_commit_shares(enum sa_protocol); +_LIBSPL_LIBSHARE_H void sa_truncate_shares(enum sa_protocol); /* protocol specific interfaces */ -_LIBSPL_LIBSHARE_H int sa_validate_shareopts(char *, char *); +_LIBSPL_LIBSHARE_H int sa_validate_shareopts(const char *, enum sa_protocol); #endif /* _LIBSPL_LIBSHARE_H */ diff --git a/sys/contrib/openzfs/lib/libspl/include/locale.h b/sys/contrib/openzfs/lib/libspl/include/locale.h deleted file mode 100644 index 6c74df72072e..000000000000 --- a/sys/contrib/openzfs/lib/libspl/include/locale.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#include_next <locale.h> - -#ifndef _LIBSPL_LOCALE_H -#define _LIBSPL_LOCALE_H - -#include <time.h> -#include <sys/time.h> - -#endif diff --git a/sys/contrib/openzfs/lib/libspl/include/os/Makefile.am b/sys/contrib/openzfs/lib/libspl/include/os/Makefile.am deleted file mode 100644 index 7b362e02ad59..000000000000 --- a/sys/contrib/openzfs/lib/libspl/include/os/Makefile.am +++ /dev/null @@ -1,7 +0,0 @@ -if BUILD_FREEBSD -SUBDIRS = freebsd -endif - -if BUILD_LINUX -SUBDIRS = linux -endif diff --git a/sys/contrib/openzfs/lib/libspl/include/os/freebsd/Makefile.am b/sys/contrib/openzfs/lib/libspl/include/os/freebsd/Makefile.am deleted file mode 100644 index f06325ee3e4e..000000000000 --- a/sys/contrib/openzfs/lib/libspl/include/os/freebsd/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -SUBDIRS = sys - -libspldir = $(includedir)/libspl -libspl_HEADERS = \ - fcntl.h diff --git a/sys/contrib/openzfs/lib/libspl/include/os/freebsd/fcntl.h b/sys/contrib/openzfs/lib/libspl/include/os/freebsd/fcntl.h index 26d571ad8926..1222b3d7a6b5 100644 --- a/sys/contrib/openzfs/lib/libspl/include/os/freebsd/fcntl.h +++ b/sys/contrib/openzfs/lib/libspl/include/os/freebsd/fcntl.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: BSD-2-Clause /* * Copyright (c) 2021 iXsystems, Inc. * diff --git a/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/Makefile.am b/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/Makefile.am deleted file mode 100644 index 7a854608079c..000000000000 --- a/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/Makefile.am +++ /dev/null @@ -1,12 +0,0 @@ -libspldir = $(includedir)/libspl/sys -libspl_HEADERS = \ - byteorder.h \ - fcntl.h \ - file.h \ - mnttab.h \ - mount.h \ - param.h \ - stat.h \ - sysmacros.h \ - vfs.h \ - zfs_context_os.h diff --git a/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/byteorder.h b/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/byteorder.h index cd692d3616e0..116ce991b89b 100644 --- a/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/byteorder.h +++ b/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/byteorder.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -43,7 +44,7 @@ #include <sys/endian.h> #include <netinet/in.h> #include <sys/isa_defs.h> -#include <sys/int_types.h> +#include <inttypes.h> #if defined(__GNUC__) && defined(_ASM_INLINES) && \ (defined(__i386) || defined(__amd64)) @@ -59,6 +60,18 @@ extern "C" { */ #if !defined(_XPG4_2) || defined(__EXTENSIONS__) +#ifdef __COVERITY__ +/* + * Coverity's taint warnings from byteswapping are false positives for us. + * Suppress them by hiding byteswapping from Coverity. + */ +#define BSWAP_8(x) ((x) & 0xff) +#define BSWAP_16(x) ((x) & 0xffff) +#define BSWAP_32(x) ((x) & 0xffffffff) +#define BSWAP_64(x) (x) + +#else /* __COVERITY__ */ + /* * Macros to reverse byte order */ @@ -67,6 +80,8 @@ extern "C" { #define BSWAP_32(x) ((BSWAP_16(x) << 16) | BSWAP_16((x) >> 16)) #define BSWAP_64(x) ((BSWAP_32(x) << 32) | BSWAP_32((x) >> 32)) +#endif /* __COVERITY__ */ + #define BMASK_8(x) ((x) & 0xff) #define BMASK_16(x) ((x) & 0xffff) #define BMASK_32(x) ((x) & 0xffffffff) diff --git a/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/fcntl.h b/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/fcntl.h index c8a37a193850..64dd4d7ebe45 100644 --- a/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/fcntl.h +++ b/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/fcntl.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: BSD-2-Clause /* * Copyright (c) 2021 iXsystems, Inc. * diff --git a/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/file.h b/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/file.h index 27fd2888f326..75c3b23860bb 100644 --- a/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/file.h +++ b/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/file.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -29,14 +30,6 @@ #include_next <sys/file.h> -#define FCREAT O_CREAT -#define FTRUNC O_TRUNC -#define FSYNC O_SYNC -#define FDSYNC O_DSYNC -#define FEXCL O_EXCL - -#define FNODSYNC 0x10000 /* fsync pseudo flag */ -#define FNOFOLLOW 0x20000 /* don't follow symlinks */ #define FIGNORECASE 0x80000 /* request case-insensitive lookups */ #endif diff --git a/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/ia32/asm_linkage.h b/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/ia32/asm_linkage.h new file mode 100644 index 000000000000..f9c34d282d46 --- /dev/null +++ b/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/ia32/asm_linkage.h @@ -0,0 +1,185 @@ +// SPDX-License-Identifier: CDDL-1.0 +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or https://opensource.org/licenses/CDDL-1.0. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#ifndef _IA32_SYS_ASM_LINKAGE_H +#define _IA32_SYS_ASM_LINKAGE_H + +#if defined(__linux__) && defined(CONFIG_SLS) +#define RET ret; int3 +#else +#define RET ret +#endif + +/* Tell compiler to call assembler like Unix */ +#undef ASMABI +#define ASMABI __attribute__((sysv_abi)) + +#define ENDBR + +#define SECTION_TEXT .text +#define SECTION_STATIC .section .rodata + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef _ASM /* The remainder of this file is only for assembly files */ + +/* + * make annoying differences in assembler syntax go away + */ + +/* + * D16 and A16 are used to insert instructions prefixes; the + * macros help the assembler code be slightly more portable. + */ +#if !defined(__GNUC_AS__) +/* + * /usr/ccs/bin/as prefixes are parsed as separate instructions + */ +#define D16 data16; +#define A16 addr16; + +/* + * (There are some weird constructs in constant expressions) + */ +#define _CONST(const) [const] +#define _BITNOT(const) -1!_CONST(const) +#define _MUL(a, b) _CONST(a \* b) + +#else +/* + * Why not use the 'data16' and 'addr16' prefixes .. well, the + * assembler doesn't quite believe in real mode, and thus argues with + * us about what we're trying to do. + */ +#define D16 .byte 0x66; +#define A16 .byte 0x67; + +#define _CONST(const) (const) +#define _BITNOT(const) ~_CONST(const) +#define _MUL(a, b) _CONST(a * b) + +#endif + +/* + * C pointers are different sizes between i386 and amd64. + * These constants can be used to compute offsets into pointer arrays. + */ +#if defined(__amd64) +#define CLONGSHIFT 3 +#define CLONGSIZE 8 +#define CLONGMASK 7 +#elif defined(__i386) +#define CLONGSHIFT 2 +#define CLONGSIZE 4 +#define CLONGMASK 3 +#endif + +/* + * Since we know we're either ILP32 or LP64 .. + */ +#define CPTRSHIFT CLONGSHIFT +#define CPTRSIZE CLONGSIZE +#define CPTRMASK CLONGMASK + +#if CPTRSIZE != (1 << CPTRSHIFT) || CLONGSIZE != (1 << CLONGSHIFT) +#error "inconsistent shift constants" +#endif + +#if CPTRMASK != (CPTRSIZE - 1) || CLONGMASK != (CLONGSIZE - 1) +#error "inconsistent mask constants" +#endif + +#define ASM_ENTRY_ALIGN 16 + +/* + * SSE register alignment and save areas + */ + +#define XMM_SIZE 16 +#define XMM_ALIGN 16 + +/* + * ENTRY provides the standard procedure entry code and an easy way to + * insert the calls to mcount for profiling. ENTRY_NP is identical, but + * never calls mcount. + */ +#define ENTRY(x) \ + .text; \ + .balign ASM_ENTRY_ALIGN; \ + .globl x; \ +x: MCOUNT(x) + +#define ENTRY_NP(x) \ + .text; \ + .balign ASM_ENTRY_ALIGN; \ + .globl x; \ +x: + +#define ENTRY_ALIGN(x, a) \ + .text; \ + .balign a; \ + .globl x; \ +x: + +#define FUNCTION(x) \ + .type x, @function; \ +x: + +/* + * ENTRY2 is identical to ENTRY but provides two labels for the entry point. + */ +#define ENTRY2(x, y) \ + .text; \ + .balign ASM_ENTRY_ALIGN; \ + .globl x, y; \ +x:; \ +y: MCOUNT(x) + +#define ENTRY_NP2(x, y) \ + .text; \ + .balign ASM_ENTRY_ALIGN; \ + .globl x, y; \ +x:; \ +y: + + +/* + * SET_SIZE trails a function and set the size for the ELF symbol table. + */ +#define SET_SIZE(x) + +#define SET_OBJ(x) + +#endif /* _ASM */ + +#ifdef __cplusplus +} +#endif + +#endif /* _IA32_SYS_ASM_LINKAGE_H */ diff --git a/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/mnttab.h b/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/mnttab.h index c08349bdf9bd..e520bf5ef3bb 100644 --- a/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/mnttab.h +++ b/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/mnttab.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -79,7 +80,7 @@ extern int _sol_getmntent(FILE *fp, struct mnttab *mp); extern int getextmntent(const char *path, struct extmnttab *entry, struct stat64 *statbuf); extern void statfs2mnttab(struct statfs *sfs, struct mnttab *mp); -char *hasmntopt(struct mnttab *mnt, char *opt); -int getmntent(FILE *fp, struct mnttab *mp); +extern char *hasmntopt(struct mnttab *mnt, const char *opt); +extern int getmntent(FILE *fp, struct mnttab *mp); #endif diff --git a/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/mount.h b/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/mount.h index e99518571270..231c250d3410 100644 --- a/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/mount.h +++ b/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/mount.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/param.h b/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/param.h index cb5260ea3d7e..55fa1de0e8ff 100644 --- a/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/param.h +++ b/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/param.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -57,6 +58,8 @@ extern size_t spl_pagesize(void); #define PAGESIZE (spl_pagesize()) +#ifndef HAVE_EXECVPE extern int execvpe(const char *name, char * const argv[], char * const envp[]); +#endif #endif diff --git a/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/stat.h b/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/stat.h index 38c684d62a1b..666f2ec6d760 100644 --- a/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/stat.h +++ b/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/stat.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -76,8 +77,12 @@ fstat64_blk(int fd, struct stat64 *st) /* * Only Intel-based Macs have a separate stat64; Arm-based Macs are like * FreeBSD and have a full 64-bit stat from the start. + * + * On Linux, musl libc is full 64-bit too and has deprecated its own version + * of these defines since version 1.2.4. */ -#if defined(__APPLE__) && !(defined(__i386__) || defined(__x86_64__)) +#if (defined(__APPLE__) && !(defined(__i386__) || defined(__x86_64__))) || \ + (defined(__linux__) && !defined(__GLIBC__)) #define stat64 stat #define fstat64 fstat #endif diff --git a/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/vfs.h b/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/vfs.h index 55eb3c23b22e..228ec5905240 100644 --- a/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/vfs.h +++ b/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/vfs.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: BSD-2-Clause /* * Copyright (c) 2020 iXsystems, Inc. * All rights reserved. diff --git a/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/zfs_context_os.h b/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/zfs_context_os.h index b9bf487c2aef..1dd036d02ac6 100644 --- a/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/zfs_context_os.h +++ b/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/zfs_context_os.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: BSD-2-Clause /* * Copyright (c) 2020 iXsystems, Inc. * All rights reserved. @@ -30,6 +31,5 @@ #define ZFS_CONTEXT_OS_H_ #define HAVE_LARGE_STACKS 1 -#define ZFS_EXPORTS_PATH "/etc/zfs/exports" #endif diff --git a/sys/contrib/openzfs/lib/libspl/include/os/linux/Makefile.am b/sys/contrib/openzfs/lib/libspl/include/os/linux/Makefile.am deleted file mode 100644 index 081839c48c8f..000000000000 --- a/sys/contrib/openzfs/lib/libspl/include/os/linux/Makefile.am +++ /dev/null @@ -1 +0,0 @@ -SUBDIRS = sys diff --git a/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/Makefile.am b/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/Makefile.am deleted file mode 100644 index 1ec07a76d354..000000000000 --- a/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/Makefile.am +++ /dev/null @@ -1,10 +0,0 @@ -libspldir = $(includedir)/libspl/sys -libspl_HEADERS = \ - byteorder.h \ - errno.h \ - mnttab.h \ - mount.h \ - param.h \ - stat.h \ - sysmacros.h \ - zfs_context_os.h diff --git a/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/byteorder.h b/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/byteorder.h index d5ee3e26f5a5..4fba62addd3b 100644 --- a/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/byteorder.h +++ b/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/byteorder.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -46,7 +47,7 @@ #endif #include <sys/isa_defs.h> -#include <sys/int_types.h> +#include <inttypes.h> #ifdef __cplusplus extern "C" { @@ -90,6 +91,18 @@ extern in_port_t ntohs(in_port_t); #if !defined(_XPG4_2) || defined(__EXTENSIONS__) +#ifdef __COVERITY__ +/* + * Coverity's taint warnings from byteswapping are false positives for us. + * Suppress them by hiding byteswapping from Coverity. + */ +#define BSWAP_8(x) ((x) & 0xff) +#define BSWAP_16(x) ((x) & 0xffff) +#define BSWAP_32(x) ((x) & 0xffffffff) +#define BSWAP_64(x) (x) + +#else /* __COVERITY__ */ + /* * Macros to reverse byte order */ @@ -98,6 +111,8 @@ extern in_port_t ntohs(in_port_t); #define BSWAP_32(x) ((BSWAP_16(x) << 16) | BSWAP_16((x) >> 16)) #define BSWAP_64(x) ((BSWAP_32(x) << 32) | BSWAP_32((x) >> 32)) +#endif /* __COVERITY__ */ + #define BMASK_8(x) ((x) & 0xff) #define BMASK_16(x) ((x) & 0xffff) #define BMASK_32(x) ((x) & 0xffffffff) diff --git a/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/errno.h b/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/errno.h index 30d20ab895c5..dd0120100a3d 100644 --- a/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/errno.h +++ b/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/errno.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/ia32/sys/asm_linkage.h b/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/ia32/asm_linkage.h index 61c4d1a26977..e1d25346b13e 100644 --- a/sys/contrib/openzfs/lib/libspl/include/ia32/sys/asm_linkage.h +++ b/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/ia32/asm_linkage.h @@ -1,13 +1,13 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -19,14 +19,48 @@ * * CDDL HEADER END */ + /* - * Copyright 2004 Sun Microsystems, Inc. All rights reserved. + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #ifndef _IA32_SYS_ASM_LINKAGE_H #define _IA32_SYS_ASM_LINKAGE_H +#if defined(_KERNEL) && defined(__linux__) +#include <linux/linkage.h> +#endif + +#ifndef ENDBR +#if defined(__ELF__) && defined(__CET__) && defined(__has_include) +/* CSTYLED */ +#if __has_include(<cet.h>) + +#include <cet.h> + +#ifdef _CET_ENDBR +#define ENDBR _CET_ENDBR +#endif /* _CET_ENDBR */ + +#endif /* <cet.h> */ +#endif /* __ELF__ && __CET__ && __has_include */ +#endif /* !ENDBR */ + +#ifndef ENDBR +#define ENDBR +#endif +#ifndef RET +#define RET ret +#endif + +/* You can set to nothing on Unix platforms */ +#undef ASMABI +#define ASMABI __attribute__((sysv_abi)) + +#define SECTION_TEXT .text +#define SECTION_STATIC .section .rodata + #ifdef __cplusplus extern "C" { #endif @@ -108,190 +142,66 @@ extern "C" { #define XMM_SIZE 16 #define XMM_ALIGN 16 -#if defined(__amd64) - -#define SAVE_XMM_PROLOG(sreg, nreg) \ - subq $_CONST(_MUL(XMM_SIZE, nreg)), %rsp; \ - movq %rsp, sreg - -#define RSTOR_XMM_EPILOG(sreg, nreg) \ - addq $_CONST(_MUL(XMM_SIZE, nreg)), %rsp - -#elif defined(__i386) - -#define SAVE_XMM_PROLOG(sreg, nreg) \ - subl $_CONST(_MUL(XMM_SIZE, nreg) + XMM_ALIGN), %esp; \ - movl %esp, sreg; \ - addl $XMM_ALIGN, sreg; \ - andl $_BITNOT(XMM_ALIGN-1), sreg - -#define RSTOR_XMM_EPILOG(sreg, nreg) \ - addl $_CONST(_MUL(XMM_SIZE, nreg) + XMM_ALIGN), %esp; - -#endif /* __i386 */ - -/* - * profiling causes definitions of the MCOUNT and RTMCOUNT - * particular to the type - */ -#ifdef GPROF - -#define MCOUNT(x) \ - pushl %ebp; \ - movl %esp, %ebp; \ - call _mcount; \ - popl %ebp - -#endif /* GPROF */ - -#ifdef PROF - -#define MCOUNT(x) \ -/* CSTYLED */ \ - .lcomm .L_/**/x/**/1, 4, 4; \ - pushl %ebp; \ - movl %esp, %ebp; \ -/* CSTYLED */ \ - movl $.L_/**/x/**/1, %edx; \ - call _mcount; \ - popl %ebp - -#endif /* PROF */ - -/* - * if we are not profiling, MCOUNT should be defined to nothing - */ -#if !defined(PROF) && !defined(GPROF) -#define MCOUNT(x) -#endif /* !defined(PROF) && !defined(GPROF) */ - -#define RTMCOUNT(x) MCOUNT(x) - -/* - * Macro to define weak symbol aliases. These are similar to the ANSI-C - * #pragma weak name = _name - * except a compiler can determine type. The assembler must be told. Hence, - * the second parameter must be the type of the symbol (i.e.: function,...) - */ -#define ANSI_PRAGMA_WEAK(sym, stype) \ - .weak sym; \ - .type sym, @stype; \ -/* CSTYLED */ \ -sym = _/**/sym - -/* - * Like ANSI_PRAGMA_WEAK(), but for unrelated names, as in: - * #pragma weak sym1 = sym2 - */ -#define ANSI_PRAGMA_WEAK2(sym1, sym2, stype) \ - .weak sym1; \ - .type sym1, @stype; \ -sym1 = sym2 - /* * ENTRY provides the standard procedure entry code and an easy way to * insert the calls to mcount for profiling. ENTRY_NP is identical, but * never calls mcount. */ +#undef ENTRY #define ENTRY(x) \ .text; \ - .align ASM_ENTRY_ALIGN; \ + .balign ASM_ENTRY_ALIGN; \ .globl x; \ .type x, @function; \ x: MCOUNT(x) #define ENTRY_NP(x) \ .text; \ - .align ASM_ENTRY_ALIGN; \ + .balign ASM_ENTRY_ALIGN; \ .globl x; \ .type x, @function; \ x: -#define RTENTRY(x) \ +#define ENTRY_ALIGN(x, a) \ .text; \ - .align ASM_ENTRY_ALIGN; \ + .balign a; \ .globl x; \ .type x, @function; \ -x: RTMCOUNT(x) +x: + +#define FUNCTION(x) \ + .type x, @function; \ +x: /* * ENTRY2 is identical to ENTRY but provides two labels for the entry point. */ #define ENTRY2(x, y) \ - .text; \ - .align ASM_ENTRY_ALIGN; \ + .text; \ + .balign ASM_ENTRY_ALIGN; \ .globl x, y; \ .type x, @function; \ .type y, @function; \ -/* CSTYLED */ \ -x: ; \ +x:; \ y: MCOUNT(x) #define ENTRY_NP2(x, y) \ .text; \ - .align ASM_ENTRY_ALIGN; \ + .balign ASM_ENTRY_ALIGN; \ .globl x, y; \ .type x, @function; \ .type y, @function; \ -/* CSTYLED */ \ -x: ; \ +x:; \ y: /* - * ALTENTRY provides for additional entry points. - */ -#define ALTENTRY(x) \ - .globl x; \ - .type x, @function; \ -x: - -/* - * DGDEF and DGDEF2 provide global data declarations. - * - * DGDEF provides a word aligned word of storage. - * - * DGDEF2 allocates "sz" bytes of storage with **NO** alignment. This - * implies this macro is best used for byte arrays. - * - * DGDEF3 allocates "sz" bytes of storage with "algn" alignment. - */ -#define DGDEF2(name, sz) \ - .data; \ - .globl name; \ - .type name, @object; \ - .size name, sz; \ -name: - -#define DGDEF3(name, sz, algn) \ - .data; \ - .align algn; \ - .globl name; \ - .type name, @object; \ - .size name, sz; \ -name: - -#define DGDEF(name) DGDEF3(name, 4, 4) - -/* * SET_SIZE trails a function and set the size for the ELF symbol table. */ #define SET_SIZE(x) \ .size x, [.-x] -/* - * NWORD provides native word value. - */ -#if defined(__amd64) - -/*CSTYLED*/ -#define NWORD quad - -#elif defined(__i386) - -#define NWORD long - -#endif /* __i386 */ +#define SET_OBJ(x) .type x, @object #endif /* _ASM */ diff --git a/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/mnttab.h b/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/mnttab.h index 1957293d5c69..c1b7f3b389c0 100644 --- a/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/mnttab.h +++ b/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/mnttab.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -74,7 +75,7 @@ extern int getmntany(FILE *fp, struct mnttab *mp, struct mnttab *mpref); extern int _sol_getmntent(FILE *fp, struct mnttab *mp); extern int getextmntent(const char *path, struct extmnttab *mp, struct stat64 *statbuf); -static inline char *_sol_hasmntopt(struct mnttab *mnt, char *opt) +static inline char *_sol_hasmntopt(struct mnttab *mnt, const char *opt) { struct mntent mnt_new; diff --git a/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/mount.h b/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/mount.h index d7c6f750e23d..c4a291f5c22d 100644 --- a/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/mount.h +++ b/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/mount.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/param.h b/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/param.h index 26335187fdca..814f8feaf37f 100644 --- a/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/param.h +++ b/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/param.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * 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 3e8d27e4c19a..488554f4e844 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 @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/sysmacros.h b/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/sysmacros.h index 31f347c6fd5a..66e0da6b5afe 100644 --- a/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/sysmacros.h +++ b/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/sysmacros.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -52,7 +53,8 @@ /* * Compatibility macros/typedefs needed for Solaris -> Linux port */ -#define P2ALIGN(x, align) ((x) & -(align)) +// Deprecated. Use P2ALIGN_TYPED instead. +// #define P2ALIGN(x, align) ((x) & -(align)) #define P2CROSS(x, y, align) (((x) ^ (y)) > (align) - 1) #define P2ROUNDUP(x, align) ((((x) - 1) | ((align) - 1)) + 1) #define P2BOUNDARY(off, len, align) \ diff --git a/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/zfs_context_os.h b/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/zfs_context_os.h index 81ced5207749..bbfb4d17e06d 100644 --- a/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/zfs_context_os.h +++ b/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/zfs_context_os.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/rpc/Makefile.am b/sys/contrib/openzfs/lib/libspl/include/rpc/Makefile.am deleted file mode 100644 index 7fe1d7fea4d7..000000000000 --- a/sys/contrib/openzfs/lib/libspl/include/rpc/Makefile.am +++ /dev/null @@ -1,3 +0,0 @@ -libspldir = $(includedir)/libspl/rpc -libspl_HEADERS = \ - xdr.h diff --git a/sys/contrib/openzfs/lib/libspl/include/rpc/xdr.h b/sys/contrib/openzfs/lib/libspl/include/rpc/xdr.h index 51d71f693bbf..85f718c275a5 100644 --- a/sys/contrib/openzfs/lib/libspl/include/rpc/xdr.h +++ b/sys/contrib/openzfs/lib/libspl/include/rpc/xdr.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/statcommon.h b/sys/contrib/openzfs/lib/libspl/include/statcommon.h index 1f376f5c7c24..21c64ed4a9f8 100644 --- a/sys/contrib/openzfs/lib/libspl/include/statcommon.h +++ b/sys/contrib/openzfs/lib/libspl/include/statcommon.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -37,5 +38,9 @@ /* Print a timestamp in either Unix or standard format. */ void print_timestamp(uint_t); +/* Return timestamp in either Unix or standard format in provided buffer */ +void get_timestamp(uint_t, char *, int); +/* convert time_t to standard format */ +void format_timestamp(time_t, char *, int); #endif /* _STATCOMMON_H */ diff --git a/sys/contrib/openzfs/lib/libspl/include/stdio.h b/sys/contrib/openzfs/lib/libspl/include/stdio.h deleted file mode 100644 index 6152b09f1a97..000000000000 --- a/sys/contrib/openzfs/lib/libspl/include/stdio.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#include_next <stdio.h> - -#ifndef _LIBSPL_STDIO_H -#define _LIBSPL_STDIO_H - -#define enable_extended_FILE_stdio(fd, sig) ((void) 0) - -#endif diff --git a/sys/contrib/openzfs/lib/libspl/include/stdlib.h b/sys/contrib/openzfs/lib/libspl/include/stdlib.h index a4ce4f781fc5..f381f21345fa 100644 --- a/sys/contrib/openzfs/lib/libspl/include/stdlib.h +++ b/sys/contrib/openzfs/lib/libspl/include/stdlib.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/string.h b/sys/contrib/openzfs/lib/libspl/include/string.h index a7d40fa61943..52f268b1d931 100644 --- a/sys/contrib/openzfs/lib/libspl/include/string.h +++ b/sys/contrib/openzfs/lib/libspl/include/string.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/Makefile.am b/sys/contrib/openzfs/lib/libspl/include/sys/Makefile.am deleted file mode 100644 index 6816a012533f..000000000000 --- a/sys/contrib/openzfs/lib/libspl/include/sys/Makefile.am +++ /dev/null @@ -1,48 +0,0 @@ -SUBDIRS = dktp - -libspldir = $(includedir)/libspl/sys -libspl_HEADERS = \ - acl.h \ - acl_impl.h \ - callb.h \ - cmn_err.h \ - cred.h \ - debug.h \ - dkio.h \ - dklabel.h \ - feature_tests.h \ - int_limits.h \ - int_types.h \ - inttypes.h \ - isa_defs.h \ - kmem.h \ - kstat.h \ - list.h \ - list_impl.h \ - mhd.h \ - mkdev.h \ - policy.h \ - poll.h \ - priv.h \ - processor.h \ - sha2.h \ - simd.h \ - stack.h \ - stdtypes.h \ - strings.h \ - stropts.h \ - sunddi.h \ - systeminfo.h \ - time.h \ - trace_spl.h \ - trace_zfs.h \ - types32.h \ - types.h \ - tzfile.h \ - uio.h \ - va_list.h \ - varargs.h \ - vnode.h \ - vtoc.h \ - wmsum.h \ - zone.h diff --git a/sys/contrib/openzfs/lib/libspl/include/stropts.h b/sys/contrib/openzfs/lib/libspl/include/sys/abd_impl_os.h index 37acd4052b0b..dee95652c71c 100644 --- a/sys/contrib/openzfs/lib/libspl/include/stropts.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/abd_impl_os.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -18,8 +19,24 @@ * * CDDL HEADER END */ +/* + * Copyright (c) 2014 by Chunwei Chen. All rights reserved. + * Copyright (c) 2016, 2019 by Delphix. All rights reserved. + * Copyright (c) 2023, 2024, Klara Inc. + */ + +#ifndef _ABD_IMPL_OS_H +#define _ABD_IMPL_OS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define abd_enter_critical(flags) ((void)0) +#define abd_exit_critical(flags) ((void)0) -#ifndef _LIBSPL_STROPTS_H -#define _LIBSPL_STROPTS_H +#ifdef __cplusplus +} +#endif -#endif /* _LIBSPL_STROPTS_H */ +#endif /* _ABD_IMPL_OS_H */ diff --git a/sys/contrib/openzfs/lib/libzfs/os/linux/libzfs_sendrecv_os.c b/sys/contrib/openzfs/lib/libspl/include/sys/abd_os.h index 593c38ec62df..80ce46e99a8e 100644 --- a/sys/contrib/openzfs/lib/libzfs/os/linux/libzfs_sendrecv_os.c +++ b/sys/contrib/openzfs/lib/libspl/include/sys/abd_os.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -18,35 +19,30 @@ * * CDDL HEADER END */ +/* + * Copyright (c) 2014 by Chunwei Chen. All rights reserved. + * Copyright (c) 2016, 2019 by Delphix. All rights reserved. + */ +#ifndef _ABD_OS_H +#define _ABD_OS_H -#include <libzfs.h> - -#include "../../libzfs_impl.h" - -#ifndef F_SETPIPE_SZ -#define F_SETPIPE_SZ (F_SETLEASE + 7) -#endif /* F_SETPIPE_SZ */ +#ifdef __cplusplus +extern "C" { +#endif -#ifndef F_GETPIPE_SZ -#define F_GETPIPE_SZ (F_GETLEASE + 7) -#endif /* F_GETPIPE_SZ */ +struct abd_scatter { + uint_t abd_offset; + uint_t abd_iovcnt; + struct iovec abd_iov[1]; /* actually variable-length */ +}; -void -libzfs_set_pipe_max(int infd) -{ - FILE *procf = fopen("/proc/sys/fs/pipe-max-size", "re"); +struct abd_linear { + void *abd_buf; +}; - if (procf != NULL) { - unsigned long max_psize; - long cur_psize; - if (fscanf(procf, "%lu", &max_psize) > 0) { - cur_psize = fcntl(infd, F_GETPIPE_SZ); - if (cur_psize > 0 && - max_psize > (unsigned long) cur_psize) - fcntl(infd, F_SETPIPE_SZ, - max_psize); - } - fclose(procf); - } +#ifdef __cplusplus } +#endif + +#endif /* _ABD_H */ diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/acl.h b/sys/contrib/openzfs/lib/libspl/include/sys/acl.h index 31168421b088..602043bbb196 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/acl.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/acl.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/acl_impl.h b/sys/contrib/openzfs/lib/libspl/include/sys/acl_impl.h index 717334906415..2850eacf61f4 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/acl_impl.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/acl_impl.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/limits.h b/sys/contrib/openzfs/lib/libspl/include/sys/asm_linkage.h index 5d996eb846d1..1a0f2864a178 100644 --- a/sys/contrib/openzfs/lib/libspl/include/limits.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/asm_linkage.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -20,26 +21,27 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2005 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ -#include_next <limits.h> -#include <float.h> +#ifndef _SYS_ASM_LINKAGE_H +#define _SYS_ASM_LINKAGE_H -#ifndef _LIBSPL_LIMITS_H -#define _LIBSPL_LIMITS_H +#if defined(__i386) || defined(__amd64) + +#include <sys/ia32/asm_linkage.h> /* XX64 x86/sys/asm_linkage.h */ -#ifndef DBL_DIG -#define DBL_DIG 15 -#define DBL_MAX 1.7976931348623157081452E+308 -#define DBL_MIN 2.2250738585072013830903E-308 #endif -#ifndef FLT_DIG -#define FLT_DIG 6 -#define FLT_MAX 3.4028234663852885981170E+38F -#define FLT_MIN 1.1754943508222875079688E-38F +#if defined(_KERNEL) && defined(HAVE_KERNEL_OBJTOOL) + +#include <asm/frame.h> + +#else /* userspace */ +#define FRAME_BEGIN +#define FRAME_END #endif -#endif /* _LIBSPL_LIMITS_H */ + +#endif /* _SYS_ASM_LINKAGE_H */ diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/va_list.h b/sys/contrib/openzfs/lib/libspl/include/sys/backtrace.h index a36f5c77daa9..3a2077f32e6c 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/va_list.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/backtrace.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -20,13 +21,13 @@ * CDDL HEADER END */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. + * Copyright (c) 2024, Rob Norris <robn@despairlabs.com> + * Copyright (c) 2024, Klara Inc. */ -#ifndef _SYS_VA_LIST_H -#define _SYS_VA_LIST_H +#ifndef _LIBSPL_SYS_BACKTRACE_H +#define _LIBSPL_SYS_BACKTRACE_H -#include <stdarg.h> +void libspl_backtrace(int fd); #endif diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/callb.h b/sys/contrib/openzfs/lib/libspl/include/sys/callb.h index 8ffd18788865..46ed166e52f8 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/callb.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/callb.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/cmn_err.h b/sys/contrib/openzfs/lib/libspl/include/sys/cmn_err.h index 63ff4eb29bc8..32930adaeffa 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/cmn_err.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/cmn_err.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -27,4 +28,38 @@ #ifndef _LIBSPL_SYS_CMN_ERR_H #define _LIBSPL_SYS_CMN_ERR_H +#include <atomic.h> + +#define cmn_err_once(ce, ...) \ +do { \ + static volatile uint32_t printed = 0; \ + if (atomic_cas_32(&printed, 0, 1) == 0) { \ + cmn_err(ce, __VA_ARGS__); \ + } \ +} while (0) + +#define vcmn_err_once(ce, fmt, ap) \ +do { \ + static volatile uint32_t printed = 0; \ + if (atomic_cas_32(&printed, 0, 1) == 0) { \ + vcmn_err(ce, fmt, ap); \ + } \ +} while (0) + +#define zcmn_err_once(zone, ce, ...) \ +do { \ + static volatile uint32_t printed = 0; \ + if (atomic_cas_32(&printed, 0, 1) == 0) { \ + zcmn_err(zone, ce, __VA_ARGS__); \ + } \ +} while (0) + +#define vzcmn_err_once(zone, ce, fmt, ap) \ +do { \ + static volatile uint32_t printed = 0; \ + if (atomic_cas_32(&printed, 0, 1) == 0) { \ + vzcmn_err(zone, ce, fmt, ap); \ + } \ +} while (0) + #endif diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/cred.h b/sys/contrib/openzfs/lib/libspl/include/sys/cred.h index 463b3abfc977..4f6183762a0a 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/cred.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/cred.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/debug.h b/sys/contrib/openzfs/lib/libspl/include/sys/debug.h index af18da94804c..cced309bd1bb 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/debug.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/debug.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/dkio.h b/sys/contrib/openzfs/lib/libspl/include/sys/dkio.h index f3c641f669b7..4ae1026d4d5f 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/dkio.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/dkio.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/dklabel.h b/sys/contrib/openzfs/lib/libspl/include/sys/dklabel.h index 8c2ca06c0cbc..409d337e9adf 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/dklabel.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/dklabel.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/dktp/Makefile.am b/sys/contrib/openzfs/lib/libspl/include/sys/dktp/Makefile.am deleted file mode 100644 index 4ad3695d8abc..000000000000 --- a/sys/contrib/openzfs/lib/libspl/include/sys/dktp/Makefile.am +++ /dev/null @@ -1,4 +0,0 @@ -libspldir = $(includedir)/libspl/sys/dktp -libspl_HEADERS = \ - fdisk.h - diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/dktp/fdisk.h b/sys/contrib/openzfs/lib/libspl/include/sys/dktp/fdisk.h index e90135f362e6..5e5db04cccfc 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/dktp/fdisk.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/dktp/fdisk.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/feature_tests.h b/sys/contrib/openzfs/lib/libspl/include/sys/feature_tests.h index c9564b2c3269..be7d4ebf9210 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/feature_tests.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/feature_tests.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -28,13 +29,12 @@ #define _SYS_FEATURE_TESTS_H #define ____cacheline_aligned -#define __NORETURN __attribute__((__noreturn__)) -#if !defined(fallthrough) && !defined(_LIBCPP_VERSION) +#if !defined(zfs_fallthrough) && !defined(_LIBCPP_VERSION) #if defined(HAVE_IMPLICIT_FALLTHROUGH) -#define fallthrough __attribute__((__fallthrough__)) +#define zfs_fallthrough __attribute__((__fallthrough__)) #else -#define fallthrough ((void)0) +#define zfs_fallthrough ((void)0) #endif #endif diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/int_limits.h b/sys/contrib/openzfs/lib/libspl/include/sys/int_limits.h deleted file mode 100644 index 7af68cdb2998..000000000000 --- a/sys/contrib/openzfs/lib/libspl/include/sys/int_limits.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#ifndef _LIBSPL_SYS_INT_LIMITS_H -#define _LIBSPL_SYS_INT_LIMITS_H - -#endif diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/int_types.h b/sys/contrib/openzfs/lib/libspl/include/sys/int_types.h deleted file mode 100644 index 51e9e0285490..000000000000 --- a/sys/contrib/openzfs/lib/libspl/include/sys/int_types.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#ifndef _SOL_SYS_INT_TYPES_H -#define _SOL_SYS_INT_TYPES_H - -#include <inttypes.h> - -#endif diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/inttypes.h b/sys/contrib/openzfs/lib/libspl/include/sys/inttypes.h index d7d063985316..66cf97ac8b5c 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/inttypes.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/inttypes.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/isa_defs.h b/sys/contrib/openzfs/lib/libspl/include/sys/isa_defs.h index 8c0932f57654..99dbc70e4617 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/isa_defs.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/isa_defs.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -126,7 +127,7 @@ extern "C" { #endif /* arm arch specific defines */ -#elif defined(__arm) || defined(__arm__) || defined(__aarch64__) +#elif defined(__arm) || defined(__arm__) #if !defined(__arm) #define __arm @@ -136,17 +137,11 @@ extern "C" { #define __arm__ #endif -#if defined(__aarch64__) -#if !defined(_LP64) -#define _LP64 -#endif -#else #if !defined(_ILP32) #define _ILP32 #endif -#endif -#if defined(__ARMEL__) || defined(__AARCH64EL__) +#if defined(__ARMEL__) #define _ZFS_LITTLE_ENDIAN #else #define _ZFS_BIG_ENDIAN @@ -158,6 +153,21 @@ extern "C" { #define HAVE_EFFICIENT_UNALIGNED_ACCESS #endif +/* aarch64 arch specific defines */ +#elif defined(__aarch64__) + +#if !defined(_LP64) +#define _LP64 +#endif + +#if defined(__AARCH64EL__) +#define _ZFS_LITTLE_ENDIAN +#else +#define _ZFS_BIG_ENDIAN +#endif + +#define _SUNOS_VTOC_16 + /* sparc arch specific defines */ #elif defined(__sparc) || defined(__sparc__) @@ -218,9 +228,13 @@ extern "C" { * RISC-V arch specific defines * only RV64G (including atomic) LP64 is supported yet */ -#elif defined(__riscv) && defined(_LP64) && _LP64 && \ +#elif defined(__riscv) && defined(__riscv_xlen) && __riscv_xlen == 64 && \ defined(__riscv_atomic) && __riscv_atomic +#if !defined(_LP64) +#define _LP64 1 +#endif + #ifndef __riscv__ #define __riscv__ #endif @@ -233,10 +247,26 @@ extern "C" { #define _SUNOS_VTOC_16 +/* + * LoongArch arch specific defines + * only LoongArch64 is supported yet + */ +#elif defined(__loongarch__) && defined(__loongarch_lp64) + +#if !defined(_LP64) +#define _LP64 +#endif + +#define _ZFS_LITTLE_ENDIAN +#define _SUNOS_VTOC_16 + +/* not all LoongArch cores support unaligned accesses in hardware */ +#define _ALIGNMENT_REQUIRED 1 + #else /* * Currently supported: - * x86_64, x32, i386, arm, powerpc, s390, sparc, mips, and RV64G + * x86_64, x32, i386, arm, powerpc, s390, sparc, mips, RV64G, and LoongArch64 */ #error "Unsupported ISA type" #endif diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/kmem.h b/sys/contrib/openzfs/lib/libspl/include/sys/kmem.h index 83d47565aeaf..279461f8d4c1 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/kmem.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/kmem.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -35,8 +36,8 @@ extern "C" { #define KM_SLEEP 0x00000000 /* same as KM_SLEEP */ #define KM_NOSLEEP 0x00000001 /* same as KM_NOSLEEP */ -#define kmem_alloc(size, flags) malloc(size) -#define kmem_free(ptr, size) free(ptr) +#define kmem_alloc(size, flags) ((void) sizeof (flags), malloc(size)) +#define kmem_free(ptr, size) ((void) sizeof (size), free(ptr)) #ifdef __cplusplus } diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/kstat.h b/sys/contrib/openzfs/lib/libspl/include/sys/kstat.h index f73fb92eb797..7777888c31eb 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/kstat.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/kstat.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -92,39 +93,6 @@ typedef struct kstat { void *ks_lock; /* protects this kstat's data */ } kstat_t; -#ifdef _SYSCALL32 - -typedef int32_t kid32_t; - -typedef struct kstat32 { - /* - * Fields relevant to both kernel and user - */ - hrtime_t ks_crtime; - caddr32_t ks_next; /* struct kstat pointer */ - kid32_t ks_kid; - char ks_module[KSTAT_STRLEN]; - uint8_t ks_resv; - int32_t ks_instance; - char ks_name[KSTAT_STRLEN]; - uint8_t ks_type; - char ks_class[KSTAT_STRLEN]; - uint8_t ks_flags; - caddr32_t ks_data; /* type-specific data */ - uint32_t ks_ndata; - size32_t ks_data_size; - hrtime_t ks_snaptime; - /* - * Fields relevant to kernel only (only needed here for padding) - */ - int32_t _ks_update; - caddr32_t _ks_private; - int32_t _ks_snapshot; - caddr32_t _ks_lock; -} kstat32_t; - -#endif /* _SYSCALL32 */ - /* * kstat structure and locking strategy * @@ -383,9 +351,9 @@ typedef struct kstat32 { * * ksp->ks_snaptime = gethrtime(); * if (rw == KSTAT_WRITE) - * bcopy(buf, ksp->ks_data, ksp->ks_data_size); + * memcpy(ksp->ks_data, buf, ksp->ks_data_size); * else - * bcopy(ksp->ks_data, buf, ksp->ks_data_size); + * memcpy(buf, ksp->ks_data, ksp->ks_data_size); * return (0); * * A more illuminating example is taking a snapshot of a linked list: @@ -394,7 +362,7 @@ typedef struct kstat32 { * if (rw == KSTAT_WRITE) * return (EACCES); ... See below ... * for (foo = first_foo; foo; foo = foo->next) { - * bcopy((char *) foo, (char *) buf, sizeof (struct foo)); + * memcpy(buf, foo, sizeof (struct foo)); * buf = ((struct foo *) buf) + 1; * } * return (0); @@ -423,12 +391,12 @@ typedef struct kstat32 { * uint_t i; * * ... Do the regular copy ... - * bcopy(ksp->ks_data, buf, sizeof (kstat_named_t) * ksp->ks_ndata); + * memcpy(buf, ksp->ks_data, sizeof (kstat_named_t) * ksp->ks_ndata); * * for (i = 0; i < ksp->ks_ndata; i++, knp++) { * if (knp[i].data_type == KSTAT_DATA_STRING && * KSTAT_NAMED_STR_PTR(knp) != NULL) { - * bcopy(KSTAT_NAMED_STR_PTR(knp), end, + * memcpy(end, KSTAT_NAMED_STR_PTR(knp), * KSTAT_NAMED_STR_BUFLEN(knp)); * KSTAT_NAMED_STR_PTR(knp) = end; * end += KSTAT_NAMED_STR_BUFLEN(knp); @@ -467,7 +435,7 @@ typedef struct kstat_named { * 64-bit compilation environments or 32-bit non-maximally conformant * C89 or C90 ANSI C compilation environments (cc -Xt and cc -Xa). In the * C99 ANSI C compilation environment, the long long type is supported. - * The _INT64_TYPE is defined by the implementation (see sys/int_types.h). + * The _INT64_TYPE is defined by the implementation (see sys/inttypes.h). */ #if defined(_INT64_TYPE) int64_t i64; diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/list.h b/sys/contrib/openzfs/lib/libspl/include/sys/list.h index 6db92ed42955..cbbda85dabb5 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/list.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/list.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/list_impl.h b/sys/contrib/openzfs/lib/libspl/include/sys/list_impl.h index b5655b972c11..10683adab325 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/list_impl.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/list_impl.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -39,7 +40,6 @@ struct list_node { }; struct list { - size_t list_size; size_t list_offset; struct list_node list_head; }; diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/mhd.h b/sys/contrib/openzfs/lib/libspl/include/sys/mhd.h index fcc062d51c84..82ec436750ef 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/mhd.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/mhd.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/mkdev.h b/sys/contrib/openzfs/lib/libspl/include/sys/mkdev.h index 5978de65de50..f02823c68db0 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/mkdev.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/mkdev.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/policy.h b/sys/contrib/openzfs/lib/libspl/include/sys/policy.h index 2f695b35cd0b..0d6016c1dd17 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/policy.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/policy.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/poll.h b/sys/contrib/openzfs/lib/libspl/include/sys/poll.h index 6ab0bddc0be5..3e99db0bdbee 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/poll.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/poll.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/priv.h b/sys/contrib/openzfs/lib/libspl/include/sys/priv.h index 76c76d1830c2..30b88a6c47fc 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/priv.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/priv.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/processor.h b/sys/contrib/openzfs/lib/libspl/include/sys/processor.h index 78e95d01f1b5..9e1bd90992bd 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/processor.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/processor.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/sha2.h b/sys/contrib/openzfs/lib/libspl/include/sys/sha2.h deleted file mode 100644 index e2f66d225e25..000000000000 --- a/sys/contrib/openzfs/lib/libspl/include/sys/sha2.h +++ /dev/null @@ -1,151 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2009 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ -/* Copyright 2013 Saso Kiselkov. All rights reserved. */ - -#ifndef _SYS_SHA2_H -#define _SYS_SHA2_H - -#include <stdint.h> - -#ifdef __cplusplus -extern "C" { -#endif - -#define SHA2_HMAC_MIN_KEY_LEN 1 /* SHA2-HMAC min key length in bytes */ -#define SHA2_HMAC_MAX_KEY_LEN INT_MAX /* SHA2-HMAC max key length in bytes */ - -#define SHA256_DIGEST_LENGTH 32 /* SHA256 digest length in bytes */ -#define SHA384_DIGEST_LENGTH 48 /* SHA384 digest length in bytes */ -#define SHA512_DIGEST_LENGTH 64 /* SHA512 digest length in bytes */ - -/* Truncated versions of SHA-512 according to FIPS-180-4, section 5.3.6 */ -#define SHA512_224_DIGEST_LENGTH 28 /* SHA512/224 digest length */ -#define SHA512_256_DIGEST_LENGTH 32 /* SHA512/256 digest length */ - -#define SHA256_HMAC_BLOCK_SIZE 64 /* SHA256-HMAC block size */ -#define SHA512_HMAC_BLOCK_SIZE 128 /* SHA512-HMAC block size */ - -#define SHA256 0 -#define SHA256_HMAC 1 -#define SHA256_HMAC_GEN 2 -#define SHA384 3 -#define SHA384_HMAC 4 -#define SHA384_HMAC_GEN 5 -#define SHA512 6 -#define SHA512_HMAC 7 -#define SHA512_HMAC_GEN 8 -#define SHA512_224 9 -#define SHA512_256 10 - -/* - * SHA2 context. - * The contents of this structure are a private interface between the - * Init/Update/Final calls of the functions defined below. - * Callers must never attempt to read or write any of the fields - * in this structure directly. - */ -typedef struct { - uint32_t algotype; /* Algorithm Type */ - - /* state (ABCDEFGH) */ - union { - uint32_t s32[8]; /* for SHA256 */ - uint64_t s64[8]; /* for SHA384/512 */ - } state; - /* number of bits */ - union { - uint32_t c32[2]; /* for SHA256 , modulo 2^64 */ - uint64_t c64[2]; /* for SHA384/512, modulo 2^128 */ - } count; - union { - uint8_t buf8[128]; /* undigested input */ - uint32_t buf32[32]; /* realigned input */ - uint64_t buf64[16]; /* realigned input */ - } buf_un; -} SHA2_CTX; - -typedef SHA2_CTX SHA256_CTX; -typedef SHA2_CTX SHA384_CTX; -typedef SHA2_CTX SHA512_CTX; - -extern void SHA256Init(SHA256_CTX *); - -extern void SHA256Update(SHA256_CTX *, const void *, size_t); - -extern void SHA256Final(void *, SHA256_CTX *); - -extern void SHA384Init(SHA384_CTX *); - -extern void SHA384Update(SHA384_CTX *, const void *, size_t); - -extern void SHA384Final(void *, SHA384_CTX *); - -extern void SHA512Init(SHA512_CTX *); - -extern void SHA512Update(SHA512_CTX *, const void *, size_t); - -extern void SHA512Final(void *, SHA512_CTX *); - -extern void SHA2Init(uint64_t mech, SHA2_CTX *); - -extern void SHA2Update(SHA2_CTX *, const void *, size_t); - -extern void SHA2Final(void *, SHA2_CTX *); - -#ifdef _SHA2_IMPL -/* - * The following types/functions are all private to the implementation - * of the SHA2 functions and must not be used by consumers of the interface - */ - -/* - * List of support mechanisms in this module. - * - * It is important to note that in the module, division or modulus calculations - * are used on the enumerated type to determine which mechanism is being used; - * therefore, changing the order or additional mechanisms should be done - * carefully - */ -typedef enum sha2_mech_type { - SHA256_MECH_INFO_TYPE, /* SUN_CKM_SHA256 */ - SHA256_HMAC_MECH_INFO_TYPE, /* SUN_CKM_SHA256_HMAC */ - SHA256_HMAC_GEN_MECH_INFO_TYPE, /* SUN_CKM_SHA256_HMAC_GENERAL */ - SHA384_MECH_INFO_TYPE, /* SUN_CKM_SHA384 */ - SHA384_HMAC_MECH_INFO_TYPE, /* SUN_CKM_SHA384_HMAC */ - SHA384_HMAC_GEN_MECH_INFO_TYPE, /* SUN_CKM_SHA384_HMAC_GENERAL */ - SHA512_MECH_INFO_TYPE, /* SUN_CKM_SHA512 */ - SHA512_HMAC_MECH_INFO_TYPE, /* SUN_CKM_SHA512_HMAC */ - SHA512_HMAC_GEN_MECH_INFO_TYPE, /* SUN_CKM_SHA512_HMAC_GENERAL */ - SHA512_224_MECH_INFO_TYPE, /* SUN_CKM_SHA512_224 */ - SHA512_256_MECH_INFO_TYPE /* SUN_CKM_SHA512_256 */ -} sha2_mech_type_t; - -#endif /* _SHA2_IMPL */ - -#ifdef __cplusplus -} -#endif - -#endif /* _SYS_SHA2_H */ diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/simd.h b/sys/contrib/openzfs/lib/libspl/include/sys/simd.h index dceedb698fe0..1ef24f5a7d39 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/simd.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/simd.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -20,8 +21,8 @@ * CDDL HEADER END */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. + * Copyright (c) 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright (c) 2022 Tino Reichardt <milky-zfs@mcmilk.de> */ #ifndef _LIBSPL_SYS_SIMD_H @@ -30,6 +31,28 @@ #include <sys/isa_defs.h> #include <sys/types.h> +/* including <sys/auxv.h> clashes with AT_UID and others */ +#if defined(__arm__) || defined(__aarch64__) || defined(__powerpc__) +#if defined(__FreeBSD__) +#define AT_HWCAP 25 +#define AT_HWCAP2 26 +extern int elf_aux_info(int aux, void *buf, int buflen); +static inline unsigned long getauxval(unsigned long key) +{ + unsigned long val = 0UL; + + if (elf_aux_info((int)key, &val, sizeof (val)) != 0) + return (0UL); + + return (val); +} +#elif defined(__linux__) +#define AT_HWCAP 16 +#define AT_HWCAP2 26 +extern unsigned long getauxval(unsigned long type); +#endif /* __linux__ */ +#endif /* arm || aarch64 || powerpc */ + #if defined(__x86) #include <cpuid.h> @@ -78,7 +101,8 @@ typedef enum cpuid_inst_sets { AVX512VL, AES, PCLMULQDQ, - MOVBE + MOVBE, + SHA_NI } cpuid_inst_sets_t; /* @@ -103,6 +127,7 @@ typedef struct cpuid_feature_desc { #define _AES_BIT (1U << 25) #define _PCLMULQDQ_BIT (1U << 1) #define _MOVBE_BIT (1U << 22) +#define _SHA_NI_BIT (1U << 29) /* * Descriptions of supported instruction sets @@ -131,6 +156,7 @@ static const cpuid_feature_desc_t cpuid_features[] = { [AES] = {1U, 0U, _AES_BIT, ECX }, [PCLMULQDQ] = {1U, 0U, _PCLMULQDQ_BIT, ECX }, [MOVBE] = {1U, 0U, _MOVBE_BIT, ECX }, + [SHA_NI] = {7U, 0U, _SHA_NI_BIT, EBX }, }; /* @@ -204,6 +230,7 @@ CPUID_FEATURE_CHECK(avx512vl, AVX512VL); CPUID_FEATURE_CHECK(aes, AES); CPUID_FEATURE_CHECK(pclmulqdq, PCLMULQDQ); CPUID_FEATURE_CHECK(movbe, MOVBE); +CPUID_FEATURE_CHECK(shani, SHA_NI); /* * Detect register set support @@ -346,6 +373,15 @@ zfs_movbe_available(void) } /* + * Check if SHA_NI instruction is available + */ +static inline boolean_t +zfs_shani_available(void) +{ + return (__cpuid_has_shani()); +} + +/* * AVX-512 family of instruction sets: * * AVX512F Foundation @@ -443,53 +479,111 @@ zfs_avx512vbmi_available(void) __zmm_enabled()); } -#elif defined(__aarch64__) +#elif defined(__arm__) #define kfpu_allowed() 1 #define kfpu_initialize(tsk) do {} while (0) #define kfpu_begin() do {} while (0) #define kfpu_end() do {} while (0) -#elif defined(__powerpc__) +#define HWCAP_NEON 0x00001000 +#define HWCAP2_SHA2 0x00000008 + +/* + * Check if NEON is available + */ +static inline boolean_t +zfs_neon_available(void) +{ + unsigned long hwcap = getauxval(AT_HWCAP); + return (hwcap & HWCAP_NEON); +} + +/* + * Check if SHA2 is available + */ +static inline boolean_t +zfs_sha256_available(void) +{ + unsigned long hwcap = getauxval(AT_HWCAP); + return (hwcap & HWCAP2_SHA2); +} + +#elif defined(__aarch64__) #define kfpu_allowed() 1 #define kfpu_initialize(tsk) do {} while (0) #define kfpu_begin() do {} while (0) #define kfpu_end() do {} while (0) +#define HWCAP_FP 0x00000001 +#define HWCAP_SHA2 0x00000040 +#define HWCAP_SHA512 0x00200000 + /* - * Check if AltiVec instruction set is available - * No easy way beyond 'altivec works' :-( + * Check if NEON is available */ -#include <signal.h> -#include <setjmp.h> +static inline boolean_t +zfs_neon_available(void) +{ + unsigned long hwcap = getauxval(AT_HWCAP); + return (hwcap & HWCAP_FP); +} -#if defined(__ALTIVEC__) && !defined(__FreeBSD__) -static jmp_buf env; -static void sigillhandler(int x) +/* + * Check if SHA2 is available + */ +static inline boolean_t +zfs_sha256_available(void) { - longjmp(env, 1); + unsigned long hwcap = getauxval(AT_HWCAP); + return (hwcap & HWCAP_SHA2); } -#endif + +/* + * Check if SHA512 is available + */ +static inline boolean_t +zfs_sha512_available(void) +{ + unsigned long hwcap = getauxval(AT_HWCAP); + return (hwcap & HWCAP_SHA512); +} + +#elif defined(__powerpc__) + +#define kfpu_allowed() 0 +#define kfpu_initialize(tsk) do {} while (0) +#define kfpu_begin() do {} while (0) +#define kfpu_end() do {} while (0) + +#define PPC_FEATURE_HAS_ALTIVEC 0x10000000 +#define PPC_FEATURE_HAS_VSX 0x00000080 +#define PPC_FEATURE2_ARCH_2_07 0x80000000 static inline boolean_t zfs_altivec_available(void) { - boolean_t has_altivec = B_FALSE; -#if defined(__ALTIVEC__) && !defined(__FreeBSD__) - sighandler_t savesig; - savesig = signal(SIGILL, sigillhandler); - if (setjmp(env)) { - signal(SIGILL, savesig); - has_altivec = B_FALSE; - } else { - __asm__ __volatile__("vor 0,0,0\n" : : : "v0"); - signal(SIGILL, savesig); - has_altivec = B_TRUE; - } -#endif - return (has_altivec); + unsigned long hwcap = getauxval(AT_HWCAP); + return (hwcap & PPC_FEATURE_HAS_ALTIVEC); } + +static inline boolean_t +zfs_vsx_available(void) +{ + unsigned long hwcap = getauxval(AT_HWCAP); + return (hwcap & PPC_FEATURE_HAS_VSX); +} + +static inline boolean_t +zfs_isa207_available(void) +{ + unsigned long hwcap = getauxval(AT_HWCAP); + unsigned long hwcap2 = getauxval(AT_HWCAP2); + return ((hwcap & PPC_FEATURE_HAS_VSX) && + (hwcap2 & PPC_FEATURE2_ARCH_2_07)); +} + #else #define kfpu_allowed() 0 @@ -499,4 +593,7 @@ zfs_altivec_available(void) #endif +extern void simd_stat_init(void); +extern void simd_stat_fini(void); + #endif /* _LIBSPL_SYS_SIMD_H */ diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/stack.h b/sys/contrib/openzfs/lib/libspl/include/sys/stack.h index 59807e97b6a0..80984086a145 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/stack.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/stack.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/stdtypes.h b/sys/contrib/openzfs/lib/libspl/include/sys/stdtypes.h index c26e2dc96c4e..db5876e5bc2b 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/stdtypes.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/stdtypes.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/string.h b/sys/contrib/openzfs/lib/libspl/include/sys/string.h new file mode 100644 index 000000000000..3b2f5900276f --- /dev/null +++ b/sys/contrib/openzfs/lib/libspl/include/sys/string.h @@ -0,0 +1 @@ +#include <string.h> diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/strings.h b/sys/contrib/openzfs/lib/libspl/include/sys/strings.h deleted file mode 100644 index c142047dcdb8..000000000000 --- a/sys/contrib/openzfs/lib/libspl/include/sys/strings.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#ifndef _LIBSPL_SYS_STRINGS_H -#define _LIBSPL_SYS_STRINGS_H - -#include <string.h> -#include <strings.h> - -#endif diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/sunddi.h b/sys/contrib/openzfs/lib/libspl/include/sys/sunddi.h index ccd2b29b9b09..8489c7139bad 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/sunddi.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/sunddi.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/systeminfo.h b/sys/contrib/openzfs/lib/libspl/include/sys/systeminfo.h index cc6c1793c00e..3ca1fa884994 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/systeminfo.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/systeminfo.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/time.h b/sys/contrib/openzfs/lib/libspl/include/sys/time.h index c9f6165047d2..da80a5852ae5 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/time.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/time.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -101,7 +102,7 @@ gethrtime(void) { struct timespec ts; (void) clock_gettime(CLOCK_MONOTONIC, &ts); - return ((((u_int64_t)ts.tv_sec) * NANOSEC) + ts.tv_nsec); + return ((((uint64_t)ts.tv_sec) * NANOSEC) + ts.tv_nsec); } #endif /* _LIBSPL_SYS_TIME_H */ diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/types.h b/sys/contrib/openzfs/lib/libspl/include/sys/types.h index ea02ffac93ac..f4bb85c7942e 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/types.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/types.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -37,41 +38,16 @@ #include <sys/feature_tests.h> #include_next <sys/types.h> #include <sys/types32.h> -#include <sys/va_list.h> +#include <stdarg.h> #include <sys/stdtypes.h> #ifndef HAVE_INTTYPES #include <inttypes.h> #endif /* HAVE_INTTYPES */ -typedef int zoneid_t; +typedef uint_t zoneid_t; typedef int projid_t; -/* - * Definitions remaining from previous partial support for 64-bit file - * offsets. This partial support for devices greater than 2gb requires - * compiler support for long long. - */ -#ifdef _LONG_LONG_LTOH -typedef union { - offset_t _f; /* Full 64 bit offset value */ - struct { - int32_t _l; /* lower 32 bits of offset value */ - int32_t _u; /* upper 32 bits of offset value */ - } _p; -} lloff_t; -#endif - -#ifdef _LONG_LONG_HTOL -typedef union { - offset_t _f; /* Full 64 bit offset value */ - struct { - int32_t _u; /* upper 32 bits of offset value */ - int32_t _l; /* lower 32 bits of offset value */ - } _p; -} lloff_t; -#endif - #include <sys/param.h> /* for NBBY */ #endif diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/types32.h b/sys/contrib/openzfs/lib/libspl/include/sys/types32.h index bb41aa34bee0..1bcae20187ad 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/types32.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/types32.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -65,11 +66,6 @@ typedef int32_t ssize32_t; typedef int32_t time32_t; typedef int32_t clock32_t; -struct timeval32 { - time32_t tv_sec; /* seconds */ - int32_t tv_usec; /* and microseconds */ -}; - typedef struct timespec32 { time32_t tv_sec; /* seconds */ int32_t tv_nsec; /* and nanoseconds */ diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/tzfile.h b/sys/contrib/openzfs/lib/libspl/include/sys/tzfile.h deleted file mode 100644 index e30e7566366e..000000000000 --- a/sys/contrib/openzfs/lib/libspl/include/sys/tzfile.h +++ /dev/null @@ -1,164 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2007 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -/* - * from Arthur Olson's 6.1 - */ - -#ifndef _LIBSPL_SYS_TZFILE_H -#define _LIBSPL_SYS_TZFILE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Information about time zone files. - */ - -#define TZDIR "/usr/share/lib/zoneinfo" /* Time zone object file directory */ - -#define TZDEFAULT (getenv("TZ")) - -#define TZDEFRULES "posixrules" - -/* - * Each file begins with. . . - */ - -struct tzhead { - char tzh_reserved[24]; /* reserved for future use */ - char tzh_ttisstdcnt[4]; /* coded number of trans. time flags */ - char tzh_leapcnt[4]; /* coded number of leap seconds */ - char tzh_timecnt[4]; /* coded number of transition times */ - char tzh_typecnt[4]; /* coded number of local time types */ - char tzh_charcnt[4]; /* coded number of abbr. chars */ -}; - -/* - * . . .followed by. . . - * - * tzh_timecnt (char [4])s coded transition times a la time(2) - * tzh_timecnt (unsigned char)s types of local time starting at above - * tzh_typecnt repetitions of - * one (char [4]) coded GMT offset in seconds - * one (unsigned char) used to set tm_isdst - * one (unsigned char) that's an abbreviation list index - * tzh_charcnt (char)s '\0'-terminated zone abbreviations - * tzh_leapcnt repetitions of - * one (char [4]) coded leap second transition times - * one (char [4]) total correction after above - * tzh_ttisstdcnt (char)s indexed by type; if TRUE, transition - * time is standard time, if FALSE, - * transition time is wall clock time - * if absent, transition times are - * assumed to be wall clock time - */ - -/* - * In the current implementation, "tzset()" refuses to deal with files that - * exceed any of the limits below. - */ - -/* - * The TZ_MAX_TIMES value below is enough to handle a bit more than a - * year's worth of solar time (corrected daily to the nearest second) or - * 138 years of Pacific Presidential Election time - * (where there are three time zone transitions every fourth year). - */ -#define TZ_MAX_TIMES 370 - -#define TZ_MAX_TYPES 256 /* Limited by what (unsigned char)'s can hold */ - -#define TZ_MAX_CHARS 50 /* Maximum number of abbreviation characters */ - -#define TZ_MAX_LEAPS 50 /* Maximum number of leap second corrections */ - -#define SECSPERMIN 60 -#define MINSPERHOUR 60 -#define HOURSPERDAY 24 -#define DAYSPERWEEK 7 -#define DAYSPERNYEAR 365 -#define DAYSPERLYEAR 366 -#define SECSPERHOUR (SECSPERMIN * MINSPERHOUR) -#define SECSPERDAY ((long)SECSPERHOUR * HOURSPERDAY) -#define MONSPERYEAR 12 - -#define TM_SUNDAY 0 -#define TM_MONDAY 1 -#define TM_TUESDAY 2 -#define TM_WEDNESDAY 3 -#define TM_THURSDAY 4 -#define TM_FRIDAY 5 -#define TM_SATURDAY 6 - -#define TM_JANUARY 0 -#define TM_FEBRUARY 1 -#define TM_MARCH 2 -#define TM_APRIL 3 -#define TM_MAY 4 -#define TM_JUNE 5 -#define TM_JULY 6 -#define TM_AUGUST 7 -#define TM_SEPTEMBER 8 -#define TM_OCTOBER 9 -#define TM_NOVEMBER 10 -#define TM_DECEMBER 11 - -#define TM_YEAR_BASE 1900 - -#define EPOCH_YEAR 1970 -#define EPOCH_WDAY TM_THURSDAY - -/* - * Accurate only for the past couple of centuries; - * that will probably do. - */ - -#define isleap(y) (((y) % 4) == 0 && ((y) % 100) != 0 || ((y) % 400) == 0) - -/* - * Use of the underscored variants may cause problems if you move your code to - * certain System-V-based systems; for maximum portability, use the - * underscore-free variants. The underscored variants are provided for - * backward compatibility only; they may disappear from future versions of - * this file. - */ - -#define SECS_PER_MIN SECSPERMIN -#define MINS_PER_HOUR MINSPERHOUR -#define HOURS_PER_DAY HOURSPERDAY -#define DAYS_PER_WEEK DAYSPERWEEK -#define DAYS_PER_NYEAR DAYSPERNYEAR -#define DAYS_PER_LYEAR DAYSPERLYEAR -#define SECS_PER_HOUR SECSPERHOUR -#define SECS_PER_DAY SECSPERDAY -#define MONS_PER_YEAR MONSPERYEAR - -#ifdef __cplusplus -} -#endif - -#endif /* _LIBSPL_SYS_TZFILE_H */ diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/uio.h b/sys/contrib/openzfs/lib/libspl/include/sys/uio.h index 81ade54b5409..93aa4984d734 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/uio.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/uio.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -57,8 +58,7 @@ typedef enum zfs_uio_rw { } zfs_uio_rw_t; typedef enum zfs_uio_seg { - UIO_USERSPACE = 0, - UIO_SYSSPACE = 1, + UIO_SYSSPACE = 0, } zfs_uio_seg_t; #elif defined(__FreeBSD__) @@ -82,6 +82,32 @@ typedef struct zfs_uio { #define zfs_uio_iovlen(uio, idx) (uio)->uio_iov[(idx)].iov_len #define zfs_uio_iovbase(uio, idx) (uio)->uio_iov[(idx)].iov_base +static inline boolean_t +zfs_dio_page_aligned(void *buf) +{ + return ((((unsigned long)(buf) & (PAGESIZE - 1)) == 0) ? + B_TRUE : B_FALSE); +} + +static inline boolean_t +zfs_dio_offset_aligned(uint64_t offset, uint64_t blksz) +{ + return ((IS_P2ALIGNED(offset, blksz)) ? B_TRUE : B_FALSE); +} + +static inline boolean_t +zfs_dio_size_aligned(uint64_t size, uint64_t blksz) +{ + return (((size % blksz) == 0) ? B_TRUE : B_FALSE); +} + +static inline boolean_t +zfs_dio_aligned(uint64_t offset, uint64_t size, uint64_t blksz) +{ + return ((zfs_dio_offset_aligned(offset, blksz) && + zfs_dio_size_aligned(size, blksz)) ? B_TRUE : B_FALSE); +} + static inline void zfs_uio_iov_at_index(zfs_uio_t *uio, uint_t idx, void **base, uint64_t *len) { @@ -90,7 +116,7 @@ zfs_uio_iov_at_index(zfs_uio_t *uio, uint_t idx, void **base, uint64_t *len) } static inline void -zfs_uio_advance(zfs_uio_t *uio, size_t size) +zfs_uio_advance(zfs_uio_t *uio, ssize_t size) { uio->uio_resid -= size; uio->uio_loffset += size; diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/varargs.h b/sys/contrib/openzfs/lib/libspl/include/sys/varargs.h deleted file mode 100644 index 3d00a3361d87..000000000000 --- a/sys/contrib/openzfs/lib/libspl/include/sys/varargs.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#ifndef _LIBSPL_SYS_VARARGS_H -#define _LIBSPL_SYS_VARARGS_H - -#endif diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/vnode.h b/sys/contrib/openzfs/lib/libspl/include/sys/vnode.h index efcdd2c5a5ae..49afe12c52b1 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/vnode.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/vnode.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/vtoc.h b/sys/contrib/openzfs/lib/libspl/include/sys/vtoc.h deleted file mode 100644 index 5d8448b628dc..000000000000 --- a/sys/contrib/openzfs/lib/libspl/include/sys/vtoc.h +++ /dev/null @@ -1,350 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ - -/* - * Copyright 2009 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - - -/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ -/* All Rights Reserved */ - - -#ifndef _SYS_VTOC_H -#define _SYS_VTOC_H - -#include <sys/dklabel.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Note: the VTOC is not implemented fully, nor in the manner - * that AT&T implements it. AT&T puts the vtoc structure - * into a sector, usually the second sector (pdsector is first). - * - * Sun incorporates the tag, flag, version, and volume vtoc fields into - * its Disk Label, which already has some vtoc-equivalent fields. - * Upon reading the vtoc with read_vtoc(), the following exceptions - * occur: - * v_bootinfo [all] returned as zero - * v_sanity returned as VTOC_SANE - * if Disk Label was sane - * v_sectorsz returned as 512 - * v_reserved [all] returned as zero - * timestamp [all] returned as zero - * - * See dklabel.h, read_vtoc(), and write_vtoc(). - */ - -#define V_NUMPAR NDKMAP /* The number of partitions */ - /* (from dkio.h) */ - -#define VTOC_SANE 0x600DDEEE /* Indicates a sane VTOC */ -#define V_VERSION 0x01 /* layout version number */ -#define V_EXTVERSION V_VERSION /* extvtoc layout version number */ - -/* - * Partition identification tags - */ -#define V_UNASSIGNED 0x00 /* unassigned partition */ -#define V_BOOT 0x01 /* Boot partition */ -#define V_ROOT 0x02 /* Root filesystem */ -#define V_SWAP 0x03 /* Swap filesystem */ -#define V_USR 0x04 /* Usr filesystem */ -#define V_BACKUP 0x05 /* full disk */ -#define V_STAND 0x06 /* Stand partition */ -#define V_VAR 0x07 /* Var partition */ -#define V_HOME 0x08 /* Home partition */ -#define V_ALTSCTR 0x09 /* Alternate sector partition */ -#define V_CACHE 0x0a /* Cache (cachefs) partition */ -#define V_RESERVED 0x0b /* SMI reserved data */ - -/* - * Partition permission flags - */ -#define V_UNMNT 0x01 /* Unmountable partition */ -#define V_RONLY 0x10 /* Read only */ - -/* - * error codes for reading & writing vtoc - */ -#define VT_ERROR (-2) /* errno supplies specific error */ -#define VT_EIO (-3) /* I/O error accessing vtoc */ -#define VT_EINVAL (-4) /* illegal value in vtoc or request */ -#define VT_ENOTSUP (-5) /* VTOC op. not supported */ -#define VT_ENOSPC (-6) /* requested space not found */ -#define VT_EOVERFLOW (-7) /* VTOC op. data struct limited */ - -struct partition { - ushort_t p_tag; /* ID tag of partition */ - ushort_t p_flag; /* permission flags */ - uint64_t p_start; /* start sector no of partition */ - long p_size; /* # of blocks in partition */ -}; - -struct vtoc { - unsigned long v_bootinfo[3]; /* info needed by mboot (unsupported) */ - unsigned long v_sanity; /* to verify vtoc sanity */ - unsigned long v_version; /* layout version */ - char v_volume[LEN_DKL_VVOL]; /* volume name */ - ushort_t v_sectorsz; /* sector size in bytes */ - ushort_t v_nparts; /* number of partitions */ - unsigned long v_reserved[10]; /* free space */ - struct partition v_part[V_NUMPAR]; /* partition headers */ - time_t timestamp[V_NUMPAR]; /* partition timestamp (unsupported) */ - char v_asciilabel[LEN_DKL_ASCII]; /* for compatibility */ -}; - -struct extpartition { - ushort_t p_tag; /* ID tag of partition */ - ushort_t p_flag; /* permission flags */ - ushort_t p_pad[2]; - diskaddr_t p_start; /* start sector no of partition */ - diskaddr_t p_size; /* # of blocks in partition */ -}; - - -struct extvtoc { - uint64_t v_bootinfo[3]; /* info needed by mboot (unsupported) */ - uint64_t v_sanity; /* to verify vtoc sanity */ - uint64_t v_version; /* layout version */ - char v_volume[LEN_DKL_VVOL]; /* volume name */ - ushort_t v_sectorsz; /* sector size in bytes */ - ushort_t v_nparts; /* number of partitions */ - ushort_t pad[2]; - uint64_t v_reserved[10]; - struct extpartition v_part[V_NUMPAR]; /* partition headers */ - uint64_t timestamp[V_NUMPAR]; /* partition timestamp (unsupported) */ - char v_asciilabel[LEN_DKL_ASCII]; /* for compatibility */ -}; - -#ifdef _KERNEL -#define extvtoctovtoc(extv, v) \ - { \ - int i; \ - v.v_bootinfo[0] = (unsigned long)extv.v_bootinfo[0]; \ - v.v_bootinfo[1] = (unsigned long)extv.v_bootinfo[1]; \ - v.v_bootinfo[2] = (unsigned long)extv.v_bootinfo[2]; \ - v.v_sanity = (unsigned long)extv.v_sanity; \ - v.v_version = (unsigned long)extv.v_version; \ - bcopy(extv.v_volume, v.v_volume, LEN_DKL_VVOL); \ - v.v_sectorsz = extv.v_sectorsz; \ - v.v_nparts = extv.v_nparts; \ - for (i = 0; i < 10; i++) \ - v.v_reserved[i] = (unsigned long)extv.v_reserved[i]; \ - for (i = 0; i < V_NUMPAR; i++) { \ - v.v_part[i].p_tag = extv.v_part[i].p_tag; \ - v.v_part[i].p_flag = extv.v_part[i].p_flag; \ - v.v_part[i].p_start = (uint64_t)extv.v_part[i].p_start; \ - v.v_part[i].p_size = (long)extv.v_part[i].p_size; \ - v.timestamp[i] = (time_t)extv.timestamp[i]; \ - } \ - bcopy(extv.v_asciilabel, v.v_asciilabel, LEN_DKL_ASCII); \ - } - -#define vtoctoextvtoc(v, extv) \ - { \ - int i; \ - extv.v_bootinfo[0] = (uint64_t)v.v_bootinfo[0]; \ - extv.v_bootinfo[1] = (uint64_t)v.v_bootinfo[1]; \ - extv.v_bootinfo[2] = (uint64_t)v.v_bootinfo[2]; \ - extv.v_sanity = (uint64_t)v.v_sanity; \ - extv.v_version = (uint64_t)v.v_version; \ - bcopy(v.v_volume, extv.v_volume, LEN_DKL_VVOL); \ - extv.v_sectorsz = v.v_sectorsz; \ - extv.v_nparts = v.v_nparts; \ - for (i = 0; i < 10; i++) \ - extv.v_reserved[i] = (uint64_t)v.v_reserved[i]; \ - for (i = 0; i < V_NUMPAR; i++) { \ - extv.v_part[i].p_tag = v.v_part[i].p_tag; \ - extv.v_part[i].p_flag = v.v_part[i].p_flag; \ - extv.v_part[i].p_start = \ - (diskaddr_t)(unsigned long)v.v_part[i].p_start; \ - extv.v_part[i].p_size = \ - (diskaddr_t)(unsigned long)v.v_part[i].p_size; \ - extv.timestamp[i] = (uint64_t)v.timestamp[i]; \ - } \ - bcopy(v.v_asciilabel, extv.v_asciilabel, LEN_DKL_ASCII); \ - } -#endif /* _KERNEL */ - -#if defined(_SYSCALL32) -struct partition32 { - uint16_t p_tag; /* ID tag of partition */ - uint16_t p_flag; /* permission flags */ - daddr32_t p_start; /* start sector no of partition */ - int32_t p_size; /* # of blocks in partition */ -}; - -struct vtoc32 { - uint32_t v_bootinfo[3]; /* info needed by mboot (unsupported) */ - uint32_t v_sanity; /* to verify vtoc sanity */ - uint32_t v_version; /* layout version */ - char v_volume[LEN_DKL_VVOL]; /* volume name */ - uint16_t v_sectorsz; /* sector size in bytes */ - uint16_t v_nparts; /* number of partitions */ - uint32_t v_reserved[10]; /* free space */ - struct partition32 v_part[V_NUMPAR]; /* partition headers */ - time32_t timestamp[V_NUMPAR]; /* partition timestamp (unsupported) */ - char v_asciilabel[LEN_DKL_ASCII]; /* for compatibility */ -}; - -#define vtoc32tovtoc(v32, v) \ - { \ - int i; \ - v.v_bootinfo[0] = v32.v_bootinfo[0]; \ - v.v_bootinfo[1] = v32.v_bootinfo[1]; \ - v.v_bootinfo[2] = v32.v_bootinfo[2]; \ - v.v_sanity = v32.v_sanity; \ - v.v_version = v32.v_version; \ - bcopy(v32.v_volume, v.v_volume, LEN_DKL_VVOL); \ - v.v_sectorsz = v32.v_sectorsz; \ - v.v_nparts = v32.v_nparts; \ - v.v_version = v32.v_version; \ - for (i = 0; i < 10; i++) \ - v.v_reserved[i] = v32.v_reserved[i]; \ - for (i = 0; i < V_NUMPAR; i++) { \ - v.v_part[i].p_tag = (ushort_t)v32.v_part[i].p_tag; \ - v.v_part[i].p_flag = (ushort_t)v32.v_part[i].p_flag; \ - v.v_part[i].p_start = (unsigned)v32.v_part[i].p_start; \ - v.v_part[i].p_size = (unsigned)v32.v_part[i].p_size; \ - } \ - for (i = 0; i < V_NUMPAR; i++) \ - v.timestamp[i] = (time_t)v32.timestamp[i]; \ - bcopy(v32.v_asciilabel, v.v_asciilabel, LEN_DKL_ASCII); \ - } - -#define vtoc32toextvtoc(v32, extv) \ - { \ - int i; \ - extv.v_bootinfo[0] = v32.v_bootinfo[0]; \ - extv.v_bootinfo[1] = v32.v_bootinfo[1]; \ - extv.v_bootinfo[2] = v32.v_bootinfo[2]; \ - extv.v_sanity = v32.v_sanity; \ - extv.v_version = v32.v_version; \ - bcopy(v32.v_volume, extv.v_volume, LEN_DKL_VVOL); \ - extv.v_sectorsz = v32.v_sectorsz; \ - extv.v_nparts = v32.v_nparts; \ - extv.v_version = v32.v_version; \ - for (i = 0; i < 10; i++) \ - extv.v_reserved[i] = v32.v_reserved[i]; \ - for (i = 0; i < V_NUMPAR; i++) { \ - extv.v_part[i].p_tag = (ushort_t)v32.v_part[i].p_tag; \ - extv.v_part[i].p_flag = (ushort_t)v32.v_part[i].p_flag; \ - extv.v_part[i].p_start = (diskaddr_t)v32.v_part[i].p_start; \ - extv.v_part[i].p_size = (diskaddr_t)v32.v_part[i].p_size; \ - extv.timestamp[i] = (time_t)v32.timestamp[i]; \ - } \ - bcopy(v32.v_asciilabel, extv.v_asciilabel, LEN_DKL_ASCII); \ - } - - -#define vtoctovtoc32(v, v32) \ - { \ - int i; \ - v32.v_bootinfo[0] = v.v_bootinfo[0]; \ - v32.v_bootinfo[1] = v.v_bootinfo[1]; \ - v32.v_bootinfo[2] = v.v_bootinfo[2]; \ - v32.v_sanity = v.v_sanity; \ - v32.v_version = v.v_version; \ - bcopy(v.v_volume, v32.v_volume, LEN_DKL_VVOL); \ - v32.v_sectorsz = v.v_sectorsz; \ - v32.v_nparts = v.v_nparts; \ - v32.v_version = v.v_version; \ - for (i = 0; i < 10; i++) \ - v32.v_reserved[i] = v.v_reserved[i]; \ - for (i = 0; i < V_NUMPAR; i++) { \ - v32.v_part[i].p_tag = (ushort_t)v.v_part[i].p_tag; \ - v32.v_part[i].p_flag = (ushort_t)v.v_part[i].p_flag; \ - v32.v_part[i].p_start = (unsigned)v.v_part[i].p_start; \ - v32.v_part[i].p_size = (unsigned)v.v_part[i].p_size; \ - } \ - for (i = 0; i < V_NUMPAR; i++) { \ - if (v.timestamp[i] > TIME32_MAX) \ - v32.timestamp[i] = TIME32_MAX; \ - else \ - v32.timestamp[i] = (time32_t)v.timestamp[i]; \ - } \ - bcopy(v.v_asciilabel, v32.v_asciilabel, LEN_DKL_ASCII); \ - } - -#define extvtoctovtoc32(extv, v32) \ - { \ - int i; \ - v32.v_bootinfo[0] = extv.v_bootinfo[0]; \ - v32.v_bootinfo[1] = extv.v_bootinfo[1]; \ - v32.v_bootinfo[2] = extv.v_bootinfo[2]; \ - v32.v_sanity = extv.v_sanity; \ - v32.v_version = extv.v_version; \ - bcopy(extv.v_volume, v32.v_volume, LEN_DKL_VVOL); \ - v32.v_sectorsz = extv.v_sectorsz; \ - v32.v_nparts = extv.v_nparts; \ - v32.v_version = extv.v_version; \ - for (i = 0; i < 10; i++) \ - v32.v_reserved[i] = extv.v_reserved[i]; \ - for (i = 0; i < V_NUMPAR; i++) { \ - v32.v_part[i].p_tag = (ushort_t)extv.v_part[i].p_tag; \ - v32.v_part[i].p_flag = (ushort_t)extv.v_part[i].p_flag; \ - v32.v_part[i].p_start = (unsigned)extv.v_part[i].p_start; \ - v32.v_part[i].p_size = (unsigned)extv.v_part[i].p_size; \ - } \ - for (i = 0; i < V_NUMPAR; i++) { \ - if (extv.timestamp[i] > TIME32_MAX) \ - v32.timestamp[i] = TIME32_MAX; \ - else \ - v32.timestamp[i] = (time32_t)extv.timestamp[i]; \ - } \ - bcopy(extv.v_asciilabel, v32.v_asciilabel, LEN_DKL_ASCII); \ - } - - -#endif /* _SYSCALL32 */ - -/* - * These defines are the mode parameter for the checksum routines. - */ -#define CK_CHECKSUM 0 /* check checksum */ -#define CK_MAKESUM 1 /* generate checksum */ - -#if defined(__STDC__) - -extern int read_vtoc(int, struct vtoc *); -extern int write_vtoc(int, struct vtoc *); -extern int read_extvtoc(int, struct extvtoc *); -extern int write_extvtoc(int, struct extvtoc *); - -#else - -extern int read_vtoc(); -extern int write_vtoc(); -extern int read_extvtoc(); -extern int write_extvtoc(); - -#endif /* __STDC__ */ - -#ifdef __cplusplus -} -#endif - -#endif /* _SYS_VTOC_H */ diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/wmsum.h b/sys/contrib/openzfs/lib/libspl/include/sys/wmsum.h index 0679af73ce91..36e37f9e17d4 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/wmsum.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/wmsum.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/zone.h b/sys/contrib/openzfs/lib/libspl/include/sys/zone.h index bbb964dcef22..f4037b4875a9 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/zone.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/zone.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/thread.h b/sys/contrib/openzfs/lib/libspl/include/thread.h deleted file mode 100644 index 74694e23eed5..000000000000 --- a/sys/contrib/openzfs/lib/libspl/include/thread.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2009 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#ifndef _LIBSPL_THREAD_H -#define _LIBSPL_THREAD_H - -#endif /* _LIBSPL_THREAD_H */ diff --git a/sys/contrib/openzfs/lib/libspl/include/tzfile.h b/sys/contrib/openzfs/lib/libspl/include/tzfile.h deleted file mode 100644 index 7bd4087cd5d1..000000000000 --- a/sys/contrib/openzfs/lib/libspl/include/tzfile.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2007 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#ifndef _LIBSPL_TZFILE_H -#define _LIBSPL_TZFILE_H - -#include <sys/tzfile.h> - -#endif /* _LIBSPL_TZFILE_H */ diff --git a/sys/contrib/openzfs/lib/libspl/include/ucred.h b/sys/contrib/openzfs/lib/libspl/include/ucred.h deleted file mode 100644 index 8178fdec4c74..000000000000 --- a/sys/contrib/openzfs/lib/libspl/include/ucred.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2007 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#ifndef _LIBSPL_UCRED_H -#define _LIBSPL_UCRED_H - -typedef int ucred_t; - -#endif diff --git a/sys/contrib/openzfs/lib/libspl/include/umem.h b/sys/contrib/openzfs/lib/libspl/include/umem.h index 65f12595e64f..6945aae9f3ce 100644 --- a/sys/contrib/openzfs/lib/libspl/include/umem.h +++ b/sys/contrib/openzfs/lib/libspl/include/umem.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -83,6 +84,7 @@ const char *_umem_debug_init(void); const char *_umem_options_init(void); const char *_umem_logging_init(void); +__attribute__((malloc, alloc_size(1))) static inline void * umem_alloc(size_t size, int flags) { @@ -95,6 +97,7 @@ umem_alloc(size_t size, int flags) return (ptr); } +__attribute__((malloc, alloc_size(1))) static inline void * umem_alloc_aligned(size_t size, size_t align, int flags) { @@ -116,6 +119,7 @@ umem_alloc_aligned(size_t size, size_t align, int flags) return (ptr); } +__attribute__((malloc, alloc_size(1))) static inline void * umem_zalloc(size_t size, int flags) { @@ -129,9 +133,24 @@ umem_zalloc(size_t size, int flags) } static inline void -umem_free(void *ptr, size_t size __maybe_unused) +umem_free(const void *ptr, size_t size __maybe_unused) { - free(ptr); + free((void *)ptr); +} + +/* + * umem_free_aligned was added for supporting portability + * with non-POSIX platforms that require a different free + * to be used with aligned allocations. + */ +static inline void +umem_free_aligned(void *ptr, size_t size __maybe_unused) +{ +#ifndef _WIN32 + free((void *)ptr); +#else + _aligned_free(ptr); +#endif } static inline void @@ -140,7 +159,7 @@ umem_nofail_callback(umem_nofail_callback_t *cb __maybe_unused) static inline umem_cache_t * umem_cache_create( - char *name, size_t bufsize, size_t align, + const char *name, size_t bufsize, size_t align, umem_constructor_t *constructor, umem_destructor_t *destructor, umem_reclaim_t *reclaim, @@ -170,6 +189,7 @@ umem_cache_destroy(umem_cache_t *cp) umem_free(cp, sizeof (umem_cache_t)); } +__attribute__((malloc)) static inline void * umem_cache_alloc(umem_cache_t *cp, int flags) { @@ -193,7 +213,10 @@ umem_cache_free(umem_cache_t *cp, void *ptr) if (cp->cache_destructor) cp->cache_destructor(ptr, cp->cache_private); - umem_free(ptr, cp->cache_bufsize); + if (cp->cache_align != 0) + umem_free_aligned(ptr, cp->cache_bufsize); + else + umem_free(ptr, cp->cache_bufsize); } static inline void diff --git a/sys/contrib/openzfs/lib/libspl/include/unistd.h b/sys/contrib/openzfs/lib/libspl/include/unistd.h index 0246991b4b61..6d755eb8ad91 100644 --- a/sys/contrib/openzfs/lib/libspl/include/unistd.h +++ b/sys/contrib/openzfs/lib/libspl/include/unistd.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/include/util/Makefile.am b/sys/contrib/openzfs/lib/libspl/include/util/Makefile.am deleted file mode 100644 index ab553bc80313..000000000000 --- a/sys/contrib/openzfs/lib/libspl/include/util/Makefile.am +++ /dev/null @@ -1,3 +0,0 @@ -libspldir = $(includedir)/libspl -libspl_HEADERS = \ - sscanf.h diff --git a/sys/contrib/openzfs/lib/libspl/include/util/sscanf.h b/sys/contrib/openzfs/lib/libspl/include/util/sscanf.h deleted file mode 100644 index ead36acaba3e..000000000000 --- a/sys/contrib/openzfs/lib/libspl/include/util/sscanf.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2010 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#ifndef _LIBSPL_UTIL_SSCANF_H -#define _LIBSPL_UTIL_SSCANF_H - -#endif diff --git a/sys/contrib/openzfs/lib/libspl/include/zone.h b/sys/contrib/openzfs/lib/libspl/include/zone.h index b0ac2d9bc610..f946c0f13f77 100644 --- a/sys/contrib/openzfs/lib/libspl/include/zone.h +++ b/sys/contrib/openzfs/lib/libspl/include/zone.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -33,7 +34,17 @@ extern "C" { #endif -#define GLOBAL_ZONEID 0 +#ifdef __FreeBSD__ +#define GLOBAL_ZONEID 0 +#else +/* + * Hardcoded in the kernel's root user namespace. A "better" way to get + * this would be by using ioctl_ns(2), but this would need to be performed + * recursively on NS_GET_PARENT and then NS_GET_USERNS. Also, that's only + * supported since Linux 4.9. + */ +#define GLOBAL_ZONEID 4026531837U +#endif extern zoneid_t getzoneid(void); diff --git a/sys/contrib/openzfs/lib/libspl/libspl_impl.h b/sys/contrib/openzfs/lib/libspl/libspl_impl.h index cda56e64c962..39392da09ef5 100644 --- a/sys/contrib/openzfs/lib/libspl/libspl_impl.h +++ b/sys/contrib/openzfs/lib/libspl/libspl_impl.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/list.c b/sys/contrib/openzfs/lib/libspl/list.c index 0f2f3731b235..f95b358153de 100644 --- a/sys/contrib/openzfs/lib/libspl/list.c +++ b/sys/contrib/openzfs/lib/libspl/list.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -65,7 +66,8 @@ list_create(list_t *list, size_t size, size_t offset) ASSERT(size > 0); ASSERT(size >= offset + sizeof (list_node_t)); - list->list_size = size; + (void) size; + list->list_offset = offset; list->list_head.next = list->list_head.prev = &list->list_head; } @@ -194,7 +196,6 @@ list_move_tail(list_t *dst, list_t *src) list_node_t *dstnode = &dst->list_head; list_node_t *srcnode = &src->list_head; - ASSERT(dst->list_size == src->list_size); ASSERT(dst->list_offset == src->list_offset); if (list_empty(src)) diff --git a/sys/contrib/openzfs/lib/libspl/mkdirp.c b/sys/contrib/openzfs/lib/libspl/mkdirp.c index fce2c1c82eb7..80198dfbecba 100644 --- a/sys/contrib/openzfs/lib/libspl/mkdirp.c +++ b/sys/contrib/openzfs/lib/libspl/mkdirp.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/os/freebsd/getexecname.c b/sys/contrib/openzfs/lib/libspl/os/freebsd/getexecname.c index 256b28c1b70e..49c0ce3a2432 100644 --- a/sys/contrib/openzfs/lib/libspl/os/freebsd/getexecname.c +++ b/sys/contrib/openzfs/lib/libspl/os/freebsd/getexecname.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/os/freebsd/gethostid.c b/sys/contrib/openzfs/lib/libspl/os/freebsd/gethostid.c index 7bd567fe61b5..bd0f3ee5a075 100644 --- a/sys/contrib/openzfs/lib/libspl/os/freebsd/gethostid.c +++ b/sys/contrib/openzfs/lib/libspl/os/freebsd/gethostid.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/os/freebsd/getmntany.c b/sys/contrib/openzfs/lib/libspl/os/freebsd/getmntany.c index 0ef24059e84f..baff124b4a40 100644 --- a/sys/contrib/openzfs/lib/libspl/os/freebsd/getmntany.c +++ b/sys/contrib/openzfs/lib/libspl/os/freebsd/getmntany.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -36,6 +37,7 @@ #include <sys/sysmacros.h> #include <sys/stat.h> #include <unistd.h> +#include <libzutil.h> int getextmntent(const char *path, struct extmnttab *entry, struct stat64 *statbuf) @@ -49,13 +51,13 @@ getextmntent(const char *path, struct extmnttab *entry, struct stat64 *statbuf) if (stat64(path, statbuf) != 0) { (void) fprintf(stderr, "cannot open '%s': %s\n", - path, strerror(errno)); + path, zfs_strerror(errno)); return (-1); } if (statfs(path, &sfs) != 0) { (void) fprintf(stderr, "%s: %s\n", path, - strerror(errno)); + zfs_strerror(errno)); return (-1); } statfs2mnttab(&sfs, (struct mnttab *)entry); diff --git a/sys/contrib/openzfs/lib/libspl/os/freebsd/mnttab.c b/sys/contrib/openzfs/lib/libspl/os/freebsd/mnttab.c index bd3e3e4e3eef..5287da132966 100644 --- a/sys/contrib/openzfs/lib/libspl/os/freebsd/mnttab.c +++ b/sys/contrib/openzfs/lib/libspl/os/freebsd/mnttab.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: BSD-2-Clause /* * Copyright (c) 2006 Pawel Jakub Dawidek <pjd@FreeBSD.org> * All rights reserved. @@ -29,9 +30,6 @@ * functions. */ -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - #include <sys/param.h> #include <sys/mount.h> #include <sys/mntent.h> @@ -39,6 +37,7 @@ __FBSDID("$FreeBSD$"); #include <ctype.h> #include <errno.h> +#include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -66,14 +65,14 @@ mntopt(char **p) } char * -hasmntopt(struct mnttab *mnt, char *opt) +hasmntopt(struct mnttab *mnt, const char *opt) { char tmpopts[MNT_LINE_MAX]; char *f, *opts = tmpopts; if (mnt->mnt_mntopts == NULL) return (NULL); - (void) strcpy(opts, mnt->mnt_mntopts); + (void) strlcpy(opts, mnt->mnt_mntopts, MNT_LINE_MAX); f = mntopt(&opts); for (; *f; f = mntopt(&opts)) { if (strncmp(opt, f, strlen(opt)) == 0) @@ -91,16 +90,28 @@ optadd(char *mntopts, size_t size, const char *opt) strlcat(mntopts, opt, size); } +static __thread char gfstypename[MFSNAMELEN]; +static __thread char gmntfromname[MNAMELEN]; +static __thread char gmntonname[MNAMELEN]; +static __thread char gmntopts[MNTMAXSTR]; + void statfs2mnttab(struct statfs *sfs, struct mnttab *mp) { - static char mntopts[MNTMAXSTR]; long flags; - mntopts[0] = '\0'; + strlcpy(gfstypename, sfs->f_fstypename, sizeof (gfstypename)); + mp->mnt_fstype = gfstypename; + + strlcpy(gmntfromname, sfs->f_mntfromname, sizeof (gmntfromname)); + mp->mnt_special = gmntfromname; + + strlcpy(gmntonname, sfs->f_mntonname, sizeof (gmntonname)); + mp->mnt_mountp = gmntonname; flags = sfs->f_flags; -#define OPTADD(opt) optadd(mntopts, sizeof (mntopts), (opt)) + gmntopts[0] = '\0'; +#define OPTADD(opt) optadd(gmntopts, sizeof (gmntopts), (opt)) if (flags & MNT_RDONLY) OPTADD(MNTOPT_RO); else @@ -121,12 +132,10 @@ statfs2mnttab(struct statfs *sfs, struct mnttab *mp) else OPTADD(MNTOPT_EXEC); #undef OPTADD - mp->mnt_special = strdup(sfs->f_mntfromname); - mp->mnt_mountp = strdup(sfs->f_mntonname); - mp->mnt_fstype = strdup(sfs->f_fstypename); - mp->mnt_mntopts = strdup(mntopts); + mp->mnt_mntopts = gmntopts; } +static pthread_rwlock_t gsfs_lock = PTHREAD_RWLOCK_INITIALIZER; static struct statfs *gsfs = NULL; static int allfs = 0; @@ -136,6 +145,8 @@ statfs_init(void) struct statfs *sfs; int error; + (void) pthread_rwlock_wrlock(&gsfs_lock); + if (gsfs != NULL) { free(gsfs); gsfs = NULL; @@ -153,6 +164,7 @@ statfs_init(void) sfs = realloc(gsfs, allfs * sizeof (gsfs[0])); if (sfs != NULL) gsfs = sfs; + (void) pthread_rwlock_unlock(&gsfs_lock); return (0); fail: error = errno; @@ -160,19 +172,21 @@ fail: free(gsfs); gsfs = NULL; allfs = 0; + (void) pthread_rwlock_unlock(&gsfs_lock); return (error); } int getmntany(FILE *fd __unused, struct mnttab *mgetp, struct mnttab *mrefp) { - // struct statfs *sfs; int i, error; error = statfs_init(); if (error != 0) return (error); + (void) pthread_rwlock_rdlock(&gsfs_lock); + for (i = 0; i < allfs; i++) { if (mrefp->mnt_special != NULL && strcmp(mrefp->mnt_special, gsfs[i].f_mntfromname) != 0) { @@ -187,15 +201,16 @@ getmntany(FILE *fd __unused, struct mnttab *mgetp, struct mnttab *mrefp) continue; } statfs2mnttab(&gsfs[i], mgetp); + (void) pthread_rwlock_unlock(&gsfs_lock); return (0); } + (void) pthread_rwlock_unlock(&gsfs_lock); return (-1); } int getmntent(FILE *fp, struct mnttab *mp) { - // struct statfs *sfs; int error, nfs; nfs = (int)lseek(fileno(fp), 0, SEEK_CUR); @@ -207,9 +222,13 @@ getmntent(FILE *fp, struct mnttab *mp) if (error != 0) return (error); } - if (nfs >= allfs) + (void) pthread_rwlock_rdlock(&gsfs_lock); + if (nfs >= allfs) { + (void) pthread_rwlock_unlock(&gsfs_lock); return (-1); + } statfs2mnttab(&gsfs[nfs], mp); + (void) pthread_rwlock_unlock(&gsfs_lock); if (lseek(fileno(fp), 1, SEEK_CUR) == -1) return (errno); return (0); diff --git a/sys/contrib/openzfs/lib/libspl/os/freebsd/zone.c b/sys/contrib/openzfs/lib/libspl/os/freebsd/zone.c index c07cb0532e16..d6f698207cd1 100644 --- a/sys/contrib/openzfs/lib/libspl/os/freebsd/zone.c +++ b/sys/contrib/openzfs/lib/libspl/os/freebsd/zone.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: BSD-2-Clause /* * Copyright (c) 2007 Pawel Jakub Dawidek <pjd@FreeBSD.org> * All rights reserved. diff --git a/sys/contrib/openzfs/lib/libspl/os/linux/getexecname.c b/sys/contrib/openzfs/lib/libspl/os/linux/getexecname.c index a640556bcbec..dc4fe26ca550 100644 --- a/sys/contrib/openzfs/lib/libspl/os/linux/getexecname.c +++ b/sys/contrib/openzfs/lib/libspl/os/linux/getexecname.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/os/linux/gethostid.c b/sys/contrib/openzfs/lib/libspl/os/linux/gethostid.c index c04b7fd3eef3..d39f3dda3b8d 100644 --- a/sys/contrib/openzfs/lib/libspl/os/linux/gethostid.c +++ b/sys/contrib/openzfs/lib/libspl/os/linux/gethostid.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -59,6 +60,7 @@ unsigned long get_system_hostid(void) { unsigned long hostid = get_spl_hostid(); + uint32_t system_hostid; /* * We do not use gethostid(3) because it can return a bogus ID, @@ -69,8 +71,11 @@ get_system_hostid(void) if (hostid == 0) { int fd = open("/etc/hostid", O_RDONLY | O_CLOEXEC); if (fd >= 0) { - if (read(fd, &hostid, 4) < 0) + if (read(fd, &system_hostid, sizeof (system_hostid)) + != sizeof (system_hostid)) hostid = 0; + else + hostid = system_hostid; (void) close(fd); } } diff --git a/sys/contrib/openzfs/lib/libspl/os/linux/getmntany.c b/sys/contrib/openzfs/lib/libspl/os/linux/getmntany.c index d458b28ad309..dcdf7b3d6fc9 100644 --- a/sys/contrib/openzfs/lib/libspl/os/linux/getmntany.c +++ b/sys/contrib/openzfs/lib/libspl/os/linux/getmntany.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -38,6 +39,7 @@ #include <sys/sysmacros.h> #include <sys/stat.h> #include <unistd.h> +#include <libzutil.h> #define BUFSIZE (MNT_LINE_MAX + 2) @@ -83,7 +85,7 @@ _sol_getmntent(FILE *fp, struct mnttab *mgetp) } static int -getextmntent_impl(FILE *fp, struct extmnttab *mp, int len) +getextmntent_impl(FILE *fp, struct extmnttab *mp) { int ret; struct stat64 st; @@ -122,7 +124,7 @@ getextmntent(const char *path, struct extmnttab *entry, struct stat64 *statbuf) */ if (stat64(path, statbuf) != 0) { (void) fprintf(stderr, "cannot open '%s': %s\n", - path, strerror(errno)); + path, zfs_strerror(errno)); return (-1); } @@ -137,7 +139,7 @@ getextmntent(const char *path, struct extmnttab *entry, struct stat64 *statbuf) */ match = 0; - while (getextmntent_impl(fp, entry, sizeof (*entry)) == 0) { + while (getextmntent_impl(fp, entry) == 0) { if (makedev(entry->mnt_major, entry->mnt_minor) == statbuf->st_dev) { match = 1; diff --git a/sys/contrib/openzfs/lib/libspl/os/linux/zone.c b/sys/contrib/openzfs/lib/libspl/os/linux/zone.c index a71c4e0b275b..f1520676753e 100644 --- a/sys/contrib/openzfs/lib/libspl/os/linux/zone.c +++ b/sys/contrib/openzfs/lib/libspl/os/linux/zone.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -23,10 +24,40 @@ * Use is subject to license terms. */ +#include <unistd.h> +#include <stdio.h> +#include <errno.h> +#include <stdlib.h> +#include <limits.h> +#include <string.h> + #include <zone.h> zoneid_t -getzoneid() +getzoneid(void) { - return (GLOBAL_ZONEID); + char path[PATH_MAX]; + char buf[128] = { '\0' }; + char *cp; + + int c = snprintf(path, sizeof (path), "/proc/self/ns/user"); + /* This API doesn't have any error checking... */ + if (c < 0 || c >= sizeof (path)) + return (GLOBAL_ZONEID); + + ssize_t r = readlink(path, buf, sizeof (buf) - 1); + if (r < 0) + return (GLOBAL_ZONEID); + + cp = strchr(buf, '['); + if (cp == NULL) + return (GLOBAL_ZONEID); + cp++; + + unsigned long n = strtoul(cp, NULL, 10); + if (n == ULONG_MAX && errno == ERANGE) + return (GLOBAL_ZONEID); + zoneid_t z = (zoneid_t)n; + + return (z); } diff --git a/sys/contrib/openzfs/lib/libspl/page.c b/sys/contrib/openzfs/lib/libspl/page.c index 5b0d3f2e5786..6160a1de10cd 100644 --- a/sys/contrib/openzfs/lib/libspl/page.c +++ b/sys/contrib/openzfs/lib/libspl/page.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/strlcat.c b/sys/contrib/openzfs/lib/libspl/strlcat.c index 4528d875ed5e..6e4c3280a83a 100644 --- a/sys/contrib/openzfs/lib/libspl/strlcat.c +++ b/sys/contrib/openzfs/lib/libspl/strlcat.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/strlcpy.c b/sys/contrib/openzfs/lib/libspl/strlcpy.c index d483b91f6121..49ffa2db67c5 100644 --- a/sys/contrib/openzfs/lib/libspl/strlcpy.c +++ b/sys/contrib/openzfs/lib/libspl/strlcpy.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libspl/timestamp.c b/sys/contrib/openzfs/lib/libspl/timestamp.c index 22ecb3940739..0b0838f4b442 100644 --- a/sys/contrib/openzfs/lib/libspl/timestamp.c +++ b/sys/contrib/openzfs/lib/libspl/timestamp.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -44,7 +45,7 @@ void print_timestamp(uint_t timestamp_fmt) { time_t t = time(NULL); - static char *fmt = NULL; + static const char *fmt = NULL; /* We only need to retrieve this once per invocation */ if (fmt == NULL) @@ -54,10 +55,53 @@ print_timestamp(uint_t timestamp_fmt) (void) printf("%lld\n", (longlong_t)t); } else if (timestamp_fmt == DDATE) { char dstr[64]; + struct tm tm; int len; - len = strftime(dstr, sizeof (dstr), fmt, localtime(&t)); + len = strftime(dstr, sizeof (dstr), fmt, localtime_r(&t, &tm)); if (len > 0) (void) printf("%s\n", dstr); } } + +/* + * Return timestamp as decimal reprentation (in string) of time_t + * value (-T u was specified) or in date(1) format (-T d was specified). + */ +void +get_timestamp(uint_t timestamp_fmt, char *buf, int len) +{ + time_t t = time(NULL); + static const char *fmt = NULL; + + /* We only need to retrieve this once per invocation */ + if (fmt == NULL) + fmt = nl_langinfo(_DATE_FMT); + + if (timestamp_fmt == UDATE) { + (void) snprintf(buf, len, "%lld", (longlong_t)t); + } else if (timestamp_fmt == DDATE) { + struct tm tm; + strftime(buf, len, fmt, localtime_r(&t, &tm)); + } +} + +/* + * Format the provided time stamp to human readable format + */ +void +format_timestamp(time_t t, char *buf, int len) +{ + struct tm tm; + static const char *fmt = NULL; + + if (t == 0) { + snprintf(buf, len, "-"); + return; + } + + /* We only need to retrieve this once per invocation */ + if (fmt == NULL) + fmt = nl_langinfo(_DATE_FMT); + strftime(buf, len, fmt, localtime_r(&t, &tm)); +} diff --git a/sys/contrib/openzfs/lib/libtpool/Makefile.am b/sys/contrib/openzfs/lib/libtpool/Makefile.am index 40fd137b4335..5a2b8a5701da 100644 --- a/sys/contrib/openzfs/lib/libtpool/Makefile.am +++ b/sys/contrib/openzfs/lib/libtpool/Makefile.am @@ -1,13 +1,11 @@ -include $(top_srcdir)/config/Rules.am +libtpool_la_CFLAGS = $(AM_CFLAGS) $(LIBRARY_CFLAGS) +libtpool_la_CFLAGS += -fvisibility=hidden +# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61118 +libtpool_la_CFLAGS += $(NO_CLOBBERED) -AM_CFLAGS += -fvisibility=hidden +noinst_LTLIBRARIES += libtpool.la +CPPCHECKTARGETS += libtpool.la -noinst_LTLIBRARIES = libtpool.la - -USER_C = \ - thread_pool.c \ - thread_pool_impl.h - -libtpool_la_SOURCES = $(USER_C) - -include $(top_srcdir)/config/CppCheck.am +libtpool_la_SOURCES = \ + %D%/thread_pool.c \ + %D%/thread_pool_impl.h diff --git a/sys/contrib/openzfs/lib/libtpool/thread_pool.c b/sys/contrib/openzfs/lib/libtpool/thread_pool.c index 892beeffa5ae..39b92ae81166 100644 --- a/sys/contrib/openzfs/lib/libtpool/thread_pool.c +++ b/sys/contrib/openzfs/lib/libtpool/thread_pool.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -28,6 +29,7 @@ #include <signal.h> #include <errno.h> #include <assert.h> +#include <limits.h> #include "thread_pool_impl.h" static pthread_mutex_t thread_pool_lock = PTHREAD_MUTEX_INITIALIZER; @@ -108,8 +110,7 @@ job_cleanup(void *arg) tpool_active_t **activepp; pthread_mutex_lock(&tpool->tp_mutex); - /* CSTYLED */ - for (activepp = &tpool->tp_active;; activepp = &activep->tpa_next) { + for (activepp = &tpool->tp_active; ; activepp = &activep->tpa_next) { activep = *activepp; if (activep->tpa_tid == my_tid) { *activepp = activep->tpa_next; @@ -423,6 +424,26 @@ tpool_dispatch(tpool_t *tpool, void (*func)(void *), void *arg) pthread_mutex_lock(&tpool->tp_mutex); + if (!(tpool->tp_flags & TP_SUSPEND)) { + if (tpool->tp_idle > 0) + (void) pthread_cond_signal(&tpool->tp_workcv); + else if (tpool->tp_current >= tpool->tp_maximum) { + /* At worker limit. Leave task on queue */ + } else { + if (create_worker(tpool) == 0) { + /* Started a new worker thread */ + tpool->tp_current++; + } else if (tpool->tp_current > 0) { + /* Leave task on queue */ + } else { + /* Cannot start a single worker! */ + pthread_mutex_unlock(&tpool->tp_mutex); + free(job); + return (-1); + } + } + } + if (tpool->tp_head == NULL) tpool->tp_head = job; else @@ -430,14 +451,6 @@ tpool_dispatch(tpool_t *tpool, void (*func)(void *), void *arg) tpool->tp_tail = job; tpool->tp_njobs++; - if (!(tpool->tp_flags & TP_SUSPEND)) { - if (tpool->tp_idle > 0) - (void) pthread_cond_signal(&tpool->tp_workcv); - else if (tpool->tp_current < tpool->tp_maximum && - create_worker(tpool) == 0) - tpool->tp_current++; - } - pthread_mutex_unlock(&tpool->tp_mutex); return (0); } diff --git a/sys/contrib/openzfs/lib/libtpool/thread_pool_impl.h b/sys/contrib/openzfs/lib/libtpool/thread_pool_impl.h index 5349c2ade8c3..e2bffd37d522 100644 --- a/sys/contrib/openzfs/lib/libtpool/thread_pool_impl.h +++ b/sys/contrib/openzfs/lib/libtpool/thread_pool_impl.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libunicode/Makefile.am b/sys/contrib/openzfs/lib/libunicode/Makefile.am index b82975f68efd..e1ac666a5e60 100644 --- a/sys/contrib/openzfs/lib/libunicode/Makefile.am +++ b/sys/contrib/openzfs/lib/libunicode/Makefile.am @@ -1,17 +1,6 @@ -include $(top_srcdir)/config/Rules.am +libunicode_la_CFLAGS = $(AM_CFLAGS) $(KERNEL_CFLAGS) $(LIBRARY_CFLAGS) -VPATH = $(top_srcdir)/module/unicode - -# Includes kernel code, generate warnings for large stack frames -AM_CFLAGS += $(FRAME_LARGER_THAN) - -noinst_LTLIBRARIES = libunicode.la - -KERNEL_C = \ - u8_textprep.c \ - uconv.c +noinst_LTLIBRARIES += libunicode.la nodist_libunicode_la_SOURCES = \ - $(KERNEL_C) - -include $(top_srcdir)/config/CppCheck.am + module/unicode/u8_textprep.c diff --git a/sys/contrib/openzfs/lib/libuutil/Makefile.am b/sys/contrib/openzfs/lib/libuutil/Makefile.am index 5a911f85f7de..b973ce3cca4c 100644 --- a/sys/contrib/openzfs/lib/libuutil/Makefile.am +++ b/sys/contrib/openzfs/lib/libuutil/Makefile.am @@ -1,23 +1,19 @@ -include $(top_srcdir)/config/Rules.am +libuutil_la_CFLAGS = $(AM_CFLAGS) $(LIBRARY_CFLAGS) $(LIBRARY_CFLAGS) -lib_LTLIBRARIES = libuutil.la +lib_LTLIBRARIES += libuutil.la +CPPCHECKTARGETS += libuutil.la -include $(top_srcdir)/config/Abigail.am - -USER_C = \ - uu_alloc.c \ - uu_avl.c \ - uu_ident.c \ - uu_list.c \ - uu_misc.c \ - uu_pname.c \ - uu_string.c - -libuutil_la_SOURCES = $(USER_C) +libuutil_la_SOURCES = \ + %D%/uu_alloc.c \ + %D%/uu_avl.c \ + %D%/uu_ident.c \ + %D%/uu_list.c \ + %D%/uu_misc.c \ + %D%/uu_string.c libuutil_la_LIBADD = \ - $(abs_top_builddir)/lib/libavl/libavl.la \ - $(abs_top_builddir)/lib/libspl/libspl.la + libavl.la \ + libspl.la libuutil_la_LIBADD += $(LTLIBINTL) @@ -29,7 +25,4 @@ endif libuutil_la_LDFLAGS += -version-info 3:0:0 -include $(top_srcdir)/config/CppCheck.am - -# Library ABI -EXTRA_DIST = libuutil.abi libuutil.suppr +dist_noinst_DATA += %D%/libuutil.abi %D%/libuutil.suppr diff --git a/sys/contrib/openzfs/lib/libuutil/libuutil.abi b/sys/contrib/openzfs/lib/libuutil/libuutil.abi index c7ab5672eace..0052f0d47a7f 100644 --- a/sys/contrib/openzfs/lib/libuutil/libuutil.abi +++ b/sys/contrib/openzfs/lib/libuutil/libuutil.abi @@ -1,6 +1,6 @@ <abi-corpus version='2.0' architecture='elf-amd-x86_64' soname='libuutil.so.3'> <elf-needed> - <dependency name='libpthread.so.0'/> + <dependency name='libunwind.so.8'/> <dependency name='libc.so.6'/> <dependency name='ld-linux-x86-64.so.2'/> </elf-needed> @@ -144,12 +144,16 @@ <elf-symbol name='avl_update_gt' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='avl_update_lt' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='avl_walk' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='format_timestamp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='get_system_hostid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='get_timestamp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='getexecname' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='getextmntent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='getmntany' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='getzoneid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='libspl_assertf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='libspl_backtrace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='libspl_set_assert_ok' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='list_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='list_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='list_head' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> @@ -172,12 +176,12 @@ <elf-symbol name='membar_enter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='membar_exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='membar_producer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='membar_sync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='mkdirp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='print_timestamp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='spl_pagesize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='strlcat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='strlcpy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_alt_exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='uu_avl_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='uu_avl_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='uu_avl_find' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> @@ -202,13 +206,8 @@ <elf-symbol name='uu_avl_walk_next' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='uu_avl_walk_start' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='uu_check_name' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_die' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='uu_error' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_exit_fatal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_exit_ok' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_exit_usage' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='uu_free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_getpname' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='uu_list_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='uu_list_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='uu_list_find' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> @@ -238,143 +237,37 @@ <elf-symbol name='uu_msprintf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='uu_panic' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='uu_set_error' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_setpname' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='uu_strbw' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='uu_strcaseeq' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='uu_strdup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='uu_streq' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='uu_strerror' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='uu_strndup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_vdie' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_vwarn' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_vxdie' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_warn' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_xdie' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='uu_zalloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> </elf-function-symbols> - <elf-variable-symbols> - <elf-symbol name='libspl_assert_ok' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_exit_fatal_value' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_exit_ok_value' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_exit_usage_value' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - </elf-variable-symbols> - <abi-instr address-size='64' path='../../module/avl/avl.c' language='LANG_C99'> - <typedef-decl name='avl_tree_t' type-id='b351119f' id='f20fbd51'/> - <typedef-decl name='avl_index_t' type-id='e475ab95' id='fba6cb51'/> - <pointer-type-def type-id='fba6cb51' size-in-bits='64' id='32adbf30'/> - <pointer-type-def type-id='f20fbd51' size-in-bits='64' id='a3681dea'/> - <function-decl name='avl_walk' mangled-name='avl_walk' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_walk'> - <parameter type-id='a3681dea' name='tree'/> - <parameter type-id='eaa32e2f' name='oldnode'/> - <parameter type-id='95e97e5e' name='left'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='avl_first' mangled-name='avl_first' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_first'> - <parameter type-id='a3681dea' name='tree'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='avl_last' mangled-name='avl_last' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_last'> - <parameter type-id='a3681dea' name='tree'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='avl_nearest' mangled-name='avl_nearest' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_nearest'> - <parameter type-id='a3681dea' name='tree'/> - <parameter type-id='fba6cb51' name='where'/> - <parameter type-id='95e97e5e' name='direction'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='avl_find' mangled-name='avl_find' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_find'> - <parameter type-id='a3681dea' name='tree'/> - <parameter type-id='eaa32e2f' name='value'/> - <parameter type-id='32adbf30' name='where'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='avl_insert' mangled-name='avl_insert' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_insert'> - <parameter type-id='a3681dea' name='tree'/> - <parameter type-id='eaa32e2f' name='new_data'/> - <parameter type-id='fba6cb51' name='where'/> + <abi-instr address-size='64' path='lib/libspl/assert.c' language='LANG_C99'> + <typedef-decl name='__pid_t' type-id='95e97e5e' id='3629bad8'/> + <function-decl name='libspl_backtrace' mangled-name='libspl_backtrace' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libspl_backtrace'> + <parameter type-id='95e97e5e'/> <return type-id='48b5725f'/> </function-decl> - <function-decl name='avl_insert_here' mangled-name='avl_insert_here' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_insert_here'> - <parameter type-id='a3681dea' name='tree'/> - <parameter type-id='eaa32e2f' name='new_data'/> - <parameter type-id='eaa32e2f' name='here'/> - <parameter type-id='95e97e5e' name='direction'/> - <return type-id='48b5725f'/> + <function-decl name='getpid' visibility='default' binding='global' size-in-bits='64'> + <return type-id='3629bad8'/> </function-decl> - <function-decl name='avl_add' mangled-name='avl_add' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_add'> - <parameter type-id='a3681dea' name='tree'/> - <parameter type-id='eaa32e2f' name='new_node'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='avl_remove' mangled-name='avl_remove' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_remove'> - <parameter type-id='a3681dea' name='tree'/> - <parameter type-id='eaa32e2f' name='data'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='avl_update_lt' mangled-name='avl_update_lt' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_update_lt'> - <parameter type-id='a3681dea' name='t'/> - <parameter type-id='eaa32e2f' name='obj'/> - <return type-id='c19b74c3'/> + <function-decl name='gettid' visibility='default' binding='global' size-in-bits='64'> + <return type-id='3629bad8'/> </function-decl> - <function-decl name='avl_update_gt' mangled-name='avl_update_gt' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_update_gt'> - <parameter type-id='a3681dea' name='t'/> - <parameter type-id='eaa32e2f' name='obj'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='avl_update' mangled-name='avl_update' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_update'> - <parameter type-id='a3681dea' name='t'/> - <parameter type-id='eaa32e2f' name='obj'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='avl_swap' mangled-name='avl_swap' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_swap'> - <parameter type-id='a3681dea' name='tree1'/> - <parameter type-id='a3681dea' name='tree2'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='avl_create' mangled-name='avl_create' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_create'> - <parameter type-id='a3681dea' name='tree'/> - <parameter type-id='585e1de9' name='compar'/> - <parameter type-id='b59d7dce' name='size'/> - <parameter type-id='b59d7dce' name='offset'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='avl_destroy' mangled-name='avl_destroy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_destroy'> - <parameter type-id='a3681dea' name='tree'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='avl_numnodes' mangled-name='avl_numnodes' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_numnodes'> - <parameter type-id='a3681dea' name='tree'/> - <return type-id='ee1f298e'/> - </function-decl> - <function-decl name='avl_is_empty' mangled-name='avl_is_empty' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_is_empty'> - <parameter type-id='a3681dea' name='tree'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='avl_destroy_nodes' mangled-name='avl_destroy_nodes' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_destroy_nodes'> - <parameter type-id='a3681dea' name='tree'/> - <parameter type-id='63e171df' name='cookie'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-type size-in-bits='64' id='96ee24a5'> - <parameter type-id='eaa32e2f'/> - <parameter type-id='eaa32e2f'/> - <return type-id='95e97e5e'/> - </function-type> - </abi-instr> - <abi-instr address-size='64' path='assert.c' language='LANG_C99'> - <var-decl name='libspl_assert_ok' type-id='95e97e5e' mangled-name='libspl_assert_ok' visibility='default' elf-symbol-id='libspl_assert_ok'/> - <function-decl name='libspl_assertf' mangled-name='libspl_assertf' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libspl_assertf'> - <parameter type-id='80f4b756' name='file'/> - <parameter type-id='80f4b756' name='func'/> - <parameter type-id='95e97e5e' name='line'/> - <parameter type-id='80f4b756' name='format'/> + <function-decl name='prctl' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> <parameter is-variadic='yes'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='libspl_set_assert_ok' mangled-name='libspl_set_assert_ok' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libspl_set_assert_ok'> + <parameter type-id='c19b74c3' name='val'/> <return type-id='48b5725f'/> </function-decl> </abi-instr> - <abi-instr address-size='64' path='atomic.c' language='LANG_C99'> - <type-decl name='unsigned short int' size-in-bits='16' id='8efea9e5'/> + <abi-instr address-size='64' path='lib/libspl/atomic.c' language='LANG_C99'> <typedef-decl name='int16_t' type-id='03896e23' id='23bd8cb5'/> <typedef-decl name='int32_t' type-id='33f57a65' id='3ff5601b'/> <typedef-decl name='uint16_t' type-id='253c2d2a' id='149c6638'/> @@ -425,6 +318,11 @@ <parameter type-id='64698d33' name='target'/> <return type-id='48b5725f'/> </function-decl> + <function-decl name='atomic_add_ptr' mangled-name='atomic_add_ptr' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_add_ptr'> + <parameter type-id='fe09dd29' name='target'/> + <parameter type-id='79a0948f' name='bits'/> + <return type-id='48b5725f'/> + </function-decl> <function-decl name='atomic_add_8' mangled-name='atomic_add_8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_add_8'> <parameter type-id='aa323ea4' name='target'/> <parameter type-id='ee31ee44' name='bits'/> @@ -440,12 +338,7 @@ <parameter type-id='3ff5601b' name='bits'/> <return type-id='48b5725f'/> </function-decl> - <function-decl name='atomic_add_long' mangled-name='atomic_add_long' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_add_long'> - <parameter type-id='64698d33' name='target'/> - <parameter type-id='bd54fe1a' name='bits'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='atomic_add_ptr' mangled-name='atomic_add_ptr' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_add_ptr'> + <function-decl name='atomic_sub_ptr' mangled-name='atomic_sub_ptr' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_sub_ptr'> <parameter type-id='fe09dd29' name='target'/> <parameter type-id='79a0948f' name='bits'/> <return type-id='48b5725f'/> @@ -465,16 +358,6 @@ <parameter type-id='3ff5601b' name='bits'/> <return type-id='48b5725f'/> </function-decl> - <function-decl name='atomic_sub_long' mangled-name='atomic_sub_long' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_sub_long'> - <parameter type-id='64698d33' name='target'/> - <parameter type-id='bd54fe1a' name='bits'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='atomic_sub_ptr' mangled-name='atomic_sub_ptr' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_sub_ptr'> - <parameter type-id='fe09dd29' name='target'/> - <parameter type-id='79a0948f' name='bits'/> - <return type-id='48b5725f'/> - </function-decl> <function-decl name='atomic_or_8' mangled-name='atomic_or_8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_or_8'> <parameter type-id='aa323ea4' name='target'/> <parameter type-id='b96825af' name='bits'/> @@ -547,6 +430,11 @@ <parameter type-id='64698d33' name='target'/> <return type-id='ee1f298e'/> </function-decl> + <function-decl name='atomic_add_ptr_nv' mangled-name='atomic_add_ptr_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_add_ptr_nv'> + <parameter type-id='fe09dd29' name='target'/> + <parameter type-id='79a0948f' name='bits'/> + <return type-id='eaa32e2f'/> + </function-decl> <function-decl name='atomic_add_8_nv' mangled-name='atomic_add_8_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_add_8_nv'> <parameter type-id='aa323ea4' name='target'/> <parameter type-id='ee31ee44' name='bits'/> @@ -567,7 +455,7 @@ <parameter type-id='bd54fe1a' name='bits'/> <return type-id='ee1f298e'/> </function-decl> - <function-decl name='atomic_add_ptr_nv' mangled-name='atomic_add_ptr_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_add_ptr_nv'> + <function-decl name='atomic_sub_ptr_nv' mangled-name='atomic_sub_ptr_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_sub_ptr_nv'> <parameter type-id='fe09dd29' name='target'/> <parameter type-id='79a0948f' name='bits'/> <return type-id='eaa32e2f'/> @@ -592,11 +480,6 @@ <parameter type-id='bd54fe1a' name='bits'/> <return type-id='ee1f298e'/> </function-decl> - <function-decl name='atomic_sub_ptr_nv' mangled-name='atomic_sub_ptr_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_sub_ptr_nv'> - <parameter type-id='fe09dd29' name='target'/> - <parameter type-id='79a0948f' name='bits'/> - <return type-id='eaa32e2f'/> - </function-decl> <function-decl name='atomic_or_8_nv' mangled-name='atomic_or_8_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_or_8_nv'> <parameter type-id='aa323ea4' name='target'/> <parameter type-id='b96825af' name='bits'/> @@ -637,6 +520,12 @@ <parameter type-id='ee1f298e' name='bits'/> <return type-id='ee1f298e'/> </function-decl> + <function-decl name='atomic_cas_ptr' mangled-name='atomic_cas_ptr' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_cas_ptr'> + <parameter type-id='fe09dd29' name='target'/> + <parameter type-id='eaa32e2f' name='exp'/> + <parameter type-id='eaa32e2f' name='des'/> + <return type-id='eaa32e2f'/> + </function-decl> <function-decl name='atomic_cas_8' mangled-name='atomic_cas_8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_cas_8'> <parameter type-id='aa323ea4' name='target'/> <parameter type-id='b96825af' name='exp'/> @@ -661,12 +550,6 @@ <parameter type-id='ee1f298e' name='des'/> <return type-id='ee1f298e'/> </function-decl> - <function-decl name='atomic_cas_ptr' mangled-name='atomic_cas_ptr' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_cas_ptr'> - <parameter type-id='fe09dd29' name='target'/> - <parameter type-id='eaa32e2f' name='exp'/> - <parameter type-id='eaa32e2f' name='des'/> - <return type-id='eaa32e2f'/> - </function-decl> <function-decl name='atomic_swap_8' mangled-name='atomic_swap_8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_swap_8'> <parameter type-id='aa323ea4' name='target'/> <parameter type-id='b96825af' name='bits'/> @@ -711,13 +594,218 @@ <function-decl name='membar_consumer' mangled-name='membar_consumer' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='membar_consumer'> <return type-id='48b5725f'/> </function-decl> + <type-decl name='unsigned short int' size-in-bits='16' id='8efea9e5'/> </abi-instr> - <abi-instr address-size='64' path='getexecname.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libspl/backtrace.c' language='LANG_C99'> + <array-type-def dimensions='1' type-id='62f1140c' size-in-bits='768' id='b80f3d9b'> + <subrange length='24' type-id='7359adad' id='fdd3342b'/> + </array-type-def> + <array-type-def dimensions='1' type-id='62f1140c' size-in-bits='128' id='bc19e735'> + <subrange length='4' type-id='7359adad' id='16fe7105'/> + </array-type-def> + <array-type-def dimensions='1' type-id='22c546af' size-in-bits='1024' id='498c040b'> + <subrange length='8' type-id='7359adad' id='56e0c0b1'/> + </array-type-def> + <array-type-def dimensions='1' type-id='4ea07cdb' size-in-bits='2048' id='4811c35e'> + <subrange length='16' type-id='7359adad' id='848d0938'/> + </array-type-def> + <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> + <array-type-def dimensions='1' type-id='3a47d82b' size-in-bits='512' id='a13e797f'> + <subrange length='8' type-id='7359adad' id='56e0c0b1'/> + </array-type-def> + <array-type-def dimensions='1' type-id='7359adad' size-in-bits='1024' id='d2baa450'> + <subrange length='16' type-id='7359adad' id='848d0938'/> + </array-type-def> + <array-type-def dimensions='1' type-id='8efea9e5' size-in-bits='48' id='ff2536e2'> + <subrange length='3' type-id='7359adad' id='56f209d2'/> + </array-type-def> + <array-type-def dimensions='1' type-id='8efea9e5' size-in-bits='64' id='3f30d495'> + <subrange length='4' type-id='7359adad' id='16fe7105'/> + </array-type-def> + <array-type-def dimensions='1' type-id='73d941c6' size-in-bits='8128' id='dc70ec0b'> + <subrange length='127' type-id='7359adad' id='5ed08de5'/> + </array-type-def> + <typedef-decl name='uint64_t' type-id='8910171f' id='9c313c2d'/> + <typedef-decl name='__uint64_t' type-id='7359adad' id='8910171f'/> + <class-decl name='__sigset_t' size-in-bits='1024' is-struct='yes' naming-typedef-id='b9c97942' visibility='default' id='2616147f'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='__val' type-id='d2baa450' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='__sigset_t' type-id='2616147f' id='b9c97942'/> + <typedef-decl name='sigset_t' type-id='b9c97942' id='daf33c64'/> + <class-decl name='stack_t' size-in-bits='192' is-struct='yes' naming-typedef-id='ac5e685f' visibility='default' id='380f9954'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ss_sp' type-id='eaa32e2f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='ss_flags' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='ss_size' type-id='b59d7dce' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='stack_t' type-id='380f9954' id='ac5e685f'/> + <typedef-decl name='unw_regnum_t' type-id='95e97e5e' id='c53620f0'/> + <class-decl name='unw_cursor' size-in-bits='8128' is-struct='yes' visibility='default' id='384a1f22'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='opaque' type-id='dc70ec0b' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='unw_cursor_t' type-id='384a1f22' id='1203d35c'/> + <typedef-decl name='unw_context_t' type-id='190d09ef' id='8f527367'/> + <typedef-decl name='unw_word_t' type-id='9c313c2d' id='73d941c6'/> + <typedef-decl name='unw_tdep_context_t' type-id='c4daa689' id='190d09ef'/> + <typedef-decl name='greg_t' type-id='1eb56b1e' id='de572c22'/> + <typedef-decl name='gregset_t' type-id='6d3c2f42' id='a66f139c'/> + <class-decl name='_libc_fpxreg' size-in-bits='128' is-struct='yes' visibility='default' id='22c546af'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='significand' type-id='3f30d495' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='exponent' type-id='8efea9e5' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='80'> + <var-decl name='__glibc_reserved1' type-id='ff2536e2' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='_libc_xmmreg' size-in-bits='128' is-struct='yes' visibility='default' id='4ea07cdb'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='element' type-id='bc19e735' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='_libc_fpstate' size-in-bits='4096' is-struct='yes' visibility='default' id='81cbe5ca'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='cwd' type-id='253c2d2a' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='16'> + <var-decl name='swd' type-id='253c2d2a' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='ftw' type-id='253c2d2a' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='48'> + <var-decl name='fop' type-id='253c2d2a' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='rip' type-id='8910171f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='rdp' type-id='8910171f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='mxcsr' type-id='62f1140c' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='224'> + <var-decl name='mxcr_mask' type-id='62f1140c' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='_st' type-id='498c040b' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1280'> + <var-decl name='_xmm' type-id='4811c35e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3328'> + <var-decl name='__glibc_reserved1' type-id='b80f3d9b' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='fpregset_t' type-id='5b1ab9a8' id='6e5851bb'/> + <class-decl name='mcontext_t' size-in-bits='2048' is-struct='yes' naming-typedef-id='bacab071' visibility='default' id='76fab990'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='gregs' type-id='a66f139c' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1472'> + <var-decl name='fpregs' type-id='6e5851bb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1536'> + <var-decl name='__reserved1' type-id='a13e797f' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='mcontext_t' type-id='76fab990' id='bacab071'/> + <class-decl name='ucontext_t' size-in-bits='7744' is-struct='yes' visibility='default' id='1ba65dc8'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='uc_flags' type-id='7359adad' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='uc_link' type-id='4ed508de' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='uc_stack' type-id='ac5e685f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='uc_mcontext' type-id='bacab071' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2368'> + <var-decl name='uc_sigmask' type-id='daf33c64' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3392'> + <var-decl name='__fpregs_mem' type-id='81cbe5ca' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7488'> + <var-decl name='__ssp' type-id='a133ec23' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='ucontext_t' type-id='1ba65dc8' id='c4daa689'/> + <pointer-type-def type-id='81cbe5ca' size-in-bits='64' id='5b1ab9a8'/> + <pointer-type-def type-id='1ba65dc8' size-in-bits='64' id='4ed508de'/> + <pointer-type-def type-id='8f527367' size-in-bits='64' id='2e408b96'/> + <pointer-type-def type-id='1203d35c' size-in-bits='64' id='3946e4d1'/> + <pointer-type-def type-id='190d09ef' size-in-bits='64' id='3e0601f0'/> + <pointer-type-def type-id='73d941c6' size-in-bits='64' id='42f5faab'/> + <function-decl name='write' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter type-id='eaa32e2f'/> + <parameter type-id='b59d7dce'/> + <return type-id='79a0948f'/> + </function-decl> + <function-decl name='_Ux86_64_regname' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='c53620f0'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='_ULx86_64_init_local' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='3946e4d1'/> + <parameter type-id='2e408b96'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='_ULx86_64_step' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='3946e4d1'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='_ULx86_64_get_reg' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='3946e4d1'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='42f5faab'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='_ULx86_64_get_proc_name' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='3946e4d1'/> + <parameter type-id='26a90f95'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='42f5faab'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='_Ux86_64_getcontext' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='3e0601f0'/> + <return type-id='95e97e5e'/> + </function-decl> + <type-decl name='unsigned long int' size-in-bits='64' id='7359adad'/> + </abi-instr> + <abi-instr address-size='64' path='lib/libspl/getexecname.c' language='LANG_C99'> <function-decl name='getexecname' mangled-name='getexecname' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='getexecname'> <return type-id='80f4b756'/> </function-decl> + <function-decl name='getexecname_impl' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='26a90f95'/> + <return type-id='79a0948f'/> + </function-decl> </abi-instr> - <abi-instr address-size='64' path='list.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libspl/list.c' language='LANG_C99'> <typedef-decl name='list_node_t' type-id='b0b5e45e' id='b21843b2'/> <typedef-decl name='list_t' type-id='e824dae9' id='0899125f'/> <class-decl name='list_node' size-in-bits='128' is-struct='yes' visibility='default' id='b0b5e45e'> @@ -728,14 +816,11 @@ <var-decl name='prev' type-id='b03eadb4' visibility='default'/> </data-member> </class-decl> - <class-decl name='list' size-in-bits='256' is-struct='yes' visibility='default' id='e824dae9'> + <class-decl name='list' size-in-bits='192' is-struct='yes' visibility='default' id='e824dae9'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='list_size' type-id='b59d7dce' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> <var-decl name='list_offset' type-id='b59d7dce' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='128'> + <data-member access='public' layout-offset-in-bits='64'> <var-decl name='list_head' type-id='b0b5e45e' visibility='default'/> </data-member> </class-decl> @@ -828,34 +913,112 @@ <return type-id='95e97e5e'/> </function-decl> </abi-instr> - <abi-instr address-size='64' path='mkdirp.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libspl/mkdirp.c' language='LANG_C99'> <typedef-decl name='__mode_t' type-id='f0981eeb' id='e1c52942'/> <typedef-decl name='mode_t' type-id='e1c52942' id='d50d396c'/> + <typedef-decl name='wchar_t' type-id='95e97e5e' id='928221d2'/> + <qualified-type-def type-id='26a90f95' restrict='yes' id='266fe297'/> + <qualified-type-def type-id='928221d2' const='yes' id='effb3702'/> + <pointer-type-def type-id='effb3702' size-in-bits='64' id='f077d3f8'/> + <qualified-type-def type-id='f077d3f8' restrict='yes' id='598aab80'/> + <pointer-type-def type-id='928221d2' size-in-bits='64' id='323d93c1'/> + <qualified-type-def type-id='323d93c1' restrict='yes' id='f1358bc3'/> + <function-decl name='calloc' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b59d7dce'/> + <parameter type-id='b59d7dce'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='strdup' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='strrchr' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='95e97e5e'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='access' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='__mbstowcs_chk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='f1358bc3'/> + <parameter type-id='9d26089a'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='b59d7dce'/> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='__wcstombs_chk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='266fe297'/> + <parameter type-id='598aab80'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='b59d7dce'/> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='mkdir' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='e1c52942'/> + <return type-id='95e97e5e'/> + </function-decl> <function-decl name='mkdirp' mangled-name='mkdirp' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mkdirp'> <parameter type-id='80f4b756' name='d'/> <parameter type-id='d50d396c' name='mode'/> <return type-id='95e97e5e'/> </function-decl> </abi-instr> - <abi-instr address-size='64' path='os/linux/gethostid.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libspl/os/linux/getexecname.c' language='LANG_C99'> + <function-decl name='__readlink_chk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='9d26089a'/> + <parameter type-id='266fe297'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='b59d7dce'/> + <return type-id='79a0948f'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='lib/libspl/os/linux/gethostid.c' language='LANG_C99'> + <type-decl name='long long unsigned int' size-in-bits='64' id='3a47d82b'/> + <pointer-type-def type-id='26a90f95' size-in-bits='64' id='9b23c9ad'/> + <qualified-type-def type-id='9b23c9ad' restrict='yes' id='8c85230f'/> + <function-decl name='fclose' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='822cd80b'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='strtoull' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='9d26089a'/> + <parameter type-id='8c85230f'/> + <parameter type-id='95e97e5e'/> + <return type-id='3a47d82b'/> + </function-decl> + <function-decl name='getenv' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='close' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='__open_too_many_args' visibility='default' binding='global' size-in-bits='64'> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='__open_missing_mode' visibility='default' binding='global' size-in-bits='64'> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='__read_chk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter type-id='eaa32e2f'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='b59d7dce'/> + <return type-id='79a0948f'/> + </function-decl> <function-decl name='get_system_hostid' mangled-name='get_system_hostid' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_system_hostid'> <return type-id='7359adad'/> </function-decl> - <type-decl name='unsigned long int' size-in-bits='64' id='7359adad'/> </abi-instr> - <abi-instr address-size='64' path='os/linux/getmntany.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libspl/os/linux/getmntany.c' language='LANG_C99'> <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='a84c031d' size-in-bits='8' id='89feb1ec'> - <subrange length='1' type-id='7359adad' id='52f813b4'/> - </array-type-def> - <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='160' id='664ac0b7'> - <subrange length='20' type-id='7359adad' id='fdca39cf'/> - </array-type-def> - <class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='a4036571'/> - <class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='010ae0b9'/> - <class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='79bd3751'/> <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'/> @@ -890,6 +1053,26 @@ <var-decl name='mnt_minor' type-id='3502e3ff' 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'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='mnt_dir' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='mnt_type' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='mnt_opts' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='mnt_freq' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='288'> + <var-decl name='mnt_passno' type-id='95e97e5e' visibility='default'/> + </data-member> + </class-decl> <class-decl name='stat64' size-in-bits='1152' is-struct='yes' visibility='default' id='0bbec9cd'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='st_dev' type-id='35ed8932' visibility='default'/> @@ -942,103 +1125,9 @@ <typedef-decl name='__gid_t' type-id='f0981eeb' id='d94ec6d9'/> <typedef-decl name='__ino64_t' type-id='7359adad' id='71288a47'/> <typedef-decl name='__nlink_t' type-id='7359adad' id='80f0b9df'/> - <typedef-decl name='__off_t' type-id='bd54fe1a' id='79989e9c'/> - <typedef-decl name='__off64_t' type-id='bd54fe1a' id='724e4de6'/> - <typedef-decl name='__time_t' type-id='bd54fe1a' id='65eda9c0'/> <typedef-decl name='__blksize_t' type-id='bd54fe1a' id='d3f10a7f'/> <typedef-decl name='__blkcnt64_t' type-id='bd54fe1a' id='4e711bf1'/> <typedef-decl name='__syscall_slong_t' type-id='bd54fe1a' id='03085adc'/> - <typedef-decl name='FILE' type-id='ec1ed955' id='aa12d1ba'/> - <typedef-decl name='_IO_lock_t' type-id='48b5725f' id='bb4788fa'/> - <class-decl name='_IO_FILE' size-in-bits='1728' is-struct='yes' visibility='default' id='ec1ed955'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_flags' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='_IO_read_ptr' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='_IO_read_end' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='_IO_read_base' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='_IO_write_base' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_IO_write_ptr' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='_IO_write_end' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='_IO_buf_base' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='_IO_buf_end' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='_IO_save_base' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='_IO_backup_base' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='_IO_save_end' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='_markers' type-id='e4c6fa61' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='_chain' type-id='dca988a5' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='_fileno' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='928'> - <var-decl name='_flags2' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='960'> - <var-decl name='_old_offset' type-id='79989e9c' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1024'> - <var-decl name='_cur_column' type-id='8efea9e5' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1040'> - <var-decl name='_vtable_offset' type-id='28577a57' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1048'> - <var-decl name='_shortbuf' type-id='89feb1ec' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1088'> - <var-decl name='_lock' type-id='cecf4ea7' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1152'> - <var-decl name='_offset' type-id='724e4de6' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1216'> - <var-decl name='_codecvt' type-id='570f8c59' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1280'> - <var-decl name='_wide_data' type-id='c65a1f29' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1344'> - <var-decl name='_freeres_list' type-id='dca988a5' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1408'> - <var-decl name='_freeres_buf' type-id='eaa32e2f' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1472'> - <var-decl name='__pad5' type-id='b59d7dce' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1536'> - <var-decl name='_mode' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1568'> - <var-decl name='_unused2' type-id='664ac0b7' visibility='default'/> - </data-member> - </class-decl> <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' id='a9c79a1f'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='tv_sec' type-id='65eda9c0' visibility='default'/> @@ -1047,18 +1136,39 @@ <var-decl name='tv_nsec' type-id='03085adc' visibility='default'/> </data-member> </class-decl> - <pointer-type-def type-id='aa12d1ba' size-in-bits='64' id='822cd80b'/> - <pointer-type-def type-id='ec1ed955' size-in-bits='64' id='dca988a5'/> - <pointer-type-def type-id='a4036571' size-in-bits='64' id='570f8c59'/> - <pointer-type-def type-id='bb4788fa' size-in-bits='64' id='cecf4ea7'/> - <pointer-type-def type-id='010ae0b9' size-in-bits='64' id='e4c6fa61'/> - <pointer-type-def type-id='79bd3751' size-in-bits='64' id='c65a1f29'/> <pointer-type-def type-id='0c544dc0' size-in-bits='64' id='394fc496'/> + <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='1b055409' size-in-bits='64' id='9d424d31'/> <pointer-type-def type-id='0bbec9cd' size-in-bits='64' id='62f7a03d'/> - <class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='a4036571'/> - <class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='010ae0b9'/> - <class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='79bd3751'/> + <qualified-type-def type-id='62f7a03d' restrict='yes' id='f1cadedf'/> + <function-decl name='getmntent_r' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='e75a27e9'/> + <parameter type-id='3cad23cd'/> + <parameter type-id='266fe297'/> + <parameter type-id='95e97e5e'/> + <return type-id='b6b61d2f'/> + </function-decl> + <function-decl name='feof' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='822cd80b'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='strerror' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='__fprintf_chk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='e75a27e9'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='9d26089a'/> + <parameter is-variadic='yes'/> + <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'/> + <return type-id='95e97e5e'/> + </function-decl> <function-decl name='getmntany' mangled-name='getmntany' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='getmntany'> <parameter type-id='822cd80b' name='fp'/> <parameter type-id='9d424d31' name='mgetp'/> @@ -1077,18 +1187,28 @@ <return type-id='95e97e5e'/> </function-decl> </abi-instr> - <abi-instr address-size='64' path='os/linux/zone.c' language='LANG_C99'> - <typedef-decl name='zoneid_t' type-id='95e97e5e' id='4da03624'/> + <abi-instr address-size='64' path='lib/libspl/os/linux/zone.c' language='LANG_C99'> + <typedef-decl name='zoneid_t' type-id='3502e3ff' id='4da03624'/> + <function-decl name='strtoul' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='9d26089a'/> + <parameter type-id='8c85230f'/> + <parameter type-id='95e97e5e'/> + <return type-id='7359adad'/> + </function-decl> <function-decl name='getzoneid' mangled-name='getzoneid' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='getzoneid'> <return type-id='4da03624'/> </function-decl> </abi-instr> - <abi-instr address-size='64' path='page.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libspl/page.c' language='LANG_C99'> + <function-decl name='sysconf' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <return type-id='bd54fe1a'/> + </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> </abi-instr> - <abi-instr address-size='64' path='strlcat.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libspl/strlcat.c' language='LANG_C99'> <function-decl name='strlcat' mangled-name='strlcat' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='strlcat'> <parameter type-id='26a90f95' name='dst'/> <parameter type-id='80f4b756' name='src'/> @@ -1096,30 +1216,130 @@ <return type-id='b59d7dce'/> </function-decl> </abi-instr> - <abi-instr address-size='64' path='strlcpy.c' language='LANG_C99'> - <function-decl name='strlcpy' mangled-name='strlcpy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='strlcpy'> - <parameter type-id='26a90f95' name='dst'/> - <parameter type-id='80f4b756' name='src'/> - <parameter type-id='b59d7dce' name='len'/> + <abi-instr address-size='64' path='lib/libspl/timestamp.c' language='LANG_C99'> + <typedef-decl name='nl_item' type-id='95e97e5e' id='03b79a94'/> + <typedef-decl name='__time_t' type-id='bd54fe1a' id='65eda9c0'/> + <class-decl name='tm' size-in-bits='448' is-struct='yes' visibility='default' id='dddf6ca2'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='tm_sec' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='tm_min' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='tm_hour' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='tm_mday' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='tm_mon' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160'> + <var-decl name='tm_year' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='tm_wday' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='224'> + <var-decl name='tm_yday' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='tm_isdst' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='tm_gmtoff' type-id='bd54fe1a' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='tm_zone' type-id='80f4b756' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='time_t' type-id='65eda9c0' id='c9d12d66'/> + <qualified-type-def type-id='c9d12d66' const='yes' id='588b3216'/> + <pointer-type-def type-id='588b3216' size-in-bits='64' id='9f201474'/> + <qualified-type-def type-id='9f201474' restrict='yes' id='d6e2847c'/> + <qualified-type-def type-id='dddf6ca2' const='yes' id='e824a34f'/> + <pointer-type-def type-id='e824a34f' size-in-bits='64' id='d6ad37ff'/> + <qualified-type-def type-id='d6ad37ff' restrict='yes' id='f8c6051d'/> + <pointer-type-def type-id='c9d12d66' size-in-bits='64' id='b2eb2c3f'/> + <pointer-type-def type-id='dddf6ca2' size-in-bits='64' id='d915a820'/> + <qualified-type-def type-id='d915a820' restrict='yes' id='f099ad08'/> + <function-decl name='nl_langinfo' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='03b79a94'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='time' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b2eb2c3f'/> + <return type-id='c9d12d66'/> + </function-decl> + <function-decl name='strftime' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='266fe297'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='9d26089a'/> + <parameter type-id='f8c6051d'/> <return type-id='b59d7dce'/> </function-decl> - </abi-instr> - <abi-instr address-size='64' path='timestamp.c' language='LANG_C99'> + <function-decl name='localtime_r' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='d6e2847c'/> + <parameter type-id='f099ad08'/> + <return type-id='d915a820'/> + </function-decl> + <function-decl name='__printf_chk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter type-id='80f4b756'/> + <parameter is-variadic='yes'/> + <return type-id='95e97e5e'/> + </function-decl> <function-decl name='print_timestamp' mangled-name='print_timestamp' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='print_timestamp'> <parameter type-id='3502e3ff' name='timestamp_fmt'/> <return type-id='48b5725f'/> </function-decl> + <function-decl name='get_timestamp' mangled-name='get_timestamp' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_timestamp'> + <parameter type-id='3502e3ff' name='timestamp_fmt'/> + <parameter type-id='26a90f95' name='buf'/> + <parameter type-id='95e97e5e' name='len'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='format_timestamp' mangled-name='format_timestamp' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='format_timestamp'> + <parameter type-id='c9d12d66' name='t'/> + <parameter type-id='26a90f95' name='buf'/> + <parameter type-id='95e97e5e' name='len'/> + <return type-id='48b5725f'/> + </function-decl> </abi-instr> - <abi-instr address-size='64' path='uu_alloc.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libuutil/uu_alloc.c' language='LANG_C99'> <type-decl name='char' size-in-bits='8' id='a84c031d'/> + <type-decl name='unsigned int' size-in-bits='32' id='f0981eeb'/> <type-decl name='unsigned long int' size-in-bits='64' id='7359adad'/> <type-decl name='variadic parameter type' id='2c1145c5'/> <type-decl name='void' id='48b5725f'/> + <typedef-decl name='uint_t' type-id='f0981eeb' id='3502e3ff'/> <typedef-decl name='size_t' type-id='7359adad' id='b59d7dce'/> <pointer-type-def type-id='a84c031d' size-in-bits='64' id='26a90f95'/> <qualified-type-def type-id='a84c031d' const='yes' id='9b45d938'/> <pointer-type-def type-id='9b45d938' size-in-bits='64' id='80f4b756'/> <pointer-type-def type-id='48b5725f' size-in-bits='64' id='eaa32e2f'/> + <function-decl name='uu_set_error' mangled-name='uu_set_error' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_set_error'> + <parameter type-id='3502e3ff'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='malloc' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b59d7dce'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='free' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='eaa32e2f'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='strlen' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='strnlen' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='b59d7dce'/> + <return type-id='b59d7dce'/> + </function-decl> <function-decl name='uu_zalloc' mangled-name='uu_zalloc' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_zalloc'> <parameter type-id='b59d7dce' name='n'/> <return type-id='eaa32e2f'/> @@ -1148,13 +1368,16 @@ <return type-id='26a90f95'/> </function-decl> </abi-instr> - <abi-instr address-size='64' path='uu_avl.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libuutil/uu_avl.c' language='LANG_C99'> <array-type-def dimensions='1' type-id='bf311473' size-in-bits='128' id='f0f65199'> <subrange length='2' type-id='7359adad' id='52efc4ef'/> </array-type-def> <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='320' id='36c46961'> <subrange length='40' type-id='7359adad' id='8f80b239'/> </array-type-def> + <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='32' id='8e0573fd'> + <subrange length='4' type-id='7359adad' id='16fe7105'/> + </array-type-def> <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='512' id='59daf3ef'> <subrange length='64' type-id='7359adad' id='b10be967'/> </array-type-def> @@ -1166,7 +1389,6 @@ <subrange length='3' type-id='7359adad' id='56f209d2'/> </array-type-def> <type-decl name='unsigned char' size-in-bits='8' id='002ac4a6'/> - <type-decl name='unsigned int' size-in-bits='32' id='f0981eeb'/> <typedef-decl name='uu_compare_fn_t' type-id='add6e811' id='40f93560'/> <typedef-decl name='uu_walk_fn_t' type-id='96ee24a5' id='9d1aa0dc'/> <typedef-decl name='uu_avl_pool_t' type-id='12a530a8' id='7f84e390'/> @@ -1201,16 +1423,16 @@ </class-decl> <class-decl name='uu_avl' size-in-bits='960' is-struct='yes' visibility='default' id='4af029d1'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ua_next_enc' type-id='e475ab95' visibility='default'/> + <var-decl name='ua_next' type-id='a5c21a38' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='ua_prev_enc' type-id='e475ab95' visibility='default'/> + <var-decl name='ua_prev' type-id='a5c21a38' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> <var-decl name='ua_pool' type-id='de82c773' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='ua_parent_enc' type-id='e475ab95' visibility='default'/> + <var-decl name='ua_parent' type-id='eaa32e2f' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> <var-decl name='ua_debug' type-id='b96825af' visibility='default'/> @@ -1257,6 +1479,8 @@ <var-decl name='uap_null_avl' type-id='bb7f0973' visibility='default'/> </data-member> </class-decl> + <typedef-decl name='avl_tree_t' type-id='b351119f' id='f20fbd51'/> + <typedef-decl name='avl_index_t' type-id='e475ab95' id='fba6cb51'/> <class-decl name='avl_node' size-in-bits='192' is-struct='yes' visibility='default' id='428b67b3'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='avl_child' type-id='f0f65199' visibility='default'/> @@ -1284,6 +1508,15 @@ </class-decl> <typedef-decl name='ulong_t' type-id='7359adad' id='ee1f298e'/> <typedef-decl name='uintptr_t' type-id='7359adad' id='e475ab95'/> + <union-decl name='pthread_mutexattr_t' size-in-bits='32' naming-typedef-id='8afd6070' visibility='default' id='7300eb00'> + <data-member access='public'> + <var-decl name='__size' type-id='8e0573fd' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='__align' type-id='95e97e5e' visibility='default'/> + </data-member> + </union-decl> + <typedef-decl name='pthread_mutexattr_t' type-id='7300eb00' id='8afd6070'/> <union-decl name='pthread_mutex_t' size-in-bits='320' naming-typedef-id='7a6844eb' visibility='default' id='70681f9b'> <data-member access='public'> <var-decl name='__data' type-id='4c734837' visibility='default'/> @@ -1338,8 +1571,14 @@ <typedef-decl name='__uint8_t' type-id='002ac4a6' id='c51d6389'/> <typedef-decl name='__uint32_t' type-id='f0981eeb' id='62f1140c'/> <pointer-type-def type-id='0e01899c' size-in-bits='64' id='4d98cd5a'/> + <pointer-type-def type-id='fba6cb51' size-in-bits='64' id='32adbf30'/> <pointer-type-def type-id='428b67b3' size-in-bits='64' id='bf311473'/> + <pointer-type-def type-id='b351119f' size-in-bits='64' id='716943c7'/> + <pointer-type-def type-id='f20fbd51' size-in-bits='64' id='a3681dea'/> + <qualified-type-def type-id='8afd6070' const='yes' id='1d853360'/> + <pointer-type-def type-id='1d853360' size-in-bits='64' id='c2afbd7e'/> <pointer-type-def type-id='96ee24a5' size-in-bits='64' id='585e1de9'/> + <pointer-type-def type-id='7a6844eb' size-in-bits='64' id='18c91f9e'/> <pointer-type-def type-id='5d7f5fc8' size-in-bits='64' id='813a2225'/> <pointer-type-def type-id='73a65116' size-in-bits='64' id='2dc35b9d'/> <pointer-type-def type-id='7f84e390' size-in-bits='64' id='de82c773'/> @@ -1348,6 +1587,96 @@ <pointer-type-def type-id='40f93560' size-in-bits='64' id='d502b39f'/> <pointer-type-def type-id='9d1aa0dc' size-in-bits='64' id='30a42b6d'/> <pointer-type-def type-id='eaa32e2f' size-in-bits='64' id='63e171df'/> + <function-decl name='uu_check_name' mangled-name='uu_check_name' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_check_name'> + <parameter type-id='80f4b756'/> + <parameter type-id='3502e3ff'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='uu_panic' mangled-name='uu_panic' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_panic'> + <parameter type-id='80f4b756'/> + <parameter is-variadic='yes'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='avl_create' mangled-name='avl_create' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_create'> + <parameter type-id='a3681dea'/> + <parameter type-id='585e1de9'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='b59d7dce'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='avl_find' mangled-name='avl_find' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_find'> + <parameter type-id='a3681dea'/> + <parameter type-id='eaa32e2f'/> + <parameter type-id='32adbf30'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='avl_insert' mangled-name='avl_insert' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_insert'> + <parameter type-id='a3681dea'/> + <parameter type-id='eaa32e2f'/> + <parameter type-id='fba6cb51'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='avl_first' mangled-name='avl_first' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_first'> + <parameter type-id='a3681dea'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='avl_last' mangled-name='avl_last' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_last'> + <parameter type-id='a3681dea'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='avl_nearest' mangled-name='avl_nearest' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_nearest'> + <parameter type-id='a3681dea'/> + <parameter type-id='fba6cb51'/> + <parameter type-id='95e97e5e'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='avl_remove' mangled-name='avl_remove' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_remove'> + <parameter type-id='a3681dea'/> + <parameter type-id='eaa32e2f'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='avl_numnodes' mangled-name='avl_numnodes' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_numnodes'> + <parameter type-id='a3681dea'/> + <return type-id='ee1f298e'/> + </function-decl> + <function-decl name='avl_destroy_nodes' mangled-name='avl_destroy_nodes' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_destroy_nodes'> + <parameter type-id='a3681dea'/> + <parameter type-id='63e171df'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='avl_destroy' mangled-name='avl_destroy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_destroy'> + <parameter type-id='a3681dea'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='avl_walk' mangled-name='avl_walk' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_walk'> + <parameter type-id='716943c7'/> + <parameter type-id='eaa32e2f'/> + <parameter type-id='95e97e5e'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='strlcpy' mangled-name='strlcpy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='strlcpy'> + <parameter type-id='26a90f95'/> + <parameter type-id='80f4b756'/> + <parameter type-id='b59d7dce'/> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='pthread_mutex_init' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='18c91f9e'/> + <parameter type-id='c2afbd7e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='pthread_mutex_destroy' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='18c91f9e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='pthread_mutex_lock' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='18c91f9e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='pthread_mutex_unlock' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='18c91f9e'/> + <return type-id='95e97e5e'/> + </function-decl> <function-decl name='uu_avl_pool_create' mangled-name='uu_avl_pool_create' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_avl_pool_create'> <parameter type-id='80f4b756' name='name'/> <parameter type-id='b59d7dce' name='objsize'/> @@ -1463,6 +1792,11 @@ <function-decl name='uu_avl_release' mangled-name='uu_avl_release' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_avl_release'> <return type-id='48b5725f'/> </function-decl> + <function-type size-in-bits='64' id='96ee24a5'> + <parameter type-id='eaa32e2f'/> + <parameter type-id='eaa32e2f'/> + <return type-id='95e97e5e'/> + </function-type> <function-type size-in-bits='64' id='add6e811'> <parameter type-id='eaa32e2f'/> <parameter type-id='eaa32e2f'/> @@ -1470,15 +1804,14 @@ <return type-id='95e97e5e'/> </function-type> </abi-instr> - <abi-instr address-size='64' path='uu_ident.c' language='LANG_C99'> - <typedef-decl name='uint_t' type-id='f0981eeb' id='3502e3ff'/> - <function-decl name='uu_check_name' mangled-name='uu_check_name' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_check_name'> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='3502e3ff' name='flags'/> - <return type-id='95e97e5e'/> + <abi-instr address-size='64' path='lib/libuutil/uu_ident.c' language='LANG_C99'> + <function-decl name='strchr' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='95e97e5e'/> + <return type-id='26a90f95'/> </function-decl> </abi-instr> - <abi-instr address-size='64' path='uu_list.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libuutil/uu_list.c' language='LANG_C99'> <array-type-def dimensions='1' type-id='e475ab95' size-in-bits='128' id='d0e9cdae'> <subrange length='2' type-id='7359adad' id='52efc4ef'/> </array-type-def> @@ -1523,16 +1856,16 @@ </class-decl> <class-decl name='uu_list' size-in-bits='896' is-struct='yes' visibility='default' id='1d04bdf0'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ul_next_enc' type-id='e475ab95' visibility='default'/> + <var-decl name='ul_next' type-id='0c0b229b' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='ul_prev_enc' type-id='e475ab95' visibility='default'/> + <var-decl name='ul_prev' type-id='0c0b229b' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> <var-decl name='ul_pool' type-id='0941e04e' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='ul_parent_enc' type-id='e475ab95' visibility='default'/> + <var-decl name='ul_parent' type-id='eaa32e2f' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> <var-decl name='ul_offset' type-id='b59d7dce' visibility='default'/> @@ -1723,25 +2056,16 @@ <return type-id='48b5725f'/> </function-decl> </abi-instr> - <abi-instr address-size='64' path='uu_misc.c' language='LANG_C99'> - <function-decl name='uu_set_error' mangled-name='uu_set_error' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_set_error'> - <parameter type-id='3502e3ff' name='code'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='uu_error' mangled-name='uu_error' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_error'> - <return type-id='8f92235e'/> - </function-decl> - <function-decl name='uu_strerror' mangled-name='uu_strerror' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_strerror'> - <parameter type-id='8f92235e' name='code'/> - <return type-id='80f4b756'/> - </function-decl> - <function-decl name='uu_panic' mangled-name='uu_panic' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_panic'> - <parameter type-id='80f4b756' name='format'/> - <parameter is-variadic='yes'/> - <return type-id='48b5725f'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='uu_pname.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libuutil/uu_misc.c' language='LANG_C99'> + <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='8' id='89feb1ec'> + <subrange length='1' type-id='7359adad' id='52f813b4'/> + </array-type-def> + <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='160' id='664ac0b7'> + <subrange length='20' type-id='7359adad' id='fdca39cf'/> + </array-type-def> + <class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='a4036571'/> + <class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='010ae0b9'/> + <class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='79bd3751'/> <class-decl name='__va_list_tag' size-in-bits='192' is-struct='yes' visibility='default' id='d5027220'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='gp_offset' type-id='f0981eeb' visibility='default'/> @@ -1756,65 +2080,179 @@ <var-decl name='reg_save_area' type-id='eaa32e2f' visibility='default'/> </data-member> </class-decl> + <type-decl name='unsigned short int' size-in-bits='16' id='8efea9e5'/> + <typedef-decl name='pthread_t' type-id='7359adad' id='4051f5e7'/> + <typedef-decl name='pthread_key_t' type-id='f0981eeb' id='2de5383b'/> + <typedef-decl name='__off_t' type-id='bd54fe1a' id='79989e9c'/> + <typedef-decl name='__off64_t' type-id='bd54fe1a' id='724e4de6'/> + <typedef-decl name='FILE' type-id='ec1ed955' id='aa12d1ba'/> + <typedef-decl name='_IO_lock_t' type-id='48b5725f' id='bb4788fa'/> + <class-decl name='_IO_FILE' size-in-bits='1728' is-struct='yes' visibility='default' id='ec1ed955'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_flags' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='_IO_read_ptr' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='_IO_read_end' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='_IO_read_base' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='_IO_write_base' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_IO_write_ptr' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='_IO_write_end' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='_IO_buf_base' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='_IO_buf_end' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='_IO_save_base' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='640'> + <var-decl name='_IO_backup_base' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='_IO_save_end' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='768'> + <var-decl name='_markers' type-id='e4c6fa61' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='832'> + <var-decl name='_chain' type-id='dca988a5' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='896'> + <var-decl name='_fileno' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='928'> + <var-decl name='_flags2' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='960'> + <var-decl name='_old_offset' type-id='79989e9c' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1024'> + <var-decl name='_cur_column' type-id='8efea9e5' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1040'> + <var-decl name='_vtable_offset' type-id='28577a57' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1048'> + <var-decl name='_shortbuf' type-id='89feb1ec' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1088'> + <var-decl name='_lock' type-id='cecf4ea7' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1152'> + <var-decl name='_offset' type-id='724e4de6' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1216'> + <var-decl name='_codecvt' type-id='570f8c59' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1280'> + <var-decl name='_wide_data' type-id='c65a1f29' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1344'> + <var-decl name='_freeres_list' type-id='dca988a5' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1408'> + <var-decl name='_freeres_buf' type-id='eaa32e2f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1472'> + <var-decl name='__pad5' type-id='b59d7dce' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1536'> + <var-decl name='_mode' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1568'> + <var-decl name='_unused2' type-id='664ac0b7' visibility='default'/> + </data-member> + </class-decl> + <pointer-type-def type-id='aa12d1ba' size-in-bits='64' id='822cd80b'/> + <qualified-type-def type-id='822cd80b' restrict='yes' id='e75a27e9'/> + <pointer-type-def type-id='ec1ed955' size-in-bits='64' id='dca988a5'/> + <pointer-type-def type-id='a4036571' size-in-bits='64' id='570f8c59'/> + <pointer-type-def type-id='bb4788fa' size-in-bits='64' id='cecf4ea7'/> + <pointer-type-def type-id='010ae0b9' size-in-bits='64' id='e4c6fa61'/> + <pointer-type-def type-id='79bd3751' size-in-bits='64' id='c65a1f29'/> <pointer-type-def type-id='d5027220' size-in-bits='64' id='b7f2d5e6'/> + <qualified-type-def type-id='80f4b756' restrict='yes' id='9d26089a'/> <pointer-type-def type-id='95e97e5e' size-in-bits='64' id='7292109c'/> - <var-decl name='uu_exit_ok_value' type-id='95e97e5e' mangled-name='uu_exit_ok_value' visibility='default' elf-symbol-id='uu_exit_ok_value'/> - <var-decl name='uu_exit_fatal_value' type-id='95e97e5e' mangled-name='uu_exit_fatal_value' visibility='default' elf-symbol-id='uu_exit_fatal_value'/> - <var-decl name='uu_exit_usage_value' type-id='95e97e5e' mangled-name='uu_exit_usage_value' visibility='default' elf-symbol-id='uu_exit_usage_value'/> - <function-decl name='uu_exit_ok' mangled-name='uu_exit_ok' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_exit_ok'> + <pointer-type-def type-id='2de5383b' size-in-bits='64' id='ce04b822'/> + <pointer-type-def type-id='ee076206' size-in-bits='64' id='953b12f8'/> + <pointer-type-def type-id='c5c76c9c' size-in-bits='64' id='b7f9d8e6'/> + <class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='a4036571'/> + <class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='010ae0b9'/> + <class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='79bd3751'/> + <function-decl name='__errno_location' visibility='default' binding='global' size-in-bits='64'> <return type-id='7292109c'/> </function-decl> - <function-decl name='uu_exit_fatal' mangled-name='uu_exit_fatal' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_exit_fatal'> - <return type-id='7292109c'/> + <function-decl name='dcgettext' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <parameter type-id='95e97e5e'/> + <return type-id='26a90f95'/> </function-decl> - <function-decl name='uu_exit_usage' mangled-name='uu_exit_usage' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_exit_usage'> - <return type-id='7292109c'/> + <function-decl name='pthread_self' visibility='default' binding='global' size-in-bits='64'> + <return type-id='4051f5e7'/> </function-decl> - <function-decl name='uu_alt_exit' mangled-name='uu_alt_exit' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_alt_exit'> - <parameter type-id='95e97e5e' name='profile'/> - <return type-id='48b5725f'/> + <function-decl name='pthread_key_create' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='ce04b822'/> + <parameter type-id='b7f9d8e6'/> + <return type-id='95e97e5e'/> </function-decl> - <function-decl name='uu_vwarn' mangled-name='uu_vwarn' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_vwarn'> - <parameter type-id='80f4b756' name='format'/> - <parameter type-id='b7f2d5e6' name='alist'/> - <return type-id='48b5725f'/> + <function-decl name='pthread_getspecific' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='2de5383b'/> + <return type-id='eaa32e2f'/> </function-decl> - <function-decl name='uu_warn' mangled-name='uu_warn' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_warn'> - <parameter type-id='80f4b756' name='format'/> - <parameter is-variadic='yes'/> - <return type-id='48b5725f'/> + <function-decl name='pthread_setspecific' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='2de5383b'/> + <parameter type-id='eaa32e2f'/> + <return type-id='95e97e5e'/> </function-decl> - <function-decl name='uu_vdie' mangled-name='uu_vdie' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_vdie'> - <parameter type-id='80f4b756' name='format'/> - <parameter type-id='b7f2d5e6' name='alist'/> - <return type-id='48b5725f'/> + <function-decl name='pthread_atfork' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='953b12f8'/> + <parameter type-id='953b12f8'/> + <parameter type-id='953b12f8'/> + <return type-id='95e97e5e'/> </function-decl> - <function-decl name='uu_die' mangled-name='uu_die' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_die'> - <parameter type-id='80f4b756' name='format'/> - <parameter is-variadic='yes'/> + <function-decl name='abort' visibility='default' binding='global' size-in-bits='64'> <return type-id='48b5725f'/> </function-decl> - <function-decl name='uu_vxdie' mangled-name='uu_vxdie' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_vxdie'> - <parameter type-id='95e97e5e' name='status'/> - <parameter type-id='80f4b756' name='format'/> - <parameter type-id='b7f2d5e6' name='alist'/> - <return type-id='48b5725f'/> + <function-decl name='pause' visibility='default' binding='global' size-in-bits='64'> + <return type-id='95e97e5e'/> </function-decl> - <function-decl name='uu_xdie' mangled-name='uu_xdie' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_xdie'> - <parameter type-id='95e97e5e' name='status'/> - <parameter type-id='80f4b756' name='format'/> - <parameter is-variadic='yes'/> - <return type-id='48b5725f'/> + <function-decl name='__vfprintf_chk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='e75a27e9'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='9d26089a'/> + <parameter type-id='b7f2d5e6'/> + <return type-id='95e97e5e'/> </function-decl> - <function-decl name='uu_setpname' mangled-name='uu_setpname' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_setpname'> - <parameter type-id='26a90f95' name='arg0'/> - <return type-id='80f4b756'/> + <function-decl name='uu_error' mangled-name='uu_error' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_error'> + <return type-id='8f92235e'/> </function-decl> - <function-decl name='uu_getpname' mangled-name='uu_getpname' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_getpname'> + <function-decl name='uu_strerror' mangled-name='uu_strerror' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_strerror'> + <parameter type-id='8f92235e' name='code'/> <return type-id='80f4b756'/> </function-decl> + <function-type size-in-bits='64' id='ee076206'> + <return type-id='48b5725f'/> + </function-type> + <function-type size-in-bits='64' id='c5c76c9c'> + <parameter type-id='eaa32e2f'/> + <return type-id='48b5725f'/> + </function-type> </abi-instr> - <abi-instr address-size='64' path='uu_string.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libuutil/uu_string.c' language='LANG_C99'> <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='9cac1fee'/> <enum-decl name='boolean_t' naming-typedef-id='c19b74c3' id='f58c8277'> <underlying-type type-id='9cac1fee'/> @@ -1822,6 +2260,22 @@ <enumerator name='B_TRUE' value='1'/> </enum-decl> <typedef-decl name='boolean_t' type-id='f58c8277' id='c19b74c3'/> + <function-decl name='strcmp' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='strncmp' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <parameter type-id='b59d7dce'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='strcasecmp' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> <function-decl name='uu_streq' mangled-name='uu_streq' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_streq'> <parameter type-id='80f4b756' name='a'/> <parameter type-id='80f4b756' name='b'/> @@ -1838,4 +2292,50 @@ <return type-id='c19b74c3'/> </function-decl> </abi-instr> + <abi-instr address-size='64' path='module/avl/avl.c' language='LANG_C99'> + <function-decl name='libspl_assertf' mangled-name='libspl_assertf' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libspl_assertf'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='80f4b756'/> + <parameter is-variadic='yes'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='avl_insert_here' mangled-name='avl_insert_here' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_insert_here'> + <parameter type-id='a3681dea' name='tree'/> + <parameter type-id='eaa32e2f' name='new_data'/> + <parameter type-id='eaa32e2f' name='here'/> + <parameter type-id='95e97e5e' name='direction'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='avl_add' mangled-name='avl_add' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_add'> + <parameter type-id='a3681dea' name='tree'/> + <parameter type-id='eaa32e2f' name='new_node'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='avl_update_lt' mangled-name='avl_update_lt' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_update_lt'> + <parameter type-id='a3681dea' name='t'/> + <parameter type-id='eaa32e2f' name='obj'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='avl_update_gt' mangled-name='avl_update_gt' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_update_gt'> + <parameter type-id='a3681dea' name='t'/> + <parameter type-id='eaa32e2f' name='obj'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='avl_update' mangled-name='avl_update' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_update'> + <parameter type-id='a3681dea' name='t'/> + <parameter type-id='eaa32e2f' name='obj'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='avl_swap' mangled-name='avl_swap' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_swap'> + <parameter type-id='a3681dea' name='tree1'/> + <parameter type-id='a3681dea' name='tree2'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='avl_is_empty' mangled-name='avl_is_empty' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_is_empty'> + <parameter type-id='a3681dea' name='tree'/> + <return type-id='c19b74c3'/> + </function-decl> + </abi-instr> </abi-corpus> diff --git a/sys/contrib/openzfs/lib/libuutil/uu_alloc.c b/sys/contrib/openzfs/lib/libuutil/uu_alloc.c index 2bef759d525e..dc2276e3d8b0 100644 --- a/sys/contrib/openzfs/lib/libuutil/uu_alloc.c +++ b/sys/contrib/openzfs/lib/libuutil/uu_alloc.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libuutil/uu_avl.c b/sys/contrib/openzfs/lib/libuutil/uu_avl.c index 53def0e073fd..a741bfa0fc94 100644 --- a/sys/contrib/openzfs/lib/libuutil/uu_avl.c +++ b/sys/contrib/openzfs/lib/libuutil/uu_avl.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -97,8 +98,8 @@ uu_avl_pool_create(const char *name, size_t objsize, size_t nodeoffset, (void) pthread_mutex_init(&pp->uap_lock, NULL); - pp->uap_null_avl.ua_next_enc = UU_PTR_ENCODE(&pp->uap_null_avl); - pp->uap_null_avl.ua_prev_enc = UU_PTR_ENCODE(&pp->uap_null_avl); + pp->uap_null_avl.ua_next = &pp->uap_null_avl; + pp->uap_null_avl.ua_prev = &pp->uap_null_avl; (void) pthread_mutex_lock(&uu_apool_list_lock); pp->uap_next = next = &uu_null_apool; @@ -114,10 +115,8 @@ void uu_avl_pool_destroy(uu_avl_pool_t *pp) { if (pp->uap_debug) { - if (pp->uap_null_avl.ua_next_enc != - UU_PTR_ENCODE(&pp->uap_null_avl) || - pp->uap_null_avl.ua_prev_enc != - UU_PTR_ENCODE(&pp->uap_null_avl)) { + if (pp->uap_null_avl.ua_next != &pp->uap_null_avl || + pp->uap_null_avl.ua_prev != &pp->uap_null_avl) { uu_panic("uu_avl_pool_destroy: Pool \"%.*s\" (%p) has " "outstanding avls, or is corrupt.\n", (int)sizeof (pp->uap_name), pp->uap_name, @@ -224,7 +223,7 @@ uu_avl_create(uu_avl_pool_t *pp, void *parent, uint32_t flags) } ap->ua_pool = pp; - ap->ua_parent_enc = UU_PTR_ENCODE(parent); + ap->ua_parent = parent; ap->ua_debug = pp->uap_debug || (flags & UU_AVL_DEBUG); ap->ua_index = (pp->uap_last_index = INDEX_NEXT(pp->uap_last_index)); @@ -236,11 +235,11 @@ uu_avl_create(uu_avl_pool_t *pp, void *parent, uint32_t flags) (void) pthread_mutex_lock(&pp->uap_lock); next = &pp->uap_null_avl; - prev = UU_PTR_DECODE(next->ua_prev_enc); - ap->ua_next_enc = UU_PTR_ENCODE(next); - ap->ua_prev_enc = UU_PTR_ENCODE(prev); - next->ua_prev_enc = UU_PTR_ENCODE(ap); - prev->ua_next_enc = UU_PTR_ENCODE(ap); + prev = next->ua_prev; + ap->ua_next = next; + ap->ua_prev = prev; + next->ua_prev = ap; + prev->ua_next = ap; (void) pthread_mutex_unlock(&pp->uap_lock); return (ap); @@ -263,11 +262,11 @@ uu_avl_destroy(uu_avl_t *ap) } } (void) pthread_mutex_lock(&pp->uap_lock); - UU_AVL_PTR(ap->ua_next_enc)->ua_prev_enc = ap->ua_prev_enc; - UU_AVL_PTR(ap->ua_prev_enc)->ua_next_enc = ap->ua_next_enc; + ap->ua_next->ua_prev = ap->ua_prev; + ap->ua_prev->ua_next = ap->ua_next; (void) pthread_mutex_unlock(&pp->uap_lock); - ap->ua_prev_enc = UU_PTR_ENCODE(NULL); - ap->ua_next_enc = UU_PTR_ENCODE(NULL); + ap->ua_prev = NULL; + ap->ua_next = NULL; ap->ua_pool = NULL; avl_destroy(&ap->ua_tree); diff --git a/sys/contrib/openzfs/lib/libuutil/uu_ident.c b/sys/contrib/openzfs/lib/libuutil/uu_ident.c index 382139316ebc..87fde4d98086 100644 --- a/sys/contrib/openzfs/lib/libuutil/uu_ident.c +++ b/sys/contrib/openzfs/lib/libuutil/uu_ident.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -7,7 +8,7 @@ * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libuutil/uu_list.c b/sys/contrib/openzfs/lib/libuutil/uu_list.c index c3a447d01de3..6c303bde9c81 100644 --- a/sys/contrib/openzfs/lib/libuutil/uu_list.c +++ b/sys/contrib/openzfs/lib/libuutil/uu_list.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -93,8 +94,8 @@ uu_list_pool_create(const char *name, size_t objsize, (void) pthread_mutex_init(&pp->ulp_lock, NULL); - pp->ulp_null_list.ul_next_enc = UU_PTR_ENCODE(&pp->ulp_null_list); - pp->ulp_null_list.ul_prev_enc = UU_PTR_ENCODE(&pp->ulp_null_list); + pp->ulp_null_list.ul_next = &pp->ulp_null_list; + pp->ulp_null_list.ul_prev = &pp->ulp_null_list; (void) pthread_mutex_lock(&uu_lpool_list_lock); pp->ulp_next = next = &uu_null_lpool; @@ -110,10 +111,8 @@ void uu_list_pool_destroy(uu_list_pool_t *pp) { if (pp->ulp_debug) { - if (pp->ulp_null_list.ul_next_enc != - UU_PTR_ENCODE(&pp->ulp_null_list) || - pp->ulp_null_list.ul_prev_enc != - UU_PTR_ENCODE(&pp->ulp_null_list)) { + if (pp->ulp_null_list.ul_next != &pp->ulp_null_list || + pp->ulp_null_list.ul_prev != &pp->ulp_null_list) { uu_panic("uu_list_pool_destroy: Pool \"%.*s\" (%p) has " "outstanding lists, or is corrupt.\n", (int)sizeof (pp->ulp_name), pp->ulp_name, @@ -202,7 +201,7 @@ uu_list_create(uu_list_pool_t *pp, void *parent, uint32_t flags) } lp->ul_pool = pp; - lp->ul_parent_enc = UU_PTR_ENCODE(parent); + lp->ul_parent = parent; lp->ul_offset = pp->ulp_nodeoffset; lp->ul_debug = pp->ulp_debug || (flags & UU_LIST_DEBUG); lp->ul_sorted = (flags & UU_LIST_SORTED); @@ -217,11 +216,11 @@ uu_list_create(uu_list_pool_t *pp, void *parent, uint32_t flags) (void) pthread_mutex_lock(&pp->ulp_lock); next = &pp->ulp_null_list; - prev = UU_PTR_DECODE(next->ul_prev_enc); - lp->ul_next_enc = UU_PTR_ENCODE(next); - lp->ul_prev_enc = UU_PTR_ENCODE(prev); - next->ul_prev_enc = UU_PTR_ENCODE(lp); - prev->ul_next_enc = UU_PTR_ENCODE(lp); + prev = next->ul_prev; + lp->ul_next = next; + lp->ul_prev = prev; + next->ul_prev = lp; + prev->ul_next = lp; (void) pthread_mutex_unlock(&pp->ulp_lock); return (lp); @@ -250,11 +249,11 @@ uu_list_destroy(uu_list_t *lp) } (void) pthread_mutex_lock(&pp->ulp_lock); - UU_LIST_PTR(lp->ul_next_enc)->ul_prev_enc = lp->ul_prev_enc; - UU_LIST_PTR(lp->ul_prev_enc)->ul_next_enc = lp->ul_next_enc; + lp->ul_next->ul_prev = lp->ul_prev; + lp->ul_prev->ul_next = lp->ul_next; (void) pthread_mutex_unlock(&pp->ulp_lock); - lp->ul_prev_enc = UU_PTR_ENCODE(NULL); - lp->ul_next_enc = UU_PTR_ENCODE(NULL); + lp->ul_prev = NULL; + lp->ul_next = NULL; lp->ul_pool = NULL; uu_free(lp); } @@ -507,14 +506,20 @@ uu_list_walk(uu_list_t *lp, uu_walk_fn_t *func, void *private, uint32_t flags) } if (lp->ul_debug || robust) { - uu_list_walk_t my_walk; + uu_list_walk_t *my_walk; void *e; - list_walk_init(&my_walk, lp, flags); + my_walk = uu_zalloc(sizeof (*my_walk)); + if (my_walk == NULL) + return (-1); + + list_walk_init(my_walk, lp, flags); while (status == UU_WALK_NEXT && - (e = uu_list_walk_next(&my_walk)) != NULL) + (e = uu_list_walk_next(my_walk)) != NULL) status = (*func)(e, private); - list_walk_fini(&my_walk); + list_walk_fini(my_walk); + + uu_free(my_walk); } else { if (!reverse) { for (np = lp->ul_null_node.uln_next; diff --git a/sys/contrib/openzfs/lib/libuutil/uu_misc.c b/sys/contrib/openzfs/lib/libuutil/uu_misc.c index a8478ace9a73..1166fdfb2231 100644 --- a/sys/contrib/openzfs/lib/libuutil/uu_misc.c +++ b/sys/contrib/openzfs/lib/libuutil/uu_misc.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libuutil/uu_pname.c b/sys/contrib/openzfs/lib/libuutil/uu_pname.c deleted file mode 100644 index 28c4a8a9cf7b..000000000000 --- a/sys/contrib/openzfs/lib/libuutil/uu_pname.c +++ /dev/null @@ -1,201 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2005 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - - - -#include "libuutil_common.h" - -#include <libintl.h> -#include <limits.h> -#include <string.h> -#include <stdlib.h> -#include <stdarg.h> -#include <stdio.h> -#include <errno.h> -#include <wchar.h> -#include <unistd.h> - -static const char *pname; - -static void -uu_die_internal(int status, const char *format, va_list alist) __NORETURN; - -int uu_exit_ok_value = EXIT_SUCCESS; -int uu_exit_fatal_value = EXIT_FAILURE; -int uu_exit_usage_value = 2; - -int * -uu_exit_ok(void) -{ - return (&uu_exit_ok_value); -} - -int * -uu_exit_fatal(void) -{ - return (&uu_exit_fatal_value); -} - -int * -uu_exit_usage(void) -{ - return (&uu_exit_usage_value); -} - -void -uu_alt_exit(int profile) -{ - switch (profile) { - case UU_PROFILE_DEFAULT: - uu_exit_ok_value = EXIT_SUCCESS; - uu_exit_fatal_value = EXIT_FAILURE; - uu_exit_usage_value = 2; - break; - case UU_PROFILE_LAUNCHER: - uu_exit_ok_value = EXIT_SUCCESS; - uu_exit_fatal_value = 124; - uu_exit_usage_value = 125; - break; - } -} - -static __attribute__((format(printf, 2, 0))) void -uu_warn_internal(int err, const char *format, va_list alist) -{ - if (pname != NULL) - (void) fprintf(stderr, "%s: ", pname); - - (void) vfprintf(stderr, format, alist); - - if (strrchr(format, '\n') == NULL) - (void) fprintf(stderr, ": %s\n", strerror(err)); -} - -void -uu_vwarn(const char *format, va_list alist) -{ - uu_warn_internal(errno, format, alist); -} - -void -uu_warn(const char *format, ...) -{ - va_list alist; - va_start(alist, format); - uu_warn_internal(errno, format, alist); - va_end(alist); -} - -static __attribute__((format(printf, 2, 0))) __NORETURN void -uu_die_internal(int status, const char *format, va_list alist) -{ - uu_warn_internal(errno, format, alist); -#ifdef DEBUG - { - char *cp; - - if (!issetugid()) { - cp = getenv("UU_DIE_ABORTS"); - if (cp != NULL && *cp != '\0') - abort(); - } - } -#endif - exit(status); -} - -void -uu_vdie(const char *format, va_list alist) -{ - uu_die_internal(UU_EXIT_FATAL, format, alist); -} - -void -uu_die(const char *format, ...) -{ - va_list alist; - va_start(alist, format); - uu_die_internal(UU_EXIT_FATAL, format, alist); - va_end(alist); -} - -void -uu_vxdie(int status, const char *format, va_list alist) -{ - uu_die_internal(status, format, alist); -} - -void -uu_xdie(int status, const char *format, ...) -{ - va_list alist; - va_start(alist, format); - uu_die_internal(status, format, alist); - va_end(alist); -} - -const char * -uu_setpname(char *arg0) -{ - /* - * Having a NULL argv[0], while uncommon, is possible. It - * makes more sense to handle this event in uu_setpname rather - * than in each of its consumers. - */ - if (arg0 == NULL) { - pname = getexecname(); - if (pname == NULL) - pname = "unknown_command"; - return (pname); - } - - /* - * Guard against '/' at end of command invocation. - */ - for (;;) { - char *p = strrchr(arg0, '/'); - if (p == NULL) { - pname = arg0; - break; - } else { - if (*(p + 1) == '\0') { - *p = '\0'; - continue; - } - - pname = p + 1; - break; - } - } - - return (pname); -} - -const char * -uu_getpname(void) -{ - return (pname); -} diff --git a/sys/contrib/openzfs/lib/libuutil/uu_string.c b/sys/contrib/openzfs/lib/libuutil/uu_string.c index 67024c3b50b4..76f0a082607a 100644 --- a/sys/contrib/openzfs/lib/libuutil/uu_string.c +++ b/sys/contrib/openzfs/lib/libuutil/uu_string.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libzdb/Makefile.am b/sys/contrib/openzfs/lib/libzdb/Makefile.am new file mode 100644 index 000000000000..ec4fd92b984e --- /dev/null +++ b/sys/contrib/openzfs/lib/libzdb/Makefile.am @@ -0,0 +1,7 @@ +libzdb_la_CFLAGS = $(AM_CFLAGS) $(LIBRARY_CFLAGS) +libzdb_la_CFLAGS += -fvisibility=hidden + +noinst_LTLIBRARIES += libzdb.la + +libzdb_la_SOURCES = \ + %D%/libzdb.c diff --git a/sys/contrib/openzfs/lib/libzdb/libzdb.c b/sys/contrib/openzfs/lib/libzdb/libzdb.c new file mode 100644 index 000000000000..12144dc65e75 --- /dev/null +++ b/sys/contrib/openzfs/lib/libzdb/libzdb.c @@ -0,0 +1,102 @@ +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <ctype.h> +#include <getopt.h> +#include <openssl/evp.h> +#include <sys/zfs_context.h> +#include <sys/spa.h> +#include <sys/spa_impl.h> +#include <sys/dmu.h> +#include <sys/zap.h> +#include <sys/fs/zfs.h> +#include <sys/zfs_znode.h> +#include <sys/zfs_sa.h> +#include <sys/sa.h> +#include <sys/sa_impl.h> +#include <sys/vdev.h> +#include <sys/vdev_impl.h> +#include <sys/metaslab_impl.h> +#include <sys/dmu_objset.h> +#include <sys/dsl_dir.h> +#include <sys/dsl_dataset.h> +#include <sys/dsl_pool.h> +#include <sys/dsl_bookmark.h> +#include <sys/dbuf.h> +#include <sys/zil.h> +#include <sys/zil_impl.h> +#include <sys/stat.h> +#include <sys/resource.h> +#include <sys/dmu_send.h> +#include <sys/dmu_traverse.h> +#include <sys/zio_checksum.h> +#include <sys/zio_compress.h> +#include <sys/zfs_fuid.h> +#include <sys/arc.h> +#include <sys/arc_impl.h> +#include <sys/ddt.h> +#include <sys/zfeature.h> +#include <sys/abd.h> +#include <sys/blkptr.h> +#include <sys/dsl_crypt.h> +#include <sys/dsl_scan.h> +#include <sys/btree.h> +#include <sys/brt.h> +#include <sys/brt_impl.h> +#include <zfs_comutil.h> +#include <sys/zstd/zstd.h> + +#include <libnvpair.h> +#include <libzutil.h> + +#include <libzdb.h> + +const char * +zdb_ot_name(dmu_object_type_t type) +{ + if (type < DMU_OT_NUMTYPES) + return (dmu_ot[type].ot_name); + else if ((type & DMU_OT_NEWTYPE) && + ((type & DMU_OT_BYTESWAP_MASK) < DMU_BSWAP_NUMFUNCS)) + return (dmu_ot_byteswap[type & DMU_OT_BYTESWAP_MASK].ob_name); + else + return ("UNKNOWN"); +} + +int +livelist_compare(const void *larg, const void *rarg) +{ + const blkptr_t *l = larg; + const blkptr_t *r = rarg; + + /* Sort them according to dva[0] */ + uint64_t l_dva0_vdev, r_dva0_vdev; + l_dva0_vdev = DVA_GET_VDEV(&l->blk_dva[0]); + r_dva0_vdev = DVA_GET_VDEV(&r->blk_dva[0]); + if (l_dva0_vdev < r_dva0_vdev) + return (-1); + else if (l_dva0_vdev > r_dva0_vdev) + return (+1); + + /* if vdevs are equal, sort by offsets. */ + uint64_t l_dva0_offset; + uint64_t r_dva0_offset; + l_dva0_offset = DVA_GET_OFFSET(&l->blk_dva[0]); + r_dva0_offset = DVA_GET_OFFSET(&r->blk_dva[0]); + if (l_dva0_offset < r_dva0_offset) { + return (-1); + } else if (l_dva0_offset > r_dva0_offset) { + return (+1); + } + + /* + * Since we're storing blkptrs without cancelling FREE/ALLOC pairs, + * it's possible the offsets are equal. In that case, sort by txg + */ + if (BP_GET_LOGICAL_BIRTH(l) < BP_GET_LOGICAL_BIRTH(r)) { + return (-1); + } else if (BP_GET_LOGICAL_BIRTH(l) > BP_GET_LOGICAL_BIRTH(r)) { + return (+1); + } + return (0); +} diff --git a/sys/contrib/openzfs/lib/libzfs/Makefile.am b/sys/contrib/openzfs/lib/libzfs/Makefile.am index e23f7c162afb..5f8963dccd1a 100644 --- a/sys/contrib/openzfs/lib/libzfs/Makefile.am +++ b/sys/contrib/openzfs/lib/libzfs/Makefile.am @@ -1,83 +1,64 @@ -include $(top_srcdir)/config/Rules.am +libzfs_la_CFLAGS = $(AM_CFLAGS) $(LIBRARY_CFLAGS) +libzfs_la_CFLAGS += $(LIBCRYPTO_CFLAGS) $(ZLIB_CFLAGS) +libzfs_la_CFLAGS += -fvisibility=hidden -VPATH = \ - $(top_srcdir)/module/icp \ - $(top_srcdir)/module/zcommon \ - $(top_srcdir)/lib/libzfs - -# Suppress unused but set variable warnings often due to ASSERTs -AM_CFLAGS += $(NO_UNUSED_BUT_SET_VARIABLE) -AM_CFLAGS += $(LIBCRYPTO_CFLAGS) $(ZLIB_CFLAGS) -AM_CFLAGS += -fvisibility=hidden - -pkgconfig_DATA = libzfs.pc - -lib_LTLIBRARIES = libzfs.la - -include $(top_srcdir)/config/Abigail.am - -USER_C = \ - libzfs_impl.h \ - libzfs_changelist.c \ - libzfs_config.c \ - libzfs_crypto.c \ - libzfs_dataset.c \ - libzfs_diff.c \ - libzfs_import.c \ - libzfs_iter.c \ - libzfs_mount.c \ - libzfs_pool.c \ - libzfs_sendrecv.c \ - libzfs_status.c \ - libzfs_util.c +lib_LTLIBRARIES += libzfs.la +CPPCHECKTARGETS += libzfs.la +dist_libzfs_la_SOURCES = \ + %D%/libzfs_impl.h \ + %D%/libzfs_changelist.c \ + %D%/libzfs_config.c \ + %D%/libzfs_crypto.c \ + %D%/libzfs_dataset.c \ + %D%/libzfs_diff.c \ + %D%/libzfs_import.c \ + %D%/libzfs_iter.c \ + %D%/libzfs_mount.c \ + %D%/libzfs_pool.c \ + %D%/libzfs_sendrecv.c \ + %D%/libzfs_status.c \ + %D%/libzfs_util.c if BUILD_FREEBSD -USER_C += \ - os/freebsd/libzfs_compat.c \ - os/freebsd/libzfs_zmount.c +dist_libzfs_la_SOURCES += \ + %D%/os/freebsd/libzfs_compat.c \ + %D%/os/freebsd/libzfs_zmount.c endif if BUILD_LINUX -USER_C += \ - os/linux/libzfs_mount_os.c \ - os/linux/libzfs_pool_os.c \ - os/linux/libzfs_sendrecv_os.c \ - os/linux/libzfs_util_os.c +dist_libzfs_la_SOURCES += \ + %D%/os/linux/libzfs_mount_os.c \ + %D%/os/linux/libzfs_pool_os.c \ + %D%/os/linux/libzfs_util_os.c endif -KERNEL_C = \ - algs/sha2/sha2.c \ - cityhash.c \ - zfeature_common.c \ - zfs_comutil.c \ - zfs_deleg.c \ - zfs_fletcher.c \ - zfs_fletcher_aarch64_neon.c \ - zfs_fletcher_avx512.c \ - zfs_fletcher_intel.c \ - zfs_fletcher_sse.c \ - zfs_fletcher_superscalar.c \ - zfs_fletcher_superscalar4.c \ - zfs_namecheck.c \ - zfs_prop.c \ - zpool_prop.c \ - zprop_common.c - -dist_libzfs_la_SOURCES = \ - $(USER_C) - nodist_libzfs_la_SOURCES = \ - $(KERNEL_C) + module/zcommon/cityhash.c \ + module/zcommon/zfeature_common.c \ + module/zcommon/zfs_comutil.c \ + module/zcommon/zfs_deleg.c \ + module/zcommon/zfs_fletcher.c \ + module/zcommon/zfs_fletcher_aarch64_neon.c \ + module/zcommon/zfs_fletcher_avx512.c \ + module/zcommon/zfs_fletcher_intel.c \ + module/zcommon/zfs_fletcher_sse.c \ + module/zcommon/zfs_fletcher_superscalar.c \ + module/zcommon/zfs_fletcher_superscalar4.c \ + module/zcommon/zfs_namecheck.c \ + module/zcommon/zfs_prop.c \ + module/zcommon/zfs_valstr.c \ + module/zcommon/zpool_prop.c \ + module/zcommon/zprop_common.c libzfs_la_LIBADD = \ - $(abs_top_builddir)/lib/libshare/libshare.la \ - $(abs_top_builddir)/lib/libzfs_core/libzfs_core.la \ - $(abs_top_builddir)/lib/libnvpair/libnvpair.la \ - $(abs_top_builddir)/lib/libzutil/libzutil.la \ - $(abs_top_builddir)/lib/libuutil/libuutil.la + libshare.la \ + libzfs_core.la \ + libnvpair.la \ + libzutil.la \ + libuutil.la -libzfs_la_LIBADD += -lm $(LIBCRYPTO_LIBS) $(ZLIB_LIBS) $(LIBFETCH_LIBS) $(LTLIBINTL) +libzfs_la_LIBADD += -lrt -lm $(LIBCRYPTO_LIBS) $(ZLIB_LIBS) $(LIBFETCH_LIBS) $(LTLIBINTL) libzfs_la_LDFLAGS = -pthread @@ -89,12 +70,9 @@ if BUILD_FREEBSD libzfs_la_LIBADD += -lutil -lgeom endif -libzfs_la_LDFLAGS += -version-info 5:0:1 - -include $(top_srcdir)/config/CppCheck.am +libzfs_la_LDFLAGS += -version-info 6:0:0 -# Library ABI -EXTRA_DIST = libzfs.abi libzfs.suppr +pkgconfig_DATA += %D%/libzfs.pc -# Licensing data -EXTRA_DIST += THIRDPARTYLICENSE.openssl THIRDPARTYLICENSE.openssl.descrip +dist_noinst_DATA += %D%/libzfs.abi %D%/libzfs.suppr +dist_noinst_DATA += %D%/THIRDPARTYLICENSE.openssl %D%/THIRDPARTYLICENSE.openssl.descrip diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs.abi b/sys/contrib/openzfs/lib/libzfs/libzfs.abi index ab6d27e913b8..35ecdca767db 100644 --- a/sys/contrib/openzfs/lib/libzfs/libzfs.abi +++ b/sys/contrib/openzfs/lib/libzfs/libzfs.abi @@ -1,16 +1,15 @@ -<abi-corpus version='2.0' architecture='elf-amd-x86_64' soname='libzfs.so.4'> +<abi-corpus version='2.0' architecture='elf-amd-x86_64' soname='libzfs.so.6'> <elf-needed> <dependency name='libzfs_core.so.3'/> <dependency name='libnvpair.so.3'/> + <dependency name='libunwind.so.8'/> <dependency name='libuuid.so.1'/> - <dependency name='librt.so.1'/> <dependency name='libblkid.so.1'/> <dependency name='libudev.so.1'/> <dependency name='libuutil.so.3'/> <dependency name='libm.so.6'/> - <dependency name='libcrypto.so.1.1'/> + <dependency name='libcrypto.so.3'/> <dependency name='libz.so.1'/> - <dependency name='libpthread.so.0'/> <dependency name='libc.so.6'/> <dependency name='ld-linux-x86-64.so.2'/> </elf-needed> @@ -155,6 +154,9 @@ <elf-symbol name='avl_update_lt' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='avl_walk' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='bookmark_namecheck' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='cityhash1' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='cityhash2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='cityhash3' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='cityhash4' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='color_end' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='color_start' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> @@ -165,7 +167,6 @@ <elf-symbol name='efi_err_check' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='efi_free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='efi_rescan' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='efi_type' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='efi_use_whole_disk' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='efi_write' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='entity_namecheck' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> @@ -182,8 +183,11 @@ <elf-symbol name='fletcher_4_native' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='fletcher_4_native_varsize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='fletcher_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='format_timestamp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='fsleep' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='get_dataset_depth' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='get_system_hostid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='get_timestamp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='getexecname' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='getextmntent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='getmntany' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> @@ -191,7 +195,10 @@ <elf-symbol name='getzoneid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='is_mounted' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='is_mpath_whole_disk' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='libpc_error_description' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='libspl_assertf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='libspl_backtrace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='libspl_set_assert_ok' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='libzfs_add_handle' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='libzfs_envvar_is_set' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='libzfs_errno' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> @@ -233,6 +240,7 @@ <elf-symbol name='membar_enter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='membar_exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='membar_producer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='membar_sync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='mkdirp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='mountpoint_namecheck' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='permset_namecheck' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> @@ -244,6 +252,7 @@ <elf-symbol name='sa_enable_share' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='sa_errorstr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='sa_is_shared' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='sa_truncate_shares' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='sa_validate_shareopts' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='snapshot_namecheck' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='spl_pagesize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> @@ -259,6 +268,25 @@ <elf-symbol name='tpool_suspended' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='tpool_wait' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='update_vdev_config_dev_strs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='update_vdev_config_dev_sysfs_path' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='use_color' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='vdev_expand_proplist' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='vdev_name_to_prop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='vdev_prop_align_right' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='vdev_prop_column_name' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='vdev_prop_default_numeric' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='vdev_prop_default_string' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='vdev_prop_get_table' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='vdev_prop_get_type' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='vdev_prop_index_to_string' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='vdev_prop_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='vdev_prop_random_value' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='vdev_prop_readonly' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='vdev_prop_string_to_index' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='vdev_prop_to_name' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='vdev_prop_user' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='vdev_prop_values' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zcmd_print_json' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfeature_depends_on' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfeature_is_supported' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfeature_is_valid_guid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> @@ -271,10 +299,7 @@ <elf-symbol name='zfs_bookmark_exists' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_clone' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_close' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='zfs_commit_all_shares' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='zfs_commit_nfs_shares' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_commit_shares' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='zfs_commit_smb_shares' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_component_namecheck' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_create_ancestors' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> @@ -320,20 +345,26 @@ <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_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_shared' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='zfs_is_shared_nfs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='zfs_is_shared_smb' 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_iter_bookmarks' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zfs_iter_bookmarks_v2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_iter_children' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zfs_iter_children_v2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_iter_dependents' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zfs_iter_dependents_v2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_iter_filesystems' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zfs_iter_filesystems_v2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_iter_mounted' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_iter_root' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_iter_snapshots' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_iter_snapshots_sorted' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zfs_iter_snapshots_sorted_v2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zfs_iter_snapshots_v2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_iter_snapspec' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zfs_iter_snapspec_v2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_mod_supported' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_mount' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_mount_at' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> @@ -376,6 +407,7 @@ <elf-symbol name='zfs_prop_readonly' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_prop_set' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_prop_set_list' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zfs_prop_set_list_flags' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_prop_setonce' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_prop_string_to_index' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_prop_to_name' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> @@ -401,10 +433,9 @@ <elf-symbol name='zfs_send_resume_token_to_nvlist' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_send_saved' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_set_fsacl' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zfs_setproctitle' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zfs_setproctitle_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_share' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='zfs_share_nfs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='zfs_share_smb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='zfs_shareall' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_show_diffs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_smb_acl_add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_smb_acl_purge' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> @@ -419,36 +450,45 @@ <elf-symbol name='zfs_strcmp_pathname' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_strip_partition' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_strip_path' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zfs_truncate_shares' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_type_to_name' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_unmount' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_unmountall' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_unshare' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='zfs_unshare_nfs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='zfs_unshare_smb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_unshareall' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='zfs_unshareall_bypath' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='zfs_unshareall_bytype' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='zfs_unshareall_nfs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='zfs_unshareall_smb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zfs_userns' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_userspace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_valid_proplist' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zfs_valstr_zio_flag' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zfs_valstr_zio_flag_bits' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zfs_valstr_zio_flag_pairs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zfs_valstr_zio_priority' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zfs_valstr_zio_stage' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zfs_valstr_zio_stage_bits' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zfs_valstr_zio_stage_pairs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zfs_valstr_zio_type' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_version_kernel' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zfs_version_nvlist' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_version_print' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_version_userland' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_wait_status' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zfs_zpl_version_map' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zpool_add_propname' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_checkpoint' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_clear' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_clear_label' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_close' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zpool_collect_unsup_feat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zpool_ddt_prune' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_default_search_paths' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_disable_datasets' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_disable_datasets_os' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_disable_volume_os' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_discard_checkpoint' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zpool_disk_wait' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_dump_ddt' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_enable_datasets' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_events_clear' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> @@ -460,9 +500,11 @@ <elf-symbol name='zpool_export_force' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_feature_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_find_config' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zpool_find_parent_vdev' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_find_vdev' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_find_vdev_by_physpath' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_free_handles' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zpool_get_all_vdev_props' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_get_bootenv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_get_config' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_get_errlog' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> @@ -471,12 +513,15 @@ <elf-symbol name='zpool_get_history' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_get_load_policy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_get_name' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='zpool_get_physpath' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_get_prop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_get_prop_int' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_get_state' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_get_state_str' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_get_status' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zpool_get_userprop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zpool_get_vdev_prop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zpool_get_vdev_prop_value' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zpool_getenv_int' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_history_unpack' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_import' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_import_props' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> @@ -496,7 +541,9 @@ <elf-symbol name='zpool_open' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_open_canfail' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_pool_state_to_name' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='zpool_print_unsup_feat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zpool_prefetch' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zpool_prepare_and_label_disk' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zpool_prepare_disk' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_prop_align_right' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_prop_column_name' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_prop_default_numeric' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> @@ -514,6 +561,7 @@ <elf-symbol name='zpool_prop_to_name' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_prop_unsupported' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_prop_values' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zpool_prop_vdev' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <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'/> @@ -522,7 +570,9 @@ <elf-symbol name='zpool_scan' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_search_import' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_set_bootenv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zpool_set_guid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_set_prop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zpool_set_vdev_prop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_skip_pool' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_state_to_name' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_sync_one' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> @@ -540,15 +590,21 @@ <elf-symbol name='zpool_vdev_path_to_guid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_vdev_remove' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_vdev_remove_cancel' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zpool_vdev_remove_wanted' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zpool_vdev_script_alloc_env' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zpool_vdev_script_free_env' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zpool_vdev_set_removed_state' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_vdev_split' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_wait' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zpool_wait_status' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zprop_collect_property' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zprop_free_list' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zprop_get_list' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zprop_index_to_string' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zprop_iter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zprop_iter_common' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zprop_name_to_prop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zprop_nvlist_one_property' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zprop_print_one_property' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zprop_random_value' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zprop_register_hidden' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> @@ -557,6 +613,7 @@ <elf-symbol name='zprop_register_number' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zprop_register_string' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zprop_string_to_index' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='zprop_valid_char' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zprop_valid_for_type' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zprop_values' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='zprop_width' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> @@ -565,359 +622,212 @@ <elf-variable-symbols> <elf-symbol name='efi_debug' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='fletcher_4_abd_ops' size='24' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='fletcher_4_avx2_ops' size='64' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='fletcher_4_avx512bw_ops' size='64' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='fletcher_4_avx512f_ops' size='64' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='fletcher_4_sse2_ops' size='64' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='fletcher_4_ssse3_ops' size='64' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='fletcher_4_superscalar4_ops' size='64' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='fletcher_4_superscalar_ops' size='64' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='libspl_assert_ok' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='fletcher_4_avx2_ops' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='fletcher_4_avx512bw_ops' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='fletcher_4_avx512f_ops' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='fletcher_4_sse2_ops' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='fletcher_4_ssse3_ops' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='fletcher_4_superscalar4_ops' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='fletcher_4_superscalar_ops' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='libzfs_config_ops' size='16' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='spa_feature_table' size='1904' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <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='2464' 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='512' 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_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'/> </elf-variable-symbols> - <abi-instr address-size='64' path='../../module/avl/avl.c' language='LANG_C99'> - <typedef-decl name='avl_index_t' type-id='e475ab95' id='fba6cb51'/> - <pointer-type-def type-id='fba6cb51' size-in-bits='64' id='32adbf30'/> - <pointer-type-def type-id='eaa32e2f' size-in-bits='64' id='63e171df'/> - <function-decl name='avl_walk' mangled-name='avl_walk' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_walk'> - <parameter type-id='a3681dea' name='tree'/> - <parameter type-id='eaa32e2f' name='oldnode'/> - <parameter type-id='95e97e5e' name='left'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='avl_first' mangled-name='avl_first' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_first'> - <parameter type-id='a3681dea' name='tree'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='avl_last' mangled-name='avl_last' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_last'> - <parameter type-id='a3681dea' name='tree'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='avl_nearest' mangled-name='avl_nearest' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_nearest'> - <parameter type-id='a3681dea' name='tree'/> - <parameter type-id='fba6cb51' name='where'/> - <parameter type-id='95e97e5e' name='direction'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='avl_find' mangled-name='avl_find' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_find'> - <parameter type-id='a3681dea' name='tree'/> - <parameter type-id='eaa32e2f' name='value'/> - <parameter type-id='32adbf30' name='where'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='avl_insert' mangled-name='avl_insert' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_insert'> - <parameter type-id='a3681dea' name='tree'/> - <parameter type-id='eaa32e2f' name='new_data'/> - <parameter type-id='fba6cb51' name='where'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='avl_insert_here' mangled-name='avl_insert_here' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_insert_here'> - <parameter type-id='a3681dea' name='tree'/> - <parameter type-id='eaa32e2f' name='new_data'/> - <parameter type-id='eaa32e2f' name='here'/> - <parameter type-id='95e97e5e' name='direction'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='avl_add' mangled-name='avl_add' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_add'> - <parameter type-id='a3681dea' name='tree'/> - <parameter type-id='eaa32e2f' name='new_node'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='avl_remove' mangled-name='avl_remove' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_remove'> - <parameter type-id='a3681dea' name='tree'/> - <parameter type-id='eaa32e2f' name='data'/> + <abi-instr address-size='64' path='lib/libefi/rdwr_efi.c' language='LANG_C99'> + <typedef-decl name='uInt' type-id='f0981eeb' id='09110a74'/> + <var-decl name='efi_debug' type-id='95e97e5e' mangled-name='efi_debug' visibility='default' elf-symbol-id='efi_debug'/> + <function-decl name='uuid_generate' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='cf536864'/> <return type-id='48b5725f'/> </function-decl> - <function-decl name='avl_update_lt' mangled-name='avl_update_lt' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_update_lt'> - <parameter type-id='a3681dea' name='t'/> - <parameter type-id='eaa32e2f' name='obj'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='avl_update_gt' mangled-name='avl_update_gt' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_update_gt'> - <parameter type-id='a3681dea' name='t'/> - <parameter type-id='eaa32e2f' name='obj'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='avl_update' mangled-name='avl_update' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_update'> - <parameter type-id='a3681dea' name='t'/> - <parameter type-id='eaa32e2f' name='obj'/> - <return type-id='c19b74c3'/> + <function-decl name='uuid_is_null' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='354f7eb9'/> + <return type-id='95e97e5e'/> </function-decl> - <function-decl name='avl_swap' mangled-name='avl_swap' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_swap'> - <parameter type-id='a3681dea' name='tree1'/> - <parameter type-id='a3681dea' name='tree2'/> - <return type-id='48b5725f'/> + <function-decl name='crc32' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5bbcce85'/> + <parameter type-id='e8cb3e0e'/> + <parameter type-id='09110a74'/> + <return type-id='5bbcce85'/> </function-decl> - <function-decl name='avl_create' mangled-name='avl_create' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_create'> - <parameter type-id='a3681dea' name='tree'/> - <parameter type-id='585e1de9' name='compar'/> - <parameter type-id='b59d7dce' name='size'/> - <parameter type-id='b59d7dce' name='offset'/> + <function-decl name='efi_err_check' mangled-name='efi_err_check' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='efi_err_check'> + <parameter type-id='0d8119a8' name='vtoc'/> <return type-id='48b5725f'/> </function-decl> - <function-decl name='avl_destroy' mangled-name='avl_destroy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_destroy'> - <parameter type-id='a3681dea' name='tree'/> - <return type-id='48b5725f'/> + </abi-instr> + <abi-instr address-size='64' path='lib/libshare/libshare.c' language='LANG_C99'> + <array-type-def dimensions='1' type-id='b99c00c9' size-in-bits='128' id='2d6895a3'> + <subrange length='2' type-id='7359adad' id='52efc4ef'/> + </array-type-def> + <var-decl name='sa_protocol_names' type-id='2d6895a3' mangled-name='sa_protocol_names' visibility='default' elf-symbol-id='sa_protocol_names'/> + <type-decl name='unsigned long int' size-in-bits='64' id='7359adad'/> + </abi-instr> + <abi-instr address-size='64' path='lib/libshare/nfs.c' language='LANG_C99'> + <function-decl name='rename' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> </function-decl> - <function-decl name='avl_numnodes' mangled-name='avl_numnodes' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_numnodes'> - <parameter type-id='a3681dea' name='tree'/> - <return type-id='ee1f298e'/> + <function-decl name='memchr' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='eaa32e2f'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='b59d7dce'/> + <return type-id='eaa32e2f'/> </function-decl> - <function-decl name='avl_is_empty' mangled-name='avl_is_empty' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_is_empty'> - <parameter type-id='a3681dea' name='tree'/> - <return type-id='c19b74c3'/> + <function-decl name='flock' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> </function-decl> - <function-decl name='avl_destroy_nodes' mangled-name='avl_destroy_nodes' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_destroy_nodes'> - <parameter type-id='a3681dea' name='tree'/> - <parameter type-id='63e171df' name='cookie'/> - <return type-id='eaa32e2f'/> + <function-decl name='fchmod' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter type-id='e1c52942'/> + <return type-id='95e97e5e'/> </function-decl> - <function-type size-in-bits='64' id='96ee24a5'> - <parameter type-id='eaa32e2f'/> - <parameter type-id='eaa32e2f'/> + <function-decl name='mkdir' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='e1c52942'/> <return type-id='95e97e5e'/> - </function-type> + </function-decl> </abi-instr> - <abi-instr address-size='64' path='rdwr_efi.c' language='LANG_C99'> - <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='288' id='16e6f2c6'> - <subrange length='36' type-id='7359adad' id='ae666bde'/> - </array-type-def> - <array-type-def dimensions='1' type-id='a65ae39c' size-in-bits='960' id='fa198beb'> - <subrange length='1' type-id='7359adad' id='52f813b4'/> - </array-type-def> - <array-type-def dimensions='1' type-id='b96825af' size-in-bits='48' id='0f562bd0'> - <subrange length='6' type-id='7359adad' id='52fa524b'/> - </array-type-def> - <array-type-def dimensions='1' type-id='3502e3ff' size-in-bits='384' id='dba89ba3'> - <subrange length='12' type-id='7359adad' id='84827bdc'/> - </array-type-def> - <array-type-def dimensions='1' type-id='3502e3ff' size-in-bits='256' id='01d84ed4'> - <subrange length='8' type-id='7359adad' id='56e0c0b1'/> - </array-type-def> - <class-decl name='dk_part' size-in-bits='960' is-struct='yes' visibility='default' id='a65ae39c'> + <abi-instr address-size='64' path='lib/libshare/os/linux/nfs.c' language='LANG_C99'> + <class-decl name='sa_share_impl' size-in-bits='192' is-struct='yes' visibility='default' id='72b09bf8'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='p_start' type-id='804dc465' visibility='default'/> + <var-decl name='sa_zfsname' type-id='80f4b756' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='p_size' type-id='804dc465' visibility='default'/> + <var-decl name='sa_mountpoint' type-id='80f4b756' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='p_guid' type-id='214f32ea' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='p_tag' type-id='d908a348' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='272'> - <var-decl name='p_flag' type-id='d908a348' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='288'> - <var-decl name='p_name' type-id='16e6f2c6' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='p_uguid' type-id='214f32ea' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='p_resv' type-id='01d84ed4' visibility='default'/> + <var-decl name='sa_shareopts' type-id='80f4b756' visibility='default'/> </data-member> </class-decl> - <class-decl name='dk_gpt' size-in-bits='1920' is-struct='yes' visibility='default' id='dd4a2e5a'> + <typedef-decl name='sa_share_impl_t' type-id='946a2c6b' id='a48b47d0'/> + <class-decl name='sa_fstype_t' size-in-bits='384' is-struct='yes' naming-typedef-id='639af739' visibility='default' id='944afa86'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='efi_version' type-id='3502e3ff' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='efi_nparts' type-id='3502e3ff' visibility='default'/> + <var-decl name='enable_share' type-id='2f78a9c1' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='efi_part_size' type-id='3502e3ff' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='efi_lbasize' type-id='3502e3ff' visibility='default'/> + <var-decl name='disable_share' type-id='2f78a9c1' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='efi_last_lba' type-id='804dc465' visibility='default'/> + <var-decl name='is_shared' type-id='81020bc2' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='efi_first_u_lba' type-id='804dc465' visibility='default'/> + <var-decl name='validate_shareopts' type-id='f194a8fb' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='efi_last_u_lba' type-id='804dc465' visibility='default'/> + <var-decl name='commit_shares' type-id='797ee7da' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='efi_disk_uguid' type-id='214f32ea' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='efi_flags' type-id='3502e3ff' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='480'> - <var-decl name='efi_reserved1' type-id='3502e3ff' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='efi_altern_lba' type-id='804dc465' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='efi_reserved' type-id='dba89ba3' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='960'> - <var-decl name='efi_parts' type-id='fa198beb' visibility='default'/> - </data-member> - </class-decl> - <class-decl name='uuid' size-in-bits='128' is-struct='yes' visibility='default' id='214f32ea'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='time_low' type-id='8f92235e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='time_mid' type-id='149c6638' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='48'> - <var-decl name='time_hi_and_version' type-id='149c6638' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='clock_seq_hi_and_reserved' type-id='b96825af' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='72'> - <var-decl name='clock_seq_low' type-id='b96825af' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='80'> - <var-decl name='node_addr' type-id='0f562bd0' visibility='default'/> + <var-decl name='truncate_shares' type-id='5d51038b' visibility='default'/> </data-member> </class-decl> - <typedef-decl name='ushort_t' type-id='8efea9e5' id='d908a348'/> - <pointer-type-def type-id='dd4a2e5a' size-in-bits='64' id='0d8119a8'/> - <pointer-type-def type-id='0d8119a8' size-in-bits='64' id='c43b27a6'/> - <var-decl name='efi_debug' type-id='95e97e5e' mangled-name='efi_debug' visibility='default' elf-symbol-id='efi_debug'/> - <function-decl name='efi_alloc_and_init' mangled-name='efi_alloc_and_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='efi_alloc_and_init'> - <parameter type-id='95e97e5e' name='fd'/> - <parameter type-id='8f92235e' name='nparts'/> - <parameter type-id='c43b27a6' name='vtoc'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='efi_alloc_and_read' mangled-name='efi_alloc_and_read' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='efi_alloc_and_read'> - <parameter type-id='95e97e5e' name='fd'/> - <parameter type-id='c43b27a6' name='vtoc'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='efi_rescan' mangled-name='efi_rescan' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='efi_rescan'> - <parameter type-id='95e97e5e' name='fd'/> + <typedef-decl name='sa_fstype_t' type-id='944afa86' id='639af739'/> + <qualified-type-def type-id='639af739' const='yes' id='d19dbca9'/> + <qualified-type-def type-id='72b09bf8' const='yes' id='484950e3'/> + <pointer-type-def type-id='484950e3' size-in-bits='64' id='946a2c6b'/> + <pointer-type-def type-id='276427e1' size-in-bits='64' id='1db260e5'/> + <qualified-type-def type-id='1db260e5' const='yes' id='797ee7da'/> + <pointer-type-def type-id='5113b296' size-in-bits='64' id='70487b28'/> + <qualified-type-def type-id='70487b28' const='yes' id='f194a8fb'/> + <pointer-type-def type-id='c13578bc' size-in-bits='64' id='fa1f29ce'/> + <qualified-type-def type-id='fa1f29ce' const='yes' id='2f78a9c1'/> + <pointer-type-def type-id='723e6cf2' size-in-bits='64' id='1d99e49c'/> + <pointer-type-def type-id='86373eb1' size-in-bits='64' id='f337456d'/> + <qualified-type-def type-id='f337456d' const='yes' id='81020bc2'/> + <qualified-type-def type-id='953b12f8' const='yes' id='5d51038b'/> + <var-decl name='libshare_nfs_type' type-id='d19dbca9' visibility='default'/> + <function-decl name='nfs_escape_mountpoint' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='9b23c9ad'/> + <parameter type-id='37e3bd22'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='efi_use_whole_disk' mangled-name='efi_use_whole_disk' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='efi_use_whole_disk'> - <parameter type-id='95e97e5e' name='fd'/> - <return type-id='95e97e5e'/> + <function-decl name='nfs_is_shared_impl' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='a48b47d0'/> + <return type-id='c19b74c3'/> </function-decl> - <function-decl name='efi_write' mangled-name='efi_write' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='efi_write'> - <parameter type-id='95e97e5e' name='fd'/> - <parameter type-id='0d8119a8' name='vtoc'/> + <function-decl name='nfs_toggle_share' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <parameter type-id='a48b47d0'/> + <parameter type-id='1d99e49c'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='efi_free' mangled-name='efi_free' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='efi_free'> - <parameter type-id='0d8119a8' name='ptr'/> + <function-decl name='nfs_reset_shares' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> <return type-id='48b5725f'/> </function-decl> - <function-decl name='efi_type' mangled-name='efi_type' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='efi_type'> - <parameter type-id='95e97e5e' name='fd'/> + <function-type size-in-bits='64' id='276427e1'> <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='efi_err_check' mangled-name='efi_err_check' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='efi_err_check'> - <parameter type-id='0d8119a8' name='vtoc'/> - <return type-id='48b5725f'/> - </function-decl> - <type-decl name='unsigned long int' size-in-bits='64' id='7359adad'/> - <type-decl name='unsigned short int' size-in-bits='16' id='8efea9e5'/> - </abi-instr> - <abi-instr address-size='64' path='libshare.c' language='LANG_C99'> - <function-decl name='sa_enable_share' mangled-name='sa_enable_share' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sa_enable_share'> - <parameter type-id='80f4b756' name='zfsname'/> - <parameter type-id='80f4b756' name='mountpoint'/> - <parameter type-id='80f4b756' name='shareopts'/> - <parameter type-id='26a90f95' name='protocol'/> + </function-type> + <function-type size-in-bits='64' id='5113b296'> + <parameter type-id='80f4b756'/> <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='sa_disable_share' mangled-name='sa_disable_share' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sa_disable_share'> - <parameter type-id='80f4b756' name='mountpoint'/> - <parameter type-id='26a90f95' name='protocol'/> + </function-type> + <function-type size-in-bits='64' id='c13578bc'> + <parameter type-id='a48b47d0'/> <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='sa_is_shared' mangled-name='sa_is_shared' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sa_is_shared'> - <parameter type-id='80f4b756' name='mountpoint'/> - <parameter type-id='26a90f95' name='protocol'/> + </function-type> + <function-type size-in-bits='64' id='723e6cf2'> + <parameter type-id='a48b47d0'/> + <parameter type-id='822cd80b'/> + <return type-id='95e97e5e'/> + </function-type> + <function-type size-in-bits='64' id='86373eb1'> + <parameter type-id='a48b47d0'/> <return type-id='c19b74c3'/> + </function-type> + <function-type size-in-bits='64' id='ee076206'> + <return type-id='48b5725f'/> + </function-type> + </abi-instr> + <abi-instr address-size='64' path='lib/libshare/os/linux/smb.c' language='LANG_C99'> + <var-decl name='libshare_smb_type' type-id='d19dbca9' visibility='default'/> + <function-decl name='__fgets_chk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='266fe297'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='e75a27e9'/> + <return type-id='26a90f95'/> </function-decl> - <function-decl name='sa_commit_shares' mangled-name='sa_commit_shares' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sa_commit_shares'> - <parameter type-id='80f4b756' name='protocol'/> + </abi-instr> + <abi-instr address-size='64' path='lib/libspl/assert.c' language='LANG_C99'> + <function-decl name='libspl_backtrace' mangled-name='libspl_backtrace' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libspl_backtrace'> + <parameter type-id='95e97e5e'/> <return type-id='48b5725f'/> </function-decl> - <function-decl name='sa_errorstr' mangled-name='sa_errorstr' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sa_errorstr'> - <parameter type-id='95e97e5e' name='err'/> - <return type-id='26a90f95'/> + <function-decl name='gettid' visibility='default' binding='global' size-in-bits='64'> + <return type-id='3629bad8'/> </function-decl> - <function-decl name='sa_validate_shareopts' mangled-name='sa_validate_shareopts' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sa_validate_shareopts'> - <parameter type-id='26a90f95' name='options'/> - <parameter type-id='26a90f95' name='proto'/> + <function-decl name='prctl' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter is-variadic='yes'/> <return type-id='95e97e5e'/> </function-decl> - </abi-instr> - <abi-instr address-size='64' path='os/linux/smb.c' language='LANG_C99'> - <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='2040' id='11641789'> - <subrange length='255' type-id='7359adad' id='36e7f891'/> - </array-type-def> - <class-decl name='smb_share_s' size-in-bits='36992' is-struct='yes' visibility='default' id='a75bc907'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='name' type-id='11641789' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2040'> - <var-decl name='path' type-id='d16c6df4' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='34808'> - <var-decl name='comment' type-id='11641789' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='36864'> - <var-decl name='guest_ok' type-id='c19b74c3' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='36928'> - <var-decl name='next' type-id='05ed1c5f' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='smb_share_t' type-id='a75bc907' id='2d05afd9'/> - <pointer-type-def type-id='a75bc907' size-in-bits='64' id='05ed1c5f'/> - <pointer-type-def type-id='2d05afd9' size-in-bits='64' id='a3e5c654'/> - <var-decl name='smb_shares' type-id='a3e5c654' visibility='default'/> - </abi-instr> - <abi-instr address-size='64' path='assert.c' language='LANG_C99'> - <var-decl name='libspl_assert_ok' type-id='95e97e5e' mangled-name='libspl_assert_ok' visibility='default' elf-symbol-id='libspl_assert_ok'/> - <function-decl name='libspl_assertf' mangled-name='libspl_assertf' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libspl_assertf'> - <parameter type-id='80f4b756' name='file'/> - <parameter type-id='80f4b756' name='func'/> - <parameter type-id='95e97e5e' name='line'/> - <parameter type-id='80f4b756' name='format'/> - <parameter is-variadic='yes'/> + <function-decl name='libspl_set_assert_ok' mangled-name='libspl_set_assert_ok' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libspl_set_assert_ok'> + <parameter type-id='c19b74c3' name='val'/> <return type-id='48b5725f'/> </function-decl> </abi-instr> - <abi-instr address-size='64' path='atomic.c' language='LANG_C99'> - <type-decl name='signed char' size-in-bits='8' id='28577a57'/> - <type-decl name='unsigned short int' size-in-bits='16' id='8efea9e5'/> + <abi-instr address-size='64' path='lib/libspl/atomic.c' language='LANG_C99'> <typedef-decl name='int8_t' type-id='2171a512' id='ee31ee44'/> - <typedef-decl name='int16_t' type-id='03896e23' id='23bd8cb5'/> - <typedef-decl name='uint16_t' type-id='253c2d2a' id='149c6638'/> <typedef-decl name='__int8_t' type-id='28577a57' id='2171a512'/> - <typedef-decl name='__int16_t' type-id='a2185560' id='03896e23'/> - <typedef-decl name='__uint16_t' type-id='8efea9e5' id='253c2d2a'/> <qualified-type-def type-id='149c6638' volatile='yes' id='5120c5f7'/> <pointer-type-def type-id='5120c5f7' size-in-bits='64' id='93977ae7'/> - <qualified-type-def type-id='8f92235e' volatile='yes' id='430e0681'/> - <pointer-type-def type-id='430e0681' size-in-bits='64' id='3a147f31'/> <qualified-type-def type-id='b96825af' volatile='yes' id='84ff7d66'/> <pointer-type-def type-id='84ff7d66' size-in-bits='64' id='aa323ea4'/> <qualified-type-def type-id='ee1f298e' volatile='yes' id='6f7e09cb'/> <pointer-type-def type-id='6f7e09cb' size-in-bits='64' id='64698d33'/> - <qualified-type-def type-id='48b5725f' volatile='yes' id='b0b3cbf9'/> - <pointer-type-def type-id='b0b3cbf9' size-in-bits='64' id='fe09dd29'/> <function-decl name='atomic_inc_8' mangled-name='atomic_inc_8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_inc_8'> <parameter type-id='aa323ea4' name='target'/> <return type-id='48b5725f'/> @@ -950,6 +860,11 @@ <parameter type-id='64698d33' name='target'/> <return type-id='48b5725f'/> </function-decl> + <function-decl name='atomic_add_ptr' mangled-name='atomic_add_ptr' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_add_ptr'> + <parameter type-id='fe09dd29' name='target'/> + <parameter type-id='79a0948f' name='bits'/> + <return type-id='48b5725f'/> + </function-decl> <function-decl name='atomic_add_8' mangled-name='atomic_add_8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_add_8'> <parameter type-id='aa323ea4' name='target'/> <parameter type-id='ee31ee44' name='bits'/> @@ -965,12 +880,7 @@ <parameter type-id='3ff5601b' name='bits'/> <return type-id='48b5725f'/> </function-decl> - <function-decl name='atomic_add_long' mangled-name='atomic_add_long' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_add_long'> - <parameter type-id='64698d33' name='target'/> - <parameter type-id='bd54fe1a' name='bits'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='atomic_add_ptr' mangled-name='atomic_add_ptr' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_add_ptr'> + <function-decl name='atomic_sub_ptr' mangled-name='atomic_sub_ptr' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_sub_ptr'> <parameter type-id='fe09dd29' name='target'/> <parameter type-id='79a0948f' name='bits'/> <return type-id='48b5725f'/> @@ -990,16 +900,6 @@ <parameter type-id='3ff5601b' name='bits'/> <return type-id='48b5725f'/> </function-decl> - <function-decl name='atomic_sub_long' mangled-name='atomic_sub_long' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_sub_long'> - <parameter type-id='64698d33' name='target'/> - <parameter type-id='bd54fe1a' name='bits'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='atomic_sub_ptr' mangled-name='atomic_sub_ptr' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_sub_ptr'> - <parameter type-id='fe09dd29' name='target'/> - <parameter type-id='79a0948f' name='bits'/> - <return type-id='48b5725f'/> - </function-decl> <function-decl name='atomic_or_8' mangled-name='atomic_or_8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_or_8'> <parameter type-id='aa323ea4' name='target'/> <parameter type-id='b96825af' name='bits'/> @@ -1072,6 +972,11 @@ <parameter type-id='64698d33' name='target'/> <return type-id='ee1f298e'/> </function-decl> + <function-decl name='atomic_add_ptr_nv' mangled-name='atomic_add_ptr_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_add_ptr_nv'> + <parameter type-id='fe09dd29' name='target'/> + <parameter type-id='79a0948f' name='bits'/> + <return type-id='eaa32e2f'/> + </function-decl> <function-decl name='atomic_add_8_nv' mangled-name='atomic_add_8_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_add_8_nv'> <parameter type-id='aa323ea4' name='target'/> <parameter type-id='ee31ee44' name='bits'/> @@ -1092,7 +997,7 @@ <parameter type-id='bd54fe1a' name='bits'/> <return type-id='ee1f298e'/> </function-decl> - <function-decl name='atomic_add_ptr_nv' mangled-name='atomic_add_ptr_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_add_ptr_nv'> + <function-decl name='atomic_sub_ptr_nv' mangled-name='atomic_sub_ptr_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_sub_ptr_nv'> <parameter type-id='fe09dd29' name='target'/> <parameter type-id='79a0948f' name='bits'/> <return type-id='eaa32e2f'/> @@ -1117,11 +1022,6 @@ <parameter type-id='bd54fe1a' name='bits'/> <return type-id='ee1f298e'/> </function-decl> - <function-decl name='atomic_sub_ptr_nv' mangled-name='atomic_sub_ptr_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_sub_ptr_nv'> - <parameter type-id='fe09dd29' name='target'/> - <parameter type-id='79a0948f' name='bits'/> - <return type-id='eaa32e2f'/> - </function-decl> <function-decl name='atomic_or_8_nv' mangled-name='atomic_or_8_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_or_8_nv'> <parameter type-id='aa323ea4' name='target'/> <parameter type-id='b96825af' name='bits'/> @@ -1162,6 +1062,12 @@ <parameter type-id='ee1f298e' name='bits'/> <return type-id='ee1f298e'/> </function-decl> + <function-decl name='atomic_cas_ptr' mangled-name='atomic_cas_ptr' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_cas_ptr'> + <parameter type-id='fe09dd29' name='target'/> + <parameter type-id='eaa32e2f' name='exp'/> + <parameter type-id='eaa32e2f' name='des'/> + <return type-id='eaa32e2f'/> + </function-decl> <function-decl name='atomic_cas_8' mangled-name='atomic_cas_8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_cas_8'> <parameter type-id='aa323ea4' name='target'/> <parameter type-id='b96825af' name='exp'/> @@ -1186,12 +1092,6 @@ <parameter type-id='ee1f298e' name='des'/> <return type-id='ee1f298e'/> </function-decl> - <function-decl name='atomic_cas_ptr' mangled-name='atomic_cas_ptr' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_cas_ptr'> - <parameter type-id='fe09dd29' name='target'/> - <parameter type-id='eaa32e2f' name='exp'/> - <parameter type-id='eaa32e2f' name='des'/> - <return type-id='eaa32e2f'/> - </function-decl> <function-decl name='atomic_swap_8' mangled-name='atomic_swap_8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_swap_8'> <parameter type-id='aa323ea4' name='target'/> <parameter type-id='b96825af' name='bits'/> @@ -1202,11 +1102,6 @@ <parameter type-id='149c6638' name='bits'/> <return type-id='149c6638'/> </function-decl> - <function-decl name='atomic_swap_32' mangled-name='atomic_swap_32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_swap_32'> - <parameter type-id='3a147f31' name='target'/> - <parameter type-id='8f92235e' name='bits'/> - <return type-id='8f92235e'/> - </function-decl> <function-decl name='atomic_swap_ulong' mangled-name='atomic_swap_ulong' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_swap_ulong'> <parameter type-id='64698d33' name='target'/> <parameter type-id='ee1f298e' name='bits'/> @@ -1230,19 +1125,201 @@ <function-decl name='membar_enter' mangled-name='membar_enter' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='membar_enter'> <return type-id='48b5725f'/> </function-decl> - <function-decl name='membar_producer' mangled-name='membar_producer' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='membar_producer'> - <return type-id='48b5725f'/> - </function-decl> <function-decl name='membar_consumer' mangled-name='membar_consumer' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='membar_consumer'> <return type-id='48b5725f'/> </function-decl> </abi-instr> - <abi-instr address-size='64' path='getexecname.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libspl/backtrace.c' language='LANG_C99'> + <array-type-def dimensions='1' type-id='62f1140c' size-in-bits='768' id='b80f3d9b'> + <subrange length='24' type-id='7359adad' id='fdd3342b'/> + </array-type-def> + <array-type-def dimensions='1' type-id='62f1140c' size-in-bits='128' id='bc19e735'> + <subrange length='4' type-id='7359adad' id='16fe7105'/> + </array-type-def> + <array-type-def dimensions='1' type-id='22c546af' size-in-bits='1024' id='498c040b'> + <subrange length='8' type-id='7359adad' id='56e0c0b1'/> + </array-type-def> + <array-type-def dimensions='1' type-id='4ea07cdb' size-in-bits='2048' id='4811c35e'> + <subrange length='16' type-id='7359adad' id='848d0938'/> + </array-type-def> + <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> + <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> + <array-type-def dimensions='1' type-id='3a47d82b' size-in-bits='512' id='a13e797f'> + <subrange length='8' type-id='7359adad' id='56e0c0b1'/> + </array-type-def> + <array-type-def dimensions='1' type-id='8efea9e5' size-in-bits='48' id='ff2536e2'> + <subrange length='3' type-id='7359adad' id='56f209d2'/> + </array-type-def> + <array-type-def dimensions='1' type-id='8efea9e5' size-in-bits='64' id='3f30d495'> + <subrange length='4' type-id='7359adad' id='16fe7105'/> + </array-type-def> + <array-type-def dimensions='1' type-id='73d941c6' size-in-bits='8128' id='dc70ec0b'> + <subrange length='127' type-id='7359adad' id='5ed08de5'/> + </array-type-def> + <class-decl name='stack_t' size-in-bits='192' is-struct='yes' naming-typedef-id='ac5e685f' visibility='default' id='380f9954'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ss_sp' type-id='eaa32e2f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='ss_flags' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='ss_size' type-id='b59d7dce' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='stack_t' type-id='380f9954' id='ac5e685f'/> + <typedef-decl name='unw_regnum_t' type-id='95e97e5e' id='c53620f0'/> + <class-decl name='unw_cursor' size-in-bits='8128' is-struct='yes' visibility='default' id='384a1f22'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='opaque' type-id='dc70ec0b' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='unw_cursor_t' type-id='384a1f22' id='1203d35c'/> + <typedef-decl name='unw_context_t' type-id='190d09ef' id='8f527367'/> + <typedef-decl name='unw_word_t' type-id='9c313c2d' id='73d941c6'/> + <typedef-decl name='unw_tdep_context_t' type-id='c4daa689' id='190d09ef'/> + <typedef-decl name='greg_t' type-id='1eb56b1e' id='de572c22'/> + <typedef-decl name='gregset_t' type-id='6d3c2f42' id='a66f139c'/> + <class-decl name='_libc_fpxreg' size-in-bits='128' is-struct='yes' visibility='default' id='22c546af'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='significand' type-id='3f30d495' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='exponent' type-id='8efea9e5' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='80'> + <var-decl name='__glibc_reserved1' type-id='ff2536e2' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='_libc_xmmreg' size-in-bits='128' is-struct='yes' visibility='default' id='4ea07cdb'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='element' type-id='bc19e735' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='_libc_fpstate' size-in-bits='4096' is-struct='yes' visibility='default' id='81cbe5ca'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='cwd' type-id='253c2d2a' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='16'> + <var-decl name='swd' type-id='253c2d2a' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='ftw' type-id='253c2d2a' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='48'> + <var-decl name='fop' type-id='253c2d2a' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='rip' type-id='8910171f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='rdp' type-id='8910171f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='mxcsr' type-id='62f1140c' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='224'> + <var-decl name='mxcr_mask' type-id='62f1140c' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='_st' type-id='498c040b' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1280'> + <var-decl name='_xmm' type-id='4811c35e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3328'> + <var-decl name='__glibc_reserved1' type-id='b80f3d9b' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='fpregset_t' type-id='5b1ab9a8' id='6e5851bb'/> + <class-decl name='mcontext_t' size-in-bits='2048' is-struct='yes' naming-typedef-id='bacab071' visibility='default' id='76fab990'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='gregs' type-id='a66f139c' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1472'> + <var-decl name='fpregs' type-id='6e5851bb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1536'> + <var-decl name='__reserved1' type-id='a13e797f' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='mcontext_t' type-id='76fab990' id='bacab071'/> + <class-decl name='ucontext_t' size-in-bits='7744' is-struct='yes' visibility='default' id='1ba65dc8'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='uc_flags' type-id='7359adad' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='uc_link' type-id='4ed508de' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='uc_stack' type-id='ac5e685f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='uc_mcontext' type-id='bacab071' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2368'> + <var-decl name='uc_sigmask' type-id='daf33c64' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3392'> + <var-decl name='__fpregs_mem' type-id='81cbe5ca' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7488'> + <var-decl name='__ssp' type-id='a133ec23' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='ucontext_t' type-id='1ba65dc8' id='c4daa689'/> + <pointer-type-def type-id='81cbe5ca' size-in-bits='64' id='5b1ab9a8'/> + <pointer-type-def type-id='1ba65dc8' size-in-bits='64' id='4ed508de'/> + <pointer-type-def type-id='8f527367' size-in-bits='64' id='2e408b96'/> + <pointer-type-def type-id='1203d35c' size-in-bits='64' id='3946e4d1'/> + <pointer-type-def type-id='190d09ef' size-in-bits='64' id='3e0601f0'/> + <pointer-type-def type-id='73d941c6' size-in-bits='64' id='42f5faab'/> + <function-decl name='_Ux86_64_regname' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='c53620f0'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='_ULx86_64_init_local' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='3946e4d1'/> + <parameter type-id='2e408b96'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='_ULx86_64_step' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='3946e4d1'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='_ULx86_64_get_reg' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='3946e4d1'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='42f5faab'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='_ULx86_64_get_proc_name' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='3946e4d1'/> + <parameter type-id='26a90f95'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='42f5faab'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='_Ux86_64_getcontext' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='3e0601f0'/> + <return type-id='95e97e5e'/> + </function-decl> + <type-decl name='unsigned short int' size-in-bits='16' id='8efea9e5'/> + </abi-instr> + <abi-instr address-size='64' path='lib/libspl/getexecname.c' language='LANG_C99'> <function-decl name='getexecname' mangled-name='getexecname' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='getexecname'> <return type-id='80f4b756'/> </function-decl> + <function-decl name='getexecname_impl' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='26a90f95'/> + <return type-id='79a0948f'/> + </function-decl> </abi-instr> - <abi-instr address-size='64' path='list.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libspl/list.c' language='LANG_C99'> <typedef-decl name='list_node_t' type-id='b0b5e45e' id='b21843b2'/> <typedef-decl name='list_t' type-id='e824dae9' id='0899125f'/> <class-decl name='list_node' size-in-bits='128' is-struct='yes' visibility='default' id='b0b5e45e'> @@ -1253,14 +1330,11 @@ <var-decl name='prev' type-id='b03eadb4' visibility='default'/> </data-member> </class-decl> - <class-decl name='list' size-in-bits='256' is-struct='yes' visibility='default' id='e824dae9'> + <class-decl name='list' size-in-bits='192' is-struct='yes' visibility='default' id='e824dae9'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='list_size' type-id='b59d7dce' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> <var-decl name='list_offset' type-id='b59d7dce' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='128'> + <data-member access='public' layout-offset-in-bits='64'> <var-decl name='list_head' type-id='b0b5e45e' visibility='default'/> </data-member> </class-decl> @@ -1353,367 +1427,109 @@ <return type-id='95e97e5e'/> </function-decl> </abi-instr> - <abi-instr address-size='64' path='mkdirp.c' language='LANG_C99'> - <typedef-decl name='mode_t' type-id='e1c52942' id='d50d396c'/> - <function-decl name='mkdirp' mangled-name='mkdirp' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mkdirp'> - <parameter type-id='80f4b756' name='d'/> - <parameter type-id='d50d396c' name='mode'/> - <return type-id='95e97e5e'/> + <abi-instr address-size='64' path='lib/libspl/mkdirp.c' language='LANG_C99'> + <typedef-decl name='wchar_t' type-id='95e97e5e' id='928221d2'/> + <qualified-type-def type-id='928221d2' const='yes' id='effb3702'/> + <pointer-type-def type-id='effb3702' size-in-bits='64' id='f077d3f8'/> + <qualified-type-def type-id='f077d3f8' restrict='yes' id='598aab80'/> + <pointer-type-def type-id='928221d2' size-in-bits='64' id='323d93c1'/> + <qualified-type-def type-id='323d93c1' restrict='yes' id='f1358bc3'/> + <function-decl name='__mbstowcs_chk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='f1358bc3'/> + <parameter type-id='9d26089a'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='b59d7dce'/> + <return type-id='b59d7dce'/> </function-decl> - </abi-instr> - <abi-instr address-size='64' path='os/linux/gethostid.c' language='LANG_C99'> - <function-decl name='get_system_hostid' mangled-name='get_system_hostid' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_system_hostid'> - <return type-id='7359adad'/> + <function-decl name='__wcstombs_chk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='266fe297'/> + <parameter type-id='598aab80'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='b59d7dce'/> + <return type-id='b59d7dce'/> </function-decl> </abi-instr> - <abi-instr address-size='64' path='os/linux/getmntany.c' language='LANG_C99'> - <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='a84c031d' size-in-bits='8' id='89feb1ec'> - <subrange length='1' type-id='7359adad' id='52f813b4'/> - </array-type-def> - <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='160' id='664ac0b7'> - <subrange length='20' type-id='7359adad' id='fdca39cf'/> - </array-type-def> - <class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='a4036571'/> - <class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='010ae0b9'/> - <class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='79bd3751'/> - <class-decl name='extmnttab' size-in-bits='320' is-struct='yes' visibility='default' id='0c544dc0'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='mnt_special' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='mnt_mountp' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='mnt_fstype' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='mnt_mntopts' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='mnt_major' type-id='3502e3ff' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='288'> - <var-decl name='mnt_minor' type-id='3502e3ff' visibility='default'/> - </data-member> - </class-decl> - <class-decl name='stat64' size-in-bits='1152' is-struct='yes' visibility='default' id='0bbec9cd'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='st_dev' type-id='35ed8932' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='st_ino' type-id='71288a47' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='st_nlink' type-id='80f0b9df' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='st_mode' type-id='e1c52942' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='224'> - <var-decl name='st_uid' type-id='cc5fcceb' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='st_gid' type-id='d94ec6d9' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='288'> - <var-decl name='__pad0' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='st_rdev' type-id='35ed8932' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='st_size' type-id='79989e9c' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='st_blksize' type-id='d3f10a7f' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='st_blocks' type-id='4e711bf1' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='st_atim' type-id='a9c79a1f' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='st_mtim' type-id='a9c79a1f' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='st_ctim' type-id='a9c79a1f' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='960'> - <var-decl name='__glibc_reserved' type-id='083f8d58' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='__dev_t' type-id='7359adad' id='35ed8932'/> - <typedef-decl name='__gid_t' type-id='f0981eeb' id='d94ec6d9'/> - <typedef-decl name='__ino64_t' type-id='7359adad' id='71288a47'/> - <typedef-decl name='__mode_t' type-id='f0981eeb' id='e1c52942'/> - <typedef-decl name='__nlink_t' type-id='7359adad' id='80f0b9df'/> - <typedef-decl name='__off_t' type-id='bd54fe1a' id='79989e9c'/> - <typedef-decl name='__off64_t' type-id='bd54fe1a' id='724e4de6'/> - <typedef-decl name='__time_t' type-id='bd54fe1a' id='65eda9c0'/> - <typedef-decl name='__blksize_t' type-id='bd54fe1a' id='d3f10a7f'/> - <typedef-decl name='__blkcnt64_t' type-id='bd54fe1a' id='4e711bf1'/> - <typedef-decl name='__syscall_slong_t' type-id='bd54fe1a' id='03085adc'/> - <typedef-decl name='FILE' type-id='ec1ed955' id='aa12d1ba'/> - <typedef-decl name='_IO_lock_t' type-id='48b5725f' id='bb4788fa'/> - <class-decl name='_IO_FILE' size-in-bits='1728' is-struct='yes' visibility='default' id='ec1ed955'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_flags' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='_IO_read_ptr' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='_IO_read_end' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='_IO_read_base' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='_IO_write_base' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_IO_write_ptr' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='_IO_write_end' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='_IO_buf_base' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='_IO_buf_end' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='_IO_save_base' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='_IO_backup_base' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='_IO_save_end' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='_markers' type-id='e4c6fa61' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='_chain' type-id='dca988a5' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='_fileno' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='928'> - <var-decl name='_flags2' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='960'> - <var-decl name='_old_offset' type-id='79989e9c' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1024'> - <var-decl name='_cur_column' type-id='8efea9e5' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1040'> - <var-decl name='_vtable_offset' type-id='28577a57' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1048'> - <var-decl name='_shortbuf' type-id='89feb1ec' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1088'> - <var-decl name='_lock' type-id='cecf4ea7' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1152'> - <var-decl name='_offset' type-id='724e4de6' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1216'> - <var-decl name='_codecvt' type-id='570f8c59' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1280'> - <var-decl name='_wide_data' type-id='c65a1f29' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1344'> - <var-decl name='_freeres_list' type-id='dca988a5' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1408'> - <var-decl name='_freeres_buf' type-id='eaa32e2f' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1472'> - <var-decl name='__pad5' type-id='b59d7dce' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1536'> - <var-decl name='_mode' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1568'> - <var-decl name='_unused2' type-id='664ac0b7' visibility='default'/> - </data-member> - </class-decl> - <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' id='a9c79a1f'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='tv_sec' type-id='65eda9c0' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='tv_nsec' type-id='03085adc' visibility='default'/> - </data-member> - </class-decl> - <pointer-type-def type-id='aa12d1ba' size-in-bits='64' id='822cd80b'/> - <pointer-type-def type-id='ec1ed955' size-in-bits='64' id='dca988a5'/> - <pointer-type-def type-id='a4036571' size-in-bits='64' id='570f8c59'/> - <pointer-type-def type-id='bb4788fa' size-in-bits='64' id='cecf4ea7'/> - <pointer-type-def type-id='010ae0b9' size-in-bits='64' id='e4c6fa61'/> - <pointer-type-def type-id='79bd3751' size-in-bits='64' id='c65a1f29'/> - <pointer-type-def type-id='0c544dc0' size-in-bits='64' id='394fc496'/> - <pointer-type-def type-id='0bbec9cd' size-in-bits='64' id='62f7a03d'/> - <class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='a4036571'/> - <class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='010ae0b9'/> - <class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='79bd3751'/> - <function-decl name='getmntany' mangled-name='getmntany' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='getmntany'> - <parameter type-id='822cd80b' name='fp'/> - <parameter type-id='9d424d31' name='mgetp'/> - <parameter type-id='9d424d31' name='mrefp'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='_sol_getmntent' mangled-name='_sol_getmntent' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_sol_getmntent'> - <parameter type-id='822cd80b' name='fp'/> - <parameter type-id='9d424d31' name='mgetp'/> - <return type-id='95e97e5e'/> + <abi-instr address-size='64' path='lib/libspl/os/linux/getmntany.c' language='LANG_C99'> + <pointer-type-def type-id='56fe4a37' size-in-bits='64' id='b6b61d2f'/> + <qualified-type-def type-id='b6b61d2f' restrict='yes' id='3cad23cd'/> + <function-decl name='getmntent_r' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='e75a27e9'/> + <parameter type-id='3cad23cd'/> + <parameter type-id='266fe297'/> + <parameter type-id='95e97e5e'/> + <return type-id='b6b61d2f'/> </function-decl> - <function-decl name='getextmntent' mangled-name='getextmntent' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='getextmntent'> - <parameter type-id='80f4b756' name='path'/> - <parameter type-id='394fc496' name='entry'/> - <parameter type-id='62f7a03d' name='statbuf'/> + <function-decl name='feof' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='822cd80b'/> <return type-id='95e97e5e'/> </function-decl> </abi-instr> - <abi-instr address-size='64' path='os/linux/zone.c' language='LANG_C99'> - <typedef-decl name='zoneid_t' type-id='95e97e5e' id='4da03624'/> - <function-decl name='getzoneid' mangled-name='getzoneid' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='getzoneid'> - <return type-id='4da03624'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='page.c' language='LANG_C99'> - <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> - </abi-instr> - <abi-instr address-size='64' path='strlcat.c' language='LANG_C99'> - <function-decl name='strlcat' mangled-name='strlcat' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='strlcat'> - <parameter type-id='26a90f95' name='dst'/> - <parameter type-id='80f4b756' name='src'/> - <parameter type-id='b59d7dce' name='dstsize'/> - <return type-id='b59d7dce'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='strlcpy.c' language='LANG_C99'> - <function-decl name='strlcpy' mangled-name='strlcpy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='strlcpy'> - <parameter type-id='26a90f95' name='dst'/> - <parameter type-id='80f4b756' name='src'/> - <parameter type-id='b59d7dce' name='len'/> - <return type-id='b59d7dce'/> + <abi-instr address-size='64' path='lib/libspl/timestamp.c' language='LANG_C99'> + <typedef-decl name='nl_item' type-id='95e97e5e' id='03b79a94'/> + <function-decl name='nl_langinfo' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='03b79a94'/> + <return type-id='26a90f95'/> </function-decl> - </abi-instr> - <abi-instr address-size='64' path='timestamp.c' language='LANG_C99'> <function-decl name='print_timestamp' mangled-name='print_timestamp' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='print_timestamp'> <parameter type-id='3502e3ff' name='timestamp_fmt'/> <return type-id='48b5725f'/> </function-decl> + <function-decl name='get_timestamp' mangled-name='get_timestamp' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_timestamp'> + <parameter type-id='3502e3ff' name='timestamp_fmt'/> + <parameter type-id='26a90f95' name='buf'/> + <parameter type-id='95e97e5e' name='len'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='format_timestamp' mangled-name='format_timestamp' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='format_timestamp'> + <parameter type-id='c9d12d66' name='t'/> + <parameter type-id='26a90f95' name='buf'/> + <parameter type-id='95e97e5e' name='len'/> + <return type-id='48b5725f'/> + </function-decl> </abi-instr> - <abi-instr address-size='64' path='thread_pool.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libtpool/thread_pool.c' language='LANG_C99'> + <array-type-def dimensions='1' type-id='49ef3ffd' size-in-bits='1024' id='a14403f5'> + <subrange length='16' type-id='7359adad' id='848d0938'/> + </array-type-def> <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='384' id='36d7f119'> <subrange length='48' type-id='7359adad' id='8f6d2a81'/> </array-type-def> - <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='448' id='6093ff7c'> - <subrange length='56' type-id='7359adad' id='f8137894'/> - </array-type-def> - <type-decl name='long long unsigned int' size-in-bits='64' id='3a47d82b'/> <array-type-def dimensions='1' type-id='f0981eeb' size-in-bits='64' id='0d532ec1'> <subrange length='2' type-id='7359adad' id='52efc4ef'/> </array-type-def> - <typedef-decl name='tpool_t' type-id='88d1b7f9' id='b1bbf10d'/> - <typedef-decl name='tpool_job_t' type-id='3b8579e5' id='66a0afc9'/> - <class-decl name='tpool_job' size-in-bits='192' is-struct='yes' visibility='default' id='3b8579e5'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='tpj_next' type-id='f32b30e4' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='tpj_func' type-id='b7f9d8e6' visibility='default'/> + <union-decl name='__atomic_wide_counter' size-in-bits='64' naming-typedef-id='f3b40860' visibility='default' id='613ce450'> + <data-member access='public'> + <var-decl name='__value64' type-id='3a47d82b' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='tpj_arg' type-id='eaa32e2f' visibility='default'/> + <data-member access='public'> + <var-decl name='__value32' type-id='e7f43f72' visibility='default'/> </data-member> - </class-decl> - <typedef-decl name='tpool_active_t' type-id='c8d086f4' id='6fcda10e'/> - <class-decl name='tpool_active' size-in-bits='128' is-struct='yes' visibility='default' id='c8d086f4'> + </union-decl> + <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f72'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='tpa_next' type-id='ad33e5e7' visibility='default'/> + <var-decl name='__low' type-id='f0981eeb' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='tpa_tid' type-id='4051f5e7' visibility='default'/> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='__high' type-id='f0981eeb' visibility='default'/> </data-member> </class-decl> - <class-decl name='tpool' size-in-bits='2496' is-struct='yes' visibility='default' id='88d1b7f9'> + <typedef-decl name='__atomic_wide_counter' type-id='613ce450' id='f3b40860'/> + <typedef-decl name='__cpu_mask' type-id='7359adad' id='49ef3ffd'/> + <class-decl name='cpu_set_t' size-in-bits='1024' is-struct='yes' naming-typedef-id='8037c762' visibility='default' id='1f20d231'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='tp_forw' type-id='9cf59a50' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='tp_back' type-id='9cf59a50' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='tp_mutex' type-id='7a6844eb' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='tp_busycv' type-id='62fab762' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='tp_workcv' type-id='62fab762' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1216'> - <var-decl name='tp_waitcv' type-id='62fab762' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1600'> - <var-decl name='tp_active' type-id='ad33e5e7' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1664'> - <var-decl name='tp_head' type-id='f32b30e4' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1728'> - <var-decl name='tp_tail' type-id='f32b30e4' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1792'> - <var-decl name='tp_attr' type-id='7d8569fd' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2240'> - <var-decl name='tp_flags' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2272'> - <var-decl name='tp_linger' type-id='3502e3ff' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2304'> - <var-decl name='tp_njobs' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2336'> - <var-decl name='tp_minimum' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2368'> - <var-decl name='tp_maximum' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2400'> - <var-decl name='tp_current' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2432'> - <var-decl name='tp_idle' type-id='95e97e5e' visibility='default'/> + <var-decl name='__bits' type-id='a14403f5' visibility='default'/> </data-member> </class-decl> - <typedef-decl name='pthread_t' type-id='7359adad' id='4051f5e7'/> - <union-decl name='pthread_attr_t' size-in-bits='448' visibility='default' id='b63afacd'> + <typedef-decl name='cpu_set_t' type-id='1f20d231' id='8037c762'/> + <union-decl name='pthread_condattr_t' size-in-bits='32' naming-typedef-id='836265dd' visibility='default' id='33dd3aad'> <data-member access='public'> - <var-decl name='__size' type-id='6093ff7c' visibility='default'/> + <var-decl name='__size' type-id='8e0573fd' visibility='default'/> </data-member> <data-member access='public'> - <var-decl name='__align' type-id='bd54fe1a' visibility='default'/> + <var-decl name='__align' type-id='95e97e5e' visibility='default'/> </data-member> </union-decl> - <typedef-decl name='pthread_attr_t' type-id='b63afacd' id='7d8569fd'/> + <typedef-decl name='pthread_condattr_t' type-id='33dd3aad' id='836265dd'/> <union-decl name='pthread_cond_t' size-in-bits='384' naming-typedef-id='62fab762' visibility='default' id='cbb12c12'> <data-member access='public'> <var-decl name='__data' type-id='c987b47c' visibility='default'/> @@ -1728,10 +1544,10 @@ <typedef-decl name='pthread_cond_t' type-id='cbb12c12' id='62fab762'/> <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' id='c987b47c'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='' type-id='ac5ab595' visibility='default'/> + <var-decl name='__wseq' type-id='f3b40860' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='' type-id='ac5ab596' visibility='default'/> + <var-decl name='__g1_start' type-id='f3b40860' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> <var-decl name='__g_refs' type-id='0d532ec1' visibility='default'/> @@ -1749,1052 +1565,270 @@ <var-decl name='__g_signals' type-id='0d532ec1' visibility='default'/> </data-member> </class-decl> - <union-decl name='__anonymous_union__1' size-in-bits='64' is-anonymous='yes' visibility='default' id='ac5ab595'> - <data-member access='public'> - <var-decl name='__wseq' type-id='3a47d82b' visibility='default'/> - </data-member> - <data-member access='public'> - <var-decl name='__wseq32' type-id='e7f43f72' visibility='default'/> - </data-member> - </union-decl> - <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f72'> + <class-decl name='sched_param' size-in-bits='32' is-struct='yes' visibility='default' id='0897719a'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='__low' type-id='f0981eeb' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='__high' type-id='f0981eeb' visibility='default'/> + <var-decl name='sched_priority' type-id='95e97e5e' visibility='default'/> </data-member> </class-decl> - <union-decl name='__anonymous_union__2' size-in-bits='64' is-anonymous='yes' visibility='default' id='ac5ab596'> - <data-member access='public'> - <var-decl name='__g1_start' type-id='3a47d82b' visibility='default'/> - </data-member> - <data-member access='public'> - <var-decl name='__g1_start32' type-id='e7f43f72' visibility='default'/> - </data-member> - </union-decl> - <pointer-type-def type-id='7d8569fd' size-in-bits='64' id='7347a39e'/> - <pointer-type-def type-id='6fcda10e' size-in-bits='64' id='ad33e5e7'/> - <pointer-type-def type-id='66a0afc9' size-in-bits='64' id='f32b30e4'/> - <pointer-type-def type-id='b1bbf10d' size-in-bits='64' id='9cf59a50'/> - <pointer-type-def type-id='c5c76c9c' size-in-bits='64' id='b7f9d8e6'/> - <function-decl name='tpool_create' mangled-name='tpool_create' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='tpool_create'> - <parameter type-id='3502e3ff' name='min_threads'/> - <parameter type-id='3502e3ff' name='max_threads'/> - <parameter type-id='3502e3ff' name='linger'/> - <parameter type-id='7347a39e' name='attr'/> - <return type-id='9cf59a50'/> - </function-decl> - <function-decl name='tpool_dispatch' mangled-name='tpool_dispatch' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='tpool_dispatch'> - <parameter type-id='9cf59a50' name='tpool'/> - <parameter type-id='b7f9d8e6' name='func'/> - <parameter type-id='eaa32e2f' name='arg'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='tpool_destroy' mangled-name='tpool_destroy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='tpool_destroy'> - <parameter type-id='9cf59a50' name='tpool'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='tpool_abandon' mangled-name='tpool_abandon' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='tpool_abandon'> - <parameter type-id='9cf59a50' name='tpool'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='tpool_wait' mangled-name='tpool_wait' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='tpool_wait'> - <parameter type-id='9cf59a50' name='tpool'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='tpool_suspend' mangled-name='tpool_suspend' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='tpool_suspend'> - <parameter type-id='9cf59a50' name='tpool'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='tpool_suspended' mangled-name='tpool_suspended' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='tpool_suspended'> - <parameter type-id='9cf59a50' name='tpool'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='tpool_resume' mangled-name='tpool_resume' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='tpool_resume'> - <parameter type-id='9cf59a50' name='tpool'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='tpool_member' mangled-name='tpool_member' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='tpool_member'> - <parameter type-id='9cf59a50' name='tpool'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-type size-in-bits='64' id='c5c76c9c'> - <parameter type-id='eaa32e2f'/> - <return type-id='48b5725f'/> - </function-type> - </abi-instr> - <abi-instr address-size='64' path='../../module/zcommon/cityhash.c' language='LANG_C99'> - <function-decl name='cityhash4' mangled-name='cityhash4' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cityhash4'> - <parameter type-id='9c313c2d' name='w1'/> - <parameter type-id='9c313c2d' name='w2'/> - <parameter type-id='9c313c2d' name='w3'/> - <parameter type-id='9c313c2d' name='w4'/> - <return type-id='9c313c2d'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='../../module/zcommon/zfeature_common.c' language='LANG_C99'> - <array-type-def dimensions='1' type-id='83f29ca2' size-in-bits='15232' id='d96379d0'> - <subrange length='34' type-id='7359adad' id='6a6a7e00'/> - </array-type-def> - <enum-decl name='spa_feature' id='33ecb627'> - <underlying-type type-id='9cac1fee'/> - <enumerator name='SPA_FEATURE_NONE' value='-1'/> - <enumerator name='SPA_FEATURE_ASYNC_DESTROY' value='0'/> - <enumerator name='SPA_FEATURE_EMPTY_BPOBJ' value='1'/> - <enumerator name='SPA_FEATURE_LZ4_COMPRESS' value='2'/> - <enumerator name='SPA_FEATURE_MULTI_VDEV_CRASH_DUMP' value='3'/> - <enumerator name='SPA_FEATURE_SPACEMAP_HISTOGRAM' value='4'/> - <enumerator name='SPA_FEATURE_ENABLED_TXG' value='5'/> - <enumerator name='SPA_FEATURE_HOLE_BIRTH' value='6'/> - <enumerator name='SPA_FEATURE_EXTENSIBLE_DATASET' value='7'/> - <enumerator name='SPA_FEATURE_EMBEDDED_DATA' value='8'/> - <enumerator name='SPA_FEATURE_BOOKMARKS' value='9'/> - <enumerator name='SPA_FEATURE_FS_SS_LIMIT' value='10'/> - <enumerator name='SPA_FEATURE_LARGE_BLOCKS' value='11'/> - <enumerator name='SPA_FEATURE_LARGE_DNODE' value='12'/> - <enumerator name='SPA_FEATURE_SHA512' value='13'/> - <enumerator name='SPA_FEATURE_SKEIN' value='14'/> - <enumerator name='SPA_FEATURE_EDONR' value='15'/> - <enumerator name='SPA_FEATURE_USEROBJ_ACCOUNTING' value='16'/> - <enumerator name='SPA_FEATURE_ENCRYPTION' value='17'/> - <enumerator name='SPA_FEATURE_PROJECT_QUOTA' value='18'/> - <enumerator name='SPA_FEATURE_DEVICE_REMOVAL' value='19'/> - <enumerator name='SPA_FEATURE_OBSOLETE_COUNTS' value='20'/> - <enumerator name='SPA_FEATURE_POOL_CHECKPOINT' value='21'/> - <enumerator name='SPA_FEATURE_SPACEMAP_V2' value='22'/> - <enumerator name='SPA_FEATURE_ALLOCATION_CLASSES' value='23'/> - <enumerator name='SPA_FEATURE_RESILVER_DEFER' value='24'/> - <enumerator name='SPA_FEATURE_BOOKMARK_V2' value='25'/> - <enumerator name='SPA_FEATURE_REDACTION_BOOKMARKS' value='26'/> - <enumerator name='SPA_FEATURE_REDACTED_DATASETS' value='27'/> - <enumerator name='SPA_FEATURE_BOOKMARK_WRITTEN' value='28'/> - <enumerator name='SPA_FEATURE_LOG_SPACEMAP' value='29'/> - <enumerator name='SPA_FEATURE_LIVELIST' value='30'/> - <enumerator name='SPA_FEATURE_DEVICE_REBUILD' value='31'/> - <enumerator name='SPA_FEATURE_ZSTD_COMPRESS' value='32'/> - <enumerator name='SPA_FEATURE_DRAID' value='33'/> - <enumerator name='SPA_FEATURES' value='34'/> - </enum-decl> - <typedef-decl name='spa_feature_t' type-id='33ecb627' id='d6618c78'/> - <enum-decl name='zfeature_flags' id='6db816a4'> - <underlying-type type-id='9cac1fee'/> - <enumerator name='ZFEATURE_FLAG_READONLY_COMPAT' value='1'/> - <enumerator name='ZFEATURE_FLAG_MOS' value='2'/> - <enumerator name='ZFEATURE_FLAG_ACTIVATE_ON_ENABLE' value='4'/> - <enumerator name='ZFEATURE_FLAG_PER_DATASET' value='8'/> - </enum-decl> - <typedef-decl name='zfeature_flags_t' type-id='6db816a4' id='fc329033'/> - <enum-decl name='zfeature_type' id='c4fa2355'> - <underlying-type type-id='9cac1fee'/> - <enumerator name='ZFEATURE_TYPE_BOOLEAN' value='0'/> - <enumerator name='ZFEATURE_TYPE_UINT64_ARRAY' value='1'/> - <enumerator name='ZFEATURE_NUM_TYPES' value='2'/> - </enum-decl> - <typedef-decl name='zfeature_type_t' type-id='c4fa2355' id='732d2bb2'/> - <class-decl name='zfeature_info' size-in-bits='448' is-struct='yes' visibility='default' id='1178d146'> + <typedef-decl name='tpool_job_t' type-id='3b8579e5' id='66a0afc9'/> + <class-decl name='tpool_job' size-in-bits='192' is-struct='yes' visibility='default' id='3b8579e5'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='fi_feature' type-id='d6618c78' visibility='default'/> + <var-decl name='tpj_next' type-id='f32b30e4' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='fi_uname' type-id='80f4b756' visibility='default'/> + <var-decl name='tpj_func' type-id='b7f9d8e6' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='fi_guid' type-id='80f4b756' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='fi_desc' type-id='80f4b756' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='fi_flags' type-id='fc329033' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='288'> - <var-decl name='fi_zfs_mod_supported' type-id='c19b74c3' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='fi_type' type-id='732d2bb2' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='fi_depends' type-id='1acff326' visibility='default'/> + <var-decl name='tpj_arg' type-id='eaa32e2f' visibility='default'/> </data-member> </class-decl> - <typedef-decl name='zfeature_info_t' type-id='1178d146' id='83f29ca2'/> - <qualified-type-def type-id='d6618c78' const='yes' id='81a65028'/> - <pointer-type-def type-id='81a65028' size-in-bits='64' id='1acff326'/> - <pointer-type-def type-id='d6618c78' size-in-bits='64' id='a8425263'/> - <var-decl name='spa_feature_table' type-id='d96379d0' mangled-name='spa_feature_table' visibility='default' elf-symbol-id='spa_feature_table'/> - <var-decl name='zfeature_checks_disable' type-id='c19b74c3' mangled-name='zfeature_checks_disable' visibility='default' elf-symbol-id='zfeature_checks_disable'/> - <function-decl name='zfeature_is_valid_guid' mangled-name='zfeature_is_valid_guid' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfeature_is_valid_guid'> - <parameter type-id='80f4b756' name='name'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='zfeature_is_supported' mangled-name='zfeature_is_supported' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfeature_is_supported'> - <parameter type-id='80f4b756' name='guid'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='zfeature_lookup_guid' mangled-name='zfeature_lookup_guid' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfeature_lookup_guid'> - <parameter type-id='80f4b756' name='guid'/> - <parameter type-id='a8425263' name='res'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='zfeature_lookup_name' mangled-name='zfeature_lookup_name' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfeature_lookup_name'> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='a8425263' name='res'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='zfeature_depends_on' mangled-name='zfeature_depends_on' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfeature_depends_on'> - <parameter type-id='d6618c78' name='fid'/> - <parameter type-id='d6618c78' name='check'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='zfs_mod_supported' mangled-name='zfs_mod_supported' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_mod_supported'> - <parameter type-id='80f4b756' name='scope'/> - <parameter type-id='80f4b756' name='name'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='zpool_feature_init' mangled-name='zpool_feature_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_feature_init'> - <return type-id='48b5725f'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='../../module/zcommon/zfs_comutil.c' language='LANG_C99'> - <array-type-def dimensions='1' type-id='80f4b756' size-in-bits='2624' id='ef31fedf'> - <subrange length='41' type-id='7359adad' id='cb834f44'/> - </array-type-def> - <class-decl name='zpool_load_policy' size-in-bits='256' is-struct='yes' visibility='default' id='2f65b36f'> + <typedef-decl name='tpool_active_t' type-id='c8d086f4' id='6fcda10e'/> + <class-decl name='tpool_active' size-in-bits='128' is-struct='yes' visibility='default' id='c8d086f4'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='zlp_rewind' type-id='8f92235e' visibility='default'/> + <var-decl name='tpa_next' type-id='ad33e5e7' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='zlp_maxmeta' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='zlp_maxdata' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='zlp_txg' type-id='9c313c2d' visibility='default'/> + <var-decl name='tpa_tid' type-id='4051f5e7' visibility='default'/> </data-member> </class-decl> - <typedef-decl name='zpool_load_policy_t' type-id='2f65b36f' id='d11b7617'/> - <pointer-type-def type-id='d11b7617' size-in-bits='64' id='23432aaa'/> - <var-decl name='zfs_history_event_names' type-id='ef31fedf' mangled-name='zfs_history_event_names' visibility='default' elf-symbol-id='zfs_history_event_names'/> - <function-decl name='zfs_allocatable_devs' mangled-name='zfs_allocatable_devs' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_allocatable_devs'> - <parameter type-id='5ce45b60' name='nv'/> - <return type-id='c19b74c3'/> + <qualified-type-def type-id='8037c762' const='yes' id='f50ea9b2'/> + <pointer-type-def type-id='f50ea9b2' size-in-bits='64' id='5e14fa48'/> + <qualified-type-def type-id='836265dd' const='yes' id='7d24c58d'/> + <pointer-type-def type-id='7d24c58d' size-in-bits='64' id='a7e325e5'/> + <qualified-type-def type-id='a7e325e5' restrict='yes' id='4c428e67'/> + <qualified-type-def type-id='0897719a' const='yes' id='c4a7b189'/> + <pointer-type-def type-id='c4a7b189' size-in-bits='64' id='36fca399'/> + <qualified-type-def type-id='36fca399' restrict='yes' id='37e4897b'/> + <qualified-type-def type-id='e05e8614' restrict='yes' id='0be2e71c'/> + <pointer-type-def type-id='8037c762' size-in-bits='64' id='d74a6869'/> + <qualified-type-def type-id='7292109c' restrict='yes' id='6942f6a4'/> + <qualified-type-def type-id='7347a39e' restrict='yes' id='578ba182'/> + <pointer-type-def type-id='62fab762' size-in-bits='64' id='db285b03'/> + <qualified-type-def type-id='db285b03' restrict='yes' id='2a468b41'/> + <qualified-type-def type-id='18c91f9e' restrict='yes' id='6e745582'/> + <pointer-type-def type-id='0897719a' size-in-bits='64' id='23cbcb08'/> + <qualified-type-def type-id='23cbcb08' restrict='yes' id='b09b2050'/> + <pointer-type-def type-id='6fcda10e' size-in-bits='64' id='ad33e5e7'/> + <pointer-type-def type-id='66a0afc9' size-in-bits='64' id='f32b30e4'/> + <qualified-type-def type-id='63e171df' restrict='yes' id='9e7a3a7d'/> + <function-decl name='pthread_self' visibility='default' binding='global' size-in-bits='64'> + <return type-id='4051f5e7'/> </function-decl> - <function-decl name='zfs_special_devs' mangled-name='zfs_special_devs' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_special_devs'> - <parameter type-id='5ce45b60' name='nv'/> - <parameter type-id='26a90f95' name='type'/> - <return type-id='c19b74c3'/> + <function-decl name='pthread_attr_init' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='7347a39e'/> + <return type-id='95e97e5e'/> </function-decl> - <function-decl name='zpool_get_load_policy' mangled-name='zpool_get_load_policy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_get_load_policy'> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='23432aaa' name='zlpp'/> - <return type-id='48b5725f'/> + <function-decl name='pthread_attr_destroy' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='7347a39e'/> + <return type-id='95e97e5e'/> </function-decl> - <function-decl name='zfs_zpl_version_map' mangled-name='zfs_zpl_version_map' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_zpl_version_map'> - <parameter type-id='95e97e5e' name='spa_version'/> + <function-decl name='pthread_attr_getdetachstate' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='540db505'/> + <parameter type-id='7292109c'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='zfs_spa_version_map' mangled-name='zfs_spa_version_map' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_spa_version_map'> - <parameter type-id='95e97e5e' name='zpl_version'/> + <function-decl name='pthread_attr_setdetachstate' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='7347a39e'/> + <parameter type-id='95e97e5e'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='zfs_dataset_name_hidden' mangled-name='zfs_dataset_name_hidden' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_dataset_name_hidden'> - <parameter type-id='80f4b756' name='name'/> - <return type-id='c19b74c3'/> + <function-decl name='pthread_attr_getguardsize' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='540db505'/> + <parameter type-id='78c01427'/> + <return type-id='95e97e5e'/> </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='f3f851ad' size-in-bits='infinite' id='bc4e5d90'> - <subrange length='infinite' id='031f2035'/> - </array-type-def> - <enum-decl name='zfs_deleg_who_type_t' naming-typedef-id='36d4bd5a' id='b5fa5816'> - <underlying-type type-id='9cac1fee'/> - <enumerator name='ZFS_DELEG_WHO_UNKNOWN' value='0'/> - <enumerator name='ZFS_DELEG_USER' value='117'/> - <enumerator name='ZFS_DELEG_USER_SETS' value='85'/> - <enumerator name='ZFS_DELEG_GROUP' value='103'/> - <enumerator name='ZFS_DELEG_GROUP_SETS' value='71'/> - <enumerator name='ZFS_DELEG_EVERYONE' value='101'/> - <enumerator name='ZFS_DELEG_EVERYONE_SETS' value='69'/> - <enumerator name='ZFS_DELEG_CREATE' value='99'/> - <enumerator name='ZFS_DELEG_CREATE_SETS' value='67'/> - <enumerator name='ZFS_DELEG_NAMED_SET' value='115'/> - <enumerator name='ZFS_DELEG_NAMED_SET_SETS' value='83'/> - </enum-decl> - <typedef-decl name='zfs_deleg_who_type_t' type-id='b5fa5816' id='36d4bd5a'/> - <enum-decl name='zfs_deleg_note_t' naming-typedef-id='4613c173' id='729d4547'> - <underlying-type type-id='9cac1fee'/> - <enumerator name='ZFS_DELEG_NOTE_CREATE' value='0'/> - <enumerator name='ZFS_DELEG_NOTE_DESTROY' value='1'/> - <enumerator name='ZFS_DELEG_NOTE_SNAPSHOT' value='2'/> - <enumerator name='ZFS_DELEG_NOTE_ROLLBACK' value='3'/> - <enumerator name='ZFS_DELEG_NOTE_CLONE' value='4'/> - <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'/> - </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'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='z_perm' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='z_note' type-id='4613c173' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='zfs_deleg_perm_tab_t' type-id='5aa05c1f' id='f3f851ad'/> - <var-decl name='zfs_deleg_perm_tab' type-id='bc4e5d90' mangled-name='zfs_deleg_perm_tab' visibility='default' elf-symbol-id='zfs_deleg_perm_tab'/> - <function-decl name='zfs_deleg_canonicalize_perm' mangled-name='zfs_deleg_canonicalize_perm' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_deleg_canonicalize_perm'> - <parameter type-id='80f4b756' name='perm'/> - <return type-id='80f4b756'/> + <function-decl name='pthread_attr_setguardsize' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='7347a39e'/> + <parameter type-id='b59d7dce'/> + <return type-id='95e97e5e'/> </function-decl> - <function-decl name='zfs_deleg_verify_nvlist' mangled-name='zfs_deleg_verify_nvlist' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_deleg_verify_nvlist'> - <parameter type-id='5ce45b60' name='nvp'/> + <function-decl name='pthread_attr_getschedparam' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='e1815e87'/> + <parameter type-id='b09b2050'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='zfs_deleg_whokey' mangled-name='zfs_deleg_whokey' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_deleg_whokey'> - <parameter type-id='26a90f95' name='attr'/> - <parameter type-id='36d4bd5a' name='type'/> - <parameter type-id='a84c031d' name='inheritchr'/> - <parameter type-id='eaa32e2f' name='data'/> - <return type-id='48b5725f'/> + <function-decl name='pthread_attr_setschedparam' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='578ba182'/> + <parameter type-id='37e4897b'/> + <return type-id='95e97e5e'/> </function-decl> - </abi-instr> - <abi-instr address-size='64' path='../../module/zcommon/zfs_fletcher.c' language='LANG_C99'> - <array-type-def dimensions='1' type-id='9c313c2d' size-in-bits='256' id='85c64d26'> - <subrange length='4' type-id='7359adad' id='16fe7105'/> - </array-type-def> - <array-type-def dimensions='1' type-id='9c313c2d' size-in-bits='512' id='c5d13f42'> - <subrange length='8' type-id='7359adad' id='56e0c0b1'/> - </array-type-def> - <array-type-def dimensions='1' type-id='90dbb6d6' size-in-bits='2048' id='16582e69'> - <subrange length='4' type-id='7359adad' id='16fe7105'/> - </array-type-def> - <array-type-def dimensions='1' type-id='8240361c' size-in-bits='1024' id='481f90b1'> - <subrange length='4' type-id='7359adad' id='16fe7105'/> - </array-type-def> - <array-type-def dimensions='1' type-id='7c1ab40c' size-in-bits='512' id='cbd91ec1'> - <subrange length='4' type-id='7359adad' id='16fe7105'/> - </array-type-def> - <array-type-def dimensions='1' type-id='6d059eaa' size-in-bits='1024' id='729b6ebb'> - <subrange length='4' type-id='7359adad' id='16fe7105'/> - </array-type-def> - <class-decl name='zio_cksum' size-in-bits='256' is-struct='yes' visibility='default' id='1d53e28b'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='zc_word' type-id='85c64d26' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='zio_cksum_t' type-id='1d53e28b' id='39730d0b'/> - <enum-decl name='zio_byteorder_t' naming-typedef-id='595a65ec' id='fc861be0'> - <underlying-type type-id='9cac1fee'/> - <enumerator name='ZIO_CHECKSUM_NATIVE' value='0'/> - <enumerator name='ZIO_CHECKSUM_BYTESWAP' value='1'/> - </enum-decl> - <typedef-decl name='zio_byteorder_t' type-id='fc861be0' id='595a65ec'/> - <class-decl name='zio_abd_checksum_data' size-in-bits='256' is-struct='yes' visibility='default' id='4bf4b004'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='acd_byteorder' type-id='595a65ec' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='acd_ctx' type-id='0f7df99e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='acd_zcp' type-id='c24fc2ee' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='acd_private' type-id='eaa32e2f' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='zio_abd_checksum_data_t' type-id='4bf4b004' id='74e39470'/> - <typedef-decl name='zio_abd_checksum_init_t' type-id='a5444274' id='029a8ebe'/> - <typedef-decl name='zio_abd_checksum_fini_t' type-id='a5444274' id='d6fd5c6c'/> - <typedef-decl name='zio_abd_checksum_iter_t' type-id='f4a1892e' id='cefa0f4a'/> - <class-decl name='zio_abd_checksum_func' size-in-bits='192' is-struct='yes' visibility='default' id='aa14691a'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='acf_init' type-id='0bcca125' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='acf_fini' type-id='bfe36153' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='acf_iter' type-id='1e276399' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='zio_abd_checksum_func_t' type-id='3f8e8d11' id='c2eb138a'/> - <class-decl name='zfs_fletcher_superscalar' size-in-bits='256' is-struct='yes' visibility='default' id='28efb250'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='v' type-id='85c64d26' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='zfs_fletcher_superscalar_t' type-id='28efb250' id='6d059eaa'/> - <class-decl name='zfs_fletcher_sse' size-in-bits='128' is-struct='yes' visibility='default' id='acd4019a'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='v' type-id='c1c22e6c' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='zfs_fletcher_sse_t' type-id='acd4019a' id='7c1ab40c'/> - <class-decl name='zfs_fletcher_avx' size-in-bits='256' is-struct='yes' visibility='default' id='8c208dfa'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='v' type-id='85c64d26' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='zfs_fletcher_avx_t' type-id='8c208dfa' id='8240361c'/> - <class-decl name='zfs_fletcher_avx512' size-in-bits='512' is-struct='yes' visibility='default' id='c6d0c382'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='v' type-id='c5d13f42' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='zfs_fletcher_avx512_t' type-id='c6d0c382' id='90dbb6d6'/> - <union-decl name='fletcher_4_ctx' size-in-bits='2048' visibility='default' id='1f951ade'> - <data-member access='public'> - <var-decl name='scalar' type-id='39730d0b' visibility='default'/> - </data-member> - <data-member access='public'> - <var-decl name='superscalar' type-id='729b6ebb' visibility='default'/> - </data-member> - <data-member access='public'> - <var-decl name='sse' type-id='cbd91ec1' visibility='default'/> - </data-member> - <data-member access='public'> - <var-decl name='avx' type-id='481f90b1' visibility='default'/> - </data-member> - <data-member access='public'> - <var-decl name='avx512' type-id='16582e69' visibility='default'/> - </data-member> - </union-decl> - <typedef-decl name='fletcher_4_ctx_t' type-id='1f951ade' id='4b675395'/> - <qualified-type-def type-id='aa14691a' const='yes' id='3f8e8d11'/> - <pointer-type-def type-id='4b675395' size-in-bits='64' id='0f7df99e'/> - <pointer-type-def type-id='74e39470' size-in-bits='64' id='eefe7427'/> - <pointer-type-def type-id='d6fd5c6c' size-in-bits='64' id='bfe36153'/> - <pointer-type-def type-id='029a8ebe' size-in-bits='64' id='0bcca125'/> - <pointer-type-def type-id='cefa0f4a' size-in-bits='64' id='1e276399'/> - <pointer-type-def type-id='39730d0b' size-in-bits='64' id='c24fc2ee'/> - <var-decl name='fletcher_4_abd_ops' type-id='c2eb138a' mangled-name='fletcher_4_abd_ops' visibility='default' elf-symbol-id='fletcher_4_abd_ops'/> - <function-decl name='fletcher_init' mangled-name='fletcher_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fletcher_init'> - <parameter type-id='c24fc2ee' name='zcp'/> - <return type-id='48b5725f'/> + <function-decl name='pthread_attr_getschedpolicy' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='e1815e87'/> + <parameter type-id='6942f6a4'/> + <return type-id='95e97e5e'/> </function-decl> - <function-decl name='fletcher_2_incremental_native' mangled-name='fletcher_2_incremental_native' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fletcher_2_incremental_native'> - <parameter type-id='eaa32e2f' name='buf'/> - <parameter type-id='b59d7dce' name='size'/> - <parameter type-id='eaa32e2f' name='data'/> + <function-decl name='pthread_attr_setschedpolicy' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='7347a39e'/> + <parameter type-id='95e97e5e'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='fletcher_2_native' mangled-name='fletcher_2_native' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fletcher_2_native'> - <parameter type-id='eaa32e2f' name='buf'/> - <parameter type-id='9c313c2d' name='size'/> - <parameter type-id='eaa32e2f' name='ctx_template'/> - <parameter type-id='c24fc2ee' name='zcp'/> - <return type-id='48b5725f'/> + <function-decl name='pthread_attr_getinheritsched' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='e1815e87'/> + <parameter type-id='6942f6a4'/> + <return type-id='95e97e5e'/> </function-decl> - <function-decl name='fletcher_2_incremental_byteswap' mangled-name='fletcher_2_incremental_byteswap' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fletcher_2_incremental_byteswap'> - <parameter type-id='eaa32e2f' name='buf'/> - <parameter type-id='b59d7dce' name='size'/> - <parameter type-id='eaa32e2f' name='data'/> + <function-decl name='pthread_attr_setinheritsched' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='7347a39e'/> + <parameter type-id='95e97e5e'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='fletcher_2_byteswap' mangled-name='fletcher_2_byteswap' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fletcher_2_byteswap'> - <parameter type-id='eaa32e2f' name='buf'/> - <parameter type-id='9c313c2d' name='size'/> - <parameter type-id='eaa32e2f' name='ctx_template'/> - <parameter type-id='c24fc2ee' name='zcp'/> - <return type-id='48b5725f'/> + <function-decl name='pthread_attr_getscope' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='e1815e87'/> + <parameter type-id='6942f6a4'/> + <return type-id='95e97e5e'/> </function-decl> - <function-decl name='fletcher_4_impl_set' mangled-name='fletcher_4_impl_set' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fletcher_4_impl_set'> - <parameter type-id='80f4b756' name='val'/> + <function-decl name='pthread_attr_setscope' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='7347a39e'/> + <parameter type-id='95e97e5e'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='fletcher_4_native' mangled-name='fletcher_4_native' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fletcher_4_native'> - <parameter type-id='eaa32e2f' name='buf'/> - <parameter type-id='9c313c2d' name='size'/> - <parameter type-id='eaa32e2f' name='ctx_template'/> - <parameter type-id='c24fc2ee' name='zcp'/> - <return type-id='48b5725f'/> + <function-decl name='pthread_attr_getstack' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='e1815e87'/> + <parameter type-id='9e7a3a7d'/> + <parameter type-id='d19b2c25'/> + <return type-id='95e97e5e'/> </function-decl> - <function-decl name='fletcher_4_native_varsize' mangled-name='fletcher_4_native_varsize' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fletcher_4_native_varsize'> - <parameter type-id='eaa32e2f' name='buf'/> - <parameter type-id='9c313c2d' name='size'/> - <parameter type-id='c24fc2ee' name='zcp'/> - <return type-id='48b5725f'/> + <function-decl name='pthread_attr_setstack' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='7347a39e'/> + <parameter type-id='eaa32e2f'/> + <parameter type-id='b59d7dce'/> + <return type-id='95e97e5e'/> </function-decl> - <function-decl name='fletcher_4_byteswap' mangled-name='fletcher_4_byteswap' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fletcher_4_byteswap'> - <parameter type-id='eaa32e2f' name='buf'/> - <parameter type-id='9c313c2d' name='size'/> - <parameter type-id='eaa32e2f' name='ctx_template'/> - <parameter type-id='c24fc2ee' name='zcp'/> - <return type-id='48b5725f'/> + <function-decl name='pthread_attr_setaffinity_np' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='7347a39e'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='5e14fa48'/> + <return type-id='95e97e5e'/> </function-decl> - <function-decl name='fletcher_4_incremental_native' mangled-name='fletcher_4_incremental_native' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fletcher_4_incremental_native'> - <parameter type-id='eaa32e2f' name='buf'/> - <parameter type-id='b59d7dce' name='size'/> - <parameter type-id='eaa32e2f' name='data'/> + <function-decl name='pthread_attr_getaffinity_np' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='540db505'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='d74a6869'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='fletcher_4_incremental_byteswap' mangled-name='fletcher_4_incremental_byteswap' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fletcher_4_incremental_byteswap'> - <parameter type-id='eaa32e2f' name='buf'/> - <parameter type-id='b59d7dce' name='size'/> - <parameter type-id='eaa32e2f' name='data'/> + <function-decl name='pthread_setcancelstate' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter type-id='7292109c'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='fletcher_4_init' mangled-name='fletcher_4_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fletcher_4_init'> - <return type-id='48b5725f'/> + <function-decl name='pthread_setcanceltype' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter type-id='7292109c'/> + <return type-id='95e97e5e'/> </function-decl> - <function-decl name='fletcher_4_fini' mangled-name='fletcher_4_fini' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fletcher_4_fini'> + <function-decl name='__pthread_unregister_cancel' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='ba7c727c'/> <return type-id='48b5725f'/> </function-decl> - <function-type size-in-bits='64' id='f4a1892e'> - <parameter type-id='eaa32e2f'/> - <parameter type-id='b59d7dce'/> - <parameter type-id='eaa32e2f'/> - <return type-id='95e97e5e'/> - </function-type> - <function-type size-in-bits='64' id='a5444274'> - <parameter type-id='eefe7427'/> - <return type-id='48b5725f'/> - </function-type> - </abi-instr> - <abi-instr address-size='64' path='../../module/zcommon/zfs_fletcher_avx512.c' language='LANG_C99'> - <typedef-decl name='fletcher_4_init_f' type-id='173aa527' id='b9ae1656'/> - <typedef-decl name='fletcher_4_fini_f' type-id='0ad5b8a8' id='c4c1f4fc'/> - <typedef-decl name='fletcher_4_compute_f' type-id='38147eff' id='ad1dc4cb'/> - <class-decl name='fletcher_4_func' size-in-bits='512' is-struct='yes' visibility='default' id='57f479a0'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='init_native' type-id='b9ae1656' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='fini_native' type-id='c4c1f4fc' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='compute_native' type-id='ad1dc4cb' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='init_byteswap' type-id='b9ae1656' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='fini_byteswap' type-id='c4c1f4fc' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='compute_byteswap' type-id='ad1dc4cb' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='valid' type-id='297d38bc' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='name' type-id='80f4b756' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='fletcher_4_ops_t' type-id='57f479a0' id='eba91718'/> - <qualified-type-def type-id='eba91718' const='yes' id='9eeabdc8'/> - <pointer-type-def type-id='e9e61702' size-in-bits='64' id='297d38bc'/> - <pointer-type-def type-id='fe40251b' size-in-bits='64' id='173aa527'/> - <pointer-type-def type-id='17fb1f83' size-in-bits='64' id='38147eff'/> - <pointer-type-def type-id='fb39e25e' size-in-bits='64' id='0ad5b8a8'/> - <var-decl name='fletcher_4_avx512f_ops' type-id='9eeabdc8' mangled-name='fletcher_4_avx512f_ops' visibility='default' elf-symbol-id='fletcher_4_avx512f_ops'/> - <var-decl name='fletcher_4_avx512bw_ops' type-id='9eeabdc8' mangled-name='fletcher_4_avx512bw_ops' visibility='default' elf-symbol-id='fletcher_4_avx512bw_ops'/> - <function-type size-in-bits='64' id='e9e61702'> - <return type-id='c19b74c3'/> - </function-type> - <function-type size-in-bits='64' id='fe40251b'> - <parameter type-id='0f7df99e'/> - <return type-id='48b5725f'/> - </function-type> - <function-type size-in-bits='64' id='17fb1f83'> - <parameter type-id='0f7df99e'/> - <parameter type-id='eaa32e2f'/> - <parameter type-id='9c313c2d'/> - <return type-id='48b5725f'/> - </function-type> - <function-type size-in-bits='64' id='fb39e25e'> - <parameter type-id='0f7df99e'/> - <parameter type-id='c24fc2ee'/> - <return type-id='48b5725f'/> - </function-type> - </abi-instr> - <abi-instr address-size='64' path='../../module/zcommon/zfs_fletcher_intel.c' language='LANG_C99'> - <var-decl name='fletcher_4_avx2_ops' type-id='9eeabdc8' mangled-name='fletcher_4_avx2_ops' visibility='default' elf-symbol-id='fletcher_4_avx2_ops'/> - </abi-instr> - <abi-instr address-size='64' path='../../module/zcommon/zfs_fletcher_sse.c' language='LANG_C99'> - <var-decl name='fletcher_4_sse2_ops' type-id='9eeabdc8' mangled-name='fletcher_4_sse2_ops' visibility='default' elf-symbol-id='fletcher_4_sse2_ops'/> - <var-decl name='fletcher_4_ssse3_ops' type-id='9eeabdc8' mangled-name='fletcher_4_ssse3_ops' visibility='default' elf-symbol-id='fletcher_4_ssse3_ops'/> - </abi-instr> - <abi-instr address-size='64' path='../../module/zcommon/zfs_fletcher_superscalar.c' language='LANG_C99'> - <var-decl name='fletcher_4_superscalar_ops' type-id='9eeabdc8' mangled-name='fletcher_4_superscalar_ops' visibility='default' elf-symbol-id='fletcher_4_superscalar_ops'/> - </abi-instr> - <abi-instr address-size='64' path='../../module/zcommon/zfs_fletcher_superscalar4.c' language='LANG_C99'> - <var-decl name='fletcher_4_superscalar4_ops' type-id='9eeabdc8' mangled-name='fletcher_4_superscalar4_ops' visibility='default' elf-symbol-id='fletcher_4_superscalar4_ops'/> - </abi-instr> - <abi-instr address-size='64' path='../../module/zcommon/zfs_namecheck.c' language='LANG_C99'> - <enum-decl name='namecheck_err_t' naming-typedef-id='8e0af06e' id='f43bbcda'> - <underlying-type type-id='9cac1fee'/> - <enumerator name='NAME_ERR_LEADING_SLASH' value='0'/> - <enumerator name='NAME_ERR_EMPTY_COMPONENT' value='1'/> - <enumerator name='NAME_ERR_TRAILING_SLASH' value='2'/> - <enumerator name='NAME_ERR_INVALCHAR' value='3'/> - <enumerator name='NAME_ERR_MULTIPLE_DELIMITERS' value='4'/> - <enumerator name='NAME_ERR_NOLETTER' value='5'/> - <enumerator name='NAME_ERR_RESERVED' value='6'/> - <enumerator name='NAME_ERR_DISKLIKE' value='7'/> - <enumerator name='NAME_ERR_TOOLONG' value='8'/> - <enumerator name='NAME_ERR_SELF_REF' value='9'/> - <enumerator name='NAME_ERR_PARENT_REF' value='10'/> - <enumerator name='NAME_ERR_NO_AT' value='11'/> - <enumerator name='NAME_ERR_NO_POUND' value='12'/> - </enum-decl> - <typedef-decl name='namecheck_err_t' type-id='f43bbcda' id='8e0af06e'/> - <pointer-type-def type-id='8e0af06e' size-in-bits='64' id='053457bd'/> - <var-decl name='zfs_max_dataset_nesting' type-id='95e97e5e' mangled-name='zfs_max_dataset_nesting' visibility='default' elf-symbol-id='zfs_max_dataset_nesting'/> - <function-decl name='get_dataset_depth' mangled-name='get_dataset_depth' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_dataset_depth'> - <parameter type-id='80f4b756' name='path'/> + <function-decl name='pthread_cond_init' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='2a468b41'/> + <parameter type-id='4c428e67'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='zfs_component_namecheck' mangled-name='zfs_component_namecheck' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_component_namecheck'> - <parameter type-id='80f4b756' name='path'/> - <parameter type-id='053457bd' name='why'/> - <parameter type-id='26a90f95' name='what'/> + <function-decl name='pthread_cond_signal' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='db285b03'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='permset_namecheck' mangled-name='permset_namecheck' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='permset_namecheck'> - <parameter type-id='80f4b756' name='path'/> - <parameter type-id='053457bd' name='why'/> - <parameter type-id='26a90f95' name='what'/> + <function-decl name='pthread_cond_broadcast' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='db285b03'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='dataset_nestcheck' mangled-name='dataset_nestcheck' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dataset_nestcheck'> - <parameter type-id='80f4b756' name='path'/> + <function-decl name='pthread_cond_wait' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='2a468b41'/> + <parameter type-id='6e745582'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='entity_namecheck' mangled-name='entity_namecheck' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='entity_namecheck'> - <parameter type-id='80f4b756' name='path'/> - <parameter type-id='053457bd' name='why'/> - <parameter type-id='26a90f95' name='what'/> + <function-decl name='pthread_cond_timedwait' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='2a468b41'/> + <parameter type-id='6e745582'/> + <parameter type-id='0be2e71c'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='dataset_namecheck' mangled-name='dataset_namecheck' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dataset_namecheck'> - <parameter type-id='80f4b756' name='path'/> - <parameter type-id='053457bd' name='why'/> - <parameter type-id='26a90f95' name='what'/> - <return type-id='95e97e5e'/> + <function-decl name='__sysconf' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <return type-id='bd54fe1a'/> </function-decl> - <function-decl name='bookmark_namecheck' mangled-name='bookmark_namecheck' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bookmark_namecheck'> - <parameter type-id='80f4b756' name='path'/> - <parameter type-id='053457bd' name='why'/> - <parameter type-id='26a90f95' name='what'/> - <return type-id='95e97e5e'/> + <function-decl name='tpool_abandon' mangled-name='tpool_abandon' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='tpool_abandon'> + <parameter type-id='9cf59a50' name='tpool'/> + <return type-id='48b5725f'/> </function-decl> - <function-decl name='snapshot_namecheck' mangled-name='snapshot_namecheck' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='snapshot_namecheck'> - <parameter type-id='80f4b756' name='path'/> - <parameter type-id='053457bd' name='why'/> - <parameter type-id='26a90f95' name='what'/> - <return type-id='95e97e5e'/> + <function-decl name='tpool_suspend' mangled-name='tpool_suspend' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='tpool_suspend'> + <parameter type-id='9cf59a50' name='tpool'/> + <return type-id='48b5725f'/> </function-decl> - <function-decl name='mountpoint_namecheck' mangled-name='mountpoint_namecheck' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mountpoint_namecheck'> - <parameter type-id='80f4b756' name='path'/> - <parameter type-id='053457bd' name='why'/> + <function-decl name='tpool_suspended' mangled-name='tpool_suspended' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='tpool_suspended'> + <parameter type-id='9cf59a50' name='tpool'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='pool_namecheck' mangled-name='pool_namecheck' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pool_namecheck'> - <parameter type-id='80f4b756' name='pool'/> - <parameter type-id='053457bd' name='why'/> - <parameter type-id='26a90f95' name='what'/> + <function-decl name='tpool_resume' mangled-name='tpool_resume' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='tpool_resume'> + <parameter type-id='9cf59a50' name='tpool'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='tpool_member' mangled-name='tpool_member' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='tpool_member'> + <parameter type-id='9cf59a50' name='tpool'/> <return type-id='95e97e5e'/> </function-decl> - </abi-instr> - <abi-instr address-size='64' path='../../module/zcommon/zfs_prop.c' language='LANG_C99'> - <array-type-def dimensions='1' type-id='80f4b756' size-in-bits='768' id='35e4b367'> - <subrange length='12' type-id='7359adad' id='84827bdc'/> - </array-type-def> - <enum-decl name='zprop_type_t' naming-typedef-id='31429eff' id='87676253'> - <underlying-type type-id='9cac1fee'/> - <enumerator name='PROP_TYPE_NUMBER' value='0'/> - <enumerator name='PROP_TYPE_STRING' value='1'/> - <enumerator name='PROP_TYPE_INDEX' value='2'/> - </enum-decl> - <typedef-decl name='zprop_type_t' type-id='87676253' id='31429eff'/> - <enum-decl name='zprop_attr_t' naming-typedef-id='999701cc' id='77d05200'> - <underlying-type type-id='9cac1fee'/> - <enumerator name='PROP_DEFAULT' value='0'/> - <enumerator name='PROP_READONLY' value='1'/> - <enumerator name='PROP_INHERIT' value='2'/> - <enumerator name='PROP_ONETIME' value='3'/> - <enumerator name='PROP_ONETIME_DEFAULT' value='4'/> - </enum-decl> - <typedef-decl name='zprop_attr_t' type-id='77d05200' id='999701cc'/> - <class-decl name='zfs_index' size-in-bits='128' is-struct='yes' visibility='default' id='87957af9'> + <pointer-type-def type-id='b1bbf10d' size-in-bits='64' id='9cf59a50'/> + <typedef-decl name='tpool_t' type-id='88d1b7f9' id='b1bbf10d'/> + <class-decl name='tpool' size-in-bits='2496' is-struct='yes' visibility='default' id='88d1b7f9'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='pi_name' type-id='80f4b756' visibility='default'/> + <var-decl name='tp_forw' type-id='9cf59a50' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='pi_value' type-id='9c313c2d' visibility='default'/> + <var-decl name='tp_back' type-id='9cf59a50' visibility='default'/> </data-member> - </class-decl> - <typedef-decl name='zprop_index_t' type-id='87957af9' id='64636ce3'/> - <class-decl name='zprop_desc_t' size-in-bits='704' is-struct='yes' naming-typedef-id='ffa52b96' visibility='default' id='bbff5e4b'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='pd_name' type-id='80f4b756' visibility='default'/> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='tp_mutex' type-id='7a6844eb' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='pd_propnum' type-id='95e97e5e' visibility='default'/> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='tp_busycv' type-id='62fab762' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='pd_proptype' type-id='31429eff' visibility='default'/> + <data-member access='public' layout-offset-in-bits='832'> + <var-decl name='tp_workcv' type-id='62fab762' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='pd_strdefault' type-id='80f4b756' visibility='default'/> + <data-member access='public' layout-offset-in-bits='1216'> + <var-decl name='tp_waitcv' type-id='62fab762' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='pd_numdefault' type-id='9c313c2d' visibility='default'/> + <data-member access='public' layout-offset-in-bits='1600'> + <var-decl name='tp_active' type-id='ad33e5e7' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='pd_attr' type-id='999701cc' visibility='default'/> + <data-member access='public' layout-offset-in-bits='1664'> + <var-decl name='tp_head' type-id='f32b30e4' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='288'> - <var-decl name='pd_types' type-id='95e97e5e' visibility='default'/> + <data-member access='public' layout-offset-in-bits='1728'> + <var-decl name='tp_tail' type-id='f32b30e4' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='pd_values' type-id='80f4b756' visibility='default'/> + <data-member access='public' layout-offset-in-bits='1792'> + <var-decl name='tp_attr' type-id='7d8569fd' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='pd_colname' type-id='80f4b756' visibility='default'/> + <data-member access='public' layout-offset-in-bits='2240'> + <var-decl name='tp_flags' type-id='95e97e5e' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='pd_rightalign' type-id='c19b74c3' visibility='default'/> + <data-member access='public' layout-offset-in-bits='2272'> + <var-decl name='tp_linger' type-id='3502e3ff' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='480'> - <var-decl name='pd_visible' type-id='c19b74c3' visibility='default'/> + <data-member access='public' layout-offset-in-bits='2304'> + <var-decl name='tp_njobs' type-id='95e97e5e' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='pd_zfs_mod_supported' type-id='c19b74c3' visibility='default'/> + <data-member access='public' layout-offset-in-bits='2336'> + <var-decl name='tp_minimum' type-id='95e97e5e' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='pd_table' type-id='c8bc397b' visibility='default'/> + <data-member access='public' layout-offset-in-bits='2368'> + <var-decl name='tp_maximum' type-id='95e97e5e' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='pd_table_size' type-id='b59d7dce' visibility='default'/> + <data-member access='public' layout-offset-in-bits='2400'> + <var-decl name='tp_current' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2432'> + <var-decl name='tp_idle' type-id='95e97e5e' visibility='default'/> </data-member> </class-decl> - <typedef-decl name='zprop_desc_t' type-id='bbff5e4b' id='ffa52b96'/> - <pointer-type-def type-id='80f4b756' size-in-bits='64' id='7d3cd834'/> - <qualified-type-def type-id='64636ce3' const='yes' id='072f7953'/> - <pointer-type-def type-id='072f7953' size-in-bits='64' id='c8bc397b'/> - <pointer-type-def type-id='ffa52b96' size-in-bits='64' id='76c8174b'/> - <var-decl name='zfs_userquota_prop_prefixes' type-id='35e4b367' mangled-name='zfs_userquota_prop_prefixes' visibility='default' elf-symbol-id='zfs_userquota_prop_prefixes'/> - <function-decl name='zfs_prop_get_table' mangled-name='zfs_prop_get_table' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_get_table'> - <return type-id='76c8174b'/> - </function-decl> - <function-decl name='zfs_prop_init' mangled-name='zfs_prop_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_init'> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='zfs_prop_delegatable' mangled-name='zfs_prop_delegatable' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_delegatable'> - <parameter type-id='58603c44' name='prop'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='zfs_name_to_prop' mangled-name='zfs_name_to_prop' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_name_to_prop'> - <parameter type-id='80f4b756' name='propname'/> - <return type-id='58603c44'/> - </function-decl> - <function-decl name='zfs_prop_user' mangled-name='zfs_prop_user' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_user'> - <parameter type-id='80f4b756' name='name'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='zfs_prop_userquota' mangled-name='zfs_prop_userquota' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_userquota'> - <parameter type-id='80f4b756' name='name'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='zfs_prop_written' mangled-name='zfs_prop_written' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_written'> - <parameter type-id='80f4b756' name='name'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='zfs_prop_string_to_index' mangled-name='zfs_prop_string_to_index' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_string_to_index'> - <parameter type-id='58603c44' name='prop'/> - <parameter type-id='80f4b756' name='string'/> - <parameter type-id='5d6479ae' name='index'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='zfs_prop_index_to_string' mangled-name='zfs_prop_index_to_string' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_index_to_string'> - <parameter type-id='58603c44' name='prop'/> - <parameter type-id='9c313c2d' name='index'/> - <parameter type-id='7d3cd834' name='string'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='zfs_prop_random_value' mangled-name='zfs_prop_random_value' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_random_value'> - <parameter type-id='58603c44' name='prop'/> - <parameter type-id='9c313c2d' name='seed'/> - <return type-id='9c313c2d'/> - </function-decl> - <function-decl name='zfs_prop_valid_for_type' mangled-name='zfs_prop_valid_for_type' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_valid_for_type'> - <parameter type-id='95e97e5e' name='prop'/> - <parameter type-id='2e45de5d' name='types'/> - <parameter type-id='c19b74c3' name='headcheck'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='zfs_prop_get_type' mangled-name='zfs_prop_get_type' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_get_type'> - <parameter type-id='58603c44' name='prop'/> - <return type-id='31429eff'/> - </function-decl> - <function-decl name='zfs_prop_readonly' mangled-name='zfs_prop_readonly' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_readonly'> - <parameter type-id='58603c44' name='prop'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='zfs_prop_visible' mangled-name='zfs_prop_visible' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_visible'> - <parameter type-id='58603c44' name='prop'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='zfs_prop_setonce' mangled-name='zfs_prop_setonce' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_setonce'> - <parameter type-id='58603c44' name='prop'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='zfs_prop_default_string' mangled-name='zfs_prop_default_string' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_default_string'> - <parameter type-id='58603c44' name='prop'/> - <return type-id='80f4b756'/> - </function-decl> - <function-decl name='zfs_prop_default_numeric' mangled-name='zfs_prop_default_numeric' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_default_numeric'> - <parameter type-id='58603c44' name='prop'/> - <return type-id='9c313c2d'/> - </function-decl> - <function-decl name='zfs_prop_to_name' mangled-name='zfs_prop_to_name' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_to_name'> - <parameter type-id='58603c44' name='prop'/> - <return type-id='80f4b756'/> - </function-decl> - <function-decl name='zfs_prop_inheritable' mangled-name='zfs_prop_inheritable' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_inheritable'> - <parameter type-id='58603c44' name='prop'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='zfs_prop_encryption_key_param' mangled-name='zfs_prop_encryption_key_param' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_encryption_key_param'> - <parameter type-id='58603c44' name='prop'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='zfs_prop_valid_keylocation' mangled-name='zfs_prop_valid_keylocation' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_valid_keylocation'> - <parameter type-id='80f4b756' name='str'/> - <parameter type-id='c19b74c3' name='encrypted'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='zfs_prop_values' mangled-name='zfs_prop_values' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_values'> - <parameter type-id='58603c44' name='prop'/> - <return type-id='80f4b756'/> - </function-decl> - <function-decl name='zfs_prop_is_string' mangled-name='zfs_prop_is_string' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_is_string'> - <parameter type-id='58603c44' name='prop'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='zfs_prop_column_name' mangled-name='zfs_prop_column_name' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_column_name'> - <parameter type-id='58603c44' name='prop'/> - <return type-id='80f4b756'/> - </function-decl> - <function-decl name='zfs_prop_align_right' mangled-name='zfs_prop_align_right' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_align_right'> - <parameter type-id='58603c44' name='prop'/> - <return type-id='c19b74c3'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='../../module/zcommon/zpool_prop.c' language='LANG_C99'> - <function-decl name='zpool_prop_get_table' mangled-name='zpool_prop_get_table' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_get_table'> - <return type-id='76c8174b'/> - </function-decl> - <function-decl name='zpool_prop_init' mangled-name='zpool_prop_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_init'> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='zpool_name_to_prop' mangled-name='zpool_name_to_prop' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_name_to_prop'> - <parameter type-id='80f4b756' name='propname'/> - <return type-id='5d0c23fb'/> - </function-decl> - <function-decl name='zpool_prop_to_name' mangled-name='zpool_prop_to_name' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_to_name'> - <parameter type-id='5d0c23fb' name='prop'/> - <return type-id='80f4b756'/> - </function-decl> - <function-decl name='zpool_prop_get_type' mangled-name='zpool_prop_get_type' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_get_type'> - <parameter type-id='5d0c23fb' name='prop'/> - <return type-id='31429eff'/> - </function-decl> - <function-decl name='zpool_prop_readonly' mangled-name='zpool_prop_readonly' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_readonly'> - <parameter type-id='5d0c23fb' name='prop'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='zpool_prop_setonce' mangled-name='zpool_prop_setonce' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_setonce'> - <parameter type-id='5d0c23fb' name='prop'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='zpool_prop_default_string' mangled-name='zpool_prop_default_string' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_default_string'> - <parameter type-id='5d0c23fb' name='prop'/> - <return type-id='80f4b756'/> - </function-decl> - <function-decl name='zpool_prop_default_numeric' mangled-name='zpool_prop_default_numeric' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_default_numeric'> - <parameter type-id='5d0c23fb' name='prop'/> - <return type-id='9c313c2d'/> - </function-decl> - <function-decl name='zpool_prop_feature' mangled-name='zpool_prop_feature' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_feature'> - <parameter type-id='80f4b756' name='name'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='zpool_prop_unsupported' mangled-name='zpool_prop_unsupported' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_unsupported'> - <parameter type-id='80f4b756' name='name'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='zpool_prop_string_to_index' mangled-name='zpool_prop_string_to_index' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_string_to_index'> - <parameter type-id='5d0c23fb' name='prop'/> - <parameter type-id='80f4b756' name='string'/> - <parameter type-id='5d6479ae' name='index'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='zpool_prop_index_to_string' mangled-name='zpool_prop_index_to_string' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_index_to_string'> - <parameter type-id='5d0c23fb' name='prop'/> - <parameter type-id='9c313c2d' name='index'/> - <parameter type-id='7d3cd834' name='string'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='zpool_prop_random_value' mangled-name='zpool_prop_random_value' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_random_value'> - <parameter type-id='5d0c23fb' name='prop'/> - <parameter type-id='9c313c2d' name='seed'/> - <return type-id='9c313c2d'/> - </function-decl> - <function-decl name='zpool_prop_values' mangled-name='zpool_prop_values' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_values'> - <parameter type-id='5d0c23fb' name='prop'/> - <return type-id='80f4b756'/> - </function-decl> - <function-decl name='zpool_prop_column_name' mangled-name='zpool_prop_column_name' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_column_name'> - <parameter type-id='5d0c23fb' name='prop'/> - <return type-id='80f4b756'/> - </function-decl> - <function-decl name='zpool_prop_align_right' mangled-name='zpool_prop_align_right' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_align_right'> - <parameter type-id='5d0c23fb' name='prop'/> - <return type-id='c19b74c3'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='../../module/zcommon/zprop_common.c' language='LANG_C99'> - <function-decl name='zprop_register_impl' mangled-name='zprop_register_impl' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_register_impl'> - <parameter type-id='95e97e5e' name='prop'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='31429eff' name='type'/> - <parameter type-id='9c313c2d' name='numdefault'/> - <parameter type-id='80f4b756' name='strdefault'/> - <parameter type-id='999701cc' name='attr'/> - <parameter type-id='95e97e5e' name='objset_types'/> - <parameter type-id='80f4b756' name='values'/> - <parameter type-id='80f4b756' name='colname'/> - <parameter type-id='c19b74c3' name='rightalign'/> - <parameter type-id='c19b74c3' name='visible'/> - <parameter type-id='c8bc397b' name='idx_tbl'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='zprop_register_string' mangled-name='zprop_register_string' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_register_string'> - <parameter type-id='95e97e5e' name='prop'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='80f4b756' name='def'/> - <parameter type-id='999701cc' name='attr'/> - <parameter type-id='95e97e5e' name='objset_types'/> - <parameter type-id='80f4b756' name='values'/> - <parameter type-id='80f4b756' name='colname'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='zprop_register_number' mangled-name='zprop_register_number' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_register_number'> - <parameter type-id='95e97e5e' name='prop'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='9c313c2d' name='def'/> - <parameter type-id='999701cc' name='attr'/> - <parameter type-id='95e97e5e' name='objset_types'/> - <parameter type-id='80f4b756' name='values'/> - <parameter type-id='80f4b756' name='colname'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='zprop_register_index' mangled-name='zprop_register_index' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_register_index'> - <parameter type-id='95e97e5e' name='prop'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='9c313c2d' name='def'/> - <parameter type-id='999701cc' name='attr'/> - <parameter type-id='95e97e5e' name='objset_types'/> - <parameter type-id='80f4b756' name='values'/> - <parameter type-id='80f4b756' name='colname'/> - <parameter type-id='c8bc397b' name='idx_tbl'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='zprop_register_hidden' mangled-name='zprop_register_hidden' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_register_hidden'> - <parameter type-id='95e97e5e' name='prop'/> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='31429eff' name='type'/> - <parameter type-id='999701cc' name='attr'/> - <parameter type-id='95e97e5e' name='objset_types'/> - <parameter type-id='80f4b756' name='colname'/> + <function-type size-in-bits='64' id='c5c76c9c'> + <parameter type-id='eaa32e2f'/> <return type-id='48b5725f'/> - </function-decl> - <function-decl name='zprop_iter_common' mangled-name='zprop_iter_common' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_iter_common'> - <parameter type-id='1ec3747a' name='func'/> - <parameter type-id='eaa32e2f' name='cb'/> - <parameter type-id='c19b74c3' name='show_all'/> - <parameter type-id='c19b74c3' name='ordered'/> - <parameter type-id='2e45de5d' name='type'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='zprop_name_to_prop' mangled-name='zprop_name_to_prop' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_name_to_prop'> - <parameter type-id='80f4b756' name='propname'/> - <parameter type-id='2e45de5d' name='type'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='zprop_string_to_index' mangled-name='zprop_string_to_index' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_string_to_index'> - <parameter type-id='95e97e5e' name='prop'/> - <parameter type-id='80f4b756' name='string'/> - <parameter type-id='5d6479ae' name='index'/> - <parameter type-id='2e45de5d' name='type'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='zprop_index_to_string' mangled-name='zprop_index_to_string' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_index_to_string'> - <parameter type-id='95e97e5e' name='prop'/> - <parameter type-id='9c313c2d' name='index'/> - <parameter type-id='7d3cd834' name='string'/> - <parameter type-id='2e45de5d' name='type'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='zprop_random_value' mangled-name='zprop_random_value' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_random_value'> - <parameter type-id='95e97e5e' name='prop'/> - <parameter type-id='9c313c2d' name='seed'/> - <parameter type-id='2e45de5d' name='type'/> - <return type-id='9c313c2d'/> - </function-decl> - <function-decl name='zprop_values' mangled-name='zprop_values' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_values'> - <parameter type-id='95e97e5e' name='prop'/> - <parameter type-id='2e45de5d' name='type'/> - <return type-id='80f4b756'/> - </function-decl> - <function-decl name='zprop_valid_for_type' mangled-name='zprop_valid_for_type' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_valid_for_type'> - <parameter type-id='95e97e5e' name='prop'/> - <parameter type-id='2e45de5d' name='type'/> - <parameter type-id='c19b74c3' name='headcheck'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='zprop_width' mangled-name='zprop_width' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_width'> - <parameter type-id='95e97e5e' name='prop'/> - <parameter type-id='37e3bd22' name='fixed'/> - <parameter type-id='2e45de5d' name='type'/> - <return type-id='b59d7dce'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='libzfs_changelist.c' language='LANG_C99'> - <type-decl name='void' id='48b5725f'/> + </function-type> </abi-instr> - <abi-instr address-size='64' path='libzfs_config.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libzfs/libzfs_changelist.c' language='LANG_C99'> <array-type-def dimensions='1' type-id='bf311473' size-in-bits='128' id='f0f65199'> <subrange length='2' type-id='7359adad' id='52efc4ef'/> </array-type-def> @@ -2811,20 +1845,36 @@ <class-decl name='re_dfa_t' is-struct='yes' visibility='default' is-declaration-only='yes' id='b48d2441'/> <class-decl name='uu_avl' is-struct='yes' visibility='default' is-declaration-only='yes' id='4af029d1'/> <class-decl name='uu_avl_pool' is-struct='yes' visibility='default' is-declaration-only='yes' id='12a530a8'/> + <class-decl name='uu_avl_walk' is-struct='yes' visibility='default' is-declaration-only='yes' id='e70a39e3'/> + <array-type-def dimensions='1' type-id='80f4b756' size-in-bits='256' id='71dc54ac'> + <subrange length='4' type-id='7359adad' id='16fe7105'/> + </array-type-def> <type-decl name='int' size-in-bits='32' id='95e97e5e'/> <type-decl name='long int' size-in-bits='64' id='bd54fe1a'/> <type-decl name='long long int' size-in-bits='64' id='1eb56b1e'/> <type-decl name='short int' size-in-bits='16' id='a2185560'/> + <array-type-def dimensions='1' type-id='e475ab95' size-in-bits='192' id='0ce65a8b'> + <subrange length='3' type-id='7359adad' id='56f209d2'/> + </array-type-def> <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='9cac1fee'/> <type-decl name='unsigned char' size-in-bits='8' id='002ac4a6'/> <type-decl name='unsigned int' size-in-bits='32' id='f0981eeb'/> <type-decl name='unsigned long int' size-in-bits='64' id='7359adad'/> + <type-decl name='void' id='48b5725f'/> + <typedef-decl name='uu_compare_fn_t' type-id='add6e811' id='40f93560'/> <typedef-decl name='uu_avl_pool_t' type-id='12a530a8' id='7f84e390'/> <typedef-decl name='uu_avl_t' type-id='4af029d1' id='bb7f0973'/> + <class-decl name='uu_avl_node' size-in-bits='192' is-struct='yes' visibility='default' id='f65f4326'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='uan_opaque' type-id='0ce65a8b' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='uu_avl_node_t' type-id='f65f4326' id='73a65116'/> + <typedef-decl name='uu_avl_walk_t' type-id='e70a39e3' id='edd8457b'/> + <typedef-decl name='uu_avl_index_t' type-id='e475ab95' id='5d7f5fc8'/> <typedef-decl name='zfs_handle_t' type-id='f6ee4445' id='775509eb'/> <typedef-decl name='zpool_handle_t' type-id='67002a8a' id='b1efc708'/> <typedef-decl name='libzfs_handle_t' type-id='c8a9d9d8' id='95942d0c'/> - <typedef-decl name='zpool_iter_f' type-id='3aebb66f' id='fa476e62'/> <typedef-decl name='zfs_iter_f' type-id='5571cde4' id='d8e49ab9'/> <typedef-decl name='avl_tree_t' type-id='b351119f' id='f20fbd51'/> <class-decl name='avl_node' size-in-bits='192' is-struct='yes' visibility='default' id='428b67b3'> @@ -2877,15 +1927,20 @@ <data-member access='public' layout-offset-in-bits='248'> <var-decl name='dds_origin' type-id='d1617432' visibility='default'/> </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> <typedef-decl name='dmu_objset_stats_t' type-id='098f0221' id='b2c14f17'/> <enum-decl name='zfs_type_t' naming-typedef-id='2e45de5d' id='5d8f7321'> <underlying-type type-id='9cac1fee'/> + <enumerator name='ZFS_TYPE_INVALID' value='0'/> <enumerator name='ZFS_TYPE_FILESYSTEM' value='1'/> <enumerator name='ZFS_TYPE_SNAPSHOT' value='2'/> <enumerator name='ZFS_TYPE_VOLUME' value='4'/> <enumerator name='ZFS_TYPE_POOL' value='8'/> <enumerator name='ZFS_TYPE_BOOKMARK' value='16'/> + <enumerator name='ZFS_TYPE_VDEV' value='32'/> </enum-decl> <typedef-decl name='zfs_type_t' type-id='5d8f7321' id='2e45de5d'/> <enum-decl name='dmu_objset_type' id='6b1b19f9'> @@ -2899,6 +1954,130 @@ <enumerator name='DMU_OST_NUMTYPES' value='6'/> </enum-decl> <typedef-decl name='dmu_objset_type_t' type-id='6b1b19f9' id='230f1e16'/> + <enum-decl name='zfs_prop_t' naming-typedef-id='58603c44' id='4b000d60'> + <underlying-type type-id='9cac1fee'/> + <enumerator name='ZPROP_CONT' value='-2'/> + <enumerator name='ZPROP_INVAL' value='-1'/> + <enumerator name='ZPROP_USERPROP' value='-1'/> + <enumerator name='ZFS_PROP_TYPE' value='0'/> + <enumerator name='ZFS_PROP_CREATION' value='1'/> + <enumerator name='ZFS_PROP_USED' value='2'/> + <enumerator name='ZFS_PROP_AVAILABLE' value='3'/> + <enumerator name='ZFS_PROP_REFERENCED' value='4'/> + <enumerator name='ZFS_PROP_COMPRESSRATIO' value='5'/> + <enumerator name='ZFS_PROP_MOUNTED' value='6'/> + <enumerator name='ZFS_PROP_ORIGIN' value='7'/> + <enumerator name='ZFS_PROP_QUOTA' value='8'/> + <enumerator name='ZFS_PROP_RESERVATION' value='9'/> + <enumerator name='ZFS_PROP_VOLSIZE' value='10'/> + <enumerator name='ZFS_PROP_VOLBLOCKSIZE' value='11'/> + <enumerator name='ZFS_PROP_RECORDSIZE' value='12'/> + <enumerator name='ZFS_PROP_MOUNTPOINT' value='13'/> + <enumerator name='ZFS_PROP_SHARENFS' value='14'/> + <enumerator name='ZFS_PROP_CHECKSUM' value='15'/> + <enumerator name='ZFS_PROP_COMPRESSION' value='16'/> + <enumerator name='ZFS_PROP_ATIME' value='17'/> + <enumerator name='ZFS_PROP_DEVICES' value='18'/> + <enumerator name='ZFS_PROP_EXEC' value='19'/> + <enumerator name='ZFS_PROP_SETUID' value='20'/> + <enumerator name='ZFS_PROP_READONLY' value='21'/> + <enumerator name='ZFS_PROP_ZONED' value='22'/> + <enumerator name='ZFS_PROP_SNAPDIR' value='23'/> + <enumerator name='ZFS_PROP_ACLMODE' value='24'/> + <enumerator name='ZFS_PROP_ACLINHERIT' value='25'/> + <enumerator name='ZFS_PROP_CREATETXG' value='26'/> + <enumerator name='ZFS_PROP_NAME' value='27'/> + <enumerator name='ZFS_PROP_CANMOUNT' value='28'/> + <enumerator name='ZFS_PROP_ISCSIOPTIONS' value='29'/> + <enumerator name='ZFS_PROP_XATTR' value='30'/> + <enumerator name='ZFS_PROP_NUMCLONES' value='31'/> + <enumerator name='ZFS_PROP_COPIES' value='32'/> + <enumerator name='ZFS_PROP_VERSION' value='33'/> + <enumerator name='ZFS_PROP_UTF8ONLY' value='34'/> + <enumerator name='ZFS_PROP_NORMALIZE' value='35'/> + <enumerator name='ZFS_PROP_CASE' value='36'/> + <enumerator name='ZFS_PROP_VSCAN' value='37'/> + <enumerator name='ZFS_PROP_NBMAND' value='38'/> + <enumerator name='ZFS_PROP_SHARESMB' value='39'/> + <enumerator name='ZFS_PROP_REFQUOTA' value='40'/> + <enumerator name='ZFS_PROP_REFRESERVATION' value='41'/> + <enumerator name='ZFS_PROP_GUID' value='42'/> + <enumerator name='ZFS_PROP_PRIMARYCACHE' value='43'/> + <enumerator name='ZFS_PROP_SECONDARYCACHE' value='44'/> + <enumerator name='ZFS_PROP_USEDSNAP' value='45'/> + <enumerator name='ZFS_PROP_USEDDS' value='46'/> + <enumerator name='ZFS_PROP_USEDCHILD' value='47'/> + <enumerator name='ZFS_PROP_USEDREFRESERV' value='48'/> + <enumerator name='ZFS_PROP_USERACCOUNTING' value='49'/> + <enumerator name='ZFS_PROP_STMF_SHAREINFO' value='50'/> + <enumerator name='ZFS_PROP_DEFER_DESTROY' value='51'/> + <enumerator name='ZFS_PROP_USERREFS' value='52'/> + <enumerator name='ZFS_PROP_LOGBIAS' value='53'/> + <enumerator name='ZFS_PROP_UNIQUE' value='54'/> + <enumerator name='ZFS_PROP_OBJSETID' value='55'/> + <enumerator name='ZFS_PROP_DEDUP' value='56'/> + <enumerator name='ZFS_PROP_MLSLABEL' value='57'/> + <enumerator name='ZFS_PROP_SYNC' value='58'/> + <enumerator name='ZFS_PROP_DNODESIZE' value='59'/> + <enumerator name='ZFS_PROP_REFRATIO' value='60'/> + <enumerator name='ZFS_PROP_WRITTEN' value='61'/> + <enumerator name='ZFS_PROP_CLONES' value='62'/> + <enumerator name='ZFS_PROP_LOGICALUSED' value='63'/> + <enumerator name='ZFS_PROP_LOGICALREFERENCED' value='64'/> + <enumerator name='ZFS_PROP_INCONSISTENT' value='65'/> + <enumerator name='ZFS_PROP_VOLMODE' value='66'/> + <enumerator name='ZFS_PROP_FILESYSTEM_LIMIT' value='67'/> + <enumerator name='ZFS_PROP_SNAPSHOT_LIMIT' value='68'/> + <enumerator name='ZFS_PROP_FILESYSTEM_COUNT' value='69'/> + <enumerator name='ZFS_PROP_SNAPSHOT_COUNT' value='70'/> + <enumerator name='ZFS_PROP_SNAPDEV' value='71'/> + <enumerator name='ZFS_PROP_ACLTYPE' value='72'/> + <enumerator name='ZFS_PROP_SELINUX_CONTEXT' value='73'/> + <enumerator name='ZFS_PROP_SELINUX_FSCONTEXT' value='74'/> + <enumerator name='ZFS_PROP_SELINUX_DEFCONTEXT' value='75'/> + <enumerator name='ZFS_PROP_SELINUX_ROOTCONTEXT' value='76'/> + <enumerator name='ZFS_PROP_RELATIME' value='77'/> + <enumerator name='ZFS_PROP_REDUNDANT_METADATA' value='78'/> + <enumerator name='ZFS_PROP_OVERLAY' value='79'/> + <enumerator name='ZFS_PROP_PREV_SNAP' value='80'/> + <enumerator name='ZFS_PROP_RECEIVE_RESUME_TOKEN' value='81'/> + <enumerator name='ZFS_PROP_ENCRYPTION' value='82'/> + <enumerator name='ZFS_PROP_KEYLOCATION' value='83'/> + <enumerator name='ZFS_PROP_KEYFORMAT' value='84'/> + <enumerator name='ZFS_PROP_PBKDF2_SALT' value='85'/> + <enumerator name='ZFS_PROP_PBKDF2_ITERS' value='86'/> + <enumerator name='ZFS_PROP_ENCRYPTION_ROOT' value='87'/> + <enumerator name='ZFS_PROP_KEY_GUID' value='88'/> + <enumerator name='ZFS_PROP_KEYSTATUS' value='89'/> + <enumerator name='ZFS_PROP_REMAPTXG' value='90'/> + <enumerator name='ZFS_PROP_SPECIAL_SMALL_BLOCKS' value='91'/> + <enumerator name='ZFS_PROP_IVSET_GUID' value='92'/> + <enumerator name='ZFS_PROP_REDACTED' value='93'/> + <enumerator name='ZFS_PROP_REDACT_SNAPS' value='94'/> + <enumerator name='ZFS_PROP_SNAPSHOTS_CHANGED' value='95'/> + <enumerator name='ZFS_PROP_PREFETCH' value='96'/> + <enumerator name='ZFS_PROP_VOLTHREADING' value='97'/> + <enumerator name='ZFS_PROP_DIRECT' value='98'/> + <enumerator name='ZFS_PROP_LONGNAME' value='99'/> + <enumerator name='ZFS_PROP_DEFAULTUSERQUOTA' value='100'/> + <enumerator name='ZFS_PROP_DEFAULTGROUPQUOTA' value='101'/> + <enumerator name='ZFS_PROP_DEFAULTPROJECTQUOTA' value='102'/> + <enumerator name='ZFS_PROP_DEFAULTUSEROBJQUOTA' value='103'/> + <enumerator name='ZFS_PROP_DEFAULTGROUPOBJQUOTA' value='104'/> + <enumerator name='ZFS_PROP_DEFAULTPROJECTOBJQUOTA' value='105'/> + <enumerator name='ZFS_NUM_PROPS' value='106'/> + </enum-decl> + <typedef-decl name='zfs_prop_t' type-id='4b000d60' id='58603c44'/> + <enum-decl name='zprop_source_t' naming-typedef-id='a2256d42' id='5903f80e'> + <underlying-type type-id='9cac1fee'/> + <enumerator name='ZPROP_SRC_NONE' value='1'/> + <enumerator name='ZPROP_SRC_DEFAULT' value='2'/> + <enumerator name='ZPROP_SRC_TEMPORARY' value='4'/> + <enumerator name='ZPROP_SRC_LOCAL' value='8'/> + <enumerator name='ZPROP_SRC_INHERITED' value='16'/> + <enumerator name='ZPROP_SRC_RECEIVED' value='32'/> + </enum-decl> + <typedef-decl name='zprop_source_t' type-id='5903f80e' id='a2256d42'/> <class-decl name='nvlist' size-in-bits='192' is-struct='yes' visibility='default' id='ac266fd9'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='nvl_version' type-id='3ff5601b' visibility='default'/> @@ -2917,15 +2096,127 @@ </data-member> </class-decl> <typedef-decl name='nvlist_t' type-id='ac266fd9' id='8e8d4be3'/> + <enum-decl name='sa_protocol' id='9155d4b5'> + <underlying-type type-id='9cac1fee'/> + <enumerator name='SA_PROTOCOL_NFS' value='0'/> + <enumerator name='SA_PROTOCOL_SMB' value='1'/> + <enumerator name='SA_PROTOCOL_COUNT' value='2'/> + </enum-decl> <enum-decl name='boolean_t' naming-typedef-id='c19b74c3' id='f58c8277'> <underlying-type type-id='9cac1fee'/> <enumerator name='B_FALSE' value='0'/> <enumerator name='B_TRUE' value='1'/> </enum-decl> <typedef-decl name='boolean_t' type-id='f58c8277' id='c19b74c3'/> + <typedef-decl name='uint_t' type-id='f0981eeb' id='3502e3ff'/> <typedef-decl name='ulong_t' type-id='7359adad' id='ee1f298e'/> <typedef-decl name='longlong_t' type-id='1eb56b1e' id='9b3ff54f'/> <typedef-decl name='diskaddr_t' type-id='9b3ff54f' id='804dc465'/> + <typedef-decl name='zoneid_t' type-id='3502e3ff' id='4da03624'/> + <typedef-decl name='__re_long_size_t' type-id='7359adad' id='ba516949'/> + <typedef-decl name='reg_syntax_t' type-id='7359adad' id='1b72c3b3'/> + <class-decl name='re_pattern_buffer' size-in-bits='512' is-struct='yes' visibility='default' id='19fc9a8c'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='buffer' type-id='33976309' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='allocated' type-id='ba516949' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='used' type-id='ba516949' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='syntax' type-id='1b72c3b3' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='fastmap' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='translate' type-id='cf536864' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='re_nsub' type-id='b59d7dce' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='can_be_null' type-id='f0981eeb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='449'> + <var-decl name='regs_allocated' type-id='f0981eeb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='451'> + <var-decl name='fastmap_accurate' type-id='f0981eeb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='452'> + <var-decl name='no_sub' type-id='f0981eeb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='453'> + <var-decl name='not_bol' type-id='f0981eeb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='454'> + <var-decl name='not_eol' type-id='f0981eeb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='455'> + <var-decl name='newline_anchor' type-id='f0981eeb' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='regex_t' type-id='19fc9a8c' id='aca3bac8'/> + <typedef-decl name='uintptr_t' type-id='7359adad' id='e475ab95'/> + <union-decl name='pthread_mutex_t' size-in-bits='320' naming-typedef-id='7a6844eb' visibility='default' id='70681f9b'> + <data-member access='public'> + <var-decl name='__data' type-id='4c734837' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='__size' type-id='36c46961' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='__align' type-id='bd54fe1a' visibility='default'/> + </data-member> + </union-decl> + <typedef-decl name='pthread_mutex_t' type-id='70681f9b' id='7a6844eb'/> + <typedef-decl name='int32_t' type-id='33f57a65' id='3ff5601b'/> + <typedef-decl name='uint8_t' type-id='c51d6389' id='b96825af'/> + <typedef-decl name='uint32_t' type-id='62f1140c' id='8f92235e'/> + <typedef-decl name='uint64_t' type-id='8910171f' id='9c313c2d'/> + <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' id='4c734837'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='__lock' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='__count' type-id='f0981eeb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='__owner' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='__nusers' type-id='f0981eeb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='__kind' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160'> + <var-decl name='__spins' type-id='a2185560' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='176'> + <var-decl name='__elision' type-id='a2185560' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='__list' type-id='518fb49c' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' id='0e01899c'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='__prev' type-id='4d98cd5a' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='__next' type-id='4d98cd5a' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='__pthread_list_t' type-id='0e01899c' id='518fb49c'/> + <typedef-decl name='__uint8_t' type-id='002ac4a6' id='c51d6389'/> + <typedef-decl name='__int32_t' type-id='95e97e5e' id='33f57a65'/> + <typedef-decl name='__uint32_t' type-id='f0981eeb' id='62f1140c'/> + <typedef-decl name='__uint64_t' type-id='7359adad' id='8910171f'/> + <typedef-decl name='size_t' type-id='7359adad' id='b59d7dce'/> <class-decl name='libzfs_handle' size-in-bits='18240' is-struct='yes' visibility='default' id='c8a9d9d8'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='libzfs_error' type-id='95e97e5e' visibility='default'/> @@ -3023,7 +2314,7 @@ <var-decl name='zfs_props_table' type-id='ae3e8ca6' visibility='default'/> </data-member> </class-decl> - <class-decl name='zpool_handle' size-in-bits='2560' is-struct='yes' visibility='default' id='67002a8a'> + <class-decl name='zpool_handle' size-in-bits='2816' is-struct='yes' visibility='default' id='67002a8a'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='zpool_hdl' type-id='b0382bb3' visibility='default'/> </data-member> @@ -3036,149 +2327,709 @@ <data-member access='public' layout-offset-in-bits='2176'> <var-decl name='zpool_state' type-id='95e97e5e' visibility='default'/> </data-member> + <data-member access='public' layout-offset-in-bits='2208'> + <var-decl name='zpool_n_propnames' type-id='f0981eeb' visibility='default'/> + </data-member> <data-member access='public' layout-offset-in-bits='2240'> + <var-decl name='zpool_propnames' type-id='71dc54ac' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2496'> <var-decl name='zpool_config_size' type-id='b59d7dce' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='2304'> + <data-member access='public' layout-offset-in-bits='2560'> <var-decl name='zpool_config' type-id='5ce45b60' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='2368'> + <data-member access='public' layout-offset-in-bits='2624'> <var-decl name='zpool_old_config' type-id='5ce45b60' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='2432'> + <data-member access='public' layout-offset-in-bits='2688'> <var-decl name='zpool_props' type-id='5ce45b60' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='2496'> + <data-member access='public' layout-offset-in-bits='2752'> <var-decl name='zpool_start_block' type-id='804dc465' visibility='default'/> </data-member> </class-decl> - <typedef-decl name='__re_long_size_t' type-id='7359adad' id='ba516949'/> - <typedef-decl name='reg_syntax_t' type-id='7359adad' id='1b72c3b3'/> - <class-decl name='re_pattern_buffer' size-in-bits='512' is-struct='yes' visibility='default' id='19fc9a8c'> + <pointer-type-def type-id='0e01899c' size-in-bits='64' id='4d98cd5a'/> + <pointer-type-def type-id='428b67b3' size-in-bits='64' id='bf311473'/> + <pointer-type-def type-id='a84c031d' size-in-bits='64' id='26a90f95'/> + <pointer-type-def type-id='26a90f95' size-in-bits='64' id='9b23c9ad'/> + <qualified-type-def type-id='a84c031d' const='yes' id='9b45d938'/> + <pointer-type-def type-id='9b45d938' size-in-bits='64' id='80f4b756'/> + <qualified-type-def type-id='9155d4b5' const='yes' id='9f2c1699'/> + <pointer-type-def type-id='9f2c1699' size-in-bits='64' id='4567bbc9'/> + <qualified-type-def type-id='775509eb' const='yes' id='5eadf2db'/> + <pointer-type-def type-id='5eadf2db' size-in-bits='64' id='fcd57163'/> + <pointer-type-def type-id='96ee24a5' size-in-bits='64' id='585e1de9'/> + <pointer-type-def type-id='cb9628fa' size-in-bits='64' id='5571cde4'/> + <pointer-type-def type-id='95942d0c' size-in-bits='64' id='b0382bb3'/> + <pointer-type-def type-id='8e8d4be3' size-in-bits='64' id='5ce45b60'/> + <pointer-type-def type-id='b48d2441' size-in-bits='64' id='33976309'/> + <pointer-type-def type-id='b96825af' size-in-bits='64' id='ae3e8ca6'/> + <pointer-type-def type-id='002ac4a6' size-in-bits='64' id='cf536864'/> + <pointer-type-def type-id='5d7f5fc8' size-in-bits='64' id='813a2225'/> + <pointer-type-def type-id='73a65116' size-in-bits='64' id='2dc35b9d'/> + <pointer-type-def type-id='7f84e390' size-in-bits='64' id='de82c773'/> + <pointer-type-def type-id='bb7f0973' size-in-bits='64' id='a5c21a38'/> + <pointer-type-def type-id='edd8457b' size-in-bits='64' id='5842d146'/> + <pointer-type-def type-id='40f93560' size-in-bits='64' id='d502b39f'/> + <pointer-type-def type-id='48b5725f' size-in-bits='64' id='eaa32e2f'/> + <pointer-type-def type-id='775509eb' size-in-bits='64' id='9200a744'/> + <pointer-type-def type-id='b1efc708' size-in-bits='64' id='4c81de99'/> + <pointer-type-def type-id='a2256d42' size-in-bits='64' id='debc6aa3'/> + <class-decl name='re_dfa_t' is-struct='yes' visibility='default' is-declaration-only='yes' id='b48d2441'/> + <class-decl name='uu_avl' is-struct='yes' visibility='default' is-declaration-only='yes' id='4af029d1'/> + <class-decl name='uu_avl_pool' is-struct='yes' visibility='default' is-declaration-only='yes' id='12a530a8'/> + <class-decl name='uu_avl_walk' is-struct='yes' visibility='default' is-declaration-only='yes' id='e70a39e3'/> + <function-decl name='uu_avl_pool_create' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='d502b39f'/> + <parameter type-id='8f92235e'/> + <return type-id='de82c773'/> + </function-decl> + <function-decl name='uu_avl_pool_destroy' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='de82c773'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='uu_avl_node_init' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='eaa32e2f'/> + <parameter type-id='2dc35b9d'/> + <parameter type-id='de82c773'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='uu_avl_create' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='de82c773'/> + <parameter type-id='eaa32e2f'/> + <parameter type-id='8f92235e'/> + <return type-id='a5c21a38'/> + </function-decl> + <function-decl name='uu_avl_destroy' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='a5c21a38'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='uu_avl_last' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='a5c21a38'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='uu_avl_walk_start' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='a5c21a38'/> + <parameter type-id='8f92235e'/> + <return type-id='5842d146'/> + </function-decl> + <function-decl name='uu_avl_walk_next' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5842d146'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='uu_avl_walk_end' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5842d146'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='uu_avl_find' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='a5c21a38'/> + <parameter type-id='eaa32e2f'/> + <parameter type-id='eaa32e2f'/> + <parameter type-id='813a2225'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='uu_avl_insert' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='a5c21a38'/> + <parameter type-id='eaa32e2f'/> + <parameter type-id='5d7f5fc8'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='uu_avl_remove' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='a5c21a38'/> + <parameter type-id='eaa32e2f'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='zfs_get_handle' mangled-name='zfs_get_handle' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_get_handle'> + <parameter type-id='9200a744'/> + <return type-id='b0382bb3'/> + </function-decl> + <function-decl name='zfs_open' mangled-name='zfs_open' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_open'> + <parameter type-id='b0382bb3'/> + <parameter type-id='80f4b756'/> + <parameter type-id='95e97e5e'/> + <return type-id='9200a744'/> + </function-decl> + <function-decl name='zfs_close' mangled-name='zfs_close' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_close'> + <parameter type-id='9200a744'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='zfs_get_name' mangled-name='zfs_get_name' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_get_name'> + <parameter type-id='fcd57163'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='zfs_prop_get' mangled-name='zfs_prop_get' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_get'> + <parameter type-id='9200a744'/> + <parameter type-id='58603c44'/> + <parameter type-id='26a90f95'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='debc6aa3'/> + <parameter type-id='26a90f95'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='c19b74c3'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_prop_get_int' mangled-name='zfs_prop_get_int' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_get_int'> + <parameter type-id='9200a744'/> + <parameter type-id='58603c44'/> + <return type-id='9c313c2d'/> + </function-decl> + <function-decl name='zfs_iter_children_v2' mangled-name='zfs_iter_children_v2' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_iter_children_v2'> + <parameter type-id='9200a744'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='d8e49ab9'/> + <parameter type-id='eaa32e2f'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_iter_dependents_v2' mangled-name='zfs_iter_dependents_v2' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_iter_dependents_v2'> + <parameter type-id='9200a744'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='c19b74c3'/> + <parameter type-id='d8e49ab9'/> + <parameter type-id='eaa32e2f'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_iter_filesystems_v2' mangled-name='zfs_iter_filesystems_v2' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_iter_filesystems_v2'> + <parameter type-id='9200a744'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='d8e49ab9'/> + <parameter type-id='eaa32e2f'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_iter_mounted' mangled-name='zfs_iter_mounted' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_iter_mounted'> + <parameter type-id='9200a744'/> + <parameter type-id='d8e49ab9'/> + <parameter type-id='eaa32e2f'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_refresh_properties' mangled-name='zfs_refresh_properties' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_refresh_properties'> + <parameter type-id='9200a744'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='zfs_is_mounted' mangled-name='zfs_is_mounted' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_is_mounted'> + <parameter type-id='9200a744'/> + <parameter type-id='9b23c9ad'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='zfs_mount' mangled-name='zfs_mount' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_mount'> + <parameter type-id='9200a744'/> + <parameter type-id='80f4b756'/> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_unmount' mangled-name='zfs_unmount' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_unmount'> + <parameter type-id='9200a744'/> + <parameter type-id='80f4b756'/> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_is_shared' mangled-name='zfs_is_shared' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_is_shared'> + <parameter type-id='9200a744'/> + <parameter type-id='9b23c9ad'/> + <parameter type-id='4567bbc9'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='zfs_share' mangled-name='zfs_share' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_share'> + <parameter type-id='9200a744'/> + <parameter type-id='4567bbc9'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_unshare' mangled-name='zfs_unshare' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_unshare'> + <parameter type-id='9200a744'/> + <parameter type-id='80f4b756'/> + <parameter type-id='4567bbc9'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_commit_shares' mangled-name='zfs_commit_shares' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_commit_shares'> + <parameter type-id='4567bbc9'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='getzoneid' mangled-name='getzoneid' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='getzoneid'> + <return type-id='4da03624'/> + </function-decl> + <function-decl name='sa_commit_shares' mangled-name='sa_commit_shares' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sa_commit_shares'> + <parameter type-id='9155d4b5'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='strlcat' mangled-name='strlcat' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='strlcat'> + <parameter type-id='26a90f95'/> + <parameter type-id='80f4b756'/> + <parameter type-id='b59d7dce'/> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='strlcpy' mangled-name='strlcpy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='strlcpy'> + <parameter type-id='26a90f95'/> + <parameter type-id='80f4b756'/> + <parameter type-id='b59d7dce'/> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='free' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='eaa32e2f'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='strcmp' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='strncmp' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <parameter type-id='b59d7dce'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='strlen' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='zfs_error' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b0382bb3'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_alloc' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b0382bb3'/> + <parameter type-id='b59d7dce'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='remove_mountpoint' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='9200a744'/> + <return type-id='48b5725f'/> + </function-decl> + <function-type size-in-bits='64' id='96ee24a5'> + <parameter type-id='eaa32e2f'/> + <parameter type-id='eaa32e2f'/> + <return type-id='95e97e5e'/> + </function-type> + <function-type size-in-bits='64' id='add6e811'> + <parameter type-id='eaa32e2f'/> + <parameter type-id='eaa32e2f'/> + <parameter type-id='eaa32e2f'/> + <return type-id='95e97e5e'/> + </function-type> + <function-type size-in-bits='64' id='cb9628fa'> + <parameter type-id='9200a744'/> + <parameter type-id='eaa32e2f'/> + <return type-id='95e97e5e'/> + </function-type> + </abi-instr> + <abi-instr address-size='64' path='lib/libzfs/libzfs_config.c' language='LANG_C99'> + <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='2816' id='514368c7'> + <subrange length='352' type-id='7359adad' id='b715cd6f'/> + </array-type-def> + <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='32768' id='d16c6df4'> + <subrange length='4096' type-id='7359adad' id='bc1b5ddc'/> + </array-type-def> + <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='65536' id='163f6aa5'> + <subrange length='8192' type-id='7359adad' id='c88f397d'/> + </array-type-def> + <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='infinite' id='e84913bd'> + <subrange length='infinite' type-id='7359adad' id='031f2035'/> + </array-type-def> + <array-type-def dimensions='1' type-id='9c313c2d' size-in-bits='128' id='c1c22e6c'> + <subrange length='2' type-id='7359adad' id='52efc4ef'/> + </array-type-def> + <array-type-def dimensions='1' type-id='b96825af' size-in-bits='24' id='d3490169'> + <subrange length='3' type-id='7359adad' id='56f209d2'/> + </array-type-def> + <type-decl name='variadic parameter type' id='2c1145c5'/> + <typedef-decl name='zpool_iter_f' type-id='3aebb66f' id='fa476e62'/> + <enum-decl name='data_type_t' naming-typedef-id='8d0687d2' id='aeeae136'> + <underlying-type type-id='9cac1fee'/> + <enumerator name='DATA_TYPE_DONTCARE' value='-1'/> + <enumerator name='DATA_TYPE_UNKNOWN' value='0'/> + <enumerator name='DATA_TYPE_BOOLEAN' value='1'/> + <enumerator name='DATA_TYPE_BYTE' value='2'/> + <enumerator name='DATA_TYPE_INT16' value='3'/> + <enumerator name='DATA_TYPE_UINT16' value='4'/> + <enumerator name='DATA_TYPE_INT32' value='5'/> + <enumerator name='DATA_TYPE_UINT32' value='6'/> + <enumerator name='DATA_TYPE_INT64' value='7'/> + <enumerator name='DATA_TYPE_UINT64' value='8'/> + <enumerator name='DATA_TYPE_STRING' value='9'/> + <enumerator name='DATA_TYPE_BYTE_ARRAY' value='10'/> + <enumerator name='DATA_TYPE_INT16_ARRAY' value='11'/> + <enumerator name='DATA_TYPE_UINT16_ARRAY' value='12'/> + <enumerator name='DATA_TYPE_INT32_ARRAY' value='13'/> + <enumerator name='DATA_TYPE_UINT32_ARRAY' value='14'/> + <enumerator name='DATA_TYPE_INT64_ARRAY' value='15'/> + <enumerator name='DATA_TYPE_UINT64_ARRAY' value='16'/> + <enumerator name='DATA_TYPE_STRING_ARRAY' value='17'/> + <enumerator name='DATA_TYPE_HRTIME' value='18'/> + <enumerator name='DATA_TYPE_NVLIST' value='19'/> + <enumerator name='DATA_TYPE_NVLIST_ARRAY' value='20'/> + <enumerator name='DATA_TYPE_BOOLEAN_VALUE' value='21'/> + <enumerator name='DATA_TYPE_INT8' value='22'/> + <enumerator name='DATA_TYPE_UINT8' value='23'/> + <enumerator name='DATA_TYPE_BOOLEAN_ARRAY' value='24'/> + <enumerator name='DATA_TYPE_INT8_ARRAY' value='25'/> + <enumerator name='DATA_TYPE_UINT8_ARRAY' value='26'/> + <enumerator name='DATA_TYPE_DOUBLE' value='27'/> + </enum-decl> + <typedef-decl name='data_type_t' type-id='aeeae136' id='8d0687d2'/> + <class-decl name='nvpair' size-in-bits='128' is-struct='yes' visibility='default' id='1c34e459'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='buffer' type-id='33976309' visibility='default'/> + <var-decl name='nvp_size' type-id='3ff5601b' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='nvp_name_sz' type-id='23bd8cb5' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='48'> + <var-decl name='nvp_reserve' type-id='23bd8cb5' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='allocated' type-id='ba516949' visibility='default'/> + <var-decl name='nvp_value_elem' type-id='3ff5601b' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='nvp_type' type-id='8d0687d2' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='used' type-id='ba516949' visibility='default'/> + <var-decl name='nvp_name' type-id='e84913bd' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='nvpair_t' type-id='1c34e459' id='57928edf'/> + <class-decl name='drr_begin' size-in-bits='2432' is-struct='yes' visibility='default' id='09fcdc01'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='drr_magic' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='drr_versioninfo' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='drr_creation_time' type-id='9c313c2d' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='syntax' type-id='1b72c3b3' visibility='default'/> + <var-decl name='drr_type' type-id='230f1e16' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='224'> + <var-decl name='drr_flags' type-id='8f92235e' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='fastmap' type-id='26a90f95' visibility='default'/> + <var-decl name='drr_toguid' type-id='9c313c2d' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='translate' type-id='cf536864' visibility='default'/> + <var-decl name='drr_fromguid' type-id='9c313c2d' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='re_nsub' type-id='b59d7dce' visibility='default'/> + <var-decl name='drr_toname' type-id='d1617432' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='zinject_record' size-in-bits='2944' is-struct='yes' visibility='default' id='3216f820'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='zi_objset' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='zi_object' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='zi_start' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='zi_end' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='zi_guid' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='zi_level' type-id='8f92235e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='352'> + <var-decl name='zi_error' type-id='8f92235e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='zi_type' type-id='9c313c2d' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='can_be_null' type-id='f0981eeb' visibility='default'/> + <var-decl name='zi_freq' type-id='8f92235e' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='449'> - <var-decl name='regs_allocated' type-id='f0981eeb' visibility='default'/> + <data-member access='public' layout-offset-in-bits='480'> + <var-decl name='zi_failfast' type-id='8f92235e' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='451'> - <var-decl name='fastmap_accurate' type-id='f0981eeb' visibility='default'/> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='zi_func' type-id='d1617432' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='452'> - <var-decl name='no_sub' type-id='f0981eeb' visibility='default'/> + <data-member access='public' layout-offset-in-bits='2560'> + <var-decl name='zi_iotype' type-id='8f92235e' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='453'> - <var-decl name='not_bol' type-id='f0981eeb' visibility='default'/> + <data-member access='public' layout-offset-in-bits='2592'> + <var-decl name='zi_duration' type-id='3ff5601b' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='454'> - <var-decl name='not_eol' type-id='f0981eeb' visibility='default'/> + <data-member access='public' layout-offset-in-bits='2624'> + <var-decl name='zi_timer' type-id='9c313c2d' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='455'> - <var-decl name='newline_anchor' type-id='f0981eeb' visibility='default'/> + <data-member access='public' layout-offset-in-bits='2688'> + <var-decl name='zi_nlanes' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2752'> + <var-decl name='zi_cmd' type-id='8f92235e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2784'> + <var-decl name='zi_dvas' type-id='8f92235e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2816'> + <var-decl name='zi_match_count' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2880'> + <var-decl name='zi_inject_count' type-id='9c313c2d' visibility='default'/> </data-member> </class-decl> - <typedef-decl name='regex_t' type-id='19fc9a8c' id='aca3bac8'/> - <typedef-decl name='uintptr_t' type-id='7359adad' id='e475ab95'/> - <union-decl name='pthread_mutex_t' size-in-bits='320' naming-typedef-id='7a6844eb' visibility='default' id='70681f9b'> - <data-member access='public'> - <var-decl name='__data' type-id='4c734837' visibility='default'/> + <typedef-decl name='zinject_record_t' type-id='3216f820' id='a4301ca6'/> + <class-decl name='zfs_share' size-in-bits='256' is-struct='yes' visibility='default' id='feb6f2da'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='z_exportdata' type-id='9c313c2d' visibility='default'/> </data-member> - <data-member access='public'> - <var-decl name='__size' type-id='36c46961' visibility='default'/> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='z_sharedata' type-id='9c313c2d' visibility='default'/> </data-member> - <data-member access='public'> - <var-decl name='__align' type-id='bd54fe1a' visibility='default'/> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='z_sharetype' type-id='9c313c2d' visibility='default'/> </data-member> - </union-decl> - <typedef-decl name='pthread_mutex_t' type-id='70681f9b' id='7a6844eb'/> - <typedef-decl name='int32_t' type-id='33f57a65' id='3ff5601b'/> - <typedef-decl name='uint8_t' type-id='c51d6389' id='b96825af'/> - <typedef-decl name='uint32_t' type-id='62f1140c' id='8f92235e'/> - <typedef-decl name='uint64_t' type-id='8910171f' id='9c313c2d'/> - <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' id='4c734837'> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='z_sharemax' type-id='9c313c2d' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='zfs_share_t' type-id='feb6f2da' id='ee5cec36'/> + <class-decl name='zfs_cmd' size-in-bits='109952' is-struct='yes' visibility='default' id='3522cd69'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='__lock' type-id='95e97e5e' visibility='default'/> + <var-decl name='zc_name' type-id='d16c6df4' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='__count' type-id='f0981eeb' visibility='default'/> + <data-member access='public' layout-offset-in-bits='32768'> + <var-decl name='zc_nvlist_src' type-id='9c313c2d' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='__owner' type-id='95e97e5e' visibility='default'/> + <data-member access='public' layout-offset-in-bits='32832'> + <var-decl name='zc_nvlist_src_size' type-id='9c313c2d' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='__nusers' type-id='f0981eeb' visibility='default'/> + <data-member access='public' layout-offset-in-bits='32896'> + <var-decl name='zc_nvlist_dst' type-id='9c313c2d' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='__kind' type-id='95e97e5e' visibility='default'/> + <data-member access='public' layout-offset-in-bits='32960'> + <var-decl name='zc_nvlist_dst_size' type-id='9c313c2d' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='160'> - <var-decl name='__spins' type-id='a2185560' visibility='default'/> + <data-member access='public' layout-offset-in-bits='33024'> + <var-decl name='zc_nvlist_dst_filled' type-id='c19b74c3' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='176'> - <var-decl name='__elision' type-id='a2185560' visibility='default'/> + <data-member access='public' layout-offset-in-bits='33056'> + <var-decl name='zc_pad2' type-id='95e97e5e' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='__list' type-id='518fb49c' visibility='default'/> + <data-member access='public' layout-offset-in-bits='33088'> + <var-decl name='zc_history' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='33152'> + <var-decl name='zc_value' type-id='163f6aa5' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='98688'> + <var-decl name='zc_string' type-id='d1617432' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='100736'> + <var-decl name='zc_guid' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='100800'> + <var-decl name='zc_nvlist_conf' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='100864'> + <var-decl name='zc_nvlist_conf_size' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='100928'> + <var-decl name='zc_cookie' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='100992'> + <var-decl name='zc_objset_type' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='101056'> + <var-decl name='zc_perm_action' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='101120'> + <var-decl name='zc_history_len' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='101184'> + <var-decl name='zc_history_offset' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='101248'> + <var-decl name='zc_obj' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='101312'> + <var-decl name='zc_iflags' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='101376'> + <var-decl name='zc_share' type-id='ee5cec36' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='101632'> + <var-decl name='zc_objset_stats' type-id='b2c14f17' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='103936'> + <var-decl name='zc_begin_record' type-id='09fcdc01' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='106368'> + <var-decl name='' type-id='ac5ab595' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='109312'> + <var-decl name='zc_cleanup_fd' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='109344'> + <var-decl name='zc_simple' type-id='b96825af' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='109352'> + <var-decl name='zc_pad' type-id='d3490169' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='109376'> + <var-decl name='zc_sendobj' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='109440'> + <var-decl name='zc_fromobj' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='109504'> + <var-decl name='zc_createtxg' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='109568'> + <var-decl name='zc_stat' type-id='0371a9c7' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='109888'> + <var-decl name='zc_zoneid' type-id='9c313c2d' visibility='default'/> </data-member> </class-decl> - <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' id='0e01899c'> + <union-decl name='__anonymous_union__' size-in-bits='2944' is-anonymous='yes' visibility='default' id='ac5ab595'> + <data-member access='public'> + <var-decl name='zc_inject_record' type-id='a4301ca6' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='' type-id='e7f43f73' visibility='default'/> + </data-member> + </union-decl> + <class-decl name='__anonymous_struct__' size-in-bits='2944' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f73'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='__prev' type-id='4d98cd5a' visibility='default'/> + <var-decl name='zc_pad1' type-id='514368c7' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2816'> + <var-decl name='zc_defer_destroy' type-id='8f92235e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2848'> + <var-decl name='zc_flags' type-id='8f92235e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2880'> + <var-decl name='zc_action_handle' type-id='9c313c2d' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='zfs_cmd_t' type-id='3522cd69' id='a5559cdd'/> + <class-decl name='zfs_stat' size-in-bits='320' is-struct='yes' visibility='default' id='6417f0b9'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='zs_gen' type-id='9c313c2d' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='__next' type-id='4d98cd5a' visibility='default'/> + <var-decl name='zs_mode' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='zs_links' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='zs_ctime' type-id='c1c22e6c' visibility='default'/> </data-member> </class-decl> - <typedef-decl name='__pthread_list_t' type-id='0e01899c' id='518fb49c'/> - <typedef-decl name='__uint8_t' type-id='002ac4a6' id='c51d6389'/> - <typedef-decl name='__int32_t' type-id='95e97e5e' id='33f57a65'/> - <typedef-decl name='__uint32_t' type-id='f0981eeb' id='62f1140c'/> - <typedef-decl name='__uint64_t' type-id='7359adad' id='8910171f'/> - <typedef-decl name='size_t' type-id='7359adad' id='b59d7dce'/> - <pointer-type-def type-id='0e01899c' size-in-bits='64' id='4d98cd5a'/> - <pointer-type-def type-id='428b67b3' size-in-bits='64' id='bf311473'/> + <typedef-decl name='zfs_stat_t' type-id='6417f0b9' id='0371a9c7'/> + <typedef-decl name='int16_t' type-id='03896e23' id='23bd8cb5'/> + <typedef-decl name='__int16_t' type-id='a2185560' id='03896e23'/> <pointer-type-def type-id='c19b74c3' size-in-bits='64' id='37e3bd22'/> - <pointer-type-def type-id='a84c031d' size-in-bits='64' id='26a90f95'/> - <qualified-type-def type-id='a84c031d' const='yes' id='9b45d938'/> - <pointer-type-def type-id='9b45d938' size-in-bits='64' id='80f4b756'/> - <pointer-type-def type-id='96ee24a5' size-in-bits='64' id='585e1de9'/> - <pointer-type-def type-id='cb9628fa' size-in-bits='64' id='5571cde4'/> + <qualified-type-def type-id='8e8d4be3' const='yes' id='693c3853'/> + <pointer-type-def type-id='693c3853' size-in-bits='64' id='22cce67b'/> + <qualified-type-def type-id='57928edf' const='yes' id='642ee20f'/> + <pointer-type-def type-id='642ee20f' size-in-bits='64' id='dace003f'/> <pointer-type-def type-id='2bce87e3' size-in-bits='64' id='3aebb66f'/> - <pointer-type-def type-id='95942d0c' size-in-bits='64' id='b0382bb3'/> - <pointer-type-def type-id='8e8d4be3' size-in-bits='64' id='5ce45b60'/> + <pointer-type-def type-id='95e97e5e' size-in-bits='64' id='7292109c'/> <pointer-type-def type-id='5ce45b60' size-in-bits='64' id='857bb57e'/> - <pointer-type-def type-id='b48d2441' size-in-bits='64' id='33976309'/> - <pointer-type-def type-id='b96825af' size-in-bits='64' id='ae3e8ca6'/> - <pointer-type-def type-id='002ac4a6' size-in-bits='64' id='cf536864'/> - <pointer-type-def type-id='7f84e390' size-in-bits='64' id='de82c773'/> - <pointer-type-def type-id='bb7f0973' size-in-bits='64' id='a5c21a38'/> - <pointer-type-def type-id='48b5725f' size-in-bits='64' id='eaa32e2f'/> - <pointer-type-def type-id='775509eb' size-in-bits='64' id='9200a744'/> - <pointer-type-def type-id='b1efc708' size-in-bits='64' id='4c81de99'/> - <class-decl name='re_dfa_t' is-struct='yes' visibility='default' is-declaration-only='yes' id='b48d2441'/> - <class-decl name='uu_avl' is-struct='yes' visibility='default' is-declaration-only='yes' id='4af029d1'/> - <class-decl name='uu_avl_pool' is-struct='yes' visibility='default' is-declaration-only='yes' id='12a530a8'/> + <pointer-type-def type-id='57928edf' size-in-bits='64' id='3fa542f0'/> + <pointer-type-def type-id='eaa32e2f' size-in-bits='64' id='63e171df'/> + <pointer-type-def type-id='3522cd69' size-in-bits='64' id='b65f7fd1'/> + <pointer-type-def type-id='a5559cdd' size-in-bits='64' id='e4ec4540'/> + <pointer-type-def type-id='4c81de99' size-in-bits='64' id='237193c9'/> + <function-decl name='uu_avl_first' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='a5c21a38'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='uu_avl_next' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='a5c21a38'/> + <parameter type-id='eaa32e2f'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='uu_avl_teardown' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='a5c21a38'/> + <parameter type-id='63e171df'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='zfs_standard_error' mangled-name='zfs_standard_error' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_standard_error'> + <parameter type-id='b0382bb3'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_ioctl' mangled-name='zfs_ioctl' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_ioctl'> + <parameter type-id='b0382bb3'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='b65f7fd1'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_free' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='nvlist_dup' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='22cce67b'/> + <parameter type-id='857bb57e'/> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_nvlist' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='857bb57e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_exists' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='22cce67b'/> + <parameter type-id='80f4b756'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='nvlist_next_nvpair' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='dace003f'/> + <return type-id='3fa542f0'/> + </function-decl> + <function-decl name='nvpair_name' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='dace003f'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='fnvpair_value_nvlist' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='3fa542f0'/> + <return type-id='5ce45b60'/> + </function-decl> + <function-decl name='libspl_assertf' mangled-name='libspl_assertf' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libspl_assertf'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='80f4b756'/> + <parameter is-variadic='yes'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='__errno_location' visibility='default' binding='global' size-in-bits='64'> + <return type-id='7292109c'/> + </function-decl> + <function-decl name='dcgettext' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <parameter type-id='95e97e5e'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='getenv' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='strchr' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='95e97e5e'/> + <return type-id='26a90f95'/> + </function-decl> <function-decl name='zpool_get_config' mangled-name='zpool_get_config' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_get_config'> <parameter type-id='4c81de99' name='zhp'/> <parameter type-id='857bb57e' name='oldconfig'/> @@ -3209,21 +3060,728 @@ <parameter type-id='eaa32e2f' name='data'/> <return type-id='95e97e5e'/> </function-decl> - <function-type size-in-bits='64' id='cb9628fa'> - <parameter type-id='9200a744'/> - <parameter type-id='eaa32e2f'/> + <function-decl name='zfs_strdup' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b0382bb3'/> + <parameter type-id='80f4b756'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='no_memory' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b0382bb3'/> <return type-id='95e97e5e'/> - </function-type> + </function-decl> + <function-decl name='zcmd_alloc_dst_nvlist' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b0382bb3'/> + <parameter type-id='e4ec4540'/> + <parameter type-id='b59d7dce'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='zcmd_expand_dst_nvlist' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b0382bb3'/> + <parameter type-id='e4ec4540'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='zcmd_read_dst_nvlist' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b0382bb3'/> + <parameter type-id='e4ec4540'/> + <parameter type-id='857bb57e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zcmd_free_nvlists' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='e4ec4540'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='make_dataset_handle' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b0382bb3'/> + <parameter type-id='80f4b756'/> + <return type-id='9200a744'/> + </function-decl> + <function-decl name='zpool_open_silent' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b0382bb3'/> + <parameter type-id='80f4b756'/> + <parameter type-id='237193c9'/> + <return type-id='95e97e5e'/> + </function-decl> <function-type size-in-bits='64' id='2bce87e3'> <parameter type-id='4c81de99'/> <parameter type-id='eaa32e2f'/> <return type-id='95e97e5e'/> </function-type> </abi-instr> - <abi-instr address-size='64' path='libzfs_crypto.c' language='LANG_C99'> - <typedef-decl name='uint_t' type-id='f0981eeb' id='3502e3ff'/> + <abi-instr address-size='64' path='lib/libzfs/libzfs_crypto.c' language='LANG_C99'> + <array-type-def dimensions='1' type-id='fb7c6451' size-in-bits='256' id='64177143'> + <subrange length='32' type-id='7359adad' id='ae5bde82'/> + </array-type-def> + <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='8' id='89feb1ec'> + <subrange length='1' type-id='7359adad' id='52f813b4'/> + </array-type-def> + <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='160' id='664ac0b7'> + <subrange length='20' type-id='7359adad' id='fdca39cf'/> + </array-type-def> + <class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='a4036571'/> + <class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='010ae0b9'/> + <class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='79bd3751'/> + <array-type-def dimensions='1' type-id='95e97e5e' size-in-bits='896' id='47394ee0'> + <subrange length='28' type-id='7359adad' id='3db583d7'/> + </array-type-def> + <type-decl name='signed char' size-in-bits='8' id='28577a57'/> + <array-type-def dimensions='1' type-id='7359adad' size-in-bits='1024' id='d2baa450'> + <subrange length='16' type-id='7359adad' id='848d0938'/> + </array-type-def> + <type-decl name='unsigned short int' size-in-bits='16' id='8efea9e5'/> + <enum-decl name='zpool_prop_t' naming-typedef-id='5d0c23fb' id='af1ba157'> + <underlying-type type-id='9cac1fee'/> + <enumerator name='ZPOOL_PROP_INVAL' value='-1'/> + <enumerator name='ZPOOL_PROP_NAME' value='0'/> + <enumerator name='ZPOOL_PROP_SIZE' value='1'/> + <enumerator name='ZPOOL_PROP_CAPACITY' value='2'/> + <enumerator name='ZPOOL_PROP_ALTROOT' value='3'/> + <enumerator name='ZPOOL_PROP_HEALTH' value='4'/> + <enumerator name='ZPOOL_PROP_GUID' value='5'/> + <enumerator name='ZPOOL_PROP_VERSION' value='6'/> + <enumerator name='ZPOOL_PROP_BOOTFS' value='7'/> + <enumerator name='ZPOOL_PROP_DELEGATION' value='8'/> + <enumerator name='ZPOOL_PROP_AUTOREPLACE' value='9'/> + <enumerator name='ZPOOL_PROP_CACHEFILE' value='10'/> + <enumerator name='ZPOOL_PROP_FAILUREMODE' value='11'/> + <enumerator name='ZPOOL_PROP_LISTSNAPS' value='12'/> + <enumerator name='ZPOOL_PROP_AUTOEXPAND' value='13'/> + <enumerator name='ZPOOL_PROP_DEDUPDITTO' value='14'/> + <enumerator name='ZPOOL_PROP_DEDUPRATIO' value='15'/> + <enumerator name='ZPOOL_PROP_FREE' value='16'/> + <enumerator name='ZPOOL_PROP_ALLOCATED' value='17'/> + <enumerator name='ZPOOL_PROP_READONLY' value='18'/> + <enumerator name='ZPOOL_PROP_ASHIFT' value='19'/> + <enumerator name='ZPOOL_PROP_COMMENT' value='20'/> + <enumerator name='ZPOOL_PROP_EXPANDSZ' value='21'/> + <enumerator name='ZPOOL_PROP_FREEING' value='22'/> + <enumerator name='ZPOOL_PROP_FRAGMENTATION' value='23'/> + <enumerator name='ZPOOL_PROP_LEAKED' value='24'/> + <enumerator name='ZPOOL_PROP_MAXBLOCKSIZE' value='25'/> + <enumerator name='ZPOOL_PROP_TNAME' value='26'/> + <enumerator name='ZPOOL_PROP_MAXDNODESIZE' value='27'/> + <enumerator name='ZPOOL_PROP_MULTIHOST' value='28'/> + <enumerator name='ZPOOL_PROP_CHECKPOINT' value='29'/> + <enumerator name='ZPOOL_PROP_LOAD_GUID' value='30'/> + <enumerator name='ZPOOL_PROP_AUTOTRIM' value='31'/> + <enumerator name='ZPOOL_PROP_COMPATIBILITY' value='32'/> + <enumerator name='ZPOOL_PROP_BCLONEUSED' value='33'/> + <enumerator name='ZPOOL_PROP_BCLONESAVED' value='34'/> + <enumerator name='ZPOOL_PROP_BCLONERATIO' value='35'/> + <enumerator name='ZPOOL_PROP_DEDUP_TABLE_SIZE' value='36'/> + <enumerator name='ZPOOL_PROP_DEDUP_TABLE_QUOTA' value='37'/> + <enumerator name='ZPOOL_PROP_DEDUPCACHED' value='38'/> + <enumerator name='ZPOOL_PROP_LAST_SCRUBBED_TXG' value='39'/> + <enumerator name='ZPOOL_NUM_PROPS' value='40'/> + </enum-decl> + <typedef-decl name='zpool_prop_t' type-id='af1ba157' id='5d0c23fb'/> + <typedef-decl name='regoff_t' type-id='95e97e5e' id='54a2a2a8'/> + <class-decl name='regmatch_t' size-in-bits='64' is-struct='yes' naming-typedef-id='1b941664' visibility='default' id='4f932615'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='rm_so' type-id='54a2a2a8' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='rm_eo' type-id='54a2a2a8' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='regmatch_t' type-id='4f932615' id='1b941664'/> + <typedef-decl name='__sighandler_t' type-id='03347643' id='8cdd9566'/> + <typedef-decl name='ssize_t' type-id='41060289' id='79a0948f'/> + <class-decl name='sigaction' size-in-bits='1216' is-struct='yes' visibility='default' id='fe391c48'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='__sigaction_handler' type-id='ac5ab596' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='sa_mask' type-id='b9c97942' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1088'> + <var-decl name='sa_flags' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1152'> + <var-decl name='sa_restorer' type-id='953b12f8' visibility='default'/> + </data-member> + </class-decl> + <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' id='ac5ab596'> + <data-member access='public'> + <var-decl name='sa_handler' type-id='8cdd9566' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='sa_sigaction' type-id='6e756877' visibility='default'/> + </data-member> + </union-decl> + <class-decl name='termios' size-in-bits='480' is-struct='yes' visibility='default' id='ad55d2bc'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='c_iflag' type-id='241ce6f8' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='c_oflag' type-id='241ce6f8' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='c_cflag' type-id='241ce6f8' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='c_lflag' type-id='241ce6f8' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='c_line' type-id='fb7c6451' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='136'> + <var-decl name='c_cc' type-id='64177143' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='416'> + <var-decl name='c_ispeed' type-id='6a8e8a14' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='c_ospeed' type-id='6a8e8a14' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='cc_t' type-id='002ac4a6' id='fb7c6451'/> + <typedef-decl name='speed_t' type-id='f0981eeb' id='6a8e8a14'/> + <typedef-decl name='tcflag_t' type-id='f0981eeb' id='241ce6f8'/> + <typedef-decl name='__uid_t' type-id='f0981eeb' id='cc5fcceb'/> + <typedef-decl name='__off_t' type-id='bd54fe1a' id='79989e9c'/> + <typedef-decl name='__off64_t' type-id='bd54fe1a' id='724e4de6'/> + <typedef-decl name='__pid_t' type-id='95e97e5e' id='3629bad8'/> + <typedef-decl name='__clock_t' type-id='bd54fe1a' id='4d66c6d7'/> + <typedef-decl name='__ssize_t' type-id='bd54fe1a' id='41060289'/> + <typedef-decl name='FILE' type-id='ec1ed955' id='aa12d1ba'/> + <class-decl name='__sigset_t' size-in-bits='1024' is-struct='yes' naming-typedef-id='b9c97942' visibility='default' id='2616147f'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='__val' type-id='d2baa450' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='__sigset_t' type-id='2616147f' id='b9c97942'/> + <union-decl name='sigval' size-in-bits='64' visibility='default' id='a094b870'> + <data-member access='public'> + <var-decl name='sival_int' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='sival_ptr' type-id='eaa32e2f' visibility='default'/> + </data-member> + </union-decl> + <typedef-decl name='__sigval_t' type-id='a094b870' id='eabacd01'/> + <class-decl name='siginfo_t' size-in-bits='1024' is-struct='yes' naming-typedef-id='cb681f62' visibility='default' id='d8149419'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='si_signo' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='si_errno' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='si_code' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='__pad0' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='_sifields' type-id='ac5ab597' visibility='default'/> + </data-member> + </class-decl> + <union-decl name='__anonymous_union__1' size-in-bits='896' is-anonymous='yes' visibility='default' id='ac5ab597'> + <data-member access='public'> + <var-decl name='_pad' type-id='47394ee0' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='_kill' type-id='e7f43f74' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='_timer' type-id='e7f43f75' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='_rt' type-id='e7f43f76' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='_sigchld' type-id='e7f43f77' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='_sigfault' type-id='e7f43f78' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='_sigpoll' type-id='e7f43f79' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='_sigsys' type-id='e7f43f7a' visibility='default'/> + </data-member> + </union-decl> + <class-decl name='__anonymous_struct__1' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f74'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='si_pid' type-id='3629bad8' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='si_uid' type-id='cc5fcceb' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__2' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f75'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='si_tid' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='si_overrun' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='si_sigval' type-id='eabacd01' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__3' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f76'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='si_pid' type-id='3629bad8' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='si_uid' type-id='cc5fcceb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='si_sigval' type-id='eabacd01' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__4' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f77'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='si_pid' type-id='3629bad8' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='si_uid' type-id='cc5fcceb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='si_status' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='si_utime' type-id='4d66c6d7' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='si_stime' type-id='4d66c6d7' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__5' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f78'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='si_addr' type-id='eaa32e2f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='si_addr_lsb' type-id='a2185560' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='_bounds' type-id='ac5ab598' visibility='default'/> + </data-member> + </class-decl> + <union-decl name='__anonymous_union__2' size-in-bits='128' is-anonymous='yes' visibility='default' id='ac5ab598'> + <data-member access='public'> + <var-decl name='_addr_bnd' type-id='e7f43f7b' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='_pkey' type-id='62f1140c' visibility='default'/> + </data-member> + </union-decl> + <class-decl name='__anonymous_struct__6' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f7b'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_lower' type-id='eaa32e2f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='_upper' type-id='eaa32e2f' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__7' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f79'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='si_band' type-id='bd54fe1a' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='si_fd' type-id='95e97e5e' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__8' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f7a'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_call_addr' type-id='eaa32e2f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='_syscall' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='_arch' type-id='f0981eeb' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='siginfo_t' type-id='d8149419' id='cb681f62'/> + <typedef-decl name='sigset_t' type-id='b9c97942' id='daf33c64'/> + <typedef-decl name='_IO_lock_t' type-id='48b5725f' id='bb4788fa'/> + <class-decl name='_IO_FILE' size-in-bits='1728' is-struct='yes' visibility='default' id='ec1ed955'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_flags' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='_IO_read_ptr' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='_IO_read_end' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='_IO_read_base' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='_IO_write_base' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_IO_write_ptr' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='_IO_write_end' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='_IO_buf_base' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='_IO_buf_end' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='_IO_save_base' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='640'> + <var-decl name='_IO_backup_base' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='_IO_save_end' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='768'> + <var-decl name='_markers' type-id='e4c6fa61' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='832'> + <var-decl name='_chain' type-id='dca988a5' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='896'> + <var-decl name='_fileno' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='928'> + <var-decl name='_flags2' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='960'> + <var-decl name='_old_offset' type-id='79989e9c' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1024'> + <var-decl name='_cur_column' type-id='8efea9e5' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1040'> + <var-decl name='_vtable_offset' type-id='28577a57' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1048'> + <var-decl name='_shortbuf' type-id='89feb1ec' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1088'> + <var-decl name='_lock' type-id='cecf4ea7' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1152'> + <var-decl name='_offset' type-id='724e4de6' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1216'> + <var-decl name='_codecvt' type-id='570f8c59' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1280'> + <var-decl name='_wide_data' type-id='c65a1f29' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1344'> + <var-decl name='_freeres_list' type-id='dca988a5' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1408'> + <var-decl name='_freeres_buf' type-id='eaa32e2f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1472'> + <var-decl name='__pad5' type-id='b59d7dce' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1536'> + <var-decl name='_mode' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1568'> + <var-decl name='_unused2' type-id='664ac0b7' visibility='default'/> + </data-member> + </class-decl> + <pointer-type-def type-id='aa12d1ba' size-in-bits='64' id='822cd80b'/> + <qualified-type-def type-id='822cd80b' restrict='yes' id='e75a27e9'/> + <pointer-type-def type-id='ec1ed955' size-in-bits='64' id='dca988a5'/> + <pointer-type-def type-id='a4036571' size-in-bits='64' id='570f8c59'/> + <pointer-type-def type-id='bb4788fa' size-in-bits='64' id='cecf4ea7'/> + <pointer-type-def type-id='010ae0b9' size-in-bits='64' id='e4c6fa61'/> + <pointer-type-def type-id='79bd3751' size-in-bits='64' id='c65a1f29'/> + <qualified-type-def type-id='9b23c9ad' restrict='yes' id='8c85230f'/> + <qualified-type-def type-id='80f4b756' restrict='yes' id='9d26089a'/> + <pointer-type-def type-id='80f4b756' size-in-bits='64' id='7d3cd834'/> + <qualified-type-def type-id='aca3bac8' const='yes' id='2498fd78'/> + <pointer-type-def type-id='2498fd78' size-in-bits='64' id='eed6c816'/> + <qualified-type-def type-id='eed6c816' restrict='yes' id='a431a9da'/> + <qualified-type-def type-id='fe391c48' const='yes' id='14a93b33'/> + <pointer-type-def type-id='14a93b33' size-in-bits='64' id='9f68085b'/> + <qualified-type-def type-id='9f68085b' restrict='yes' id='e2a5e6f9'/> + <qualified-type-def type-id='ad55d2bc' const='yes' id='a46bf13f'/> + <pointer-type-def type-id='a46bf13f' size-in-bits='64' id='eaec840f'/> + <qualified-type-def type-id='002ac4a6' const='yes' id='ea86de29'/> + <pointer-type-def type-id='ea86de29' size-in-bits='64' id='354f7eb9'/> + <qualified-type-def type-id='8efea9e5' const='yes' id='3beb2af4'/> + <pointer-type-def type-id='3beb2af4' size-in-bits='64' id='31347b7a'/> + <pointer-type-def type-id='31347b7a' size-in-bits='64' id='c59e1ef0'/> + <pointer-type-def type-id='7a6844eb' size-in-bits='64' id='18c91f9e'/> + <pointer-type-def type-id='1b941664' size-in-bits='64' id='7e2979d5'/> + <qualified-type-def type-id='7e2979d5' restrict='yes' id='fc212857'/> + <pointer-type-def type-id='fe391c48' size-in-bits='64' id='568dd84e'/> + <qualified-type-def type-id='568dd84e' restrict='yes' id='3d8ee6f2'/> + <pointer-type-def type-id='cb681f62' size-in-bits='64' id='185869c1'/> + <pointer-type-def type-id='daf33c64' size-in-bits='64' id='9e80f729'/> + <pointer-type-def type-id='b59d7dce' size-in-bits='64' id='78c01427'/> + <qualified-type-def type-id='78c01427' restrict='yes' id='d19b2c25'/> + <pointer-type-def type-id='ad55d2bc' size-in-bits='64' id='665a4eda'/> + <pointer-type-def type-id='9c313c2d' size-in-bits='64' id='5d6479ae'/> <pointer-type-def type-id='ae3e8ca6' size-in-bits='64' id='d8774064'/> <pointer-type-def type-id='3502e3ff' size-in-bits='64' id='4dd26a40'/> + <pointer-type-def type-id='ee076206' size-in-bits='64' id='953b12f8'/> + <pointer-type-def type-id='f712e2b7' size-in-bits='64' id='03347643'/> + <pointer-type-def type-id='ef70d893' size-in-bits='64' id='6e756877'/> + <qualified-type-def type-id='eaa32e2f' restrict='yes' id='1b7446cd'/> + <class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='a4036571'/> + <class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='010ae0b9'/> + <class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='79bd3751'/> + <function-decl name='zpool_get_prop_int' mangled-name='zpool_get_prop_int' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_get_prop_int'> + <parameter type-id='4c81de99'/> + <parameter type-id='5d0c23fb'/> + <parameter type-id='debc6aa3'/> + <return type-id='9c313c2d'/> + </function-decl> + <function-decl name='zfs_handle_dup' mangled-name='zfs_handle_dup' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_handle_dup'> + <parameter type-id='9200a744'/> + <return type-id='9200a744'/> + </function-decl> + <function-decl name='zfs_valid_proplist' mangled-name='zfs_valid_proplist' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_valid_proplist'> + <parameter type-id='b0382bb3'/> + <parameter type-id='2e45de5d'/> + <parameter type-id='5ce45b60'/> + <parameter type-id='9c313c2d'/> + <parameter type-id='9200a744'/> + <parameter type-id='4c81de99'/> + <parameter type-id='c19b74c3'/> + <parameter type-id='80f4b756'/> + <return type-id='5ce45b60'/> + </function-decl> + <function-decl name='zfs_prop_to_name' mangled-name='zfs_prop_to_name' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_to_name'> + <parameter type-id='58603c44'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='zfs_parent_name' mangled-name='zfs_parent_name' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_parent_name'> + <parameter type-id='9200a744'/> + <parameter type-id='26a90f95'/> + <parameter type-id='b59d7dce'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_load_key' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='c19b74c3'/> + <parameter type-id='ae3e8ca6'/> + <parameter type-id='3502e3ff'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_unload_key' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_change_key' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='9c313c2d'/> + <parameter type-id='5ce45b60'/> + <parameter type-id='ae3e8ca6'/> + <parameter type-id='3502e3ff'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_name_to_prop' mangled-name='zfs_name_to_prop' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_name_to_prop'> + <parameter type-id='80f4b756'/> + <return type-id='58603c44'/> + </function-decl> + <function-decl name='nvlist_add_uint64' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='9c313c2d'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_string' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_uint64' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='22cce67b'/> + <parameter type-id='80f4b756'/> + <parameter type-id='5d6479ae'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_string' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='22cce67b'/> + <parameter type-id='80f4b756'/> + <parameter type-id='7d3cd834'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='fnvlist_alloc' visibility='default' binding='global' size-in-bits='64'> + <return type-id='5ce45b60'/> + </function-decl> + <function-decl name='__ctype_b_loc' visibility='default' binding='global' size-in-bits='64'> + <return type-id='c59e1ef0'/> + </function-decl> + <function-decl name='dlopen' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='95e97e5e'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='dlsym' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='1b7446cd'/> + <parameter type-id='9d26089a'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='dlerror' visibility='default' binding='global' size-in-bits='64'> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='PKCS5_PBKDF2_HMAC_SHA1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='354f7eb9'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='cf536864'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='pthread_mutex_lock' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='18c91f9e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='pthread_mutex_unlock' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='18c91f9e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='regexec' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='a431a9da'/> + <parameter type-id='9d26089a'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='fc212857'/> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='kill' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='3629bad8'/> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='sigemptyset' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='9e80f729'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='sigaction' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter type-id='e2a5e6f9'/> + <parameter type-id='3d8ee6f2'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='fclose' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='822cd80b'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='fflush' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='822cd80b'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='fdopen' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter type-id='80f4b756'/> + <return type-id='822cd80b'/> + </function-decl> + <function-decl name='fputc' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter type-id='822cd80b'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='__getdelim' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='8c85230f'/> + <parameter type-id='d19b2c25'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='e75a27e9'/> + <return type-id='41060289'/> + </function-decl> + <function-decl name='rewind' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='822cd80b'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='ferror' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='822cd80b'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='fileno' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='822cd80b'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='malloc' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b59d7dce'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='calloc' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b59d7dce'/> + <parameter type-id='b59d7dce'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='strdup' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='strerror' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='tcgetattr' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter type-id='665a4eda'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='tcsetattr' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='eaec840f'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='close' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='getpid' visibility='default' binding='global' size-in-bits='64'> + <return type-id='3629bad8'/> + </function-decl> + <function-decl name='isatty' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='unlink' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='__open_too_many_args' visibility='default' binding='global' size-in-bits='64'> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='__open_missing_mode' visibility='default' binding='global' size-in-bits='64'> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='__printf_chk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter type-id='80f4b756'/> + <parameter is-variadic='yes'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='__asprintf_chk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='8c85230f'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='9d26089a'/> + <parameter is-variadic='yes'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='__fread_chk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='1b7446cd'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='e75a27e9'/> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='__read_chk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter type-id='eaa32e2f'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='b59d7dce'/> + <return type-id='79a0948f'/> + </function-decl> <function-decl name='zfs_crypto_get_encryption_root' mangled-name='zfs_crypto_get_encryption_root' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_crypto_get_encryption_root'> <parameter type-id='9200a744' name='zhp'/> <parameter type-id='37e3bd22' name='is_encroot'/> @@ -3249,13 +3807,13 @@ </function-decl> <function-decl name='zfs_crypto_attempt_load_keys' mangled-name='zfs_crypto_attempt_load_keys' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_crypto_attempt_load_keys'> <parameter type-id='b0382bb3' name='hdl'/> - <parameter type-id='26a90f95' name='fsname'/> + <parameter type-id='80f4b756' name='fsname'/> <return type-id='95e97e5e'/> </function-decl> <function-decl name='zfs_crypto_load_key' mangled-name='zfs_crypto_load_key' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_crypto_load_key'> <parameter type-id='9200a744' name='zhp'/> <parameter type-id='c19b74c3' name='noop'/> - <parameter type-id='26a90f95' name='alt_keylocation'/> + <parameter type-id='80f4b756' name='alt_keylocation'/> <return type-id='95e97e5e'/> </function-decl> <function-decl name='zfs_crypto_unload_key' mangled-name='zfs_crypto_unload_key' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_crypto_unload_key'> @@ -3268,8 +3826,32 @@ <parameter type-id='c19b74c3' name='inheritkey'/> <return type-id='95e97e5e'/> </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'> + <parameter type-id='b0382bb3'/> + <parameter type-id='80f4b756'/> + <parameter is-variadic='yes'/> + <return type-id='48b5725f'/> + </function-decl> + <function-type size-in-bits='64' id='f712e2b7'> + <parameter type-id='95e97e5e'/> + <return type-id='48b5725f'/> + </function-type> + <function-type size-in-bits='64' id='ef70d893'> + <parameter type-id='95e97e5e'/> + <parameter type-id='185869c1'/> + <parameter type-id='eaa32e2f'/> + <return type-id='48b5725f'/> + </function-type> </abi-instr> - <abi-instr address-size='64' path='libzfs_dataset.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libzfs/libzfs_dataset.c' language='LANG_C99'> + <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='32' id='8e0573fd'> + <subrange length='4' type-id='7359adad' id='16fe7105'/> + </array-type-def> + <class-decl name='prop_changelist' is-struct='yes' visibility='default' is-declaration-only='yes' id='d86edc51'/> <class-decl name='zprop_list' size-in-bits='448' is-struct='yes' visibility='default' id='bd9b4291'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='pl_prop' type-id='95e97e5e' visibility='default'/> @@ -3296,119 +3878,23 @@ <typedef-decl name='zprop_list_t' type-id='bd9b4291' id='bdb8ac4f'/> <class-decl name='renameflags' size-in-bits='32' is-struct='yes' visibility='default' id='7aee5792'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='recursive' type-id='95e97e5e' visibility='default'/> + <var-decl name='recursive' type-id='f0981eeb' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='1'> - <var-decl name='nounmount' type-id='95e97e5e' visibility='default'/> + <var-decl name='nounmount' type-id='f0981eeb' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='2'> - <var-decl name='forceunmount' type-id='95e97e5e' visibility='default'/> + <var-decl name='forceunmount' type-id='f0981eeb' visibility='default'/> </data-member> </class-decl> <typedef-decl name='renameflags_t' type-id='7aee5792' id='067170c2'/> - <typedef-decl name='zfs_userspace_cb_t' type-id='ca64ff60' id='16c5f410'/> - <enum-decl name='zfs_prop_t' naming-typedef-id='58603c44' id='4b000d60'> + <typedef-decl name='zfs_userspace_cb_t' type-id='bbaa4f9c' id='16c5f410'/> + <enum-decl name='lzc_dataset_type' id='bc9887f1'> <underlying-type type-id='9cac1fee'/> - <enumerator name='ZPROP_CONT' value='-2'/> - <enumerator name='ZPROP_INVAL' value='-1'/> - <enumerator name='ZFS_PROP_TYPE' value='0'/> - <enumerator name='ZFS_PROP_CREATION' value='1'/> - <enumerator name='ZFS_PROP_USED' value='2'/> - <enumerator name='ZFS_PROP_AVAILABLE' value='3'/> - <enumerator name='ZFS_PROP_REFERENCED' value='4'/> - <enumerator name='ZFS_PROP_COMPRESSRATIO' value='5'/> - <enumerator name='ZFS_PROP_MOUNTED' value='6'/> - <enumerator name='ZFS_PROP_ORIGIN' value='7'/> - <enumerator name='ZFS_PROP_QUOTA' value='8'/> - <enumerator name='ZFS_PROP_RESERVATION' value='9'/> - <enumerator name='ZFS_PROP_VOLSIZE' value='10'/> - <enumerator name='ZFS_PROP_VOLBLOCKSIZE' value='11'/> - <enumerator name='ZFS_PROP_RECORDSIZE' value='12'/> - <enumerator name='ZFS_PROP_MOUNTPOINT' value='13'/> - <enumerator name='ZFS_PROP_SHARENFS' value='14'/> - <enumerator name='ZFS_PROP_CHECKSUM' value='15'/> - <enumerator name='ZFS_PROP_COMPRESSION' value='16'/> - <enumerator name='ZFS_PROP_ATIME' value='17'/> - <enumerator name='ZFS_PROP_DEVICES' value='18'/> - <enumerator name='ZFS_PROP_EXEC' value='19'/> - <enumerator name='ZFS_PROP_SETUID' value='20'/> - <enumerator name='ZFS_PROP_READONLY' value='21'/> - <enumerator name='ZFS_PROP_ZONED' value='22'/> - <enumerator name='ZFS_PROP_SNAPDIR' value='23'/> - <enumerator name='ZFS_PROP_ACLMODE' value='24'/> - <enumerator name='ZFS_PROP_ACLINHERIT' value='25'/> - <enumerator name='ZFS_PROP_CREATETXG' value='26'/> - <enumerator name='ZFS_PROP_NAME' value='27'/> - <enumerator name='ZFS_PROP_CANMOUNT' value='28'/> - <enumerator name='ZFS_PROP_ISCSIOPTIONS' value='29'/> - <enumerator name='ZFS_PROP_XATTR' value='30'/> - <enumerator name='ZFS_PROP_NUMCLONES' value='31'/> - <enumerator name='ZFS_PROP_COPIES' value='32'/> - <enumerator name='ZFS_PROP_VERSION' value='33'/> - <enumerator name='ZFS_PROP_UTF8ONLY' value='34'/> - <enumerator name='ZFS_PROP_NORMALIZE' value='35'/> - <enumerator name='ZFS_PROP_CASE' value='36'/> - <enumerator name='ZFS_PROP_VSCAN' value='37'/> - <enumerator name='ZFS_PROP_NBMAND' value='38'/> - <enumerator name='ZFS_PROP_SHARESMB' value='39'/> - <enumerator name='ZFS_PROP_REFQUOTA' value='40'/> - <enumerator name='ZFS_PROP_REFRESERVATION' value='41'/> - <enumerator name='ZFS_PROP_GUID' value='42'/> - <enumerator name='ZFS_PROP_PRIMARYCACHE' value='43'/> - <enumerator name='ZFS_PROP_SECONDARYCACHE' value='44'/> - <enumerator name='ZFS_PROP_USEDSNAP' value='45'/> - <enumerator name='ZFS_PROP_USEDDS' value='46'/> - <enumerator name='ZFS_PROP_USEDCHILD' value='47'/> - <enumerator name='ZFS_PROP_USEDREFRESERV' value='48'/> - <enumerator name='ZFS_PROP_USERACCOUNTING' value='49'/> - <enumerator name='ZFS_PROP_STMF_SHAREINFO' value='50'/> - <enumerator name='ZFS_PROP_DEFER_DESTROY' value='51'/> - <enumerator name='ZFS_PROP_USERREFS' value='52'/> - <enumerator name='ZFS_PROP_LOGBIAS' value='53'/> - <enumerator name='ZFS_PROP_UNIQUE' value='54'/> - <enumerator name='ZFS_PROP_OBJSETID' value='55'/> - <enumerator name='ZFS_PROP_DEDUP' value='56'/> - <enumerator name='ZFS_PROP_MLSLABEL' value='57'/> - <enumerator name='ZFS_PROP_SYNC' value='58'/> - <enumerator name='ZFS_PROP_DNODESIZE' value='59'/> - <enumerator name='ZFS_PROP_REFRATIO' value='60'/> - <enumerator name='ZFS_PROP_WRITTEN' value='61'/> - <enumerator name='ZFS_PROP_CLONES' value='62'/> - <enumerator name='ZFS_PROP_LOGICALUSED' value='63'/> - <enumerator name='ZFS_PROP_LOGICALREFERENCED' value='64'/> - <enumerator name='ZFS_PROP_INCONSISTENT' value='65'/> - <enumerator name='ZFS_PROP_VOLMODE' value='66'/> - <enumerator name='ZFS_PROP_FILESYSTEM_LIMIT' value='67'/> - <enumerator name='ZFS_PROP_SNAPSHOT_LIMIT' value='68'/> - <enumerator name='ZFS_PROP_FILESYSTEM_COUNT' value='69'/> - <enumerator name='ZFS_PROP_SNAPSHOT_COUNT' value='70'/> - <enumerator name='ZFS_PROP_SNAPDEV' value='71'/> - <enumerator name='ZFS_PROP_ACLTYPE' value='72'/> - <enumerator name='ZFS_PROP_SELINUX_CONTEXT' value='73'/> - <enumerator name='ZFS_PROP_SELINUX_FSCONTEXT' value='74'/> - <enumerator name='ZFS_PROP_SELINUX_DEFCONTEXT' value='75'/> - <enumerator name='ZFS_PROP_SELINUX_ROOTCONTEXT' value='76'/> - <enumerator name='ZFS_PROP_RELATIME' value='77'/> - <enumerator name='ZFS_PROP_REDUNDANT_METADATA' value='78'/> - <enumerator name='ZFS_PROP_OVERLAY' value='79'/> - <enumerator name='ZFS_PROP_PREV_SNAP' value='80'/> - <enumerator name='ZFS_PROP_RECEIVE_RESUME_TOKEN' value='81'/> - <enumerator name='ZFS_PROP_ENCRYPTION' value='82'/> - <enumerator name='ZFS_PROP_KEYLOCATION' value='83'/> - <enumerator name='ZFS_PROP_KEYFORMAT' value='84'/> - <enumerator name='ZFS_PROP_PBKDF2_SALT' value='85'/> - <enumerator name='ZFS_PROP_PBKDF2_ITERS' value='86'/> - <enumerator name='ZFS_PROP_ENCRYPTION_ROOT' value='87'/> - <enumerator name='ZFS_PROP_KEY_GUID' value='88'/> - <enumerator name='ZFS_PROP_KEYSTATUS' value='89'/> - <enumerator name='ZFS_PROP_REMAPTXG' value='90'/> - <enumerator name='ZFS_PROP_SPECIAL_SMALL_BLOCKS' value='91'/> - <enumerator name='ZFS_PROP_IVSET_GUID' value='92'/> - <enumerator name='ZFS_PROP_REDACTED' value='93'/> - <enumerator name='ZFS_PROP_REDACT_SNAPS' value='94'/> - <enumerator name='ZFS_NUM_PROPS' value='95'/> + <enumerator name='LZC_DATSET_TYPE_ZFS' value='2'/> + <enumerator name='LZC_DATSET_TYPE_ZVOL' value='3'/> </enum-decl> - <typedef-decl name='zfs_prop_t' type-id='4b000d60' id='58603c44'/> + <typedef-decl name='avl_index_t' type-id='e475ab95' id='fba6cb51'/> <enum-decl name='zfs_userquota_prop_t' naming-typedef-id='279fde6a' id='5258d2f6'> <underlying-type type-id='9cac1fee'/> <enumerator name='ZFS_PROP_USERUSED' value='0'/> @@ -3426,22 +3912,36 @@ <enumerator name='ZFS_NUM_USERQUOTA_PROPS' value='12'/> </enum-decl> <typedef-decl name='zfs_userquota_prop_t' type-id='5258d2f6' id='279fde6a'/> - <enum-decl name='zprop_source_t' naming-typedef-id='a2256d42' id='5903f80e'> - <underlying-type type-id='9cac1fee'/> - <enumerator name='ZPROP_SRC_NONE' value='1'/> - <enumerator name='ZPROP_SRC_DEFAULT' value='2'/> - <enumerator name='ZPROP_SRC_TEMPORARY' value='4'/> - <enumerator name='ZPROP_SRC_LOCAL' value='8'/> - <enumerator name='ZPROP_SRC_INHERITED' value='16'/> - <enumerator name='ZPROP_SRC_RECEIVED' value='32'/> - </enum-decl> - <typedef-decl name='zprop_source_t' type-id='5903f80e' id='a2256d42'/> <enum-decl name='zfs_wait_activity_t' naming-typedef-id='3024501a' id='527d5dc6'> <underlying-type type-id='9cac1fee'/> <enumerator name='ZFS_WAIT_DELETEQ' value='0'/> <enumerator name='ZFS_WAIT_NUM_ACTIVITIES' value='1'/> </enum-decl> <typedef-decl name='zfs_wait_activity_t' type-id='527d5dc6' id='3024501a'/> + <enum-decl name='namecheck_err_t' naming-typedef-id='8e0af06e' id='f43bbcda'> + <underlying-type type-id='9cac1fee'/> + <enumerator name='NAME_ERR_LEADING_SLASH' value='0'/> + <enumerator name='NAME_ERR_EMPTY_COMPONENT' value='1'/> + <enumerator name='NAME_ERR_TRAILING_SLASH' value='2'/> + <enumerator name='NAME_ERR_INVALCHAR' value='3'/> + <enumerator name='NAME_ERR_MULTIPLE_DELIMITERS' value='4'/> + <enumerator name='NAME_ERR_NOLETTER' value='5'/> + <enumerator name='NAME_ERR_RESERVED' value='6'/> + <enumerator name='NAME_ERR_DISKLIKE' value='7'/> + <enumerator name='NAME_ERR_TOOLONG' value='8'/> + <enumerator name='NAME_ERR_SELF_REF' value='9'/> + <enumerator name='NAME_ERR_PARENT_REF' value='10'/> + <enumerator name='NAME_ERR_NO_AT' value='11'/> + <enumerator name='NAME_ERR_NO_POUND' value='12'/> + </enum-decl> + <typedef-decl name='namecheck_err_t' type-id='f43bbcda' id='8e0af06e'/> + <enum-decl name='zprop_type_t' naming-typedef-id='31429eff' id='87676253'> + <underlying-type type-id='9cac1fee'/> + <enumerator name='PROP_TYPE_NUMBER' value='0'/> + <enumerator name='PROP_TYPE_STRING' value='1'/> + <enumerator name='PROP_TYPE_INDEX' value='2'/> + </enum-decl> + <typedef-decl name='zprop_type_t' type-id='87676253' id='31429eff'/> <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'/> @@ -3456,19 +3956,663 @@ <var-decl name='mnt_mntopts' type-id='26a90f95' visibility='default'/> </data-member> </class-decl> - <typedef-decl name='__uid_t' type-id='f0981eeb' id='cc5fcceb'/> + <class-decl name='group' size-in-bits='256' is-struct='yes' visibility='default' id='01a1b934'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='gr_name' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='gr_passwd' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='gr_gid' type-id='d94ec6d9' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='gr_mem' type-id='9b23c9ad' 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'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='mnt_dir' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='mnt_type' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='mnt_opts' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='mnt_freq' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='288'> + <var-decl name='mnt_passno' type-id='95e97e5e' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='passwd' size-in-bits='384' is-struct='yes' visibility='default' id='a63d15a3'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='pw_name' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='pw_passwd' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='pw_uid' type-id='cc5fcceb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160'> + <var-decl name='pw_gid' type-id='d94ec6d9' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='pw_gecos' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='pw_dir' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='pw_shell' type-id='26a90f95' visibility='default'/> + </data-member> + </class-decl> + <union-decl name='pthread_mutexattr_t' size-in-bits='32' naming-typedef-id='8afd6070' visibility='default' id='7300eb00'> + <data-member access='public'> + <var-decl name='__size' type-id='8e0573fd' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='__align' type-id='95e97e5e' visibility='default'/> + </data-member> + </union-decl> + <typedef-decl name='pthread_mutexattr_t' type-id='7300eb00' id='8afd6070'/> + <typedef-decl name='int64_t' type-id='0c9942d2' id='9da381c4'/> + <typedef-decl name='__int64_t' type-id='bd54fe1a' id='0c9942d2'/> + <typedef-decl name='__gid_t' type-id='f0981eeb' id='d94ec6d9'/> + <typedef-decl name='__time_t' type-id='bd54fe1a' id='65eda9c0'/> + <class-decl name='tm' size-in-bits='448' is-struct='yes' visibility='default' id='dddf6ca2'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='tm_sec' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='tm_min' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='tm_hour' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='tm_mday' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='tm_mon' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160'> + <var-decl name='tm_year' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='tm_wday' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='224'> + <var-decl name='tm_yday' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='tm_isdst' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='tm_gmtoff' type-id='bd54fe1a' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='tm_zone' type-id='80f4b756' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='time_t' type-id='65eda9c0' id='c9d12d66'/> <typedef-decl name='uid_t' type-id='cc5fcceb' id='354978ed'/> - <pointer-type-def type-id='26a90f95' size-in-bits='64' id='9b23c9ad'/> - <qualified-type-def type-id='775509eb' const='yes' id='5eadf2db'/> - <pointer-type-def type-id='5eadf2db' size-in-bits='64' id='fcd57163'/> - <pointer-type-def type-id='7e291ce6' size-in-bits='64' id='ca64ff60'/> - <pointer-type-def type-id='95e97e5e' size-in-bits='64' id='7292109c'/> + <typedef-decl name='prop_changelist_t' type-id='d86edc51' id='eae6431d'/> + <pointer-type-def type-id='fba6cb51' size-in-bits='64' id='32adbf30'/> + <pointer-type-def type-id='f20fbd51' size-in-bits='64' id='a3681dea'/> + <qualified-type-def type-id='26a90f95' restrict='yes' id='266fe297'/> + <qualified-type-def type-id='56fe4a37' const='yes' id='a75125ce'/> + <pointer-type-def type-id='a75125ce' size-in-bits='64' id='48bea5ec'/> + <qualified-type-def type-id='8afd6070' const='yes' id='1d853360'/> + <pointer-type-def type-id='1d853360' size-in-bits='64' id='c2afbd7e'/> + <qualified-type-def type-id='c9d12d66' const='yes' id='588b3216'/> + <pointer-type-def type-id='588b3216' size-in-bits='64' id='9f201474'/> + <qualified-type-def type-id='9f201474' restrict='yes' id='d6e2847c'/> + <qualified-type-def type-id='dddf6ca2' const='yes' id='e824a34f'/> + <pointer-type-def type-id='e824a34f' size-in-bits='64' id='d6ad37ff'/> + <qualified-type-def type-id='d6ad37ff' restrict='yes' id='f8c6051d'/> + <qualified-type-def type-id='9c313c2d' const='yes' id='c3b7ba7d'/> + <pointer-type-def type-id='c3b7ba7d' size-in-bits='64' id='713a56f5'/> + <pointer-type-def type-id='01a1b934' size-in-bits='64' id='566b3f52'/> + <qualified-type-def type-id='566b3f52' restrict='yes' id='c878edd6'/> + <pointer-type-def type-id='566b3f52' size-in-bits='64' id='82d4e9e8'/> + <qualified-type-def type-id='82d4e9e8' restrict='yes' id='aa19c230'/> + <pointer-type-def type-id='02362c02' size-in-bits='64' id='bbaa4f9c'/> + <pointer-type-def type-id='9da381c4' size-in-bits='64' id='cb785ebf'/> <pointer-type-def type-id='1b055409' size-in-bits='64' id='9d424d31'/> - <pointer-type-def type-id='9c313c2d' size-in-bits='64' id='5d6479ae'/> + <pointer-type-def type-id='8e0af06e' size-in-bits='64' id='053457bd'/> + <pointer-type-def type-id='857bb57e' size-in-bits='64' id='75be733c'/> + <pointer-type-def type-id='a63d15a3' size-in-bits='64' id='a195f4a3'/> + <qualified-type-def type-id='a195f4a3' restrict='yes' id='33518961'/> + <pointer-type-def type-id='a195f4a3' size-in-bits='64' id='e80ff3ab'/> + <qualified-type-def type-id='e80ff3ab' restrict='yes' id='8f2c7109'/> + <pointer-type-def type-id='eae6431d' size-in-bits='64' id='0d41d328'/> + <pointer-type-def type-id='dddf6ca2' size-in-bits='64' id='d915a820'/> + <qualified-type-def type-id='d915a820' restrict='yes' id='f099ad08'/> + <pointer-type-def type-id='5d6479ae' size-in-bits='64' id='892b4acc'/> <pointer-type-def type-id='bd9b4291' size-in-bits='64' id='9f1a1109'/> <pointer-type-def type-id='bdb8ac4f' size-in-bits='64' id='3a9b2288'/> <pointer-type-def type-id='3a9b2288' size-in-bits='64' id='e4378506'/> - <pointer-type-def type-id='a2256d42' size-in-bits='64' id='debc6aa3'/> + <class-decl name='prop_changelist' is-struct='yes' visibility='default' is-declaration-only='yes' id='d86edc51'/> + <function-decl name='zpool_open' mangled-name='zpool_open' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_open'> + <parameter type-id='b0382bb3'/> + <parameter type-id='80f4b756'/> + <return type-id='4c81de99'/> + </function-decl> + <function-decl name='zpool_open_canfail' mangled-name='zpool_open_canfail' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_open_canfail'> + <parameter type-id='b0382bb3'/> + <parameter type-id='80f4b756'/> + <return type-id='4c81de99'/> + </function-decl> + <function-decl name='zpool_close' mangled-name='zpool_close' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_close'> + <parameter type-id='4c81de99'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='zpool_get_name' mangled-name='zpool_get_name' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_get_name'> + <parameter type-id='4c81de99'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='zpool_get_prop' mangled-name='zpool_get_prop' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_get_prop'> + <parameter type-id='4c81de99'/> + <parameter type-id='5d0c23fb'/> + <parameter type-id='26a90f95'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='debc6aa3'/> + <parameter type-id='c19b74c3'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_prop_default_string' mangled-name='zfs_prop_default_string' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_default_string'> + <parameter type-id='58603c44'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='zfs_prop_default_numeric' mangled-name='zfs_prop_default_numeric' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_default_numeric'> + <parameter type-id='58603c44'/> + <return type-id='9c313c2d'/> + </function-decl> + <function-decl name='zpool_prop_get_feature' mangled-name='zpool_prop_get_feature' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_get_feature'> + <parameter type-id='4c81de99'/> + <parameter type-id='80f4b756'/> + <parameter type-id='26a90f95'/> + <parameter type-id='b59d7dce'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_iter_snapshots_v2' mangled-name='zfs_iter_snapshots_v2' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_iter_snapshots_v2'> + <parameter type-id='9200a744'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='d8e49ab9'/> + <parameter type-id='eaa32e2f'/> + <parameter type-id='9c313c2d'/> + <parameter type-id='9c313c2d'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_iter_bookmarks_v2' mangled-name='zfs_iter_bookmarks_v2' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_iter_bookmarks_v2'> + <parameter type-id='9200a744'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='d8e49ab9'/> + <parameter type-id='eaa32e2f'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_destroy_snaps_nvl_os' mangled-name='zfs_destroy_snaps_nvl_os' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_destroy_snaps_nvl_os'> + <parameter type-id='b0382bb3'/> + <parameter type-id='5ce45b60'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_nicestrtonum' mangled-name='zfs_nicestrtonum' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_nicestrtonum'> + <parameter type-id='b0382bb3'/> + <parameter type-id='80f4b756'/> + <parameter type-id='5d6479ae'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_ioctl_fd' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter type-id='7359adad'/> + <parameter type-id='b65f7fd1'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_snapshot' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='5ce45b60'/> + <parameter type-id='857bb57e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_create' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='bc9887f1'/> + <parameter type-id='5ce45b60'/> + <parameter type-id='ae3e8ca6'/> + <parameter type-id='3502e3ff'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_clone' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <parameter type-id='5ce45b60'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_promote' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='26a90f95'/> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_destroy_snaps' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='c19b74c3'/> + <parameter type-id='857bb57e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_get_bookmarks' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='5ce45b60'/> + <parameter type-id='857bb57e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_destroy_bookmarks' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='857bb57e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_hold' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='857bb57e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_release' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='857bb57e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_get_holds' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='857bb57e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_exists' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='lzc_rollback_to' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_destroy' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_channel_program_nosync' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <parameter type-id='9c313c2d'/> + <parameter type-id='9c313c2d'/> + <parameter type-id='5ce45b60'/> + <parameter type-id='857bb57e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_wait_fs' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='3024501a'/> + <parameter type-id='37e3bd22'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_nicebytes' mangled-name='zfs_nicebytes' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_nicebytes'> + <parameter type-id='9c313c2d'/> + <parameter type-id='26a90f95'/> + <parameter type-id='b59d7dce'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='zfs_nicenum' mangled-name='zfs_nicenum' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_nicenum'> + <parameter type-id='9c313c2d'/> + <parameter type-id='26a90f95'/> + <parameter type-id='b59d7dce'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='avl_create' mangled-name='avl_create' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_create'> + <parameter type-id='a3681dea'/> + <parameter type-id='585e1de9'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='b59d7dce'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='avl_find' mangled-name='avl_find' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_find'> + <parameter type-id='a3681dea'/> + <parameter type-id='eaa32e2f'/> + <parameter type-id='32adbf30'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='avl_add' mangled-name='avl_add' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_add'> + <parameter type-id='a3681dea'/> + <parameter type-id='eaa32e2f'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='avl_remove' mangled-name='avl_remove' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_remove'> + <parameter type-id='a3681dea'/> + <parameter type-id='eaa32e2f'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='avl_numnodes' mangled-name='avl_numnodes' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_numnodes'> + <parameter type-id='a3681dea'/> + <return type-id='ee1f298e'/> + </function-decl> + <function-decl name='avl_destroy_nodes' mangled-name='avl_destroy_nodes' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_destroy_nodes'> + <parameter type-id='a3681dea'/> + <parameter type-id='63e171df'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='avl_destroy' mangled-name='avl_destroy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_destroy'> + <parameter type-id='a3681dea'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='zfs_prop_readonly' mangled-name='zfs_prop_readonly' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_readonly'> + <parameter type-id='58603c44'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='zfs_prop_inheritable' mangled-name='zfs_prop_inheritable' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_inheritable'> + <parameter type-id='58603c44'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='zfs_prop_setonce' mangled-name='zfs_prop_setonce' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_setonce'> + <parameter type-id='58603c44'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='zfs_prop_encryption_key_param' mangled-name='zfs_prop_encryption_key_param' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_encryption_key_param'> + <parameter type-id='58603c44'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='zfs_prop_valid_keylocation' mangled-name='zfs_prop_valid_keylocation' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_valid_keylocation'> + <parameter type-id='80f4b756'/> + <parameter type-id='c19b74c3'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='zfs_prop_user' mangled-name='zfs_prop_user' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_user'> + <parameter type-id='80f4b756'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='zfs_prop_userquota' mangled-name='zfs_prop_userquota' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_userquota'> + <parameter type-id='80f4b756'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='zfs_prop_written' mangled-name='zfs_prop_written' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_written'> + <parameter type-id='80f4b756'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='zfs_prop_index_to_string' mangled-name='zfs_prop_index_to_string' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_index_to_string'> + <parameter type-id='58603c44'/> + <parameter type-id='9c313c2d'/> + <parameter type-id='7d3cd834'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_prop_valid_for_type' mangled-name='zfs_prop_valid_for_type' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_valid_for_type'> + <parameter type-id='95e97e5e'/> + <parameter type-id='2e45de5d'/> + <parameter type-id='c19b74c3'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='nvlist_alloc' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='857bb57e'/> + <parameter type-id='3502e3ff'/> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_size' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='78c01427'/> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_pack' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='9b23c9ad'/> + <parameter type-id='78c01427'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_unpack' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='26a90f95'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='857bb57e'/> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_nvlist' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='22cce67b'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_uint64_array' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='713a56f5'/> + <parameter type-id='3502e3ff'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_remove' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='8d0687d2'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_remove_all' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_int64' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='22cce67b'/> + <parameter type-id='80f4b756'/> + <parameter type-id='cb785ebf'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_uint64_array' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='892b4acc'/> + <parameter type-id='4dd26a40'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_nvlist_array' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='75be733c'/> + <parameter type-id='4dd26a40'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_empty' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='22cce67b'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='nvpair_type' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='dace003f'/> + <return type-id='8d0687d2'/> + </function-decl> + <function-decl name='nvpair_value_uint64' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='dace003f'/> + <parameter type-id='5d6479ae'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvpair_value_string' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='dace003f'/> + <parameter type-id='7d3cd834'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='fnvlist_free' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_boolean' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_uint64' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='9c313c2d'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_string' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_nvlist' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='5ce45b60'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_lookup_uint64' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='22cce67b'/> + <parameter type-id='80f4b756'/> + <return type-id='9c313c2d'/> + </function-decl> + <function-decl name='fnvlist_lookup_string' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='22cce67b'/> + <parameter type-id='80f4b756'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='fnvlist_lookup_nvlist' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <return type-id='5ce45b60'/> + </function-decl> + <function-decl name='fnvpair_value_int32' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='dace003f'/> + <return type-id='3ff5601b'/> + </function-decl> + <function-decl name='fnvpair_value_uint64' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='dace003f'/> + <return type-id='9c313c2d'/> + </function-decl> + <function-decl name='entity_namecheck' mangled-name='entity_namecheck' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='entity_namecheck'> + <parameter type-id='80f4b756'/> + <parameter type-id='053457bd'/> + <parameter type-id='26a90f95'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='dataset_nestcheck' mangled-name='dataset_nestcheck' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dataset_nestcheck'> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='mountpoint_namecheck' mangled-name='mountpoint_namecheck' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mountpoint_namecheck'> + <parameter type-id='80f4b756'/> + <parameter type-id='053457bd'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_prop_get_type' mangled-name='zfs_prop_get_type' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_get_type'> + <parameter type-id='58603c44'/> + <return type-id='31429eff'/> + </function-decl> + <function-decl name='sa_validate_shareopts' mangled-name='sa_validate_shareopts' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sa_validate_shareopts'> + <parameter type-id='80f4b756'/> + <parameter type-id='9155d4b5'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='getmntany' mangled-name='getmntany' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='getmntany'> + <parameter type-id='822cd80b'/> + <parameter type-id='9d424d31'/> + <parameter type-id='9d424d31'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='_sol_getmntent' mangled-name='_sol_getmntent' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_sol_getmntent'> + <parameter type-id='822cd80b'/> + <parameter type-id='9d424d31'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='getgrnam_r' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='9d26089a'/> + <parameter type-id='c878edd6'/> + <parameter type-id='266fe297'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='aa19c230'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='hasmntopt' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='48bea5ec'/> + <parameter type-id='80f4b756'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='pthread_mutex_init' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='18c91f9e'/> + <parameter type-id='c2afbd7e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='pthread_mutex_destroy' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='18c91f9e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='getpwnam_r' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='9d26089a'/> + <parameter type-id='33518961'/> + <parameter type-id='266fe297'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='8f2c7109'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='strtol' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='9d26089a'/> + <parameter type-id='8c85230f'/> + <parameter type-id='95e97e5e'/> + <return type-id='bd54fe1a'/> + </function-decl> + <function-decl name='strtoul' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='9d26089a'/> + <parameter type-id='8c85230f'/> + <parameter type-id='95e97e5e'/> + <return type-id='7359adad'/> + </function-decl> + <function-decl name='abort' visibility='default' binding='global' size-in-bits='64'> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='strrchr' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='95e97e5e'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='strcspn' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='strstr' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='strsep' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='8c85230f'/> + <parameter type-id='9d26089a'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='strftime' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='266fe297'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='9d26089a'/> + <parameter type-id='f8c6051d'/> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='localtime_r' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='d6e2847c'/> + <parameter type-id='f099ad08'/> + <return type-id='d915a820'/> + </function-decl> + <function-decl name='__fprintf_chk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='e75a27e9'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='9d26089a'/> + <parameter is-variadic='yes'/> + <return type-id='95e97e5e'/> + </function-decl> <function-decl name='zfs_type_to_name' mangled-name='zfs_type_to_name' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_type_to_name'> <parameter type-id='2e45de5d' name='type'/> <return type-id='80f4b756'/> @@ -3482,28 +4626,10 @@ <parameter type-id='b0382bb3' name='hdl'/> <return type-id='48b5725f'/> </function-decl> - <function-decl name='zfs_refresh_properties' mangled-name='zfs_refresh_properties' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_refresh_properties'> - <parameter type-id='9200a744' name='zhp'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='zfs_handle_dup' mangled-name='zfs_handle_dup' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_handle_dup'> - <parameter type-id='9200a744' name='zhp_orig'/> - <return type-id='9200a744'/> - </function-decl> <function-decl name='zfs_bookmark_exists' mangled-name='zfs_bookmark_exists' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_bookmark_exists'> <parameter type-id='80f4b756' name='path'/> <return type-id='c19b74c3'/> </function-decl> - <function-decl name='zfs_open' mangled-name='zfs_open' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_open'> - <parameter type-id='b0382bb3' name='hdl'/> - <parameter type-id='80f4b756' name='path'/> - <parameter type-id='95e97e5e' name='types'/> - <return type-id='9200a744'/> - </function-decl> - <function-decl name='zfs_close' mangled-name='zfs_close' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_close'> - <parameter type-id='9200a744' name='zhp'/> - <return type-id='48b5725f'/> - </function-decl> <function-decl name='libzfs_mnttab_init' mangled-name='libzfs_mnttab_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libzfs_mnttab_init'> <parameter type-id='b0382bb3' name='hdl'/> <return type-id='48b5725f'/> @@ -3540,17 +4666,6 @@ <parameter type-id='7292109c' name='spa_version'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='zfs_valid_proplist' mangled-name='zfs_valid_proplist' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_valid_proplist'> - <parameter type-id='b0382bb3' name='hdl'/> - <parameter type-id='2e45de5d' name='type'/> - <parameter type-id='5ce45b60' name='nvl'/> - <parameter type-id='9c313c2d' name='zoned'/> - <parameter type-id='9200a744' name='zhp'/> - <parameter type-id='4c81de99' name='zpool_hdl'/> - <parameter type-id='c19b74c3' name='key_params_ok'/> - <parameter type-id='80f4b756' name='errbuf'/> - <return type-id='5ce45b60'/> - </function-decl> <function-decl name='zfs_prop_set' mangled-name='zfs_prop_set' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_set'> <parameter type-id='9200a744' name='zhp'/> <parameter type-id='80f4b756' name='propname'/> @@ -3562,6 +4677,12 @@ <parameter type-id='5ce45b60' name='props'/> <return type-id='95e97e5e'/> </function-decl> + <function-decl name='zfs_prop_set_list_flags' mangled-name='zfs_prop_set_list_flags' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_set_list_flags'> + <parameter type-id='9200a744' name='zhp'/> + <parameter type-id='5ce45b60' name='props'/> + <parameter type-id='95e97e5e' name='flags'/> + <return type-id='95e97e5e'/> + </function-decl> <function-decl name='zfs_prop_inherit' mangled-name='zfs_prop_inherit' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_inherit'> <parameter type-id='9200a744' name='zhp'/> <parameter type-id='80f4b756' name='propname'/> @@ -3571,7 +4692,7 @@ <function-decl name='getprop_uint64' mangled-name='getprop_uint64' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='getprop_uint64'> <parameter type-id='9200a744' name='zhp'/> <parameter type-id='58603c44' name='prop'/> - <parameter type-id='9b23c9ad' name='source'/> + <parameter type-id='7d3cd834' name='source'/> <return type-id='9c313c2d'/> </function-decl> <function-decl name='zfs_prop_get_recvd' mangled-name='zfs_prop_get_recvd' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_get_recvd'> @@ -3586,22 +4707,6 @@ <parameter type-id='9200a744' name='zhp'/> <return type-id='5ce45b60'/> </function-decl> - <function-decl name='zfs_prop_get' mangled-name='zfs_prop_get' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_get'> - <parameter type-id='9200a744' name='zhp'/> - <parameter type-id='58603c44' name='prop'/> - <parameter type-id='26a90f95' name='propbuf'/> - <parameter type-id='b59d7dce' name='proplen'/> - <parameter type-id='debc6aa3' name='src'/> - <parameter type-id='26a90f95' name='statbuf'/> - <parameter type-id='b59d7dce' name='statlen'/> - <parameter type-id='c19b74c3' name='literal'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='zfs_prop_get_int' mangled-name='zfs_prop_get_int' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_get_int'> - <parameter type-id='9200a744' name='zhp'/> - <parameter type-id='58603c44' name='prop'/> - <return type-id='9c313c2d'/> - </function-decl> <function-decl name='zfs_prop_get_numeric' mangled-name='zfs_prop_get_numeric' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_get_numeric'> <parameter type-id='9200a744' name='zhp'/> <parameter type-id='58603c44' name='prop'/> @@ -3639,10 +4744,6 @@ <parameter type-id='c19b74c3' name='literal'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='zfs_get_name' mangled-name='zfs_get_name' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_get_name'> - <parameter type-id='fcd57163' name='zhp'/> - <return type-id='80f4b756'/> - </function-decl> <function-decl name='zfs_get_pool_name' mangled-name='zfs_get_pool_name' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_get_pool_name'> <parameter type-id='fcd57163' name='zhp'/> <return type-id='80f4b756'/> @@ -3655,12 +4756,6 @@ <parameter type-id='fcd57163' name='zhp'/> <return type-id='2e45de5d'/> </function-decl> - <function-decl name='zfs_parent_name' mangled-name='zfs_parent_name' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_parent_name'> - <parameter type-id='9200a744' name='zhp'/> - <parameter type-id='26a90f95' name='buf'/> - <parameter type-id='b59d7dce' name='buflen'/> - <return type-id='95e97e5e'/> - </function-decl> <function-decl name='zfs_dataset_exists' mangled-name='zfs_dataset_exists' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_dataset_exists'> <parameter type-id='b0382bb3' name='hdl'/> <parameter type-id='80f4b756' name='path'/> @@ -3840,15 +4935,219 @@ <parameter type-id='37e3bd22' name='waited'/> <return type-id='95e97e5e'/> </function-decl> - <function-type size-in-bits='64' id='7e291ce6'> + <function-decl name='zfs_error_fmt' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b0382bb3'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='80f4b756'/> + <parameter is-variadic='yes'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_standard_error_fmt' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b0382bb3'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='80f4b756'/> + <parameter is-variadic='yes'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_setprop_error' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b0382bb3'/> + <parameter type-id='58603c44'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='26a90f95'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='zprop_parse_value' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b0382bb3'/> + <parameter type-id='3fa542f0'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='2e45de5d'/> + <parameter type-id='5ce45b60'/> + <parameter type-id='7d3cd834'/> + <parameter type-id='5d6479ae'/> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zprop_expand_list' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b0382bb3'/> + <parameter type-id='e4378506'/> + <parameter type-id='2e45de5d'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zcmd_write_src_nvlist' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b0382bb3'/> + <parameter type-id='e4ec4540'/> + <parameter type-id='5ce45b60'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='changelist_prefix' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='0d41d328'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='changelist_postfix' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='0d41d328'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='changelist_rename' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='0d41d328'/> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='changelist_remove' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='0d41d328'/> + <parameter type-id='80f4b756'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='changelist_free' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='0d41d328'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='changelist_gather' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='9200a744'/> + <parameter type-id='58603c44'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='95e97e5e'/> + <return type-id='0d41d328'/> + </function-decl> + <function-decl name='changelist_haszonedchild' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='0d41d328'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zpool_name_valid' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b0382bb3'/> + <parameter type-id='c19b74c3'/> + <parameter type-id='80f4b756'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-type size-in-bits='64' id='02362c02'> <parameter type-id='eaa32e2f'/> <parameter type-id='80f4b756'/> <parameter type-id='354978ed'/> <parameter type-id='9c313c2d'/> + <parameter type-id='9c313c2d'/> <return type-id='95e97e5e'/> </function-type> </abi-instr> - <abi-instr address-size='64' path='libzfs_diff.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libzfs/libzfs_diff.c' language='LANG_C99'> + <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='448' id='6093ff7c'> + <subrange length='56' type-id='7359adad' id='f8137894'/> + </array-type-def> + <typedef-decl name='pthread_t' type-id='7359adad' id='4051f5e7'/> + <union-decl name='pthread_attr_t' size-in-bits='448' visibility='default' id='b63afacd'> + <data-member access='public'> + <var-decl name='__size' type-id='6093ff7c' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='__align' type-id='bd54fe1a' visibility='default'/> + </data-member> + </union-decl> + <typedef-decl name='pthread_attr_t' type-id='b63afacd' id='7d8569fd'/> + <class-decl name='differ_info' size-in-bits='9088' is-struct='yes' visibility='default' id='d41965ee'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='zhp' type-id='9200a744' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='fromsnap' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='frommnt' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='tosnap' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='tomnt' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='ds' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='dsmnt' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='tmpsnap' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='errbuf' type-id='b54ce520' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8704'> + <var-decl name='isclone' type-id='c19b74c3' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8736'> + <var-decl name='scripted' type-id='c19b74c3' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8768'> + <var-decl name='classify' type-id='c19b74c3' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8800'> + <var-decl name='timestamped' type-id='c19b74c3' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8832'> + <var-decl name='no_mangle' type-id='c19b74c3' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8896'> + <var-decl name='shares' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8960'> + <var-decl name='zerr' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8992'> + <var-decl name='cleanupfd' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='9024'> + <var-decl name='outputfd' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='9056'> + <var-decl name='datafd' type-id='95e97e5e' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='differ_info_t' type-id='d41965ee' id='e8525f0e'/> + <qualified-type-def type-id='7d8569fd' const='yes' id='e06dee2d'/> + <pointer-type-def type-id='e06dee2d' size-in-bits='64' id='540db505'/> + <qualified-type-def type-id='540db505' restrict='yes' id='e1815e87'/> + <pointer-type-def type-id='e8525f0e' size-in-bits='64' id='ee78f675'/> + <pointer-type-def type-id='4051f5e7' size-in-bits='64' id='e01b5462'/> + <qualified-type-def type-id='e01b5462' restrict='yes' id='cc338b26'/> + <pointer-type-def type-id='cd5d79f4' size-in-bits='64' id='5ad9edb6'/> + <function-decl name='is_mounted' mangled-name='is_mounted' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='is_mounted'> + <parameter type-id='b0382bb3'/> + <parameter type-id='80f4b756'/> + <parameter type-id='9b23c9ad'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='color_start' mangled-name='color_start' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='color_start'> + <parameter type-id='80f4b756'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='color_end' mangled-name='color_end' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='color_end'> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='pthread_create' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='cc338b26'/> + <parameter type-id='e1815e87'/> + <parameter type-id='5ad9edb6'/> + <parameter type-id='1b7446cd'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='pthread_join' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='4051f5e7'/> + <parameter type-id='63e171df'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='pthread_cancel' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='4051f5e7'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='fputs' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='9d26089a'/> + <parameter type-id='e75a27e9'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='pipe2' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='7292109c'/> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> <function-decl name='zfs_show_diffs' mangled-name='zfs_show_diffs' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_show_diffs'> <parameter type-id='9200a744' name='zhp'/> <parameter type-id='95e97e5e' name='outfd'/> @@ -3857,8 +5156,32 @@ <parameter type-id='95e97e5e' name='flags'/> <return type-id='95e97e5e'/> </function-decl> + <function-decl name='zfs_asprintf' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b0382bb3'/> + <parameter type-id='80f4b756'/> + <parameter is-variadic='yes'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='zfs_validate_name' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b0382bb3'/> + <parameter type-id='80f4b756'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='c19b74c3'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='find_shares_object' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='ee78f675'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-type size-in-bits='64' id='cd5d79f4'> + <parameter type-id='eaa32e2f'/> + <return type-id='eaa32e2f'/> + </function-type> </abi-instr> - <abi-instr address-size='64' path='libzfs_import.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libzfs/libzfs_import.c' language='LANG_C99'> + <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> <typedef-decl name='refresh_config_func_t' type-id='29f040d2' id='b7c58eaa'/> <typedef-decl name='pool_active_func_t' type-id='baa42fef' id='de5d1d8f'/> <class-decl name='pool_config_ops' size-in-bits='128' is-struct='yes' visibility='default' id='8b092c69'> @@ -3882,11 +5205,112 @@ <enumerator name='POOL_STATE_POTENTIALLY_ACTIVE' value='7'/> </enum-decl> <typedef-decl name='pool_state_t' type-id='4871ac24' id='084a08a3'/> + <class-decl name='stat64' size-in-bits='1152' is-struct='yes' visibility='default' id='0bbec9cd'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='st_dev' type-id='35ed8932' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='st_ino' type-id='71288a47' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='st_nlink' type-id='80f0b9df' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='st_mode' type-id='e1c52942' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='224'> + <var-decl name='st_uid' type-id='cc5fcceb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='st_gid' type-id='d94ec6d9' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='288'> + <var-decl name='__pad0' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='st_rdev' type-id='35ed8932' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='st_size' type-id='79989e9c' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='st_blksize' type-id='d3f10a7f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='st_blocks' type-id='4e711bf1' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='st_atim' type-id='a9c79a1f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='st_mtim' type-id='a9c79a1f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='832'> + <var-decl name='st_ctim' type-id='a9c79a1f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='960'> + <var-decl name='__glibc_reserved' type-id='083f8d58' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='__dev_t' type-id='7359adad' id='35ed8932'/> + <typedef-decl name='__ino64_t' type-id='7359adad' id='71288a47'/> + <typedef-decl name='__mode_t' type-id='f0981eeb' id='e1c52942'/> + <typedef-decl name='__nlink_t' type-id='7359adad' id='80f0b9df'/> + <typedef-decl name='__blksize_t' type-id='bd54fe1a' id='d3f10a7f'/> + <typedef-decl name='__blkcnt64_t' type-id='bd54fe1a' id='4e711bf1'/> + <typedef-decl name='__syscall_slong_t' type-id='bd54fe1a' id='03085adc'/> + <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' id='a9c79a1f'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='tv_sec' type-id='65eda9c0' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='tv_nsec' type-id='03085adc' visibility='default'/> + </data-member> + </class-decl> <qualified-type-def type-id='8b092c69' const='yes' id='1a21babe'/> <pointer-type-def type-id='de5d1d8f' size-in-bits='64' id='9eadf5e0'/> <pointer-type-def type-id='084a08a3' size-in-bits='64' id='b9ea57b8'/> <pointer-type-def type-id='b7c58eaa' size-in-bits='64' id='e7c00489'/> + <pointer-type-def type-id='0bbec9cd' size-in-bits='64' id='62f7a03d'/> <var-decl name='libzfs_config_ops' type-id='b1e62775' mangled-name='libzfs_config_ops' visibility='default' elf-symbol-id='libzfs_config_ops'/> + <function-decl name='zpool_read_label' mangled-name='zpool_read_label' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_read_label'> + <parameter type-id='95e97e5e'/> + <parameter type-id='857bb57e'/> + <parameter type-id='7292109c'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='pwrite64' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter type-id='eaa32e2f'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='724e4de6'/> + <return type-id='79a0948f'/> + </function-decl> + <function-decl name='__pread64_chk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter type-id='eaa32e2f'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='724e4de6'/> + <parameter type-id='b59d7dce'/> + <return type-id='79a0948f'/> + </function-decl> + <function-decl name='ioctl' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter type-id='7359adad'/> + <parameter is-variadic='yes'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='fstat64' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter type-id='62f7a03d'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zcmd_write_conf_nvlist' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b0382bb3'/> + <parameter type-id='e4ec4540'/> + <parameter type-id='5ce45b60'/> + <return type-id='48b5725f'/> + </function-decl> <function-decl name='zpool_clear_label' mangled-name='zpool_clear_label' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_clear_label'> <parameter type-id='95e97e5e' name='fd'/> <return type-id='95e97e5e'/> @@ -3912,7 +5336,34 @@ <return type-id='5ce45b60'/> </function-type> </abi-instr> - <abi-instr address-size='64' path='libzfs_iter.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libzfs/libzfs_iter.c' language='LANG_C99'> + <pointer-type-def type-id='b351119f' size-in-bits='64' id='716943c7'/> + <function-decl name='avl_first' mangled-name='avl_first' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_first'> + <parameter type-id='a3681dea'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='avl_walk' mangled-name='avl_walk' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_walk'> + <parameter type-id='716943c7'/> + <parameter type-id='eaa32e2f'/> + <parameter type-id='95e97e5e'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='make_dataset_handle_zc' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b0382bb3'/> + <parameter type-id='e4ec4540'/> + <return type-id='9200a744'/> + </function-decl> + <function-decl name='make_dataset_simple_handle_zc' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='9200a744'/> + <parameter type-id='e4ec4540'/> + <return type-id='9200a744'/> + </function-decl> + <function-decl name='make_bookmark_handle' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='9200a744'/> + <parameter type-id='80f4b756'/> + <parameter type-id='5ce45b60'/> + <return type-id='9200a744'/> + </function-decl> <function-decl name='zfs_iter_filesystems' mangled-name='zfs_iter_filesystems' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_iter_filesystems'> <parameter type-id='9200a744' name='zhp'/> <parameter type-id='d8e49ab9' name='func'/> @@ -3942,6 +5393,15 @@ <parameter type-id='9c313c2d' name='max_txg'/> <return type-id='95e97e5e'/> </function-decl> + <function-decl name='zfs_iter_snapshots_sorted_v2' mangled-name='zfs_iter_snapshots_sorted_v2' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_iter_snapshots_sorted_v2'> + <parameter type-id='9200a744' name='zhp'/> + <parameter type-id='95e97e5e' name='flags'/> + <parameter type-id='d8e49ab9' name='callback'/> + <parameter type-id='eaa32e2f' name='data'/> + <parameter type-id='9c313c2d' name='min_txg'/> + <parameter type-id='9c313c2d' name='max_txg'/> + <return type-id='95e97e5e'/> + </function-decl> <function-decl name='zfs_iter_snapspec' mangled-name='zfs_iter_snapspec' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_iter_snapspec'> <parameter type-id='9200a744' name='fs_zhp'/> <parameter type-id='80f4b756' name='spec_orig'/> @@ -3949,28 +5409,87 @@ <parameter type-id='eaa32e2f' name='arg'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='zfs_iter_children' mangled-name='zfs_iter_children' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_iter_children'> - <parameter type-id='9200a744' name='zhp'/> + <function-decl name='zfs_iter_snapspec_v2' mangled-name='zfs_iter_snapspec_v2' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_iter_snapspec_v2'> + <parameter type-id='9200a744' name='fs_zhp'/> + <parameter type-id='95e97e5e' name='flags'/> + <parameter type-id='80f4b756' name='spec_orig'/> <parameter type-id='d8e49ab9' name='func'/> - <parameter type-id='eaa32e2f' name='data'/> + <parameter type-id='eaa32e2f' name='arg'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='zfs_iter_dependents' mangled-name='zfs_iter_dependents' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_iter_dependents'> + <function-decl name='zfs_iter_children' mangled-name='zfs_iter_children' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_iter_children'> <parameter type-id='9200a744' name='zhp'/> - <parameter type-id='c19b74c3' name='allowrecursion'/> <parameter type-id='d8e49ab9' name='func'/> <parameter type-id='eaa32e2f' name='data'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='zfs_iter_mounted' mangled-name='zfs_iter_mounted' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_iter_mounted'> + <function-decl name='zfs_iter_dependents' mangled-name='zfs_iter_dependents' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_iter_dependents'> <parameter type-id='9200a744' name='zhp'/> + <parameter type-id='c19b74c3' name='allowrecursion'/> <parameter type-id='d8e49ab9' name='func'/> <parameter type-id='eaa32e2f' name='data'/> <return type-id='95e97e5e'/> </function-decl> </abi-instr> - <abi-instr address-size='64' path='libzfs_mount.c' language='LANG_C99'> - <array-type-def dimensions='1' type-id='f1bd64e2' size-in-bits='384' id='b2c36c9f'> + <abi-instr address-size='64' path='lib/libzfs/libzfs_mount.c' language='LANG_C99'> + <array-type-def dimensions='1' type-id='6028cbfe' size-in-bits='256' id='b39b9aa7'> + <subrange length='4' type-id='7359adad' id='16fe7105'/> + </array-type-def> + <class-decl name='__dirstream' is-struct='yes' visibility='default' is-declaration-only='yes' id='20cd73f2'/> + <class-decl name='tpool' size-in-bits='2496' is-struct='yes' visibility='default' id='88d1b7f9'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='tp_forw' type-id='9cf59a50' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='tp_back' type-id='9cf59a50' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='tp_mutex' type-id='7a6844eb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='tp_busycv' type-id='62fab762' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='832'> + <var-decl name='tp_workcv' type-id='62fab762' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1216'> + <var-decl name='tp_waitcv' type-id='62fab762' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1600'> + <var-decl name='tp_active' type-id='ad33e5e7' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1664'> + <var-decl name='tp_head' type-id='f32b30e4' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1728'> + <var-decl name='tp_tail' type-id='f32b30e4' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1792'> + <var-decl name='tp_attr' type-id='7d8569fd' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2240'> + <var-decl name='tp_flags' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2272'> + <var-decl name='tp_linger' type-id='3502e3ff' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2304'> + <var-decl name='tp_njobs' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2336'> + <var-decl name='tp_minimum' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2368'> + <var-decl name='tp_maximum' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2400'> + <var-decl name='tp_current' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2432'> + <var-decl name='tp_idle' type-id='95e97e5e' visibility='default'/> + </data-member> + </class-decl> + <array-type-def dimensions='1' type-id='95e97e5e' size-in-bits='64' id='e4266c7e'> <subrange length='2' type-id='7359adad' id='52efc4ef'/> </array-type-def> <class-decl name='get_all_cb' size-in-bits='192' is-struct='yes' visibility='default' id='803dac95'> @@ -3985,133 +5504,272 @@ </data-member> </class-decl> <typedef-decl name='get_all_cb_t' type-id='803dac95' id='9b293607'/> - <class-decl name='proto_table_t' size-in-bits='192' is-struct='yes' naming-typedef-id='f1bd64e2' visibility='default' id='f4c8e1ed'> + <typedef-decl name='tpool_t' type-id='88d1b7f9' id='b1bbf10d'/> + <typedef-decl name='DIR' type-id='20cd73f2' id='54a5d683'/> + <typedef-decl name='mode_t' type-id='e1c52942' id='d50d396c'/> + <typedef-decl name='__compar_fn_t' type-id='585e1de9' id='aba7edd8'/> + <class-decl name='dirent64' size-in-bits='2240' is-struct='yes' visibility='default' id='5725d813'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='p_prop' type-id='58603c44' visibility='default'/> + <var-decl name='d_ino' type-id='71288a47' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='p_name' type-id='26a90f95' visibility='default'/> + <var-decl name='d_off' type-id='724e4de6' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='p_share_err' type-id='95e97e5e' visibility='default'/> + <var-decl name='d_reclen' type-id='8efea9e5' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='160'> - <var-decl name='p_unshare_err' type-id='95e97e5e' visibility='default'/> + <data-member access='public' layout-offset-in-bits='144'> + <var-decl name='d_type' type-id='002ac4a6' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='152'> + <var-decl name='d_name' type-id='d1617432' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='statfs64' size-in-bits='960' is-struct='yes' visibility='default' id='a2a6be1a'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='f_type' type-id='6028cbfe' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='f_bsize' type-id='6028cbfe' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='f_blocks' type-id='95fe1a02' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='f_bfree' type-id='95fe1a02' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='f_bavail' type-id='95fe1a02' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='f_files' type-id='0c3a4dde' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='f_ffree' type-id='0c3a4dde' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='f_fsid' type-id='0f35d263' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='f_namelen' type-id='6028cbfe' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='f_frsize' type-id='6028cbfe' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='640'> + <var-decl name='f_flags' type-id='6028cbfe' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='f_spare' type-id='b39b9aa7' visibility='default'/> </data-member> </class-decl> - <typedef-decl name='proto_table_t' type-id='f4c8e1ed' id='f1bd64e2'/> + <class-decl name='stat' size-in-bits='1152' is-struct='yes' visibility='default' id='aafc373f'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='st_dev' type-id='35ed8932' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='st_ino' type-id='e43e523d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='st_nlink' type-id='80f0b9df' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='st_mode' type-id='e1c52942' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='224'> + <var-decl name='st_uid' type-id='cc5fcceb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='st_gid' type-id='d94ec6d9' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='288'> + <var-decl name='__pad0' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='st_rdev' type-id='35ed8932' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='st_size' type-id='79989e9c' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='st_blksize' type-id='d3f10a7f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='st_blocks' type-id='dbc43803' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='st_atim' type-id='a9c79a1f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='st_mtim' type-id='a9c79a1f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='832'> + <var-decl name='st_ctim' type-id='a9c79a1f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='960'> + <var-decl name='__glibc_reserved' type-id='083f8d58' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='__ino_t' type-id='7359adad' id='e43e523d'/> + <class-decl name='__fsid_t' size-in-bits='64' is-struct='yes' naming-typedef-id='0f35d263' visibility='default' id='ea35c84a'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='__val' type-id='e4266c7e' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='__fsid_t' type-id='ea35c84a' id='0f35d263'/> + <typedef-decl name='__blkcnt_t' type-id='bd54fe1a' id='dbc43803'/> + <typedef-decl name='__fsblkcnt64_t' type-id='7359adad' id='95fe1a02'/> + <typedef-decl name='__fsfilcnt64_t' type-id='7359adad' id='0c3a4dde'/> + <typedef-decl name='__fsword_t' type-id='bd54fe1a' id='6028cbfe'/> + <pointer-type-def type-id='54a5d683' size-in-bits='64' id='f09217ba'/> + <pointer-type-def type-id='5725d813' size-in-bits='64' id='07b96073'/> <pointer-type-def type-id='9b293607' size-in-bits='64' id='77bf1784'/> + <pointer-type-def type-id='7d8569fd' size-in-bits='64' id='7347a39e'/> + <pointer-type-def type-id='aafc373f' size-in-bits='64' id='4330df87'/> + <qualified-type-def type-id='4330df87' restrict='yes' id='73665405'/> + <pointer-type-def type-id='a2a6be1a' size-in-bits='64' id='7fd094c8'/> + <pointer-type-def type-id='b1bbf10d' size-in-bits='64' id='9cf59a50'/> + <pointer-type-def type-id='c5c76c9c' size-in-bits='64' id='b7f9d8e6'/> <pointer-type-def type-id='9200a744' size-in-bits='64' id='4507922a'/> - <var-decl name='proto_table' type-id='b2c36c9f' visibility='default'/> - <function-decl name='is_mounted' mangled-name='is_mounted' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='is_mounted'> - <parameter type-id='b0382bb3' name='zfs_hdl'/> - <parameter type-id='80f4b756' name='special'/> - <parameter type-id='9b23c9ad' name='where'/> - <return type-id='c19b74c3'/> + <class-decl name='__dirstream' is-struct='yes' visibility='default' is-declaration-only='yes' id='20cd73f2'/> + <function-decl name='zpool_disable_datasets_os' mangled-name='zpool_disable_datasets_os' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_disable_datasets_os'> + <parameter type-id='4c81de99'/> + <parameter type-id='c19b74c3'/> + <return type-id='48b5725f'/> </function-decl> - <function-decl name='zfs_is_mounted' mangled-name='zfs_is_mounted' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_is_mounted'> - <parameter type-id='9200a744' name='zhp'/> - <parameter type-id='9b23c9ad' name='where'/> - <return type-id='c19b74c3'/> + <function-decl name='zpool_disable_volume_os' mangled-name='zpool_disable_volume_os' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_disable_volume_os'> + <parameter type-id='80f4b756'/> + <return type-id='48b5725f'/> </function-decl> - <function-decl name='zfs_mount' mangled-name='zfs_mount' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_mount'> - <parameter type-id='9200a744' name='zhp'/> - <parameter type-id='80f4b756' name='options'/> - <parameter type-id='95e97e5e' name='flags'/> - <return type-id='95e97e5e'/> + <function-decl name='tpool_create' mangled-name='tpool_create' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='tpool_create'> + <parameter type-id='3502e3ff'/> + <parameter type-id='3502e3ff'/> + <parameter type-id='3502e3ff'/> + <parameter type-id='7347a39e'/> + <return type-id='9cf59a50'/> </function-decl> - <function-decl name='zfs_mount_at' mangled-name='zfs_mount_at' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_mount_at'> - <parameter type-id='9200a744' name='zhp'/> - <parameter type-id='80f4b756' name='options'/> - <parameter type-id='95e97e5e' name='flags'/> - <parameter type-id='80f4b756' name='mountpoint'/> + <function-decl name='tpool_dispatch' mangled-name='tpool_dispatch' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='tpool_dispatch'> + <parameter type-id='9cf59a50'/> + <parameter type-id='b7f9d8e6'/> + <parameter type-id='eaa32e2f'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='zfs_unmount' mangled-name='zfs_unmount' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_unmount'> - <parameter type-id='9200a744' name='zhp'/> - <parameter type-id='80f4b756' name='mountpoint'/> - <parameter type-id='95e97e5e' name='flags'/> - <return type-id='95e97e5e'/> + <function-decl name='tpool_destroy' mangled-name='tpool_destroy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='tpool_destroy'> + <parameter type-id='9cf59a50'/> + <return type-id='48b5725f'/> </function-decl> - <function-decl name='zfs_unmountall' mangled-name='zfs_unmountall' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_unmountall'> - <parameter type-id='9200a744' name='zhp'/> - <parameter type-id='95e97e5e' name='flags'/> + <function-decl name='tpool_wait' mangled-name='tpool_wait' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='tpool_wait'> + <parameter type-id='9cf59a50'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='mkdirp' mangled-name='mkdirp' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mkdirp'> + <parameter type-id='80f4b756'/> + <parameter type-id='d50d396c'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='zfs_is_shared' mangled-name='zfs_is_shared' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_is_shared'> - <parameter type-id='9200a744' name='zhp'/> - <return type-id='c19b74c3'/> + <function-decl name='sa_errorstr' mangled-name='sa_errorstr' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sa_errorstr'> + <parameter type-id='95e97e5e'/> + <return type-id='80f4b756'/> </function-decl> - <function-decl name='zfs_share' mangled-name='zfs_share' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_share'> - <parameter type-id='9200a744' name='zhp'/> + <function-decl name='sa_enable_share' mangled-name='sa_enable_share' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sa_enable_share'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <parameter type-id='9155d4b5'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='zfs_unshare' mangled-name='zfs_unshare' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_unshare'> - <parameter type-id='9200a744' name='zhp'/> + <function-decl name='sa_disable_share' mangled-name='sa_disable_share' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sa_disable_share'> + <parameter type-id='80f4b756'/> + <parameter type-id='9155d4b5'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='zfs_is_shared_nfs' mangled-name='zfs_is_shared_nfs' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_is_shared_nfs'> - <parameter type-id='9200a744' name='zhp'/> - <parameter type-id='9b23c9ad' name='where'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='zfs_is_shared_smb' mangled-name='zfs_is_shared_smb' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_is_shared_smb'> - <parameter type-id='9200a744' name='zhp'/> - <parameter type-id='9b23c9ad' name='where'/> + <function-decl name='sa_is_shared' mangled-name='sa_is_shared' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sa_is_shared'> + <parameter type-id='80f4b756'/> + <parameter type-id='9155d4b5'/> <return type-id='c19b74c3'/> </function-decl> - <function-decl name='zfs_commit_nfs_shares' mangled-name='zfs_commit_nfs_shares' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_commit_nfs_shares'> + <function-decl name='sa_truncate_shares' mangled-name='sa_truncate_shares' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sa_truncate_shares'> + <parameter type-id='9155d4b5'/> <return type-id='48b5725f'/> </function-decl> - <function-decl name='zfs_commit_smb_shares' mangled-name='zfs_commit_smb_shares' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_commit_smb_shares'> + <function-decl name='fdopendir' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <return type-id='f09217ba'/> + </function-decl> + <function-decl name='closedir' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='f09217ba'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='readdir64' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='f09217ba'/> + <return type-id='07b96073'/> + </function-decl> + <function-decl name='qsort' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='eaa32e2f'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='aba7edd8'/> <return type-id='48b5725f'/> </function-decl> - <function-decl name='zfs_commit_all_shares' mangled-name='zfs_commit_all_shares' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_commit_all_shares'> + <function-decl name='rmdir' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='__openat_too_many_args' visibility='default' binding='global' size-in-bits='64'> <return type-id='48b5725f'/> </function-decl> - <function-decl name='zfs_commit_shares' mangled-name='zfs_commit_shares' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_commit_shares'> - <parameter type-id='80f4b756' name='proto'/> + <function-decl name='__openat_missing_mode' visibility='default' binding='global' size-in-bits='64'> <return type-id='48b5725f'/> </function-decl> - <function-decl name='zfs_share_nfs' mangled-name='zfs_share_nfs' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_share_nfs'> - <parameter type-id='9200a744' name='zhp'/> + <function-decl name='statfs64' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='7fd094c8'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='zfs_share_smb' mangled-name='zfs_share_smb' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_share_smb'> - <parameter type-id='9200a744' name='zhp'/> - <return type-id='95e97e5e'/> + <function-decl name='zfs_realloc' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b0382bb3'/> + <parameter type-id='eaa32e2f'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='b59d7dce'/> + <return type-id='eaa32e2f'/> </function-decl> - <function-decl name='zfs_unshare_nfs' mangled-name='zfs_unshare_nfs' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_unshare_nfs'> - <parameter type-id='9200a744' name='zhp'/> - <parameter type-id='80f4b756' name='mountpoint'/> + <function-decl name='changelist_unshare' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='0d41d328'/> + <parameter type-id='4567bbc9'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='zfs_unshare_smb' mangled-name='zfs_unshare_smb' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_unshare_smb'> - <parameter type-id='9200a744' name='zhp'/> - <parameter type-id='80f4b756' name='mountpoint'/> + <function-decl name='do_mount' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='9200a744'/> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <parameter type-id='95e97e5e'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='zfs_unshareall_nfs' mangled-name='zfs_unshareall_nfs' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_unshareall_nfs'> - <parameter type-id='9200a744' name='zhp'/> + <function-decl name='do_unmount' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='9200a744'/> + <parameter type-id='80f4b756'/> + <parameter type-id='95e97e5e'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='zfs_unshareall_smb' mangled-name='zfs_unshareall_smb' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_unshareall_smb'> + <function-decl name='zfs_mount_at' mangled-name='zfs_mount_at' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_mount_at'> <parameter type-id='9200a744' name='zhp'/> + <parameter type-id='80f4b756' name='options'/> + <parameter type-id='95e97e5e' name='flags'/> + <parameter type-id='80f4b756' name='mountpoint'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='zfs_unshareall' mangled-name='zfs_unshareall' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_unshareall'> + <function-decl name='zfs_unmountall' mangled-name='zfs_unmountall' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_unmountall'> <parameter type-id='9200a744' name='zhp'/> + <parameter type-id='95e97e5e' name='flags'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='zfs_unshareall_bypath' mangled-name='zfs_unshareall_bypath' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_unshareall_bypath'> - <parameter type-id='9200a744' name='zhp'/> - <parameter type-id='80f4b756' name='mountpoint'/> - <return type-id='95e97e5e'/> + <function-decl name='zfs_truncate_shares' mangled-name='zfs_truncate_shares' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_truncate_shares'> + <parameter type-id='4567bbc9' name='proto'/> + <return type-id='48b5725f'/> </function-decl> - <function-decl name='zfs_unshareall_bytype' mangled-name='zfs_unshareall_bytype' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_unshareall_bytype'> + <function-decl name='zfs_unshareall' mangled-name='zfs_unshareall' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_unshareall'> <parameter type-id='9200a744' name='zhp'/> - <parameter type-id='80f4b756' name='mountpoint'/> - <parameter type-id='80f4b756' name='proto'/> + <parameter type-id='4567bbc9' name='proto'/> <return type-id='95e97e5e'/> </function-decl> <function-decl name='libzfs_add_handle' mangled-name='libzfs_add_handle' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libzfs_add_handle'> @@ -4125,13 +5783,14 @@ <parameter type-id='b59d7dce' name='num_handles'/> <parameter type-id='d8e49ab9' name='func'/> <parameter type-id='eaa32e2f' name='data'/> - <parameter type-id='c19b74c3' name='parallel'/> + <parameter type-id='3502e3ff' name='nthr'/> <return type-id='48b5725f'/> </function-decl> <function-decl name='zpool_enable_datasets' mangled-name='zpool_enable_datasets' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_enable_datasets'> <parameter type-id='4c81de99' name='zhp'/> <parameter type-id='80f4b756' name='mntopts'/> <parameter type-id='95e97e5e' name='flags'/> + <parameter type-id='3502e3ff' name='nthr'/> <return type-id='95e97e5e'/> </function-decl> <function-decl name='zpool_disable_datasets' mangled-name='zpool_disable_datasets' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_disable_datasets'> @@ -4140,13 +5799,14 @@ <return type-id='95e97e5e'/> </function-decl> </abi-instr> - <abi-instr address-size='64' path='libzfs_pool.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libzfs/libzfs_pool.c' language='LANG_C99'> + <type-decl name='long long unsigned int' size-in-bits='64' id='3a47d82b'/> <class-decl name='splitflags' size-in-bits='64' is-struct='yes' visibility='default' id='dc01bf52'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='dryrun' type-id='95e97e5e' visibility='default'/> + <var-decl name='dryrun' type-id='f0981eeb' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='1'> - <var-decl name='import' type-id='95e97e5e' visibility='default'/> + <var-decl name='import' type-id='f0981eeb' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='32'> <var-decl name='name_flags' type-id='95e97e5e' visibility='default'/> @@ -4168,6 +5828,43 @@ </data-member> </class-decl> <typedef-decl name='trimflags_t' type-id='8ef58008' id='a093cbb8'/> + <enum-decl name='zpool_status_t' naming-typedef-id='d3dd6294' id='5e770b40'> + <underlying-type type-id='9cac1fee'/> + <enumerator name='ZPOOL_STATUS_CORRUPT_CACHE' value='0'/> + <enumerator name='ZPOOL_STATUS_MISSING_DEV_R' value='1'/> + <enumerator name='ZPOOL_STATUS_MISSING_DEV_NR' value='2'/> + <enumerator name='ZPOOL_STATUS_CORRUPT_LABEL_R' value='3'/> + <enumerator name='ZPOOL_STATUS_CORRUPT_LABEL_NR' value='4'/> + <enumerator name='ZPOOL_STATUS_BAD_GUID_SUM' value='5'/> + <enumerator name='ZPOOL_STATUS_CORRUPT_POOL' value='6'/> + <enumerator name='ZPOOL_STATUS_CORRUPT_DATA' value='7'/> + <enumerator name='ZPOOL_STATUS_FAILING_DEV' value='8'/> + <enumerator name='ZPOOL_STATUS_VERSION_NEWER' value='9'/> + <enumerator name='ZPOOL_STATUS_HOSTID_MISMATCH' value='10'/> + <enumerator name='ZPOOL_STATUS_HOSTID_ACTIVE' value='11'/> + <enumerator name='ZPOOL_STATUS_HOSTID_REQUIRED' value='12'/> + <enumerator name='ZPOOL_STATUS_IO_FAILURE_WAIT' value='13'/> + <enumerator name='ZPOOL_STATUS_IO_FAILURE_CONTINUE' value='14'/> + <enumerator name='ZPOOL_STATUS_IO_FAILURE_MMP' value='15'/> + <enumerator name='ZPOOL_STATUS_BAD_LOG' value='16'/> + <enumerator name='ZPOOL_STATUS_ERRATA' value='17'/> + <enumerator name='ZPOOL_STATUS_UNSUP_FEAT_READ' value='18'/> + <enumerator name='ZPOOL_STATUS_UNSUP_FEAT_WRITE' value='19'/> + <enumerator name='ZPOOL_STATUS_FAULTED_DEV_R' value='20'/> + <enumerator name='ZPOOL_STATUS_FAULTED_DEV_NR' value='21'/> + <enumerator name='ZPOOL_STATUS_VERSION_OLDER' value='22'/> + <enumerator name='ZPOOL_STATUS_FEAT_DISABLED' value='23'/> + <enumerator name='ZPOOL_STATUS_RESILVERING' value='24'/> + <enumerator name='ZPOOL_STATUS_OFFLINE_DEV' value='25'/> + <enumerator name='ZPOOL_STATUS_REMOVED_DEV' value='26'/> + <enumerator name='ZPOOL_STATUS_REBUILDING' value='27'/> + <enumerator name='ZPOOL_STATUS_REBUILD_SCRUB' value='28'/> + <enumerator name='ZPOOL_STATUS_NON_NATIVE_ASHIFT' value='29'/> + <enumerator name='ZPOOL_STATUS_COMPATIBILITY_ERR' value='30'/> + <enumerator name='ZPOOL_STATUS_INCOMPATIBLE_FEAT' value='31'/> + <enumerator name='ZPOOL_STATUS_OK' value='32'/> + </enum-decl> + <typedef-decl name='zpool_status_t' type-id='5e770b40' id='d3dd6294'/> <enum-decl name='zpool_compat_status_t' naming-typedef-id='901b78d1' id='20676925'> <underlying-type type-id='9cac1fee'/> <enumerator name='ZPOOL_COMPATIBILITY_OK' value='0'/> @@ -4177,45 +5874,80 @@ <enumerator name='ZPOOL_COMPATIBILITY_NOFILES' value='4'/> </enum-decl> <typedef-decl name='zpool_compat_status_t' type-id='20676925' id='901b78d1'/> - <enum-decl name='zpool_prop_t' naming-typedef-id='5d0c23fb' id='af1ba157'> + <enum-decl name='vdev_prop_t' naming-typedef-id='5aa5c90c' id='1573bec8'> <underlying-type type-id='9cac1fee'/> - <enumerator name='ZPOOL_PROP_INVAL' value='-1'/> - <enumerator name='ZPOOL_PROP_NAME' value='0'/> - <enumerator name='ZPOOL_PROP_SIZE' value='1'/> - <enumerator name='ZPOOL_PROP_CAPACITY' value='2'/> - <enumerator name='ZPOOL_PROP_ALTROOT' value='3'/> - <enumerator name='ZPOOL_PROP_HEALTH' value='4'/> - <enumerator name='ZPOOL_PROP_GUID' value='5'/> - <enumerator name='ZPOOL_PROP_VERSION' value='6'/> - <enumerator name='ZPOOL_PROP_BOOTFS' value='7'/> - <enumerator name='ZPOOL_PROP_DELEGATION' value='8'/> - <enumerator name='ZPOOL_PROP_AUTOREPLACE' value='9'/> - <enumerator name='ZPOOL_PROP_CACHEFILE' value='10'/> - <enumerator name='ZPOOL_PROP_FAILUREMODE' value='11'/> - <enumerator name='ZPOOL_PROP_LISTSNAPS' value='12'/> - <enumerator name='ZPOOL_PROP_AUTOEXPAND' value='13'/> - <enumerator name='ZPOOL_PROP_DEDUPDITTO' value='14'/> - <enumerator name='ZPOOL_PROP_DEDUPRATIO' value='15'/> - <enumerator name='ZPOOL_PROP_FREE' value='16'/> - <enumerator name='ZPOOL_PROP_ALLOCATED' value='17'/> - <enumerator name='ZPOOL_PROP_READONLY' value='18'/> - <enumerator name='ZPOOL_PROP_ASHIFT' value='19'/> - <enumerator name='ZPOOL_PROP_COMMENT' value='20'/> - <enumerator name='ZPOOL_PROP_EXPANDSZ' value='21'/> - <enumerator name='ZPOOL_PROP_FREEING' value='22'/> - <enumerator name='ZPOOL_PROP_FRAGMENTATION' value='23'/> - <enumerator name='ZPOOL_PROP_LEAKED' value='24'/> - <enumerator name='ZPOOL_PROP_MAXBLOCKSIZE' value='25'/> - <enumerator name='ZPOOL_PROP_TNAME' value='26'/> - <enumerator name='ZPOOL_PROP_MAXDNODESIZE' value='27'/> - <enumerator name='ZPOOL_PROP_MULTIHOST' value='28'/> - <enumerator name='ZPOOL_PROP_CHECKPOINT' value='29'/> - <enumerator name='ZPOOL_PROP_LOAD_GUID' value='30'/> - <enumerator name='ZPOOL_PROP_AUTOTRIM' value='31'/> - <enumerator name='ZPOOL_PROP_COMPATIBILITY' value='32'/> - <enumerator name='ZPOOL_NUM_PROPS' value='33'/> + <enumerator name='VDEV_PROP_INVAL' value='-1'/> + <enumerator name='VDEV_PROP_USERPROP' value='-1'/> + <enumerator name='VDEV_PROP_NAME' value='0'/> + <enumerator name='VDEV_PROP_CAPACITY' value='1'/> + <enumerator name='VDEV_PROP_STATE' value='2'/> + <enumerator name='VDEV_PROP_GUID' value='3'/> + <enumerator name='VDEV_PROP_ASIZE' value='4'/> + <enumerator name='VDEV_PROP_PSIZE' value='5'/> + <enumerator name='VDEV_PROP_ASHIFT' value='6'/> + <enumerator name='VDEV_PROP_SIZE' value='7'/> + <enumerator name='VDEV_PROP_FREE' value='8'/> + <enumerator name='VDEV_PROP_ALLOCATED' value='9'/> + <enumerator name='VDEV_PROP_COMMENT' value='10'/> + <enumerator name='VDEV_PROP_EXPANDSZ' value='11'/> + <enumerator name='VDEV_PROP_FRAGMENTATION' value='12'/> + <enumerator name='VDEV_PROP_BOOTSIZE' value='13'/> + <enumerator name='VDEV_PROP_PARITY' value='14'/> + <enumerator name='VDEV_PROP_PATH' value='15'/> + <enumerator name='VDEV_PROP_DEVID' value='16'/> + <enumerator name='VDEV_PROP_PHYS_PATH' value='17'/> + <enumerator name='VDEV_PROP_ENC_PATH' value='18'/> + <enumerator name='VDEV_PROP_FRU' value='19'/> + <enumerator name='VDEV_PROP_PARENT' value='20'/> + <enumerator name='VDEV_PROP_CHILDREN' value='21'/> + <enumerator name='VDEV_PROP_NUMCHILDREN' value='22'/> + <enumerator name='VDEV_PROP_READ_ERRORS' value='23'/> + <enumerator name='VDEV_PROP_WRITE_ERRORS' value='24'/> + <enumerator name='VDEV_PROP_CHECKSUM_ERRORS' value='25'/> + <enumerator name='VDEV_PROP_INITIALIZE_ERRORS' value='26'/> + <enumerator name='VDEV_PROP_OPS_NULL' value='27'/> + <enumerator name='VDEV_PROP_OPS_READ' value='28'/> + <enumerator name='VDEV_PROP_OPS_WRITE' value='29'/> + <enumerator name='VDEV_PROP_OPS_FREE' value='30'/> + <enumerator name='VDEV_PROP_OPS_CLAIM' value='31'/> + <enumerator name='VDEV_PROP_OPS_TRIM' value='32'/> + <enumerator name='VDEV_PROP_BYTES_NULL' value='33'/> + <enumerator name='VDEV_PROP_BYTES_READ' value='34'/> + <enumerator name='VDEV_PROP_BYTES_WRITE' value='35'/> + <enumerator name='VDEV_PROP_BYTES_FREE' value='36'/> + <enumerator name='VDEV_PROP_BYTES_CLAIM' value='37'/> + <enumerator name='VDEV_PROP_BYTES_TRIM' value='38'/> + <enumerator name='VDEV_PROP_REMOVING' value='39'/> + <enumerator name='VDEV_PROP_ALLOCATING' value='40'/> + <enumerator name='VDEV_PROP_FAILFAST' value='41'/> + <enumerator name='VDEV_PROP_CHECKSUM_N' value='42'/> + <enumerator name='VDEV_PROP_CHECKSUM_T' value='43'/> + <enumerator name='VDEV_PROP_IO_N' value='44'/> + <enumerator name='VDEV_PROP_IO_T' value='45'/> + <enumerator name='VDEV_PROP_RAIDZ_EXPANDING' value='46'/> + <enumerator name='VDEV_PROP_SLOW_IO_N' value='47'/> + <enumerator name='VDEV_PROP_SLOW_IO_T' value='48'/> + <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'/> </enum-decl> - <typedef-decl name='zpool_prop_t' type-id='af1ba157' id='5d0c23fb'/> + <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'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='zlp_rewind' type-id='8f92235e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='zlp_maxmeta' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='zlp_maxdata' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='zlp_txg' type-id='9c313c2d' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='zpool_load_policy_t' type-id='2f65b36f' id='d11b7617'/> <enum-decl name='vdev_state' id='21566197'> <underlying-type type-id='9cac1fee'/> <enumerator name='VDEV_STATE_UNKNOWN' value='0'/> @@ -4258,22 +5990,34 @@ <enumerator name='POOL_SCAN_NONE' value='0'/> <enumerator name='POOL_SCAN_SCRUB' value='1'/> <enumerator name='POOL_SCAN_RESILVER' value='2'/> - <enumerator name='POOL_SCAN_FUNCS' value='3'/> + <enumerator name='POOL_SCAN_ERRORSCRUB' value='3'/> + <enumerator name='POOL_SCAN_FUNCS' value='4'/> </enum-decl> <typedef-decl name='pool_scan_func_t' type-id='1b092565' id='7313fbe2'/> <enum-decl name='pool_scrub_cmd' id='a1474cbd'> <underlying-type type-id='9cac1fee'/> <enumerator name='POOL_SCRUB_NORMAL' value='0'/> <enumerator name='POOL_SCRUB_PAUSE' value='1'/> - <enumerator name='POOL_SCRUB_FLAGS_END' value='2'/> + <enumerator name='POOL_SCRUB_FROM_LAST_TXG' value='2'/> + <enumerator name='POOL_SCRUB_FLAGS_END' value='3'/> </enum-decl> <typedef-decl name='pool_scrub_cmd_t' type-id='a1474cbd' id='b51cf3c2'/> + <enum-decl name='zpool_errata' id='d9abbf54'> + <underlying-type type-id='9cac1fee'/> + <enumerator name='ZPOOL_ERRATA_NONE' value='0'/> + <enumerator name='ZPOOL_ERRATA_ZOL_2094_SCRUB' value='1'/> + <enumerator name='ZPOOL_ERRATA_ZOL_2094_ASYNC_DESTROY' value='2'/> + <enumerator name='ZPOOL_ERRATA_ZOL_6845_ENCRYPTION' value='3'/> + <enumerator name='ZPOOL_ERRATA_ZOL_8308_ENCRYPTION' value='4'/> + </enum-decl> + <typedef-decl name='zpool_errata_t' type-id='d9abbf54' id='688c495b'/> <enum-decl name='pool_initialize_func' id='5c246ad4'> <underlying-type type-id='9cac1fee'/> <enumerator name='POOL_INITIALIZE_START' value='0'/> <enumerator name='POOL_INITIALIZE_CANCEL' value='1'/> <enumerator name='POOL_INITIALIZE_SUSPEND' value='2'/> - <enumerator name='POOL_INITIALIZE_FUNCS' value='3'/> + <enumerator name='POOL_INITIALIZE_UNINIT' value='3'/> + <enumerator name='POOL_INITIALIZE_FUNCS' value='4'/> </enum-decl> <typedef-decl name='pool_initialize_func_t' type-id='5c246ad4' id='7063e1ab'/> <enum-decl name='pool_trim_func' id='54ed608a'> @@ -4284,6 +6028,114 @@ <enumerator name='POOL_TRIM_FUNCS' value='3'/> </enum-decl> <typedef-decl name='pool_trim_func_t' type-id='54ed608a' id='b1146b8d'/> + <enum-decl name='zfs_ioc' id='12033f13'> + <underlying-type type-id='9cac1fee'/> + <enumerator name='ZFS_IOC_FIRST' value='23040'/> + <enumerator name='ZFS_IOC' value='23040'/> + <enumerator name='ZFS_IOC_POOL_CREATE' value='23040'/> + <enumerator name='ZFS_IOC_POOL_DESTROY' value='23041'/> + <enumerator name='ZFS_IOC_POOL_IMPORT' value='23042'/> + <enumerator name='ZFS_IOC_POOL_EXPORT' value='23043'/> + <enumerator name='ZFS_IOC_POOL_CONFIGS' value='23044'/> + <enumerator name='ZFS_IOC_POOL_STATS' value='23045'/> + <enumerator name='ZFS_IOC_POOL_TRYIMPORT' value='23046'/> + <enumerator name='ZFS_IOC_POOL_SCAN' value='23047'/> + <enumerator name='ZFS_IOC_POOL_FREEZE' value='23048'/> + <enumerator name='ZFS_IOC_POOL_UPGRADE' value='23049'/> + <enumerator name='ZFS_IOC_POOL_GET_HISTORY' value='23050'/> + <enumerator name='ZFS_IOC_VDEV_ADD' value='23051'/> + <enumerator name='ZFS_IOC_VDEV_REMOVE' value='23052'/> + <enumerator name='ZFS_IOC_VDEV_SET_STATE' value='23053'/> + <enumerator name='ZFS_IOC_VDEV_ATTACH' value='23054'/> + <enumerator name='ZFS_IOC_VDEV_DETACH' value='23055'/> + <enumerator name='ZFS_IOC_VDEV_SETPATH' value='23056'/> + <enumerator name='ZFS_IOC_VDEV_SETFRU' value='23057'/> + <enumerator name='ZFS_IOC_OBJSET_STATS' value='23058'/> + <enumerator name='ZFS_IOC_OBJSET_ZPLPROPS' value='23059'/> + <enumerator name='ZFS_IOC_DATASET_LIST_NEXT' value='23060'/> + <enumerator name='ZFS_IOC_SNAPSHOT_LIST_NEXT' value='23061'/> + <enumerator name='ZFS_IOC_SET_PROP' value='23062'/> + <enumerator name='ZFS_IOC_CREATE' value='23063'/> + <enumerator name='ZFS_IOC_DESTROY' value='23064'/> + <enumerator name='ZFS_IOC_ROLLBACK' value='23065'/> + <enumerator name='ZFS_IOC_RENAME' value='23066'/> + <enumerator name='ZFS_IOC_RECV' value='23067'/> + <enumerator name='ZFS_IOC_SEND' value='23068'/> + <enumerator name='ZFS_IOC_INJECT_FAULT' value='23069'/> + <enumerator name='ZFS_IOC_CLEAR_FAULT' value='23070'/> + <enumerator name='ZFS_IOC_INJECT_LIST_NEXT' value='23071'/> + <enumerator name='ZFS_IOC_ERROR_LOG' value='23072'/> + <enumerator name='ZFS_IOC_CLEAR' value='23073'/> + <enumerator name='ZFS_IOC_PROMOTE' value='23074'/> + <enumerator name='ZFS_IOC_SNAPSHOT' value='23075'/> + <enumerator name='ZFS_IOC_DSOBJ_TO_DSNAME' value='23076'/> + <enumerator name='ZFS_IOC_OBJ_TO_PATH' value='23077'/> + <enumerator name='ZFS_IOC_POOL_SET_PROPS' value='23078'/> + <enumerator name='ZFS_IOC_POOL_GET_PROPS' value='23079'/> + <enumerator name='ZFS_IOC_SET_FSACL' value='23080'/> + <enumerator name='ZFS_IOC_GET_FSACL' value='23081'/> + <enumerator name='ZFS_IOC_SHARE' value='23082'/> + <enumerator name='ZFS_IOC_INHERIT_PROP' value='23083'/> + <enumerator name='ZFS_IOC_SMB_ACL' value='23084'/> + <enumerator name='ZFS_IOC_USERSPACE_ONE' value='23085'/> + <enumerator name='ZFS_IOC_USERSPACE_MANY' value='23086'/> + <enumerator name='ZFS_IOC_USERSPACE_UPGRADE' value='23087'/> + <enumerator name='ZFS_IOC_HOLD' value='23088'/> + <enumerator name='ZFS_IOC_RELEASE' value='23089'/> + <enumerator name='ZFS_IOC_GET_HOLDS' value='23090'/> + <enumerator name='ZFS_IOC_OBJSET_RECVD_PROPS' value='23091'/> + <enumerator name='ZFS_IOC_VDEV_SPLIT' value='23092'/> + <enumerator name='ZFS_IOC_NEXT_OBJ' value='23093'/> + <enumerator name='ZFS_IOC_DIFF' value='23094'/> + <enumerator name='ZFS_IOC_TMP_SNAPSHOT' value='23095'/> + <enumerator name='ZFS_IOC_OBJ_TO_STATS' value='23096'/> + <enumerator name='ZFS_IOC_SPACE_WRITTEN' value='23097'/> + <enumerator name='ZFS_IOC_SPACE_SNAPS' value='23098'/> + <enumerator name='ZFS_IOC_DESTROY_SNAPS' value='23099'/> + <enumerator name='ZFS_IOC_POOL_REGUID' value='23100'/> + <enumerator name='ZFS_IOC_POOL_REOPEN' value='23101'/> + <enumerator name='ZFS_IOC_SEND_PROGRESS' value='23102'/> + <enumerator name='ZFS_IOC_LOG_HISTORY' value='23103'/> + <enumerator name='ZFS_IOC_SEND_NEW' value='23104'/> + <enumerator name='ZFS_IOC_SEND_SPACE' value='23105'/> + <enumerator name='ZFS_IOC_CLONE' value='23106'/> + <enumerator name='ZFS_IOC_BOOKMARK' value='23107'/> + <enumerator name='ZFS_IOC_GET_BOOKMARKS' value='23108'/> + <enumerator name='ZFS_IOC_DESTROY_BOOKMARKS' value='23109'/> + <enumerator name='ZFS_IOC_RECV_NEW' value='23110'/> + <enumerator name='ZFS_IOC_POOL_SYNC' value='23111'/> + <enumerator name='ZFS_IOC_CHANNEL_PROGRAM' value='23112'/> + <enumerator name='ZFS_IOC_LOAD_KEY' value='23113'/> + <enumerator name='ZFS_IOC_UNLOAD_KEY' value='23114'/> + <enumerator name='ZFS_IOC_CHANGE_KEY' value='23115'/> + <enumerator name='ZFS_IOC_REMAP' value='23116'/> + <enumerator name='ZFS_IOC_POOL_CHECKPOINT' value='23117'/> + <enumerator name='ZFS_IOC_POOL_DISCARD_CHECKPOINT' value='23118'/> + <enumerator name='ZFS_IOC_POOL_INITIALIZE' value='23119'/> + <enumerator name='ZFS_IOC_POOL_TRIM' value='23120'/> + <enumerator name='ZFS_IOC_REDACT' value='23121'/> + <enumerator name='ZFS_IOC_GET_BOOKMARK_PROPS' value='23122'/> + <enumerator name='ZFS_IOC_WAIT' value='23123'/> + <enumerator name='ZFS_IOC_WAIT_FS' value='23124'/> + <enumerator name='ZFS_IOC_VDEV_GET_PROPS' value='23125'/> + <enumerator name='ZFS_IOC_VDEV_SET_PROPS' value='23126'/> + <enumerator name='ZFS_IOC_POOL_SCRUB' value='23127'/> + <enumerator name='ZFS_IOC_POOL_PREFETCH' value='23128'/> + <enumerator name='ZFS_IOC_DDT_PRUNE' value='23129'/> + <enumerator name='ZFS_IOC_PLATFORM' value='23168'/> + <enumerator name='ZFS_IOC_EVENTS_NEXT' value='23169'/> + <enumerator name='ZFS_IOC_EVENTS_CLEAR' value='23170'/> + <enumerator name='ZFS_IOC_EVENTS_SEEK' value='23171'/> + <enumerator name='ZFS_IOC_NEXTBOOT' value='23172'/> + <enumerator name='ZFS_IOC_JAIL' value='23173'/> + <enumerator name='ZFS_IOC_USERNS_ATTACH' value='23173'/> + <enumerator name='ZFS_IOC_UNJAIL' value='23174'/> + <enumerator name='ZFS_IOC_USERNS_DETACH' value='23174'/> + <enumerator name='ZFS_IOC_SET_BOOTENV' value='23175'/> + <enumerator name='ZFS_IOC_GET_BOOTENV' value='23176'/> + <enumerator name='ZFS_IOC_LAST' value='23177'/> + </enum-decl> + <typedef-decl name='zfs_ioc_t' type-id='12033f13' id='5b35941c'/> <enum-decl name='zpool_wait_activity_t' naming-typedef-id='73446457' id='849338e3'> <underlying-type type-id='9cac1fee'/> <enumerator name='ZPOOL_WAIT_CKPT_DISCARD' value='0'/> @@ -4294,23 +6146,449 @@ <enumerator name='ZPOOL_WAIT_RESILVER' value='5'/> <enumerator name='ZPOOL_WAIT_SCRUB' value='6'/> <enumerator name='ZPOOL_WAIT_TRIM' value='7'/> - <enumerator name='ZPOOL_WAIT_NUM_ACTIVITIES' value='8'/> + <enumerator name='ZPOOL_WAIT_RAIDZ_EXPAND' value='8'/> + <enumerator name='ZPOOL_WAIT_NUM_ACTIVITIES' value='9'/> </enum-decl> <typedef-decl name='zpool_wait_activity_t' type-id='849338e3' id='73446457'/> - <qualified-type-def type-id='8e8d4be3' const='yes' id='693c3853'/> - <pointer-type-def type-id='693c3853' size-in-bits='64' id='22cce67b'/> + <enum-decl name='zpool_prefetch_type_t' naming-typedef-id='e55ff6bc' id='0299ab50'> + <underlying-type type-id='9cac1fee'/> + <enumerator name='ZPOOL_PREFETCH_NONE' value='0'/> + <enumerator name='ZPOOL_PREFETCH_DDT' value='1'/> + </enum-decl> + <typedef-decl name='zpool_prefetch_type_t' type-id='0299ab50' id='e55ff6bc'/> + <enum-decl name='zpool_ddt_prune_unit_t' naming-typedef-id='02e25ab0' id='509ae11c'> + <underlying-type type-id='9cac1fee'/> + <enumerator name='ZPOOL_DDT_PRUNE_NONE' value='0'/> + <enumerator name='ZPOOL_DDT_PRUNE_AGE' value='1'/> + <enumerator name='ZPOOL_DDT_PRUNE_PERCENTAGE' value='2'/> + </enum-decl> + <typedef-decl name='zpool_ddt_prune_unit_t' type-id='509ae11c' id='02e25ab0'/> + <enum-decl name='spa_feature' id='33ecb627'> + <underlying-type type-id='9cac1fee'/> + <enumerator name='SPA_FEATURE_NONE' value='-1'/> + <enumerator name='SPA_FEATURE_ASYNC_DESTROY' value='0'/> + <enumerator name='SPA_FEATURE_EMPTY_BPOBJ' value='1'/> + <enumerator name='SPA_FEATURE_LZ4_COMPRESS' value='2'/> + <enumerator name='SPA_FEATURE_MULTI_VDEV_CRASH_DUMP' value='3'/> + <enumerator name='SPA_FEATURE_SPACEMAP_HISTOGRAM' value='4'/> + <enumerator name='SPA_FEATURE_ENABLED_TXG' value='5'/> + <enumerator name='SPA_FEATURE_HOLE_BIRTH' value='6'/> + <enumerator name='SPA_FEATURE_EXTENSIBLE_DATASET' value='7'/> + <enumerator name='SPA_FEATURE_EMBEDDED_DATA' value='8'/> + <enumerator name='SPA_FEATURE_BOOKMARKS' value='9'/> + <enumerator name='SPA_FEATURE_FS_SS_LIMIT' value='10'/> + <enumerator name='SPA_FEATURE_LARGE_BLOCKS' value='11'/> + <enumerator name='SPA_FEATURE_LARGE_DNODE' value='12'/> + <enumerator name='SPA_FEATURE_SHA512' value='13'/> + <enumerator name='SPA_FEATURE_SKEIN' value='14'/> + <enumerator name='SPA_FEATURE_EDONR' value='15'/> + <enumerator name='SPA_FEATURE_USEROBJ_ACCOUNTING' value='16'/> + <enumerator name='SPA_FEATURE_ENCRYPTION' value='17'/> + <enumerator name='SPA_FEATURE_PROJECT_QUOTA' value='18'/> + <enumerator name='SPA_FEATURE_DEVICE_REMOVAL' value='19'/> + <enumerator name='SPA_FEATURE_OBSOLETE_COUNTS' value='20'/> + <enumerator name='SPA_FEATURE_POOL_CHECKPOINT' value='21'/> + <enumerator name='SPA_FEATURE_SPACEMAP_V2' value='22'/> + <enumerator name='SPA_FEATURE_ALLOCATION_CLASSES' value='23'/> + <enumerator name='SPA_FEATURE_RESILVER_DEFER' value='24'/> + <enumerator name='SPA_FEATURE_BOOKMARK_V2' value='25'/> + <enumerator name='SPA_FEATURE_REDACTION_BOOKMARKS' value='26'/> + <enumerator name='SPA_FEATURE_REDACTED_DATASETS' value='27'/> + <enumerator name='SPA_FEATURE_BOOKMARK_WRITTEN' value='28'/> + <enumerator name='SPA_FEATURE_LOG_SPACEMAP' value='29'/> + <enumerator name='SPA_FEATURE_LIVELIST' value='30'/> + <enumerator name='SPA_FEATURE_DEVICE_REBUILD' value='31'/> + <enumerator name='SPA_FEATURE_ZSTD_COMPRESS' value='32'/> + <enumerator name='SPA_FEATURE_DRAID' value='33'/> + <enumerator name='SPA_FEATURE_ZILSAXATTR' value='34'/> + <enumerator name='SPA_FEATURE_HEAD_ERRLOG' value='35'/> + <enumerator name='SPA_FEATURE_BLAKE3' value='36'/> + <enumerator name='SPA_FEATURE_BLOCK_CLONING' value='37'/> + <enumerator name='SPA_FEATURE_AVZ_V2' value='38'/> + <enumerator name='SPA_FEATURE_REDACTION_LIST_SPILL' value='39'/> + <enumerator name='SPA_FEATURE_RAIDZ_EXPANSION' value='40'/> + <enumerator name='SPA_FEATURE_FAST_DEDUP' value='41'/> + <enumerator name='SPA_FEATURE_LONGNAME' value='42'/> + <enumerator name='SPA_FEATURE_LARGE_MICROZAP' value='43'/> + <enumerator name='SPA_FEATURES' value='44'/> + </enum-decl> + <typedef-decl name='spa_feature_t' type-id='33ecb627' id='d6618c78'/> + <qualified-type-def type-id='80f4b756' const='yes' id='b99c00c9'/> + <pointer-type-def type-id='b99c00c9' size-in-bits='64' id='13956559'/> + <qualified-type-def type-id='22cce67b' const='yes' id='d2816df0'/> + <pointer-type-def type-id='d2816df0' size-in-bits='64' id='3bbfee2e'/> + <qualified-type-def type-id='b96825af' const='yes' id='2b61797f'/> + <pointer-type-def type-id='2b61797f' size-in-bits='64' id='9f7200cf'/> + <pointer-type-def type-id='d6618c78' size-in-bits='64' id='a8425263'/> + <qualified-type-def type-id='62f7a03d' restrict='yes' id='f1cadedf'/> <pointer-type-def type-id='a093cbb8' size-in-bits='64' id='b13f38c3'/> <pointer-type-def type-id='35acf840' size-in-bits='64' id='17f3480d'/> - <function-decl name='zpool_props_refresh' mangled-name='zpool_props_refresh' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_props_refresh'> - <parameter type-id='4c81de99' name='zhp'/> + <pointer-type-def type-id='688c495b' size-in-bits='64' id='cec6f2e4'/> + <pointer-type-def type-id='d11b7617' size-in-bits='64' id='23432aaa'/> + <function-decl name='zpool_get_handle' mangled-name='zpool_get_handle' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_get_handle'> + <parameter type-id='4c81de99'/> + <return type-id='b0382bb3'/> + </function-decl> + <function-decl name='zpool_prop_to_name' mangled-name='zpool_prop_to_name' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_to_name'> + <parameter type-id='5d0c23fb'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='vdev_prop_to_name' mangled-name='vdev_prop_to_name' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vdev_prop_to_name'> + <parameter type-id='5aa5c90c'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='vdev_prop_user' mangled-name='vdev_prop_user' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vdev_prop_user'> + <parameter type-id='80f4b756'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='zpool_get_status' mangled-name='zpool_get_status' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_get_status'> + <parameter type-id='4c81de99'/> + <parameter type-id='7d3cd834'/> + <parameter type-id='cec6f2e4'/> + <return type-id='d3dd6294'/> + </function-decl> + <function-decl name='zpool_prop_default_string' mangled-name='zpool_prop_default_string' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_default_string'> + <parameter type-id='5d0c23fb'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='zpool_prop_default_numeric' mangled-name='zpool_prop_default_numeric' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_default_numeric'> + <parameter type-id='5d0c23fb'/> + <return type-id='9c313c2d'/> + </function-decl> + <function-decl name='libzfs_envvar_is_set' mangled-name='libzfs_envvar_is_set' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libzfs_envvar_is_set'> + <parameter type-id='80f4b756'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='lzc_initialize' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='7063e1ab'/> + <parameter type-id='5ce45b60'/> + <parameter type-id='857bb57e'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='zpool_get_prop_int' mangled-name='zpool_get_prop_int' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_get_prop_int'> - <parameter type-id='4c81de99' name='zhp'/> - <parameter type-id='5d0c23fb' name='prop'/> - <parameter type-id='debc6aa3' name='src'/> + <function-decl name='lzc_trim' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='b1146b8d'/> + <parameter type-id='9c313c2d'/> + <parameter type-id='c19b74c3'/> + <parameter type-id='5ce45b60'/> + <parameter type-id='857bb57e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_sync' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='5ce45b60'/> + <parameter type-id='857bb57e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_reopen' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='c19b74c3'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_pool_checkpoint' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_pool_checkpoint_discard' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_wait' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='73446457'/> + <parameter type-id='37e3bd22'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_wait_tag' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='73446457'/> + <parameter type-id='9c313c2d'/> + <parameter type-id='37e3bd22'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_pool_prefetch' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='e55ff6bc'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_set_bootenv' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='22cce67b'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_get_bootenv' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='857bb57e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_get_vdev_prop' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='5ce45b60'/> + <parameter type-id='857bb57e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_set_vdev_prop' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='5ce45b60'/> + <parameter type-id='857bb57e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_scrub' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5b35941c'/> + <parameter type-id='80f4b756'/> + <parameter type-id='5ce45b60'/> + <parameter type-id='857bb57e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_ddt_prune' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='02e25ab0'/> + <parameter type-id='9c313c2d'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_resolve_shortname' mangled-name='zfs_resolve_shortname' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_resolve_shortname'> + <parameter type-id='80f4b756'/> + <parameter type-id='26a90f95'/> + <parameter type-id='b59d7dce'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_strip_partition' mangled-name='zfs_strip_partition' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_strip_partition'> + <parameter type-id='80f4b756'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='zfs_strip_path' mangled-name='zfs_strip_path' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_strip_path'> + <parameter type-id='80f4b756'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='zfs_strcmp_pathname' mangled-name='zfs_strcmp_pathname' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_strcmp_pathname'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zpool_history_unpack' mangled-name='zpool_history_unpack' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_history_unpack'> + <parameter type-id='26a90f95'/> + <parameter type-id='9c313c2d'/> + <parameter type-id='5d6479ae'/> + <parameter type-id='75be733c'/> + <parameter type-id='4dd26a40'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_basename' mangled-name='zfs_basename' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_basename'> + <parameter type-id='80f4b756'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='zpool_name_to_prop' mangled-name='zpool_name_to_prop' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_name_to_prop'> + <parameter type-id='80f4b756'/> + <return type-id='5d0c23fb'/> + </function-decl> + <function-decl name='zpool_prop_readonly' mangled-name='zpool_prop_readonly' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_readonly'> + <parameter type-id='5d0c23fb'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='zpool_prop_setonce' mangled-name='zpool_prop_setonce' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_setonce'> + <parameter type-id='5d0c23fb'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='zpool_prop_feature' mangled-name='zpool_prop_feature' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_feature'> + <parameter type-id='80f4b756'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='zpool_prop_index_to_string' mangled-name='zpool_prop_index_to_string' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_index_to_string'> + <parameter type-id='5d0c23fb'/> + <parameter type-id='9c313c2d'/> + <parameter type-id='7d3cd834'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='vdev_name_to_prop' mangled-name='vdev_name_to_prop' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vdev_name_to_prop'> + <parameter type-id='80f4b756'/> + <return type-id='5aa5c90c'/> + </function-decl> + <function-decl name='vdev_prop_default_string' mangled-name='vdev_prop_default_string' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vdev_prop_default_string'> + <parameter type-id='5aa5c90c'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='vdev_prop_default_numeric' mangled-name='vdev_prop_default_numeric' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vdev_prop_default_numeric'> + <parameter type-id='5aa5c90c'/> <return type-id='9c313c2d'/> </function-decl> + <function-decl name='vdev_prop_readonly' mangled-name='vdev_prop_readonly' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vdev_prop_readonly'> + <parameter type-id='5aa5c90c'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='vdev_prop_index_to_string' mangled-name='vdev_prop_index_to_string' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vdev_prop_index_to_string'> + <parameter type-id='5aa5c90c'/> + <parameter type-id='9c313c2d'/> + <parameter type-id='7d3cd834'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zpool_prop_vdev' mangled-name='zpool_prop_vdev' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_vdev'> + <parameter type-id='80f4b756'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='nvlist_add_nvpair' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='3fa542f0'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_uint8_array' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='9f7200cf'/> + <parameter type-id='3502e3ff'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_nvlist_array' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='3bbfee2e'/> + <parameter type-id='3502e3ff'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvpair_value_nvlist' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='3fa542f0'/> + <parameter type-id='857bb57e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='fnvlist_add_boolean_value' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='c19b74c3'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_int64' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='9da381c4'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_string_array' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='13956559'/> + <parameter type-id='3502e3ff'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_nvlist_array' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='3bbfee2e'/> + <parameter type-id='3502e3ff'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_lookup_uint64_array' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='4dd26a40'/> + <return type-id='5d6479ae'/> + </function-decl> + <function-decl name='fnvpair_value_int64' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='dace003f'/> + <return type-id='9da381c4'/> + </function-decl> + <function-decl name='fnvpair_value_string' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='dace003f'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='zfeature_is_supported' mangled-name='zfeature_is_supported' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfeature_is_supported'> + <parameter type-id='80f4b756'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='zfeature_lookup_guid' mangled-name='zfeature_lookup_guid' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfeature_lookup_guid'> + <parameter type-id='80f4b756'/> + <parameter type-id='a8425263'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfeature_lookup_name' mangled-name='zfeature_lookup_name' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfeature_lookup_name'> + <parameter type-id='80f4b756'/> + <parameter type-id='a8425263'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zpool_get_load_policy' mangled-name='zpool_get_load_policy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_get_load_policy'> + <parameter type-id='5ce45b60'/> + <parameter type-id='23432aaa'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='pool_namecheck' mangled-name='pool_namecheck' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pool_namecheck'> + <parameter type-id='80f4b756'/> + <parameter type-id='053457bd'/> + <parameter type-id='26a90f95'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zpool_prop_get_type' mangled-name='zpool_prop_get_type' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_get_type'> + <parameter type-id='5d0c23fb'/> + <return type-id='31429eff'/> + </function-decl> + <function-decl name='vdev_prop_get_type' mangled-name='vdev_prop_get_type' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vdev_prop_get_type'> + <parameter type-id='5aa5c90c'/> + <return type-id='31429eff'/> + </function-decl> + <function-decl name='get_system_hostid' mangled-name='get_system_hostid' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_system_hostid'> + <return type-id='7359adad'/> + </function-decl> + <function-decl name='strtoull' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='9d26089a'/> + <parameter type-id='8c85230f'/> + <parameter type-id='95e97e5e'/> + <return type-id='3a47d82b'/> + </function-decl> + <function-decl name='memcmp' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='eaa32e2f'/> + <parameter type-id='eaa32e2f'/> + <parameter type-id='b59d7dce'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='strtok_r' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='266fe297'/> + <parameter type-id='9d26089a'/> + <parameter type-id='8c85230f'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='ctime_r' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='d6e2847c'/> + <parameter type-id='266fe297'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='__realpath_chk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='9d26089a'/> + <parameter type-id='266fe297'/> + <parameter type-id='b59d7dce'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='munmap' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='eaa32e2f'/> + <parameter type-id='b59d7dce'/> + <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'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zpool_standard_error' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b0382bb3'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zpool_standard_error_fmt' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b0382bb3'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='80f4b756'/> + <parameter is-variadic='yes'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zpool_relabel_disk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b0382bb3'/> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zpool_props_refresh' mangled-name='zpool_props_refresh' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_props_refresh'> + <parameter type-id='4c81de99' name='zhp'/> + <return type-id='95e97e5e'/> + </function-decl> <function-decl name='zpool_state_to_name' mangled-name='zpool_state_to_name' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_state_to_name'> <parameter type-id='35acf840' name='state'/> <parameter type-id='9d774e0b' name='aux'/> @@ -4324,13 +6602,12 @@ <parameter type-id='4c81de99' name='zhp'/> <return type-id='80f4b756'/> </function-decl> - <function-decl name='zpool_get_prop' mangled-name='zpool_get_prop' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_get_prop'> + <function-decl name='zpool_get_userprop' mangled-name='zpool_get_userprop' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_get_userprop'> <parameter type-id='4c81de99' name='zhp'/> - <parameter type-id='5d0c23fb' name='prop'/> + <parameter type-id='80f4b756' name='propname'/> <parameter type-id='26a90f95' name='buf'/> <parameter type-id='b59d7dce' name='len'/> <parameter type-id='debc6aa3' name='srctype'/> - <parameter type-id='c19b74c3' name='literal'/> <return type-id='95e97e5e'/> </function-decl> <function-decl name='zpool_set_prop' mangled-name='zpool_set_prop' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_set_prop'> @@ -4342,34 +6619,16 @@ <function-decl name='zpool_expand_proplist' mangled-name='zpool_expand_proplist' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_expand_proplist'> <parameter type-id='4c81de99' name='zhp'/> <parameter type-id='e4378506' name='plp'/> + <parameter type-id='2e45de5d' name='type'/> <parameter type-id='c19b74c3' name='literal'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='zpool_prop_get_feature' mangled-name='zpool_prop_get_feature' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_get_feature'> + <function-decl name='vdev_expand_proplist' mangled-name='vdev_expand_proplist' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vdev_expand_proplist'> <parameter type-id='4c81de99' name='zhp'/> - <parameter type-id='80f4b756' name='propname'/> - <parameter type-id='26a90f95' name='buf'/> - <parameter type-id='b59d7dce' name='len'/> + <parameter type-id='80f4b756' name='vdevname'/> + <parameter type-id='e4378506' name='plp'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='zpool_open_canfail' mangled-name='zpool_open_canfail' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_open_canfail'> - <parameter type-id='b0382bb3' name='hdl'/> - <parameter type-id='80f4b756' name='pool'/> - <return type-id='4c81de99'/> - </function-decl> - <function-decl name='zpool_open' mangled-name='zpool_open' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_open'> - <parameter type-id='b0382bb3' name='hdl'/> - <parameter type-id='80f4b756' name='pool'/> - <return type-id='4c81de99'/> - </function-decl> - <function-decl name='zpool_close' mangled-name='zpool_close' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_close'> - <parameter type-id='4c81de99' name='zhp'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='zpool_get_name' mangled-name='zpool_get_name' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_get_name'> - <parameter type-id='4c81de99' name='zhp'/> - <return type-id='80f4b756'/> - </function-decl> <function-decl name='zpool_get_state' mangled-name='zpool_get_state' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_get_state'> <parameter type-id='4c81de99' name='zhp'/> <return type-id='95e97e5e'/> @@ -4399,9 +6658,15 @@ <parameter type-id='4c81de99' name='zhp'/> <return type-id='95e97e5e'/> </function-decl> + <function-decl name='zpool_prefetch' mangled-name='zpool_prefetch' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prefetch'> + <parameter type-id='4c81de99' name='zhp'/> + <parameter type-id='e55ff6bc' name='type'/> + <return type-id='95e97e5e'/> + </function-decl> <function-decl name='zpool_add' mangled-name='zpool_add' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_add'> <parameter type-id='4c81de99' name='zhp'/> <parameter type-id='5ce45b60' name='nvroot'/> + <parameter type-id='c19b74c3' name='check_ashift'/> <return type-id='95e97e5e'/> </function-decl> <function-decl name='zpool_export' mangled-name='zpool_export' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_export'> @@ -4420,6 +6685,8 @@ <parameter type-id='80f4b756' name='name'/> <parameter type-id='95e97e5e' name='reason'/> <parameter type-id='5ce45b60' name='config'/> + <parameter type-id='26a90f95' name='buf'/> + <parameter type-id='b59d7dce' name='size'/> <return type-id='48b5725f'/> </function-decl> <function-decl name='zpool_import' mangled-name='zpool_import' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_import'> @@ -4429,8 +6696,10 @@ <parameter type-id='26a90f95' name='altroot'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='zpool_print_unsup_feat' mangled-name='zpool_print_unsup_feat' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_print_unsup_feat'> + <function-decl name='zpool_collect_unsup_feat' mangled-name='zpool_collect_unsup_feat' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_collect_unsup_feat'> <parameter type-id='5ce45b60' name='config'/> + <parameter type-id='26a90f95' name='buf'/> + <parameter type-id='b59d7dce' name='size'/> <return type-id='48b5725f'/> </function-decl> <function-decl name='zpool_import_props' mangled-name='zpool_import_props' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_import_props'> @@ -4482,11 +6751,13 @@ <parameter type-id='37e3bd22' name='log'/> <return type-id='5ce45b60'/> </function-decl> - <function-decl name='zpool_get_physpath' mangled-name='zpool_get_physpath' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_get_physpath'> + <function-decl name='zpool_find_parent_vdev' mangled-name='zpool_find_parent_vdev' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_find_parent_vdev'> <parameter type-id='4c81de99' name='zhp'/> - <parameter type-id='26a90f95' name='physpath'/> - <parameter type-id='b59d7dce' name='phypath_size'/> - <return type-id='95e97e5e'/> + <parameter type-id='80f4b756' name='path'/> + <parameter type-id='37e3bd22' name='avail_spare'/> + <parameter type-id='37e3bd22' name='l2cache'/> + <parameter type-id='37e3bd22' name='log'/> + <return type-id='5ce45b60'/> </function-decl> <function-decl name='zpool_vdev_path_to_guid' mangled-name='zpool_vdev_path_to_guid' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_vdev_path_to_guid'> <parameter type-id='4c81de99' name='zhp'/> @@ -4506,6 +6777,11 @@ <parameter type-id='c19b74c3' name='istmp'/> <return type-id='95e97e5e'/> </function-decl> + <function-decl name='zpool_vdev_remove_wanted' mangled-name='zpool_vdev_remove_wanted' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_vdev_remove_wanted'> + <parameter type-id='4c81de99' name='zhp'/> + <parameter type-id='80f4b756' name='path'/> + <return type-id='95e97e5e'/> + </function-decl> <function-decl name='zpool_vdev_fault' mangled-name='zpool_vdev_fault' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_vdev_fault'> <parameter type-id='4c81de99' name='zhp'/> <parameter type-id='9c313c2d' name='guid'/> @@ -4518,6 +6794,12 @@ <parameter type-id='9d774e0b' name='aux'/> <return type-id='95e97e5e'/> </function-decl> + <function-decl name='zpool_vdev_set_removed_state' mangled-name='zpool_vdev_set_removed_state' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_vdev_set_removed_state'> + <parameter type-id='4c81de99' name='zhp'/> + <parameter type-id='9c313c2d' name='guid'/> + <parameter type-id='9d774e0b' name='aux'/> + <return type-id='95e97e5e'/> + </function-decl> <function-decl name='zpool_vdev_attach' mangled-name='zpool_vdev_attach' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_vdev_attach'> <parameter type-id='4c81de99' name='zhp'/> <parameter type-id='80f4b756' name='old_disk'/> @@ -4566,6 +6848,11 @@ <parameter type-id='9c313c2d' name='guid'/> <return type-id='95e97e5e'/> </function-decl> + <function-decl name='zpool_set_guid' mangled-name='zpool_set_guid' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_set_guid'> + <parameter type-id='4c81de99' name='zhp'/> + <parameter type-id='713a56f5' name='guid'/> + <return type-id='95e97e5e'/> + </function-decl> <function-decl name='zpool_reguid' mangled-name='zpool_reguid' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_reguid'> <parameter type-id='4c81de99' name='zhp'/> <return type-id='95e97e5e'/> @@ -4587,6 +6874,11 @@ <parameter type-id='95e97e5e' name='name_flags'/> <return type-id='26a90f95'/> </function-decl> + <function-decl name='zpool_add_propname' mangled-name='zpool_add_propname' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_add_propname'> + <parameter type-id='4c81de99' name='zhp'/> + <parameter type-id='80f4b756' name='propname'/> + <return type-id='48b5725f'/> + </function-decl> <function-decl name='zpool_get_errlog' mangled-name='zpool_get_errlog' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_get_errlog'> <parameter type-id='4c81de99' name='zhp'/> <parameter type-id='857bb57e' name='nverrlistp'/> @@ -4680,9 +6972,82 @@ <parameter type-id='b59d7dce' name='rlen'/> <return type-id='901b78d1'/> </function-decl> + <function-decl name='zpool_get_vdev_prop_value' mangled-name='zpool_get_vdev_prop_value' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_get_vdev_prop_value'> + <parameter type-id='5ce45b60' name='nvprop'/> + <parameter type-id='5aa5c90c' name='prop'/> + <parameter type-id='26a90f95' name='prop_name'/> + <parameter type-id='26a90f95' name='buf'/> + <parameter type-id='b59d7dce' name='len'/> + <parameter type-id='debc6aa3' name='srctype'/> + <parameter type-id='c19b74c3' name='literal'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zpool_get_vdev_prop' mangled-name='zpool_get_vdev_prop' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_get_vdev_prop'> + <parameter type-id='4c81de99' name='zhp'/> + <parameter type-id='80f4b756' name='vdevname'/> + <parameter type-id='5aa5c90c' name='prop'/> + <parameter type-id='26a90f95' name='prop_name'/> + <parameter type-id='26a90f95' name='buf'/> + <parameter type-id='b59d7dce' name='len'/> + <parameter type-id='debc6aa3' name='srctype'/> + <parameter type-id='c19b74c3' name='literal'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zpool_get_all_vdev_props' mangled-name='zpool_get_all_vdev_props' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_get_all_vdev_props'> + <parameter type-id='4c81de99' name='zhp'/> + <parameter type-id='80f4b756' name='vdevname'/> + <parameter type-id='857bb57e' name='outnvl'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zpool_set_vdev_prop' mangled-name='zpool_set_vdev_prop' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_set_vdev_prop'> + <parameter type-id='4c81de99' name='zhp'/> + <parameter type-id='80f4b756' name='vdevname'/> + <parameter type-id='80f4b756' name='propname'/> + <parameter type-id='80f4b756' name='propval'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zpool_ddt_prune' mangled-name='zpool_ddt_prune' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_ddt_prune'> + <parameter type-id='4c81de99' name='zhp'/> + <parameter type-id='02e25ab0' name='unit'/> + <parameter type-id='9c313c2d' name='amount'/> + <return type-id='95e97e5e'/> + </function-decl> </abi-instr> - <abi-instr address-size='64' path='libzfs_sendrecv.c' language='LANG_C99'> - <class-decl name='sendflags' size-in-bits='544' is-struct='yes' visibility='default' id='f6aa15be'> + <abi-instr address-size='64' path='lib/libzfs/libzfs_sendrecv.c' language='LANG_C99'> + <array-type-def dimensions='1' type-id='8901473c' size-in-bits='576' id='f5da478b'> + <subrange length='1' type-id='7359adad' id='52f813b4'/> + </array-type-def> + <array-type-def dimensions='1' type-id='95e97e5e' size-in-bits='384' id='73b82f0f'> + <subrange length='12' type-id='7359adad' id='84827bdc'/> + </array-type-def> + <array-type-def dimensions='1' type-id='bd54fe1a' size-in-bits='512' id='5d4efd44'> + <subrange length='8' type-id='7359adad' id='56e0c0b1'/> + </array-type-def> + <array-type-def dimensions='1' type-id='9c313c2d' size-in-bits='2176' id='8c2bcad1'> + <subrange length='34' type-id='7359adad' id='6a6a7e00'/> + </array-type-def> + <array-type-def dimensions='1' type-id='9c313c2d' size-in-bits='256' id='85c64d26'> + <subrange length='4' type-id='7359adad' id='16fe7105'/> + </array-type-def> + <array-type-def dimensions='1' type-id='b96825af' size-in-bits='96' id='fa8ef949'> + <subrange length='12' type-id='7359adad' id='84827bdc'/> + </array-type-def> + <array-type-def dimensions='1' type-id='b96825af' size-in-bits='128' id='fa9986a5'> + <subrange length='16' type-id='7359adad' id='848d0938'/> + </array-type-def> + <array-type-def dimensions='1' type-id='b96825af' size-in-bits='40' id='0f4ddd0b'> + <subrange length='5' type-id='7359adad' id='53010e10'/> + </array-type-def> + <array-type-def dimensions='1' type-id='b96825af' size-in-bits='48' id='0f562bd0'> + <subrange length='6' type-id='7359adad' id='52fa524b'/> + </array-type-def> + <array-type-def dimensions='1' type-id='b96825af' size-in-bits='64' id='13339fda'> + <subrange length='8' type-id='7359adad' id='56e0c0b1'/> + </array-type-def> + <array-type-def dimensions='1' type-id='eaa32e2f' size-in-bits='256' id='209ef23f'> + <subrange length='4' type-id='7359adad' id='16fe7105'/> + </array-type-def> + <class-decl name='sendflags' size-in-bits='576' is-struct='yes' visibility='default' id='f6aa15be'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='verbosity' type-id='95e97e5e' visibility='default'/> </data-member> @@ -4714,30 +7079,33 @@ <var-decl name='progress' type-id='c19b74c3' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='largeblock' type-id='c19b74c3' visibility='default'/> + <var-decl name='progressastitle' type-id='c19b74c3' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='352'> - <var-decl name='embed_data' type-id='c19b74c3' visibility='default'/> + <var-decl name='largeblock' type-id='c19b74c3' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='compress' type-id='c19b74c3' visibility='default'/> + <var-decl name='embed_data' type-id='c19b74c3' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='416'> - <var-decl name='raw' type-id='c19b74c3' visibility='default'/> + <var-decl name='compress' type-id='c19b74c3' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='backup' type-id='c19b74c3' visibility='default'/> + <var-decl name='raw' type-id='c19b74c3' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='480'> - <var-decl name='holds' type-id='c19b74c3' visibility='default'/> + <var-decl name='backup' type-id='c19b74c3' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='holds' type-id='c19b74c3' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='544'> <var-decl name='saved' type-id='c19b74c3' visibility='default'/> </data-member> </class-decl> <typedef-decl name='sendflags_t' type-id='f6aa15be' id='945467e6'/> <typedef-decl name='snapfilter_cb_t' type-id='d2a5e211' id='3d3ffb69'/> - <class-decl name='recvflags' size-in-bits='416' is-struct='yes' visibility='default' id='34a384dc'> + <class-decl name='recvflags' size-in-bits='448' is-struct='yes' visibility='default' id='34a384dc'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='verbose' type-id='c19b74c3' visibility='default'/> </data-member> @@ -4777,12 +7145,791 @@ <data-member access='public' layout-offset-in-bits='384'> <var-decl name='forceunmount' type-id='c19b74c3' visibility='default'/> </data-member> + <data-member access='public' layout-offset-in-bits='416'> + <var-decl name='heal' type-id='c19b74c3' visibility='default'/> + </data-member> </class-decl> <typedef-decl name='recvflags_t' type-id='34a384dc' id='9e59d1d4'/> - <pointer-type-def type-id='f20fbd51' size-in-bits='64' id='a3681dea'/> + <enum-decl name='lzc_send_flags' id='bfbd3c8e'> + <underlying-type type-id='9cac1fee'/> + <enumerator name='LZC_SEND_FLAG_EMBED_DATA' value='1'/> + <enumerator name='LZC_SEND_FLAG_LARGE_BLOCK' value='2'/> + <enumerator name='LZC_SEND_FLAG_COMPRESS' value='4'/> + <enumerator name='LZC_SEND_FLAG_RAW' value='8'/> + <enumerator name='LZC_SEND_FLAG_SAVED' value='16'/> + </enum-decl> + <class-decl name='ddt_key_t' size-in-bits='320' is-struct='yes' naming-typedef-id='67f6d2cf' visibility='default' id='5fae1718'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ddk_cksum' type-id='39730d0b' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='ddk_prop' type-id='9c313c2d' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='ddt_key_t' type-id='5fae1718' id='67f6d2cf'/> + <enum-decl name='dmu_object_type' id='04b3b0b9'> + <underlying-type type-id='9cac1fee'/> + <enumerator name='DMU_OT_NONE' value='0'/> + <enumerator name='DMU_OT_OBJECT_DIRECTORY' value='1'/> + <enumerator name='DMU_OT_OBJECT_ARRAY' value='2'/> + <enumerator name='DMU_OT_PACKED_NVLIST' value='3'/> + <enumerator name='DMU_OT_PACKED_NVLIST_SIZE' value='4'/> + <enumerator name='DMU_OT_BPOBJ' value='5'/> + <enumerator name='DMU_OT_BPOBJ_HDR' value='6'/> + <enumerator name='DMU_OT_SPACE_MAP_HEADER' value='7'/> + <enumerator name='DMU_OT_SPACE_MAP' value='8'/> + <enumerator name='DMU_OT_INTENT_LOG' value='9'/> + <enumerator name='DMU_OT_DNODE' value='10'/> + <enumerator name='DMU_OT_OBJSET' value='11'/> + <enumerator name='DMU_OT_DSL_DIR' value='12'/> + <enumerator name='DMU_OT_DSL_DIR_CHILD_MAP' value='13'/> + <enumerator name='DMU_OT_DSL_DS_SNAP_MAP' value='14'/> + <enumerator name='DMU_OT_DSL_PROPS' value='15'/> + <enumerator name='DMU_OT_DSL_DATASET' value='16'/> + <enumerator name='DMU_OT_ZNODE' value='17'/> + <enumerator name='DMU_OT_OLDACL' value='18'/> + <enumerator name='DMU_OT_PLAIN_FILE_CONTENTS' value='19'/> + <enumerator name='DMU_OT_DIRECTORY_CONTENTS' value='20'/> + <enumerator name='DMU_OT_MASTER_NODE' value='21'/> + <enumerator name='DMU_OT_UNLINKED_SET' value='22'/> + <enumerator name='DMU_OT_ZVOL' value='23'/> + <enumerator name='DMU_OT_ZVOL_PROP' value='24'/> + <enumerator name='DMU_OT_PLAIN_OTHER' value='25'/> + <enumerator name='DMU_OT_UINT64_OTHER' value='26'/> + <enumerator name='DMU_OT_ZAP_OTHER' value='27'/> + <enumerator name='DMU_OT_ERROR_LOG' value='28'/> + <enumerator name='DMU_OT_SPA_HISTORY' value='29'/> + <enumerator name='DMU_OT_SPA_HISTORY_OFFSETS' value='30'/> + <enumerator name='DMU_OT_POOL_PROPS' value='31'/> + <enumerator name='DMU_OT_DSL_PERMS' value='32'/> + <enumerator name='DMU_OT_ACL' value='33'/> + <enumerator name='DMU_OT_SYSACL' value='34'/> + <enumerator name='DMU_OT_FUID' value='35'/> + <enumerator name='DMU_OT_FUID_SIZE' value='36'/> + <enumerator name='DMU_OT_NEXT_CLONES' value='37'/> + <enumerator name='DMU_OT_SCAN_QUEUE' value='38'/> + <enumerator name='DMU_OT_USERGROUP_USED' value='39'/> + <enumerator name='DMU_OT_USERGROUP_QUOTA' value='40'/> + <enumerator name='DMU_OT_USERREFS' value='41'/> + <enumerator name='DMU_OT_DDT_ZAP' value='42'/> + <enumerator name='DMU_OT_DDT_STATS' value='43'/> + <enumerator name='DMU_OT_SA' value='44'/> + <enumerator name='DMU_OT_SA_MASTER_NODE' value='45'/> + <enumerator name='DMU_OT_SA_ATTR_REGISTRATION' value='46'/> + <enumerator name='DMU_OT_SA_ATTR_LAYOUTS' value='47'/> + <enumerator name='DMU_OT_SCAN_XLATE' value='48'/> + <enumerator name='DMU_OT_DEDUP' value='49'/> + <enumerator name='DMU_OT_DEADLIST' value='50'/> + <enumerator name='DMU_OT_DEADLIST_HDR' value='51'/> + <enumerator name='DMU_OT_DSL_CLONES' value='52'/> + <enumerator name='DMU_OT_BPOBJ_SUBOBJ' value='53'/> + <enumerator name='DMU_OT_NUMTYPES' value='54'/> + <enumerator name='DMU_OTN_UINT8_DATA' value='128'/> + <enumerator name='DMU_OTN_UINT8_METADATA' value='192'/> + <enumerator name='DMU_OTN_UINT16_DATA' value='129'/> + <enumerator name='DMU_OTN_UINT16_METADATA' value='193'/> + <enumerator name='DMU_OTN_UINT32_DATA' value='130'/> + <enumerator name='DMU_OTN_UINT32_METADATA' value='194'/> + <enumerator name='DMU_OTN_UINT64_DATA' value='131'/> + <enumerator name='DMU_OTN_UINT64_METADATA' value='195'/> + <enumerator name='DMU_OTN_ZAP_DATA' value='132'/> + <enumerator name='DMU_OTN_ZAP_METADATA' value='196'/> + <enumerator name='DMU_OTN_UINT8_ENC_DATA' value='160'/> + <enumerator name='DMU_OTN_UINT8_ENC_METADATA' value='224'/> + <enumerator name='DMU_OTN_UINT16_ENC_DATA' value='161'/> + <enumerator name='DMU_OTN_UINT16_ENC_METADATA' value='225'/> + <enumerator name='DMU_OTN_UINT32_ENC_DATA' value='162'/> + <enumerator name='DMU_OTN_UINT32_ENC_METADATA' value='226'/> + <enumerator name='DMU_OTN_UINT64_ENC_DATA' value='163'/> + <enumerator name='DMU_OTN_UINT64_ENC_METADATA' value='227'/> + <enumerator name='DMU_OTN_ZAP_ENC_DATA' value='164'/> + <enumerator name='DMU_OTN_ZAP_ENC_METADATA' value='228'/> + </enum-decl> + <typedef-decl name='dmu_object_type_t' type-id='04b3b0b9' id='5c9d8906'/> + <class-decl name='zio_cksum' size-in-bits='256' is-struct='yes' visibility='default' id='1d53e28b'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='zc_word' type-id='85c64d26' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='zio_cksum_t' type-id='1d53e28b' id='39730d0b'/> + <class-decl name='dmu_replay_record' size-in-bits='2496' is-struct='yes' visibility='default' id='781a52d7'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='drr_type' type-id='08f5ca17' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='drr_payloadlen' type-id='8f92235e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='drr_u' type-id='ac5ab599' visibility='default'/> + </data-member> + </class-decl> + <enum-decl name='__anonymous_enum__' is-anonymous='yes' id='08f5ca17'> + <underlying-type type-id='9cac1fee'/> + <enumerator name='DRR_BEGIN' value='0'/> + <enumerator name='DRR_OBJECT' value='1'/> + <enumerator name='DRR_FREEOBJECTS' value='2'/> + <enumerator name='DRR_WRITE' value='3'/> + <enumerator name='DRR_FREE' value='4'/> + <enumerator name='DRR_END' value='5'/> + <enumerator name='DRR_WRITE_BYREF' value='6'/> + <enumerator name='DRR_SPILL' value='7'/> + <enumerator name='DRR_WRITE_EMBEDDED' value='8'/> + <enumerator name='DRR_OBJECT_RANGE' value='9'/> + <enumerator name='DRR_REDACT' value='10'/> + <enumerator name='DRR_NUMTYPES' value='11'/> + </enum-decl> + <union-decl name='__anonymous_union__' size-in-bits='2432' is-anonymous='yes' visibility='default' id='ac5ab599'> + <data-member access='public'> + <var-decl name='drr_begin' type-id='09fcdc01' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='drr_end' type-id='6ee25631' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='drr_object' type-id='f9ad530b' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='drr_freeobjects' type-id='a27d958e' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='drr_write' type-id='4cc69e4b' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='drr_free' type-id='c836cfd2' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='drr_write_byref' type-id='e511cdce' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='drr_spill' type-id='1e69a80a' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='drr_write_embedded' type-id='98b1345e' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='drr_object_range' type-id='aba1f9e1' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='drr_redact' type-id='50389039' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='drr_checksum' type-id='a5fe3647' visibility='default'/> + </data-member> + </union-decl> + <class-decl name='drr_end' size-in-bits='320' is-struct='yes' visibility='default' id='6ee25631'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='drr_checksum' type-id='39730d0b' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='drr_toguid' type-id='9c313c2d' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='drr_object' size-in-bits='448' is-struct='yes' visibility='default' id='f9ad530b'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='drr_object' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='drr_type' type-id='5c9d8906' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='drr_bonustype' type-id='5c9d8906' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='drr_blksz' type-id='8f92235e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160'> + <var-decl name='drr_bonuslen' type-id='8f92235e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='drr_checksumtype' type-id='b96825af' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='200'> + <var-decl name='drr_compress' type-id='b96825af' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='208'> + <var-decl name='drr_dn_slots' type-id='b96825af' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='216'> + <var-decl name='drr_flags' type-id='b96825af' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='224'> + <var-decl name='drr_raw_bonuslen' type-id='8f92235e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='drr_toguid' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='drr_indblkshift' type-id='b96825af' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='328'> + <var-decl name='drr_nlevels' type-id='b96825af' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='336'> + <var-decl name='drr_nblkptr' type-id='b96825af' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='344'> + <var-decl name='drr_pad' type-id='0f4ddd0b' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='drr_maxblkid' type-id='9c313c2d' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='drr_freeobjects' size-in-bits='192' is-struct='yes' visibility='default' id='a27d958e'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='drr_firstobj' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='drr_numobjs' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='drr_toguid' type-id='9c313c2d' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='drr_write' size-in-bits='1088' is-struct='yes' visibility='default' id='4cc69e4b'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='drr_object' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='drr_type' type-id='5c9d8906' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='drr_pad' type-id='8f92235e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='drr_offset' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='drr_logical_size' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='drr_toguid' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='drr_checksumtype' type-id='b96825af' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='328'> + <var-decl name='drr_flags' type-id='b96825af' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='336'> + <var-decl name='drr_compressiontype' type-id='b96825af' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='344'> + <var-decl name='drr_pad2' type-id='0f4ddd0b' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='drr_key' type-id='67f6d2cf' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='drr_compressed_size' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='768'> + <var-decl name='drr_salt' type-id='13339fda' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='832'> + <var-decl name='drr_iv' type-id='fa8ef949' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='928'> + <var-decl name='drr_mac' type-id='fa9986a5' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='drr_free' size-in-bits='256' is-struct='yes' visibility='default' id='c836cfd2'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='drr_object' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='drr_offset' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='drr_length' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='drr_toguid' type-id='9c313c2d' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='drr_write_byref' size-in-bits='832' is-struct='yes' visibility='default' id='e511cdce'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='drr_object' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='drr_offset' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='drr_length' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='drr_toguid' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='drr_refguid' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='drr_refobject' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='drr_refoffset' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='drr_checksumtype' type-id='b96825af' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='456'> + <var-decl name='drr_flags' type-id='b96825af' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='464'> + <var-decl name='drr_pad2' type-id='0f562bd0' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='drr_key' type-id='67f6d2cf' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='drr_spill' size-in-bits='640' is-struct='yes' visibility='default' id='1e69a80a'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='drr_object' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='drr_length' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='drr_toguid' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='drr_flags' type-id='b96825af' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='200'> + <var-decl name='drr_compressiontype' type-id='b96825af' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='208'> + <var-decl name='drr_pad' type-id='0f562bd0' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='drr_compressed_size' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='drr_salt' type-id='13339fda' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='drr_iv' type-id='fa8ef949' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='480'> + <var-decl name='drr_mac' type-id='fa9986a5' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='608'> + <var-decl name='drr_type' type-id='5c9d8906' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='drr_write_embedded' size-in-bits='384' is-struct='yes' visibility='default' id='98b1345e'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='drr_object' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='drr_offset' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='drr_length' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='drr_toguid' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='drr_compression' type-id='b96825af' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='264'> + <var-decl name='drr_etype' type-id='b96825af' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='272'> + <var-decl name='drr_pad' type-id='0f562bd0' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='drr_lsize' type-id='8f92235e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='352'> + <var-decl name='drr_psize' type-id='8f92235e' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='drr_object_range' size-in-bits='512' is-struct='yes' visibility='default' id='aba1f9e1'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='drr_firstobj' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='drr_numslots' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='drr_toguid' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='drr_salt' type-id='13339fda' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='drr_iv' type-id='fa8ef949' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='352'> + <var-decl name='drr_mac' type-id='fa9986a5' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='480'> + <var-decl name='drr_flags' type-id='b96825af' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='488'> + <var-decl name='drr_pad' type-id='d3490169' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='drr_redact' size-in-bits='256' is-struct='yes' visibility='default' id='50389039'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='drr_object' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='drr_offset' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='drr_length' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='drr_toguid' type-id='9c313c2d' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='drr_checksum' size-in-bits='2432' is-struct='yes' visibility='default' id='a5fe3647'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='drr_pad' type-id='8c2bcad1' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2176'> + <var-decl name='drr_checksum' type-id='39730d0b' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='__cancel_jmp_buf_tag' size-in-bits='576' is-struct='yes' visibility='default' id='8901473c'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='__cancel_jmp_buf' type-id='379a1ab7' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='__mask_was_saved' type-id='95e97e5e' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='__pthread_unwind_buf_t' size-in-bits='832' is-struct='yes' naming-typedef-id='4423cf7f' visibility='default' id='a0abc656'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='__cancel_jmp_buf' type-id='f5da478b' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='__pad' type-id='209ef23f' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='__pthread_unwind_buf_t' type-id='a0abc656' id='4423cf7f'/> + <typedef-decl name='__jmp_buf' type-id='5d4efd44' id='379a1ab7'/> + <typedef-decl name='__clockid_t' type-id='95e97e5e' id='08f9a87a'/> + <typedef-decl name='__timer_t' type-id='eaa32e2f' id='df209b60'/> + <typedef-decl name='clockid_t' type-id='08f9a87a' id='a1c3b834'/> + <class-decl name='sigevent' size-in-bits='512' is-struct='yes' visibility='default' id='519bc206'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='sigev_value' type-id='eabacd01' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='sigev_signo' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='sigev_notify' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='_sigev_un' type-id='ac5ab59a' visibility='default'/> + </data-member> + </class-decl> + <union-decl name='__anonymous_union__1' size-in-bits='384' is-anonymous='yes' visibility='default' id='ac5ab59a'> + <data-member access='public'> + <var-decl name='_pad' type-id='73b82f0f' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='_tid' type-id='3629bad8' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='_sigev_thread' type-id='e7f43f7c' visibility='default'/> + </data-member> + </union-decl> + <class-decl name='__anonymous_struct__' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f7c'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_function' type-id='5f147c28' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='_attribute' type-id='7347a39e' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='itimerspec' size-in-bits='256' is-struct='yes' visibility='default' id='acbdbcc6'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='it_interval' type-id='a9c79a1f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='it_value' type-id='a9c79a1f' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='timer_t' type-id='df209b60' id='b07ae406'/> + <typedef-decl name='Byte' type-id='002ac4a6' id='efb9ba06'/> + <typedef-decl name='uLong' type-id='7359adad' id='5bbcce85'/> + <typedef-decl name='Bytef' type-id='efb9ba06' id='c1606520'/> + <typedef-decl name='uLongf' type-id='5bbcce85' id='4d39af59'/> + <pointer-type-def type-id='c1606520' size-in-bits='64' id='4c667223'/> + <pointer-type-def type-id='8901473c' size-in-bits='64' id='eb91b7ea'/> + <pointer-type-def type-id='4423cf7f' size-in-bits='64' id='ba7c727c'/> + <pointer-type-def type-id='b9c97942' size-in-bits='64' id='bbf06c47'/> + <qualified-type-def type-id='bbf06c47' restrict='yes' id='65e6ec45'/> + <qualified-type-def type-id='c1606520' const='yes' id='a6124a50'/> + <pointer-type-def type-id='a6124a50' size-in-bits='64' id='e8cb3e0e'/> + <qualified-type-def type-id='b9c97942' const='yes' id='191f6b72'/> + <pointer-type-def type-id='191f6b72' size-in-bits='64' id='e475fb88'/> + <qualified-type-def type-id='e475fb88' restrict='yes' id='5a8729d0'/> + <qualified-type-def type-id='781a52d7' const='yes' id='413ab2b8'/> + <pointer-type-def type-id='413ab2b8' size-in-bits='64' id='41671bd6'/> + <qualified-type-def type-id='acbdbcc6' const='yes' id='4ba62af7'/> + <pointer-type-def type-id='4ba62af7' size-in-bits='64' id='f39579e7'/> + <qualified-type-def type-id='f39579e7' restrict='yes' id='9b23e165'/> + <pointer-type-def type-id='c70fa2e8' size-in-bits='64' id='2e711a2a'/> + <pointer-type-def type-id='3ff5601b' size-in-bits='64' id='4aafb922'/> + <pointer-type-def type-id='acbdbcc6' size-in-bits='64' id='116842ac'/> + <qualified-type-def type-id='116842ac' restrict='yes' id='3d3c4cf4'/> <pointer-type-def type-id='9e59d1d4' size-in-bits='64' id='4ea84b4f'/> <pointer-type-def type-id='945467e6' size-in-bits='64' id='8def7735'/> + <pointer-type-def type-id='519bc206' size-in-bits='64' id='ef2f159c'/> + <qualified-type-def type-id='ef2f159c' restrict='yes' id='de0eb5a4'/> <pointer-type-def type-id='3d3ffb69' size-in-bits='64' id='72a26210'/> + <pointer-type-def type-id='c9d12d66' size-in-bits='64' id='b2eb2c3f'/> + <pointer-type-def type-id='b07ae406' size-in-bits='64' id='36e89359'/> + <qualified-type-def type-id='36e89359' restrict='yes' id='de98c2bb'/> + <pointer-type-def type-id='a9c79a1f' size-in-bits='64' id='3d83ba87'/> + <pointer-type-def type-id='4d39af59' size-in-bits='64' id='60db3356'/> + <pointer-type-def type-id='f1abb096' size-in-bits='64' id='5f147c28'/> + <pointer-type-def type-id='39730d0b' size-in-bits='64' id='c24fc2ee'/> + <function-decl name='nvlist_print' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='822cd80b'/> + <parameter type-id='5ce45b60'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='zfs_get_pool_handle' mangled-name='zfs_get_pool_handle' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_get_pool_handle'> + <parameter type-id='fcd57163'/> + <return type-id='4c81de99'/> + </function-decl> + <function-decl name='lzc_send_wrapper' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='2e711a2a'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='eaa32e2f'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_send_redacted' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='bfbd3c8e'/> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_send_resume_redacted' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='bfbd3c8e'/> + <parameter type-id='9c313c2d'/> + <parameter type-id='9c313c2d'/> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_receive_with_cmdprops' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='5ce45b60'/> + <parameter type-id='5ce45b60'/> + <parameter type-id='ae3e8ca6'/> + <parameter type-id='3502e3ff'/> + <parameter type-id='80f4b756'/> + <parameter type-id='c19b74c3'/> + <parameter type-id='c19b74c3'/> + <parameter type-id='c19b74c3'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='41671bd6'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='5d6479ae'/> + <parameter type-id='5d6479ae'/> + <parameter type-id='5d6479ae'/> + <parameter type-id='857bb57e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_receive_with_heal' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='5ce45b60'/> + <parameter type-id='5ce45b60'/> + <parameter type-id='ae3e8ca6'/> + <parameter type-id='3502e3ff'/> + <parameter type-id='80f4b756'/> + <parameter type-id='c19b74c3'/> + <parameter type-id='c19b74c3'/> + <parameter type-id='c19b74c3'/> + <parameter type-id='c19b74c3'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='41671bd6'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='5d6479ae'/> + <parameter type-id='5d6479ae'/> + <parameter type-id='5d6479ae'/> + <parameter type-id='857bb57e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_send_space' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <parameter type-id='bfbd3c8e'/> + <parameter type-id='5d6479ae'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_send_space_resume_redacted' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <parameter type-id='bfbd3c8e'/> + <parameter type-id='9c313c2d'/> + <parameter type-id='9c313c2d'/> + <parameter type-id='9c313c2d'/> + <parameter type-id='80f4b756'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='5d6479ae'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_rename' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_setproctitle' mangled-name='zfs_setproctitle' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_setproctitle'> + <parameter type-id='80f4b756'/> + <parameter is-variadic='yes'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='avl_insert' mangled-name='avl_insert' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_insert'> + <parameter type-id='a3681dea'/> + <parameter type-id='eaa32e2f'/> + <parameter type-id='fba6cb51'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='nvlist_add_boolean' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_boolean' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='22cce67b'/> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvpair_value_int32' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='dace003f'/> + <parameter type-id='4aafb922'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='fnvlist_size' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='fnvlist_merge' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='5ce45b60'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_remove' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_lookup_boolean_value' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='22cce67b'/> + <parameter type-id='80f4b756'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='fletcher_4_native_varsize' mangled-name='fletcher_4_native_varsize' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fletcher_4_native_varsize'> + <parameter type-id='eaa32e2f'/> + <parameter type-id='9c313c2d'/> + <parameter type-id='c24fc2ee'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fletcher_4_incremental_native' mangled-name='fletcher_4_incremental_native' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fletcher_4_incremental_native'> + <parameter type-id='eaa32e2f'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='eaa32e2f'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='fletcher_4_incremental_byteswap' mangled-name='fletcher_4_incremental_byteswap' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fletcher_4_incremental_byteswap'> + <parameter type-id='eaa32e2f'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='eaa32e2f'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='pthread_exit' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='eaa32e2f'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='__pthread_register_cancel' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='ba7c727c'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='__pthread_unwind_next' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='ba7c727c'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='sigaddset' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='9e80f729'/> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='perror' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='strndup' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='b59d7dce'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='time' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b2eb2c3f'/> + <return type-id='c9d12d66'/> + </function-decl> + <function-decl name='clock_gettime' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='a1c3b834'/> + <parameter type-id='3d83ba87'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='timer_create' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='a1c3b834'/> + <parameter type-id='de0eb5a4'/> + <parameter type-id='de98c2bb'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='timer_delete' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b07ae406'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='timer_settime' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b07ae406'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='9b23e165'/> + <parameter type-id='3d3c4cf4'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='write' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter type-id='eaa32e2f'/> + <parameter type-id='b59d7dce'/> + <return type-id='79a0948f'/> + </function-decl> + <function-decl name='pause' visibility='default' binding='global' size-in-bits='64'> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='pthread_sigmask' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter type-id='5a8729d0'/> + <parameter type-id='65e6ec45'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='uncompress' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='4c667223'/> + <parameter type-id='60db3356'/> + <parameter type-id='e8cb3e0e'/> + <parameter type-id='5bbcce85'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='create_parents' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b0382bb3'/> + <parameter type-id='26a90f95'/> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> <function-decl name='zfs_send_progress' mangled-name='zfs_send_progress' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_send_progress'> <parameter type-id='9200a744' name='zhp'/> <parameter type-id='95e97e5e' name='fd'/> @@ -4837,78 +7984,48 @@ <parameter type-id='a3681dea' name='stream_avl'/> <return type-id='95e97e5e'/> </function-decl> + <function-type size-in-bits='64' id='c70fa2e8'> + <parameter type-id='95e97e5e'/> + <parameter type-id='eaa32e2f'/> + <return type-id='95e97e5e'/> + </function-type> <function-type size-in-bits='64' id='d2a5e211'> <parameter type-id='9200a744'/> <parameter type-id='eaa32e2f'/> <return type-id='c19b74c3'/> </function-type> + <function-type size-in-bits='64' id='f1abb096'> + <parameter type-id='eabacd01'/> + <return type-id='48b5725f'/> + </function-type> </abi-instr> - <abi-instr address-size='64' path='libzfs_status.c' language='LANG_C99'> - <enum-decl name='zpool_status_t' naming-typedef-id='d3dd6294' id='5e770b40'> - <underlying-type type-id='9cac1fee'/> - <enumerator name='ZPOOL_STATUS_CORRUPT_CACHE' value='0'/> - <enumerator name='ZPOOL_STATUS_MISSING_DEV_R' value='1'/> - <enumerator name='ZPOOL_STATUS_MISSING_DEV_NR' value='2'/> - <enumerator name='ZPOOL_STATUS_CORRUPT_LABEL_R' value='3'/> - <enumerator name='ZPOOL_STATUS_CORRUPT_LABEL_NR' value='4'/> - <enumerator name='ZPOOL_STATUS_BAD_GUID_SUM' value='5'/> - <enumerator name='ZPOOL_STATUS_CORRUPT_POOL' value='6'/> - <enumerator name='ZPOOL_STATUS_CORRUPT_DATA' value='7'/> - <enumerator name='ZPOOL_STATUS_FAILING_DEV' value='8'/> - <enumerator name='ZPOOL_STATUS_VERSION_NEWER' value='9'/> - <enumerator name='ZPOOL_STATUS_HOSTID_MISMATCH' value='10'/> - <enumerator name='ZPOOL_STATUS_HOSTID_ACTIVE' value='11'/> - <enumerator name='ZPOOL_STATUS_HOSTID_REQUIRED' value='12'/> - <enumerator name='ZPOOL_STATUS_IO_FAILURE_WAIT' value='13'/> - <enumerator name='ZPOOL_STATUS_IO_FAILURE_CONTINUE' value='14'/> - <enumerator name='ZPOOL_STATUS_IO_FAILURE_MMP' value='15'/> - <enumerator name='ZPOOL_STATUS_BAD_LOG' value='16'/> - <enumerator name='ZPOOL_STATUS_ERRATA' value='17'/> - <enumerator name='ZPOOL_STATUS_UNSUP_FEAT_READ' value='18'/> - <enumerator name='ZPOOL_STATUS_UNSUP_FEAT_WRITE' value='19'/> - <enumerator name='ZPOOL_STATUS_FAULTED_DEV_R' value='20'/> - <enumerator name='ZPOOL_STATUS_FAULTED_DEV_NR' value='21'/> - <enumerator name='ZPOOL_STATUS_VERSION_OLDER' value='22'/> - <enumerator name='ZPOOL_STATUS_FEAT_DISABLED' value='23'/> - <enumerator name='ZPOOL_STATUS_RESILVERING' value='24'/> - <enumerator name='ZPOOL_STATUS_OFFLINE_DEV' value='25'/> - <enumerator name='ZPOOL_STATUS_REMOVED_DEV' value='26'/> - <enumerator name='ZPOOL_STATUS_REBUILDING' value='27'/> - <enumerator name='ZPOOL_STATUS_REBUILD_SCRUB' value='28'/> - <enumerator name='ZPOOL_STATUS_NON_NATIVE_ASHIFT' value='29'/> - <enumerator name='ZPOOL_STATUS_COMPATIBILITY_ERR' value='30'/> - <enumerator name='ZPOOL_STATUS_INCOMPATIBLE_FEAT' value='31'/> - <enumerator name='ZPOOL_STATUS_OK' value='32'/> - </enum-decl> - <typedef-decl name='zpool_status_t' type-id='5e770b40' id='d3dd6294'/> - <enum-decl name='zpool_errata' id='d9abbf54'> - <underlying-type type-id='9cac1fee'/> - <enumerator name='ZPOOL_ERRATA_NONE' value='0'/> - <enumerator name='ZPOOL_ERRATA_ZOL_2094_SCRUB' value='1'/> - <enumerator name='ZPOOL_ERRATA_ZOL_2094_ASYNC_DESTROY' value='2'/> - <enumerator name='ZPOOL_ERRATA_ZOL_6845_ENCRYPTION' value='3'/> - <enumerator name='ZPOOL_ERRATA_ZOL_8308_ENCRYPTION' value='4'/> - </enum-decl> - <typedef-decl name='zpool_errata_t' type-id='d9abbf54' id='688c495b'/> - <pointer-type-def type-id='688c495b' size-in-bits='64' id='cec6f2e4'/> - <function-decl name='zpool_get_status' mangled-name='zpool_get_status' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_get_status'> - <parameter type-id='4c81de99' name='zhp'/> - <parameter type-id='9b23c9ad' name='msgid'/> - <parameter type-id='cec6f2e4' name='errata'/> - <return type-id='d3dd6294'/> - </function-decl> + <abi-instr address-size='64' path='lib/libzfs/libzfs_status.c' language='LANG_C99'> <function-decl name='zpool_import_status' mangled-name='zpool_import_status' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_import_status'> <parameter type-id='5ce45b60' name='config'/> - <parameter type-id='9b23c9ad' name='msgid'/> + <parameter type-id='7d3cd834' name='msgid'/> <parameter type-id='cec6f2e4' name='errata'/> <return type-id='d3dd6294'/> </function-decl> </abi-instr> - <abi-instr address-size='64' path='libzfs_util.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libzfs/libzfs_util.c' language='LANG_C99'> + <class-decl name='__va_list_tag' size-in-bits='192' is-struct='yes' visibility='default' id='d5027220'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='gp_offset' type-id='f0981eeb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='fp_offset' type-id='f0981eeb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='overflow_arg_area' type-id='eaa32e2f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='reg_save_area' type-id='eaa32e2f' visibility='default'/> + </data-member> + </class-decl> + <type-decl name='double' size-in-bits='64' id='a0eb0f08'/> <array-type-def dimensions='1' type-id='95e97e5e' size-in-bits='192' id='e41bdf22'> <subrange length='6' type-id='7359adad' id='52fa524b'/> </array-type-def> - <type-decl name='variadic parameter type' id='2c1145c5'/> <array-type-def dimensions='1' type-id='19cefcee' size-in-bits='160' alignment-in-bits='32' id='3fcf57d2'> <subrange length='5' type-id='7359adad' id='53010e10'/> </array-type-def> @@ -4922,7 +8039,19 @@ <enumerator name='GET_COL_SOURCE' value='5'/> </enum-decl> <typedef-decl name='zfs_get_column_t' type-id='223bdcaa' id='19cefcee'/> - <class-decl name='zprop_get_cbdata' size-in-bits='640' is-struct='yes' visibility='default' id='f3d3c319'> + <class-decl name='vdev_cbdata' size-in-bits='192' is-struct='yes' visibility='default' id='b8006be8'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='cb_name_flags' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='cb_names' type-id='9b23c9ad' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='cb_names_count' type-id='f0981eeb' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='vdev_cbdata_t' type-id='b8006be8' id='a9679c94'/> + <class-decl name='zprop_get_cbdata' size-in-bits='960' is-struct='yes' visibility='default' id='f3d3c319'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='cb_sources' type-id='95e97e5e' visibility='default'/> </data-member> @@ -4941,18 +8070,357 @@ <data-member access='public' layout-offset-in-bits='448'> <var-decl name='cb_first' type-id='c19b74c3' visibility='default'/> </data-member> + <data-member access='public' layout-offset-in-bits='480'> + <var-decl name='cb_json' type-id='c19b74c3' visibility='default'/> + </data-member> <data-member access='public' layout-offset-in-bits='512'> <var-decl name='cb_proplist' type-id='3a9b2288' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='576'> <var-decl name='cb_type' type-id='2e45de5d' visibility='default'/> </data-member> + <data-member access='public' layout-offset-in-bits='640'> + <var-decl name='cb_vdevs' type-id='a9679c94' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='832'> + <var-decl name='cb_jsobj' type-id='5ce45b60' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='896'> + <var-decl name='cb_json_as_int' type-id='c19b74c3' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='928'> + <var-decl name='cb_json_pool_key_guid' type-id='c19b74c3' visibility='default'/> + </data-member> </class-decl> <typedef-decl name='zprop_get_cbdata_t' type-id='f3d3c319' id='f3d87113'/> <typedef-decl name='zprop_func' type-id='2e711a2a' id='1ec3747a'/> + <enum-decl name='zprop_attr_t' naming-typedef-id='999701cc' id='77d05200'> + <underlying-type type-id='9cac1fee'/> + <enumerator name='PROP_DEFAULT' value='0'/> + <enumerator name='PROP_READONLY' value='1'/> + <enumerator name='PROP_INHERIT' value='2'/> + <enumerator name='PROP_ONETIME' value='3'/> + <enumerator name='PROP_ONETIME_DEFAULT' value='4'/> + </enum-decl> + <typedef-decl name='zprop_attr_t' type-id='77d05200' id='999701cc'/> + <class-decl name='zfs_index' size-in-bits='128' is-struct='yes' visibility='default' id='87957af9'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='pi_name' type-id='80f4b756' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='pi_value' type-id='9c313c2d' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='zprop_index_t' type-id='87957af9' id='64636ce3'/> + <class-decl name='zprop_desc_t' size-in-bits='640' is-struct='yes' naming-typedef-id='ffa52b96' visibility='default' id='bbff5e4b'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='pd_name' type-id='80f4b756' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='pd_propnum' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='pd_proptype' type-id='31429eff' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='pd_strdefault' type-id='80f4b756' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='pd_numdefault' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='pd_attr' type-id='999701cc' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='288'> + <var-decl name='pd_types' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='pd_values' type-id='80f4b756' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='pd_colname' type-id='80f4b756' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='pd_rightalign' type-id='c19b74c3' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='449'> + <var-decl name='pd_visible' type-id='c19b74c3' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='450'> + <var-decl name='pd_zfs_mod_supported' type-id='c19b74c3' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='451'> + <var-decl name='pd_always_flex' type-id='c19b74c3' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='pd_table' type-id='c8bc397b' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='pd_table_size' type-id='b59d7dce' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='zprop_desc_t' type-id='bbff5e4b' id='ffa52b96'/> + <class-decl name='extmnttab' size-in-bits='320' is-struct='yes' visibility='default' id='0c544dc0'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='mnt_special' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='mnt_mountp' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='mnt_fstype' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='mnt_mntopts' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='mnt_major' type-id='3502e3ff' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='288'> + <var-decl name='mnt_minor' type-id='3502e3ff' visibility='default'/> + </data-member> + </class-decl> + <pointer-type-def type-id='d5027220' size-in-bits='64' id='b7f2d5e6'/> + <qualified-type-def type-id='26a90f95' const='yes' id='57de658a'/> + <pointer-type-def type-id='57de658a' size-in-bits='64' id='f319fae0'/> <pointer-type-def type-id='9b23c9ad' size-in-bits='64' id='c0563f85'/> - <pointer-type-def type-id='c70fa2e8' size-in-bits='64' id='2e711a2a'/> + <qualified-type-def type-id='33f57a65' const='yes' id='21fd6035'/> + <pointer-type-def type-id='21fd6035' size-in-bits='64' id='a0de50cd'/> + <pointer-type-def type-id='a0de50cd' size-in-bits='64' id='24f95ba5'/> + <qualified-type-def type-id='64636ce3' const='yes' id='072f7953'/> + <pointer-type-def type-id='072f7953' size-in-bits='64' id='c8bc397b'/> + <pointer-type-def type-id='0c544dc0' size-in-bits='64' id='394fc496'/> + <pointer-type-def type-id='aca3bac8' size-in-bits='64' id='d33f11cb'/> + <qualified-type-def type-id='d33f11cb' restrict='yes' id='5c53ba29'/> + <pointer-type-def type-id='ffa52b96' size-in-bits='64' id='76c8174b'/> <pointer-type-def type-id='f3d87113' size-in-bits='64' id='0d2a0670'/> + <function-decl name='nvlist_print_json' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='822cd80b'/> + <parameter type-id='5ce45b60'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zpool_label_disk' mangled-name='zpool_label_disk' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_label_disk'> + <parameter type-id='b0382bb3'/> + <parameter type-id='4c81de99'/> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_version_kernel' mangled-name='zfs_version_kernel' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_version_kernel'> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='libzfs_core_init' visibility='default' binding='global' size-in-bits='64'> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='libzfs_core_fini' visibility='default' binding='global' size-in-bits='64'> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='zfs_get_underlying_path' mangled-name='zfs_get_underlying_path' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_get_underlying_path'> + <parameter type-id='80f4b756'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='zpool_prop_unsupported' mangled-name='zpool_prop_unsupported' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_unsupported'> + <parameter type-id='80f4b756'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='zpool_feature_init' mangled-name='zpool_feature_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_feature_init'> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fletcher_4_init' mangled-name='fletcher_4_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fletcher_4_init'> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fletcher_4_fini' mangled-name='fletcher_4_fini' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fletcher_4_fini'> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='zfs_prop_init' mangled-name='zfs_prop_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_init'> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='zfs_prop_get_table' mangled-name='zfs_prop_get_table' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_get_table'> + <return type-id='76c8174b'/> + </function-decl> + <function-decl name='zpool_prop_init' mangled-name='zpool_prop_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_init'> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='zpool_prop_get_table' mangled-name='zpool_prop_get_table' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_get_table'> + <return type-id='76c8174b'/> + </function-decl> + <function-decl name='vdev_prop_init' mangled-name='vdev_prop_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vdev_prop_init'> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='zprop_iter_common' mangled-name='zprop_iter_common' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_iter_common'> + <parameter type-id='1ec3747a'/> + <parameter type-id='eaa32e2f'/> + <parameter type-id='c19b74c3'/> + <parameter type-id='c19b74c3'/> + <parameter type-id='2e45de5d'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zprop_name_to_prop' mangled-name='zprop_name_to_prop' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_name_to_prop'> + <parameter type-id='80f4b756'/> + <parameter type-id='2e45de5d'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zprop_string_to_index' mangled-name='zprop_string_to_index' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_string_to_index'> + <parameter type-id='95e97e5e'/> + <parameter type-id='80f4b756'/> + <parameter type-id='5d6479ae'/> + <parameter type-id='2e45de5d'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zprop_values' mangled-name='zprop_values' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_values'> + <parameter type-id='95e97e5e'/> + <parameter type-id='2e45de5d'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='zprop_width' mangled-name='zprop_width' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_width'> + <parameter type-id='95e97e5e'/> + <parameter type-id='37e3bd22'/> + <parameter type-id='2e45de5d'/> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='zprop_valid_for_type' mangled-name='zprop_valid_for_type' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_valid_for_type'> + <parameter type-id='95e97e5e'/> + <parameter type-id='2e45de5d'/> + <parameter type-id='c19b74c3'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='getextmntent' mangled-name='getextmntent' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='getextmntent'> + <parameter type-id='80f4b756'/> + <parameter type-id='394fc496'/> + <parameter type-id='62f7a03d'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='__ctype_toupper_loc' visibility='default' binding='global' size-in-bits='64'> + <return type-id='24f95ba5'/> + </function-decl> + <function-decl name='dlclose' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='eaa32e2f'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='regcomp' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5c53ba29'/> + <parameter type-id='9d26089a'/> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='regfree' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='d33f11cb'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='putc' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter type-id='822cd80b'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='puts' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='strtod' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='9d26089a'/> + <parameter type-id='8c85230f'/> + <return type-id='a0eb0f08'/> + </function-decl> + <function-decl name='realloc' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='eaa32e2f'/> + <parameter type-id='b59d7dce'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='exit' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='strspn' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='strnlen' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='b59d7dce'/> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='strncasecmp' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <parameter type-id='b59d7dce'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='access' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='dup2' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='execve' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='f319fae0'/> + <parameter type-id='f319fae0'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='execv' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='f319fae0'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='execvp' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='f319fae0'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='execvpe' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='f319fae0'/> + <parameter type-id='f319fae0'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='_exit' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='setpgid' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='3629bad8'/> + <parameter type-id='3629bad8'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='fork' visibility='default' binding='global' size-in-bits='64'> + <return type-id='3629bad8'/> + </function-decl> + <function-decl name='pow' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='a0eb0f08'/> + <parameter type-id='a0eb0f08'/> + <return type-id='a0eb0f08'/> + </function-decl> + <function-decl name='__vfprintf_chk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='e75a27e9'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='9d26089a'/> + <parameter type-id='b7f2d5e6'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='__vasprintf_chk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='8c85230f'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='9d26089a'/> + <parameter type-id='b7f2d5e6'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='waitpid' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='3629bad8'/> + <parameter type-id='7292109c'/> + <parameter type-id='95e97e5e'/> + <return type-id='3629bad8'/> + </function-decl> + <function-decl name='namespace_clear' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b0382bb3'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='libzfs_load_module' visibility='default' binding='global' size-in-bits='64'> + <return type-id='95e97e5e'/> + </function-decl> <function-decl name='libzfs_errno' mangled-name='libzfs_errno' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libzfs_errno'> <parameter type-id='b0382bb3' name='hdl'/> <return type-id='95e97e5e'/> @@ -4965,12 +8433,6 @@ <parameter type-id='b0382bb3' name='hdl'/> <return type-id='80f4b756'/> </function-decl> - <function-decl name='zfs_standard_error' mangled-name='zfs_standard_error' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_standard_error'> - <parameter type-id='b0382bb3' name='hdl'/> - <parameter type-id='95e97e5e' name='error'/> - <parameter type-id='80f4b756' name='msg'/> - <return type-id='95e97e5e'/> - </function-decl> <function-decl name='libzfs_print_on_error' mangled-name='libzfs_print_on_error' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libzfs_print_on_error'> <parameter type-id='b0382bb3' name='hdl'/> <parameter type-id='c19b74c3' name='printerr'/> @@ -5003,10 +8465,6 @@ <parameter type-id='95e97e5e' name='count'/> <return type-id='48b5725f'/> </function-decl> - <function-decl name='libzfs_envvar_is_set' mangled-name='libzfs_envvar_is_set' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libzfs_envvar_is_set'> - <parameter type-id='26a90f95' name='envvar'/> - <return type-id='95e97e5e'/> - </function-decl> <function-decl name='libzfs_init' mangled-name='libzfs_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libzfs_init'> <return type-id='b0382bb3'/> </function-decl> @@ -5014,24 +8472,26 @@ <parameter type-id='b0382bb3' name='hdl'/> <return type-id='48b5725f'/> </function-decl> - <function-decl name='zpool_get_handle' mangled-name='zpool_get_handle' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_get_handle'> - <parameter type-id='4c81de99' name='zhp'/> - <return type-id='b0382bb3'/> - </function-decl> - <function-decl name='zfs_get_handle' mangled-name='zfs_get_handle' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_get_handle'> - <parameter type-id='9200a744' name='zhp'/> - <return type-id='b0382bb3'/> - </function-decl> - <function-decl name='zfs_get_pool_handle' mangled-name='zfs_get_pool_handle' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_get_pool_handle'> - <parameter type-id='fcd57163' name='zhp'/> - <return type-id='4c81de99'/> - </function-decl> <function-decl name='zfs_path_to_zhandle' mangled-name='zfs_path_to_zhandle' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_path_to_zhandle'> <parameter type-id='b0382bb3' name='hdl'/> <parameter type-id='80f4b756' name='path'/> <parameter type-id='2e45de5d' name='argtype'/> <return type-id='9200a744'/> </function-decl> + <function-decl name='zcmd_print_json' mangled-name='zcmd_print_json' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zcmd_print_json'> + <parameter type-id='5ce45b60' name='nvl'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='zprop_nvlist_one_property' mangled-name='zprop_nvlist_one_property' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_nvlist_one_property'> + <parameter type-id='80f4b756' name='propname'/> + <parameter type-id='80f4b756' name='value'/> + <parameter type-id='a2256d42' name='sourcetype'/> + <parameter type-id='80f4b756' name='source'/> + <parameter type-id='80f4b756' name='recvd_value'/> + <parameter type-id='5ce45b60' name='nvl'/> + <parameter type-id='c19b74c3' name='as_int'/> + <return type-id='95e97e5e'/> + </function-decl> <function-decl name='zprop_print_one_property' mangled-name='zprop_print_one_property' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_print_one_property'> <parameter type-id='80f4b756' name='name'/> <parameter type-id='0d2a0670' name='cbp'/> @@ -5042,10 +8502,15 @@ <parameter type-id='80f4b756' name='recvd_value'/> <return type-id='48b5725f'/> </function-decl> - <function-decl name='zfs_nicestrtonum' mangled-name='zfs_nicestrtonum' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_nicestrtonum'> - <parameter type-id='b0382bb3' name='hdl'/> + <function-decl name='zprop_collect_property' mangled-name='zprop_collect_property' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_collect_property'> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='0d2a0670' name='cbp'/> + <parameter type-id='80f4b756' name='propname'/> <parameter type-id='80f4b756' name='value'/> - <parameter type-id='5d6479ae' name='num'/> + <parameter type-id='a2256d42' name='sourcetype'/> + <parameter type-id='80f4b756' name='source'/> + <parameter type-id='80f4b756' name='recvd_value'/> + <parameter type-id='5ce45b60' name='nvl'/> <return type-id='95e97e5e'/> </function-decl> <function-decl name='zprop_get_list' mangled-name='zprop_get_list' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_get_list'> @@ -5068,36 +8533,75 @@ <return type-id='95e97e5e'/> </function-decl> <function-decl name='zfs_version_userland' mangled-name='zfs_version_userland' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_version_userland'> - <parameter type-id='26a90f95' name='version'/> - <parameter type-id='95e97e5e' name='len'/> - <return type-id='48b5725f'/> + <return type-id='80f4b756'/> </function-decl> <function-decl name='zfs_version_print' mangled-name='zfs_version_print' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_version_print'> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='color_start' mangled-name='color_start' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='color_start'> - <parameter type-id='26a90f95' name='color'/> - <return type-id='48b5725f'/> + <function-decl name='zfs_version_nvlist' mangled-name='zfs_version_nvlist' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_version_nvlist'> + <return type-id='5ce45b60'/> </function-decl> - <function-decl name='color_end' mangled-name='color_end' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='color_end'> - <return type-id='48b5725f'/> + <function-decl name='use_color' mangled-name='use_color' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='use_color'> + <return type-id='95e97e5e'/> </function-decl> <function-decl name='printf_color' mangled-name='printf_color' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='printf_color'> - <parameter type-id='26a90f95' name='color'/> - <parameter type-id='26a90f95' name='format'/> + <parameter type-id='80f4b756' name='color'/> + <parameter type-id='80f4b756' name='format'/> <parameter is-variadic='yes'/> <return type-id='95e97e5e'/> </function-decl> - <function-type size-in-bits='64' id='c70fa2e8'> - <parameter type-id='95e97e5e'/> - <parameter type-id='eaa32e2f'/> + <function-decl name='zpool_vdev_script_alloc_env' mangled-name='zpool_vdev_script_alloc_env' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_vdev_script_alloc_env'> + <parameter type-id='80f4b756' name='pool_name'/> + <parameter type-id='80f4b756' name='vdev_path'/> + <parameter type-id='80f4b756' name='vdev_upath'/> + <parameter type-id='80f4b756' name='vdev_enc_sysfs_path'/> + <parameter type-id='80f4b756' name='opt_key'/> + <parameter type-id='80f4b756' name='opt_val'/> + <return type-id='9b23c9ad'/> + </function-decl> + <function-decl name='zpool_vdev_script_free_env' mangled-name='zpool_vdev_script_free_env' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_vdev_script_free_env'> + <parameter type-id='9b23c9ad' name='env'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='zpool_prepare_disk' mangled-name='zpool_prepare_disk' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prepare_disk'> + <parameter type-id='4c81de99' name='zhp'/> + <parameter type-id='5ce45b60' name='vdev_nv'/> + <parameter type-id='80f4b756' name='prepare_str'/> + <parameter type-id='c0563f85' name='lines'/> + <parameter type-id='7292109c' name='lines_cnt'/> <return type-id='95e97e5e'/> - </function-type> + </function-decl> + <function-decl name='zpool_prepare_and_label_disk' mangled-name='zpool_prepare_and_label_disk' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prepare_and_label_disk'> + <parameter type-id='b0382bb3' name='hdl'/> + <parameter type-id='4c81de99' name='zhp'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='5ce45b60' name='vdev_nv'/> + <parameter type-id='80f4b756' name='prepare_str'/> + <parameter type-id='c0563f85' name='lines'/> + <parameter type-id='7292109c' name='lines_cnt'/> + <return type-id='95e97e5e'/> + </function-decl> </abi-instr> - <abi-instr address-size='64' path='os/linux/libzfs_mount_os.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libzfs/os/linux/libzfs_mount_os.c' language='LANG_C99'> <pointer-type-def type-id='7359adad' size-in-bits='64' id='1d2c2b85'/> + <function-decl name='geteuid' visibility='default' binding='global' size-in-bits='64'> + <return type-id='cc5fcceb'/> + </function-decl> + <function-decl name='mount' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <parameter type-id='7359adad'/> + <parameter type-id='eaa32e2f'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='umount2' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> <function-decl name='zfs_parse_mount_options' mangled-name='zfs_parse_mount_options' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_parse_mount_options'> - <parameter type-id='26a90f95' name='mntopts'/> + <parameter type-id='80f4b756' name='mntopts'/> <parameter type-id='1d2c2b85' name='mntflags'/> <parameter type-id='1d2c2b85' name='zfsflags'/> <parameter type-id='95e97e5e' name='sloppy'/> @@ -5115,290 +8619,243 @@ <function-decl name='zfs_mount_delegation_check' mangled-name='zfs_mount_delegation_check' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_mount_delegation_check'> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='zpool_disable_datasets_os' mangled-name='zpool_disable_datasets_os' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_disable_datasets_os'> - <parameter type-id='4c81de99' name='zhp'/> - <parameter type-id='c19b74c3' name='force'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='zpool_disable_volume_os' mangled-name='zpool_disable_volume_os' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_disable_volume_os'> - <parameter type-id='80f4b756' name='name'/> - <return type-id='48b5725f'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='os/linux/libzfs_pool_os.c' language='LANG_C99'> - <function-decl name='zpool_label_disk' mangled-name='zpool_label_disk' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_label_disk'> - <parameter type-id='b0382bb3' name='hdl'/> - <parameter type-id='4c81de99' name='zhp'/> - <parameter type-id='80f4b756' name='name'/> - <return type-id='95e97e5e'/> - </function-decl> </abi-instr> - <abi-instr address-size='64' path='os/linux/libzfs_util_os.c' language='LANG_C99'> - <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='32768' id='d16c6df4'> - <subrange length='4096' type-id='7359adad' id='bc1b5ddc'/> + <abi-instr address-size='64' path='lib/libzfs/os/linux/libzfs_pool_os.c' language='LANG_C99'> + <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='288' id='16e6f2c6'> + <subrange length='36' type-id='7359adad' id='ae666bde'/> </array-type-def> - <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='65536' id='163f6aa5'> - <subrange length='8192' type-id='7359adad' id='c88f397d'/> + <array-type-def dimensions='1' type-id='a65ae39c' size-in-bits='960' id='fa198beb'> + <subrange length='1' type-id='7359adad' id='52f813b4'/> </array-type-def> - <array-type-def dimensions='1' type-id='9c313c2d' size-in-bits='128' id='c1c22e6c'> - <subrange length='2' type-id='7359adad' id='52efc4ef'/> + <array-type-def dimensions='1' type-id='3502e3ff' size-in-bits='384' id='dba89ba3'> + <subrange length='12' type-id='7359adad' id='84827bdc'/> </array-type-def> - <array-type-def dimensions='1' type-id='b96825af' size-in-bits='24' id='d3490169'> - <subrange length='3' type-id='7359adad' id='56f209d2'/> + <array-type-def dimensions='1' type-id='3502e3ff' size-in-bits='256' id='01d84ed4'> + <subrange length='8' type-id='7359adad' id='56e0c0b1'/> </array-type-def> - <class-decl name='drr_begin' size-in-bits='2432' is-struct='yes' visibility='default' id='09fcdc01'> + <class-decl name='dk_part' size-in-bits='960' is-struct='yes' visibility='default' id='a65ae39c'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='drr_magic' type-id='9c313c2d' visibility='default'/> + <var-decl name='p_start' type-id='804dc465' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='drr_versioninfo' type-id='9c313c2d' visibility='default'/> + <var-decl name='p_size' type-id='804dc465' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='drr_creation_time' type-id='9c313c2d' visibility='default'/> + <var-decl name='p_guid' type-id='214f32ea' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='drr_type' type-id='230f1e16' visibility='default'/> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='p_tag' type-id='d908a348' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='224'> - <var-decl name='drr_flags' type-id='8f92235e' visibility='default'/> + <data-member access='public' layout-offset-in-bits='272'> + <var-decl name='p_flag' type-id='d908a348' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='drr_toguid' type-id='9c313c2d' visibility='default'/> + <data-member access='public' layout-offset-in-bits='288'> + <var-decl name='p_name' type-id='16e6f2c6' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='drr_fromguid' type-id='9c313c2d' visibility='default'/> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='p_uguid' type-id='214f32ea' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='drr_toname' type-id='d1617432' visibility='default'/> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='p_resv' type-id='01d84ed4' visibility='default'/> </data-member> </class-decl> - <class-decl name='zinject_record' size-in-bits='2816' is-struct='yes' visibility='default' id='3216f820'> + <class-decl name='dk_gpt' size-in-bits='1920' is-struct='yes' visibility='default' id='dd4a2e5a'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='zi_objset' type-id='9c313c2d' visibility='default'/> + <var-decl name='efi_version' type-id='3502e3ff' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='efi_nparts' type-id='3502e3ff' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='zi_object' type-id='9c313c2d' visibility='default'/> + <var-decl name='efi_part_size' type-id='3502e3ff' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='efi_lbasize' type-id='3502e3ff' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='zi_start' type-id='9c313c2d' visibility='default'/> + <var-decl name='efi_last_lba' type-id='804dc465' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='zi_end' type-id='9c313c2d' visibility='default'/> + <var-decl name='efi_first_u_lba' type-id='804dc465' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='zi_guid' type-id='9c313c2d' visibility='default'/> + <var-decl name='efi_last_u_lba' type-id='804dc465' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='zi_level' type-id='8f92235e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='352'> - <var-decl name='zi_error' type-id='8f92235e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='zi_type' type-id='9c313c2d' visibility='default'/> + <var-decl name='efi_disk_uguid' type-id='214f32ea' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='zi_freq' type-id='8f92235e' visibility='default'/> + <var-decl name='efi_flags' type-id='3502e3ff' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='480'> - <var-decl name='zi_failfast' type-id='8f92235e' visibility='default'/> + <var-decl name='efi_reserved1' type-id='3502e3ff' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='zi_func' type-id='d1617432' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2560'> - <var-decl name='zi_iotype' type-id='8f92235e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2592'> - <var-decl name='zi_duration' type-id='3ff5601b' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2624'> - <var-decl name='zi_timer' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2688'> - <var-decl name='zi_nlanes' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2752'> - <var-decl name='zi_cmd' type-id='8f92235e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2784'> - <var-decl name='zi_dvas' type-id='8f92235e' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='zinject_record_t' type-id='3216f820' id='a4301ca6'/> - <class-decl name='zfs_share' size-in-bits='256' is-struct='yes' visibility='default' id='feb6f2da'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='z_exportdata' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='z_sharedata' type-id='9c313c2d' visibility='default'/> + <var-decl name='efi_altern_lba' type-id='804dc465' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='z_sharetype' type-id='9c313c2d' visibility='default'/> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='efi_reserved' type-id='dba89ba3' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='z_sharemax' type-id='9c313c2d' visibility='default'/> + <data-member access='public' layout-offset-in-bits='960'> + <var-decl name='efi_parts' type-id='fa198beb' visibility='default'/> </data-member> </class-decl> - <typedef-decl name='zfs_share_t' type-id='feb6f2da' id='ee5cec36'/> - <class-decl name='zfs_cmd' size-in-bits='109952' is-struct='yes' visibility='default' id='3522cd69'> + <class-decl name='uuid' size-in-bits='128' is-struct='yes' visibility='default' id='214f32ea'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='zc_name' type-id='d16c6df4' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32768'> - <var-decl name='zc_nvlist_src' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32832'> - <var-decl name='zc_nvlist_src_size' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32896'> - <var-decl name='zc_nvlist_dst' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32960'> - <var-decl name='zc_nvlist_dst_size' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='33024'> - <var-decl name='zc_nvlist_dst_filled' type-id='c19b74c3' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='33056'> - <var-decl name='zc_pad2' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='33088'> - <var-decl name='zc_history' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='33152'> - <var-decl name='zc_value' type-id='163f6aa5' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='98688'> - <var-decl name='zc_string' type-id='d1617432' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='100736'> - <var-decl name='zc_guid' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='100800'> - <var-decl name='zc_nvlist_conf' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='100864'> - <var-decl name='zc_nvlist_conf_size' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='100928'> - <var-decl name='zc_cookie' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='100992'> - <var-decl name='zc_objset_type' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='101056'> - <var-decl name='zc_perm_action' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='101120'> - <var-decl name='zc_history_len' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='101184'> - <var-decl name='zc_history_offset' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='101248'> - <var-decl name='zc_obj' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='101312'> - <var-decl name='zc_iflags' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='101376'> - <var-decl name='zc_share' type-id='ee5cec36' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='101632'> - <var-decl name='zc_objset_stats' type-id='b2c14f17' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='103936'> - <var-decl name='zc_begin_record' type-id='09fcdc01' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='106368'> - <var-decl name='zc_inject_record' type-id='a4301ca6' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='109184'> - <var-decl name='zc_defer_destroy' type-id='8f92235e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='109216'> - <var-decl name='zc_flags' type-id='8f92235e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='109248'> - <var-decl name='zc_action_handle' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='109312'> - <var-decl name='zc_cleanup_fd' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='109344'> - <var-decl name='zc_simple' type-id='b96825af' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='109352'> - <var-decl name='zc_pad' type-id='d3490169' visibility='default'/> + <var-decl name='time_low' type-id='8f92235e' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='109376'> - <var-decl name='zc_sendobj' type-id='9c313c2d' visibility='default'/> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='time_mid' type-id='149c6638' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='109440'> - <var-decl name='zc_fromobj' type-id='9c313c2d' visibility='default'/> + <data-member access='public' layout-offset-in-bits='48'> + <var-decl name='time_hi_and_version' type-id='149c6638' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='109504'> - <var-decl name='zc_createtxg' type-id='9c313c2d' visibility='default'/> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='clock_seq_hi_and_reserved' type-id='b96825af' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='109568'> - <var-decl name='zc_stat' type-id='0371a9c7' visibility='default'/> + <data-member access='public' layout-offset-in-bits='72'> + <var-decl name='clock_seq_low' type-id='b96825af' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='109888'> - <var-decl name='zc_zoneid' type-id='9c313c2d' visibility='default'/> + <data-member access='public' layout-offset-in-bits='80'> + <var-decl name='node_addr' type-id='0f562bd0' visibility='default'/> </data-member> </class-decl> - <typedef-decl name='zfs_cmd_t' type-id='3522cd69' id='a5559cdd'/> - <class-decl name='zfs_stat' size-in-bits='320' is-struct='yes' visibility='default' id='6417f0b9'> + <typedef-decl name='ushort_t' type-id='8efea9e5' id='d908a348'/> + <typedef-decl name='uint16_t' type-id='253c2d2a' id='149c6638'/> + <typedef-decl name='__uint16_t' type-id='8efea9e5' id='253c2d2a'/> + <pointer-type-def type-id='dd4a2e5a' size-in-bits='64' id='0d8119a8'/> + <pointer-type-def type-id='0d8119a8' size-in-bits='64' id='c43b27a6'/> + <function-decl name='zpool_label_disk_wait' mangled-name='zpool_label_disk_wait' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_label_disk_wait'> + <parameter type-id='80f4b756'/> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_append_partition' mangled-name='zfs_append_partition' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_append_partition'> + <parameter type-id='26a90f95'/> + <parameter type-id='b59d7dce'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='efi_alloc_and_init' mangled-name='efi_alloc_and_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='efi_alloc_and_init'> + <parameter type-id='95e97e5e'/> + <parameter type-id='8f92235e'/> + <parameter type-id='c43b27a6'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='efi_alloc_and_read' mangled-name='efi_alloc_and_read' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='efi_alloc_and_read'> + <parameter type-id='95e97e5e'/> + <parameter type-id='c43b27a6'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='efi_write' mangled-name='efi_write' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='efi_write'> + <parameter type-id='95e97e5e'/> + <parameter type-id='0d8119a8'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='efi_rescan' mangled-name='efi_rescan' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='efi_rescan'> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='efi_free' mangled-name='efi_free' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='efi_free'> + <parameter type-id='0d8119a8'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='efi_use_whole_disk' mangled-name='efi_use_whole_disk' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='efi_use_whole_disk'> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='rand' visibility='default' binding='global' size-in-bits='64'> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='fsync' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='lib/libzfs/os/linux/libzfs_util_os.c' language='LANG_C99'> + <typedef-decl name='nfds_t' type-id='7359adad' id='555eef66'/> + <class-decl name='pollfd' size-in-bits='64' is-struct='yes' visibility='default' id='b440e872'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='zs_gen' type-id='9c313c2d' visibility='default'/> + <var-decl name='fd' type-id='95e97e5e' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='zs_mode' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='zs_links' type-id='9c313c2d' visibility='default'/> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='events' type-id='a2185560' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='zs_ctime' type-id='c1c22e6c' visibility='default'/> + <data-member access='public' layout-offset-in-bits='48'> + <var-decl name='revents' type-id='a2185560' visibility='default'/> </data-member> </class-decl> - <typedef-decl name='zfs_stat_t' type-id='6417f0b9' id='0371a9c7'/> - <pointer-type-def type-id='a5559cdd' size-in-bits='64' id='e4ec4540'/> - <function-decl name='zfs_ioctl' mangled-name='zfs_ioctl' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_ioctl'> - <parameter type-id='b0382bb3' name='hdl'/> - <parameter type-id='95e97e5e' name='request'/> - <parameter type-id='e4ec4540' name='zc'/> + <pointer-type-def type-id='b440e872' size-in-bits='64' id='3ac36db0'/> + <function-decl name='__poll_chk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='3ac36db0'/> + <parameter type-id='555eef66'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='7359adad'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='inotify_init1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='inotify_add_watch' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter type-id='80f4b756'/> + <parameter type-id='8f92235e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='timerfd_create' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='08f9a87a'/> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='timerfd_settime' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='f39579e7'/> + <parameter type-id='116842ac'/> <return type-id='95e97e5e'/> </function-decl> <function-decl name='libzfs_error_init' mangled-name='libzfs_error_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libzfs_error_init'> <parameter type-id='95e97e5e' name='error'/> <return type-id='80f4b756'/> </function-decl> - <function-decl name='zfs_destroy_snaps_nvl_os' mangled-name='zfs_destroy_snaps_nvl_os' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_destroy_snaps_nvl_os'> - <parameter type-id='b0382bb3' name='hdl'/> - <parameter type-id='5ce45b60' name='snaps'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='zfs_version_kernel' mangled-name='zfs_version_kernel' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_version_kernel'> - <parameter type-id='26a90f95' name='version'/> - <parameter type-id='95e97e5e' name='len'/> + <function-decl name='zfs_userns' mangled-name='zfs_userns' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_userns'> + <parameter type-id='9200a744' name='zhp'/> + <parameter type-id='80f4b756' name='nspath'/> + <parameter type-id='95e97e5e' name='attach'/> <return type-id='95e97e5e'/> </function-decl> </abi-instr> - <abi-instr address-size='64' path='os/linux/zutil_device_path_os.c' language='LANG_C99'> - <function-decl name='zfs_append_partition' mangled-name='zfs_append_partition' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_append_partition'> - <parameter type-id='26a90f95' name='path'/> - <parameter type-id='b59d7dce' name='max_len'/> - <return type-id='95e97e5e'/> + <abi-instr address-size='64' path='lib/libzutil/os/linux/zutil_device_path_os.c' language='LANG_C99'> + <class-decl name='udev' is-struct='yes' visibility='default' is-declaration-only='yes' id='e4a7fb7f'/> + <class-decl name='udev_device' is-struct='yes' visibility='default' is-declaration-only='yes' id='640b33ca'/> + <pointer-type-def type-id='e4a7fb7f' size-in-bits='64' id='025eefe7'/> + <pointer-type-def type-id='640b33ca' size-in-bits='64' id='b32bae08'/> + <class-decl name='udev' is-struct='yes' visibility='default' is-declaration-only='yes' id='e4a7fb7f'/> + <class-decl name='udev_device' is-struct='yes' visibility='default' is-declaration-only='yes' id='640b33ca'/> + <function-decl name='udev_new' visibility='default' binding='global' size-in-bits='64'> + <return type-id='025eefe7'/> </function-decl> - <function-decl name='zfs_strip_partition' mangled-name='zfs_strip_partition' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_strip_partition'> - <parameter type-id='26a90f95' name='path'/> - <return type-id='26a90f95'/> + <function-decl name='udev_device_unref' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b32bae08'/> + <return type-id='b32bae08'/> </function-decl> - <function-decl name='zfs_strip_path' mangled-name='zfs_strip_path' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_strip_path'> - <parameter type-id='26a90f95' name='path'/> - <return type-id='26a90f95'/> + <function-decl name='udev_device_new_from_subsystem_sysname' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='025eefe7'/> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <return type-id='b32bae08'/> + </function-decl> + <function-decl name='udev_device_get_property_value' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b32bae08'/> + <parameter type-id='80f4b756'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='__readlink_chk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='9d26089a'/> + <parameter type-id='266fe297'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='b59d7dce'/> + <return type-id='79a0948f'/> </function-decl> <function-decl name='zfs_get_enclosure_sysfs_path' mangled-name='zfs_get_enclosure_sysfs_path' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_get_enclosure_sysfs_path'> <parameter type-id='80f4b756' name='dev_name'/> @@ -5412,30 +8869,129 @@ <parameter type-id='80f4b756' name='dev_name'/> <return type-id='c19b74c3'/> </function-decl> - <function-decl name='zfs_get_underlying_path' mangled-name='zfs_get_underlying_path' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_get_underlying_path'> - <parameter type-id='80f4b756' name='dev_name'/> - <return type-id='26a90f95'/> - </function-decl> <function-decl name='is_mpath_whole_disk' mangled-name='is_mpath_whole_disk' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='is_mpath_whole_disk'> <parameter type-id='80f4b756' name='path'/> <return type-id='c19b74c3'/> </function-decl> </abi-instr> - <abi-instr address-size='64' path='os/linux/zutil_import_os.c' language='LANG_C99'> - <class-decl name='udev_device' is-struct='yes' visibility='default' is-declaration-only='yes' id='640b33ca'/> - <qualified-type-def type-id='80f4b756' const='yes' id='b99c00c9'/> - <pointer-type-def type-id='b99c00c9' size-in-bits='64' id='13956559'/> - <pointer-type-def type-id='b59d7dce' size-in-bits='64' id='78c01427'/> - <pointer-type-def type-id='640b33ca' size-in-bits='64' id='b32bae08'/> - <class-decl name='udev_device' is-struct='yes' visibility='default' is-declaration-only='yes' id='640b33ca'/> + <abi-instr address-size='64' path='lib/libzutil/os/linux/zutil_import_os.c' language='LANG_C99'> + <class-decl name='blkid_struct_cache' is-struct='yes' visibility='default' is-declaration-only='yes' id='09286066'/> + <class-decl name='blkid_struct_dev' is-struct='yes' visibility='default' is-declaration-only='yes' id='86223623'/> + <class-decl name='blkid_struct_dev_iterate' is-struct='yes' visibility='default' is-declaration-only='yes' id='d88420d6'/> + <class-decl name='udev_list_entry' is-struct='yes' visibility='default' is-declaration-only='yes' id='e7dbdca3'/> + <typedef-decl name='pool_vdev_iter_f' type-id='6c16a6c8' id='dff793e0'/> + <typedef-decl name='blkid_dev' type-id='8433f053' id='f47b023a'/> + <typedef-decl name='blkid_cache' type-id='940e3afc' id='0882dfdf'/> + <typedef-decl name='blkid_dev_iterate' type-id='b8fa2efc' id='f4760fa7'/> + <typedef-decl name='__useconds_t' type-id='f0981eeb' id='4e80d4b1'/> + <pointer-type-def type-id='0882dfdf' size-in-bits='64' id='2e3e7caa'/> + <pointer-type-def type-id='f47b023a' size-in-bits='64' id='d87f9b75'/> + <pointer-type-def type-id='09286066' size-in-bits='64' id='940e3afc'/> + <pointer-type-def type-id='86223623' size-in-bits='64' id='8433f053'/> + <pointer-type-def type-id='d88420d6' size-in-bits='64' id='b8fa2efc'/> + <pointer-type-def type-id='2ec2411e' size-in-bits='64' id='6c16a6c8'/> + <pointer-type-def type-id='e7dbdca3' size-in-bits='64' id='deabd0d3'/> + <class-decl name='blkid_struct_cache' is-struct='yes' visibility='default' is-declaration-only='yes' id='09286066'/> + <class-decl name='blkid_struct_dev' is-struct='yes' visibility='default' is-declaration-only='yes' id='86223623'/> + <class-decl name='blkid_struct_dev_iterate' is-struct='yes' visibility='default' is-declaration-only='yes' id='d88420d6'/> + <class-decl name='udev_list_entry' is-struct='yes' visibility='default' is-declaration-only='yes' id='e7dbdca3'/> + <function-decl name='for_each_vdev_in_nvlist' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='dff793e0'/> + <parameter type-id='eaa32e2f'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='label_paths' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5507783b'/> + <parameter type-id='5ce45b60'/> + <parameter type-id='7d3cd834'/> + <parameter type-id='7d3cd834'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zutil_alloc' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5507783b'/> + <parameter type-id='b59d7dce'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='zutil_strdup' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5507783b'/> + <parameter type-id='80f4b756'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='slice_cache_compare' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='eaa32e2f'/> + <parameter type-id='eaa32e2f'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='blkid_put_cache' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='0882dfdf'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='blkid_get_cache' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='2e3e7caa'/> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='blkid_dev_devname' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='f47b023a'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='blkid_dev_iterate_begin' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='0882dfdf'/> + <return type-id='f4760fa7'/> + </function-decl> + <function-decl name='blkid_dev_set_search' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='f4760fa7'/> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='blkid_dev_next' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='f4760fa7'/> + <parameter type-id='d87f9b75'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='blkid_dev_iterate_end' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='f4760fa7'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='blkid_probe_all_new' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='0882dfdf'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='udev_unref' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='025eefe7'/> + <return type-id='025eefe7'/> + </function-decl> + <function-decl name='udev_list_entry_get_next' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='deabd0d3'/> + <return type-id='deabd0d3'/> + </function-decl> + <function-decl name='udev_list_entry_get_name' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='deabd0d3'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='udev_device_get_parent_with_subsystem_devtype' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b32bae08'/> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <return type-id='b32bae08'/> + </function-decl> + <function-decl name='udev_device_get_devlinks_list_entry' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b32bae08'/> + <return type-id='deabd0d3'/> + </function-decl> + <function-decl name='sched_yield' visibility='default' binding='global' size-in-bits='64'> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='usleep' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='4e80d4b1'/> + <return type-id='95e97e5e'/> + </function-decl> <function-decl name='zfs_dev_flush' mangled-name='zfs_dev_flush' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_dev_flush'> <parameter type-id='95e97e5e' name='fd'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='zpool_default_search_paths' mangled-name='zpool_default_search_paths' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_default_search_paths'> - <parameter type-id='78c01427' name='count'/> - <return type-id='13956559'/> - </function-decl> <function-decl name='zfs_device_get_devid' mangled-name='zfs_device_get_devid' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_device_get_devid'> <parameter type-id='b32bae08' name='dev'/> <parameter type-id='26a90f95' name='bufptr'/> @@ -5448,42 +9004,60 @@ <parameter type-id='b59d7dce' name='buflen'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='zpool_label_disk_wait' mangled-name='zpool_label_disk_wait' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_label_disk_wait'> + <function-decl name='zpool_disk_wait' mangled-name='zpool_disk_wait' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_disk_wait'> <parameter type-id='80f4b756' name='path'/> - <parameter type-id='95e97e5e' name='timeout_ms'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='update_vdev_config_dev_strs' mangled-name='update_vdev_config_dev_strs' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='update_vdev_config_dev_strs'> + <function-decl name='update_vdev_config_dev_sysfs_path' mangled-name='update_vdev_config_dev_sysfs_path' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='update_vdev_config_dev_sysfs_path'> <parameter type-id='5ce45b60' name='nv'/> + <parameter type-id='80f4b756' name='path'/> + <parameter type-id='80f4b756' name='key'/> <return type-id='48b5725f'/> </function-decl> + <function-type size-in-bits='64' id='2ec2411e'> + <parameter type-id='eaa32e2f'/> + <parameter type-id='5ce45b60'/> + <parameter type-id='eaa32e2f'/> + <return type-id='95e97e5e'/> + </function-type> </abi-instr> - <abi-instr address-size='64' path='zutil_device_path.c' language='LANG_C99'> - <typedef-decl name='ssize_t' type-id='41060289' id='79a0948f'/> - <typedef-decl name='__ssize_t' type-id='bd54fe1a' id='41060289'/> - <function-decl name='zfs_basename' mangled-name='zfs_basename' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_basename'> - <parameter type-id='80f4b756' name='path'/> - <return type-id='80f4b756'/> - </function-decl> - <function-decl name='zfs_dirnamelen' mangled-name='zfs_dirnamelen' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_dirnamelen'> - <parameter type-id='80f4b756' name='path'/> - <return type-id='79a0948f'/> + <abi-instr address-size='64' path='lib/libzutil/os/linux/zutil_setproctitle.c' language='LANG_C99'> + <function-decl name='warnx' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter is-variadic='yes'/> + <return type-id='48b5725f'/> </function-decl> - <function-decl name='zfs_resolve_shortname' mangled-name='zfs_resolve_shortname' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_resolve_shortname'> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='26a90f95' name='path'/> - <parameter type-id='b59d7dce' name='len'/> + <function-decl name='setenv' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <parameter type-id='95e97e5e'/> <return type-id='95e97e5e'/> </function-decl> - <function-decl name='zfs_strcmp_pathname' mangled-name='zfs_strcmp_pathname' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_strcmp_pathname'> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='80f4b756' name='cmp'/> - <parameter type-id='95e97e5e' name='wholedisk'/> + <function-decl name='clearenv' visibility='default' binding='global' size-in-bits='64'> <return type-id='95e97e5e'/> </function-decl> + <function-decl name='zfs_setproctitle_init' mangled-name='zfs_setproctitle_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_setproctitle_init'> + <parameter type-id='95e97e5e' name='argc'/> + <parameter type-id='9b23c9ad' name='argv'/> + <parameter type-id='9b23c9ad' name='envp'/> + <return type-id='48b5725f'/> + </function-decl> </abi-instr> - <abi-instr address-size='64' path='zutil_import.c' language='LANG_C99'> - <class-decl name='importargs' size-in-bits='448' is-struct='yes' visibility='default' id='7ac83801'> + <abi-instr address-size='64' path='lib/libzutil/zutil_device_path.c' language='LANG_C99'> + <function-decl name='zpool_default_search_paths' mangled-name='zpool_default_search_paths' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_default_search_paths'> + <parameter type-id='78c01427'/> + <return type-id='13956559'/> + </function-decl> + <function-decl name='zfs_dirnamelen' mangled-name='zfs_dirnamelen' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_dirnamelen'> + <parameter type-id='80f4b756' name='path'/> + <return type-id='79a0948f'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='lib/libzutil/zutil_import.c' language='LANG_C99'> + <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='256' id='16dc656a'> + <subrange length='32' type-id='7359adad' id='ae5bde82'/> + </array-type-def> + <class-decl name='importargs' size-in-bits='512' is-struct='yes' visibility='default' id='7ac83801'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='path' type-id='9b23c9ad' visibility='default'/> </data-member> @@ -5508,32 +9082,145 @@ <data-member access='public' layout-offset-in-bits='384'> <var-decl name='policy' type-id='5ce45b60' visibility='default'/> </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='do_destroyed' type-id='c19b74c3' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='480'> + <var-decl name='do_all' type-id='c19b74c3' visibility='default'/> + </data-member> </class-decl> <typedef-decl name='importargs_t' type-id='7ac83801' id='7a842a6b'/> + <class-decl name='libpc_handle' size-in-bits='8448' is-struct='yes' visibility='default' id='7c8737f0'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='lpc_error' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='lpc_printerr' type-id='c19b74c3' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='lpc_open_access_error' type-id='c19b74c3' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='lpc_desc_active' type-id='c19b74c3' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='lpc_desc' type-id='b54ce520' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8320'> + <var-decl name='lpc_ops' type-id='f095e320' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8384'> + <var-decl name='lpc_lib_handle' type-id='eaa32e2f' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='libpc_handle_t' type-id='7c8737f0' id='8a70a786'/> + <class-decl name='aiocb' size-in-bits='1344' is-struct='yes' visibility='default' id='e4957c49'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='aio_fildes' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='aio_lio_opcode' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='aio_reqprio' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='aio_buf' type-id='fe09dd29' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='aio_nbytes' type-id='b59d7dce' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='aio_sigevent' type-id='519bc206' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='768'> + <var-decl name='__next_prio' type-id='924bbc81' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='832'> + <var-decl name='__abs_prio' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='864'> + <var-decl name='__policy' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='896'> + <var-decl name='__error_code' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='960'> + <var-decl name='__return_value' type-id='41060289' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1024'> + <var-decl name='aio_offset' type-id='724e4de6' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1088'> + <var-decl name='__glibc_reserved' type-id='16dc656a' visibility='default'/> + </data-member> + </class-decl> + <pointer-type-def type-id='e4957c49' size-in-bits='64' id='924bbc81'/> + <qualified-type-def type-id='924bbc81' const='yes' id='5499dcde'/> + <pointer-type-def type-id='5499dcde' size-in-bits='64' id='2236d41c'/> + <qualified-type-def type-id='2236d41c' restrict='yes' id='31488924'/> + <pointer-type-def type-id='a3681dea' size-in-bits='64' id='fce6d540'/> + <qualified-type-def type-id='e4957c49' const='yes' id='fced9da2'/> + <pointer-type-def type-id='fced9da2' size-in-bits='64' id='b20efd18'/> <pointer-type-def type-id='7a842a6b' size-in-bits='64' id='07ee4a58'/> + <pointer-type-def type-id='8a70a786' size-in-bits='64' id='5507783b'/> <pointer-type-def type-id='b1e62775' size-in-bits='64' id='f095e320'/> - <function-decl name='zpool_read_label' mangled-name='zpool_read_label' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_read_label'> - <parameter type-id='95e97e5e' name='fd'/> - <parameter type-id='857bb57e' name='config'/> - <parameter type-id='7292109c' name='num_labels'/> + <qualified-type-def type-id='48b5725f' volatile='yes' id='b0b3cbf9'/> + <pointer-type-def type-id='b0b3cbf9' size-in-bits='64' id='fe09dd29'/> + <function-decl name='update_vdev_config_dev_strs' mangled-name='update_vdev_config_dev_strs' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='update_vdev_config_dev_strs'> + <parameter type-id='5ce45b60'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='update_vdevs_config_dev_sysfs_path' visibility='default' binding='global' size-in-bits='64'> + <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> + <function-decl name='posix_memalign' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='63e171df'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='b59d7dce'/> <return type-id='95e97e5e'/> </function-decl> + <function-decl name='sysconf' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <return type-id='bd54fe1a'/> + </function-decl> + <function-decl name='libpc_error_description' mangled-name='libpc_error_description' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libpc_error_description'> + <parameter type-id='5507783b' name='hdl'/> + <return type-id='80f4b756'/> + </function-decl> <function-decl name='zpool_search_import' mangled-name='zpool_search_import' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_search_import'> - <parameter type-id='eaa32e2f' name='hdl'/> + <parameter type-id='5507783b' name='hdl'/> <parameter type-id='07ee4a58' name='import'/> - <parameter type-id='f095e320' name='pco'/> <return type-id='5ce45b60'/> </function-decl> <function-decl name='zpool_find_config' mangled-name='zpool_find_config' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_find_config'> - <parameter type-id='eaa32e2f' name='hdl'/> + <parameter type-id='5507783b' name='hdl'/> <parameter type-id='80f4b756' name='target'/> <parameter type-id='857bb57e' name='configp'/> <parameter type-id='07ee4a58' name='args'/> - <parameter type-id='f095e320' name='pco'/> <return type-id='95e97e5e'/> </function-decl> + <function-decl name='zpool_find_import_blkid' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5507783b'/> + <parameter type-id='18c91f9e'/> + <parameter type-id='fce6d540'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zpool_open_func' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='eaa32e2f'/> + <return type-id='48b5725f'/> + </function-decl> </abi-instr> - <abi-instr address-size='64' path='zutil_nicenum.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libzutil/zutil_nicenum.c' language='LANG_C99'> + <type-decl name='long double' size-in-bits='128' id='e095c704'/> <enum-decl name='zfs_nicenum_format' id='29cf1969'> <underlying-type type-id='9cac1fee'/> <enumerator name='ZFS_NICENUM_1024' value='0'/> @@ -5542,6 +9229,15 @@ <enumerator name='ZFS_NICENUM_RAW' value='3'/> <enumerator name='ZFS_NICENUM_RAWTIME' value='4'/> </enum-decl> + <function-decl name='powl' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='e095c704'/> + <parameter type-id='e095c704'/> + <return type-id='e095c704'/> + </function-decl> + <function-decl name='floor' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='a0eb0f08'/> + <return type-id='a0eb0f08'/> + </function-decl> <function-decl name='zfs_isnumber' mangled-name='zfs_isnumber' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_isnumber'> <parameter type-id='80f4b756' name='str'/> <return type-id='c19b74c3'/> @@ -5553,12 +9249,6 @@ <parameter type-id='29cf1969' name='format'/> <return type-id='48b5725f'/> </function-decl> - <function-decl name='zfs_nicenum' mangled-name='zfs_nicenum' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_nicenum'> - <parameter type-id='9c313c2d' name='num'/> - <parameter type-id='26a90f95' name='buf'/> - <parameter type-id='b59d7dce' name='buflen'/> - <return type-id='48b5725f'/> - </function-decl> <function-decl name='zfs_nicetime' mangled-name='zfs_nicetime' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_nicetime'> <parameter type-id='9c313c2d' name='num'/> <parameter type-id='26a90f95' name='buf'/> @@ -5571,17 +9261,12 @@ <parameter type-id='b59d7dce' name='buflen'/> <return type-id='48b5725f'/> </function-decl> - <function-decl name='zfs_nicebytes' mangled-name='zfs_nicebytes' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_nicebytes'> - <parameter type-id='9c313c2d' name='num'/> - <parameter type-id='26a90f95' name='buf'/> - <parameter type-id='b59d7dce' name='buflen'/> - <return type-id='48b5725f'/> - </function-decl> </abi-instr> - <abi-instr address-size='64' path='zutil_pool.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libzutil/zutil_pool.c' language='LANG_C99'> <array-type-def dimensions='1' type-id='853fd5dc' size-in-bits='32768' id='b505fc2f'> <subrange length='64' type-id='7359adad' id='b10be967'/> </array-type-def> + <type-decl name='float' size-in-bits='32' id='a6c45d85'/> <class-decl name='ddt_stat' size-in-bits='512' is-struct='yes' visibility='default' id='65242dfe'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='dds_blocks' type-id='9c313c2d' visibility='default'/> @@ -5619,19 +9304,850 @@ <pointer-type-def type-id='ec92d602' size-in-bits='64' id='932720f8'/> <qualified-type-def type-id='853fd5dc' const='yes' id='764c298c'/> <pointer-type-def type-id='764c298c' size-in-bits='64' id='dfe59052'/> - <pointer-type-def type-id='857bb57e' size-in-bits='64' id='75be733c'/> + <qualified-type-def type-id='a9c79a1f' const='yes' id='cd087e36'/> + <pointer-type-def type-id='cd087e36' size-in-bits='64' id='e05e8614'/> + <function-decl name='nanosleep' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='e05e8614'/> + <parameter type-id='3d83ba87'/> + <return type-id='95e97e5e'/> + </function-decl> <function-decl name='zpool_dump_ddt' mangled-name='zpool_dump_ddt' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_dump_ddt'> <parameter type-id='dfe59052' name='dds_total'/> <parameter type-id='932720f8' name='ddh'/> <return type-id='48b5725f'/> </function-decl> - <function-decl name='zpool_history_unpack' mangled-name='zpool_history_unpack' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_history_unpack'> - <parameter type-id='26a90f95' name='buf'/> - <parameter type-id='9c313c2d' name='bytes_read'/> - <parameter type-id='5d6479ae' name='leftover'/> - <parameter type-id='75be733c' name='records'/> - <parameter type-id='4dd26a40' name='numrecords'/> + <function-decl name='fsleep' mangled-name='fsleep' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fsleep'> + <parameter type-id='a6c45d85' name='sec'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='zpool_getenv_int' mangled-name='zpool_getenv_int' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_getenv_int'> + <parameter type-id='80f4b756' name='env'/> + <parameter type-id='95e97e5e' name='default_val'/> <return type-id='95e97e5e'/> </function-decl> </abi-instr> + <abi-instr address-size='64' path='module/avl/avl.c' language='LANG_C99'> + <function-decl name='avl_last' mangled-name='avl_last' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_last'> + <parameter type-id='a3681dea' name='tree'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='avl_nearest' mangled-name='avl_nearest' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_nearest'> + <parameter type-id='a3681dea' name='tree'/> + <parameter type-id='fba6cb51' name='where'/> + <parameter type-id='95e97e5e' name='direction'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='avl_insert_here' mangled-name='avl_insert_here' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_insert_here'> + <parameter type-id='a3681dea' name='tree'/> + <parameter type-id='eaa32e2f' name='new_data'/> + <parameter type-id='eaa32e2f' name='here'/> + <parameter type-id='95e97e5e' name='direction'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='avl_update_lt' mangled-name='avl_update_lt' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_update_lt'> + <parameter type-id='a3681dea' name='t'/> + <parameter type-id='eaa32e2f' name='obj'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='avl_update_gt' mangled-name='avl_update_gt' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_update_gt'> + <parameter type-id='a3681dea' name='t'/> + <parameter type-id='eaa32e2f' name='obj'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='avl_update' mangled-name='avl_update' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_update'> + <parameter type-id='a3681dea' name='t'/> + <parameter type-id='eaa32e2f' name='obj'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='avl_swap' mangled-name='avl_swap' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_swap'> + <parameter type-id='a3681dea' name='tree1'/> + <parameter type-id='a3681dea' name='tree2'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='avl_is_empty' mangled-name='avl_is_empty' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_is_empty'> + <parameter type-id='a3681dea' name='tree'/> + <return type-id='c19b74c3'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='module/zcommon/cityhash.c' language='LANG_C99'> + <function-decl name='cityhash1' mangled-name='cityhash1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cityhash1'> + <parameter type-id='9c313c2d' name='w'/> + <return type-id='9c313c2d'/> + </function-decl> + <function-decl name='cityhash2' mangled-name='cityhash2' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cityhash2'> + <parameter type-id='9c313c2d' name='w1'/> + <parameter type-id='9c313c2d' name='w2'/> + <return type-id='9c313c2d'/> + </function-decl> + <function-decl name='cityhash3' mangled-name='cityhash3' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cityhash3'> + <parameter type-id='9c313c2d' name='w1'/> + <parameter type-id='9c313c2d' name='w2'/> + <parameter type-id='9c313c2d' name='w3'/> + <return type-id='9c313c2d'/> + </function-decl> + <function-decl name='cityhash4' mangled-name='cityhash4' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cityhash4'> + <parameter type-id='9c313c2d' name='w1'/> + <parameter type-id='9c313c2d' name='w2'/> + <parameter type-id='9c313c2d' name='w3'/> + <parameter type-id='9c313c2d' name='w4'/> + <return type-id='9c313c2d'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='module/zcommon/zfeature_common.c' language='LANG_C99'> + <array-type-def dimensions='1' type-id='83f29ca2' size-in-bits='19712' id='fd4573e5'> + <subrange length='44' type-id='7359adad' id='cf8ba455'/> + </array-type-def> + <enum-decl name='zfeature_flags' id='6db816a4'> + <underlying-type type-id='9cac1fee'/> + <enumerator name='ZFEATURE_FLAG_READONLY_COMPAT' value='1'/> + <enumerator name='ZFEATURE_FLAG_MOS' value='2'/> + <enumerator name='ZFEATURE_FLAG_ACTIVATE_ON_ENABLE' value='4'/> + <enumerator name='ZFEATURE_FLAG_PER_DATASET' value='8'/> + </enum-decl> + <typedef-decl name='zfeature_flags_t' type-id='6db816a4' id='fc329033'/> + <enum-decl name='zfeature_type' id='c4fa2355'> + <underlying-type type-id='9cac1fee'/> + <enumerator name='ZFEATURE_TYPE_BOOLEAN' value='0'/> + <enumerator name='ZFEATURE_TYPE_UINT64_ARRAY' value='1'/> + <enumerator name='ZFEATURE_NUM_TYPES' value='2'/> + </enum-decl> + <typedef-decl name='zfeature_type_t' type-id='c4fa2355' id='732d2bb2'/> + <class-decl name='zfeature_info' size-in-bits='448' is-struct='yes' visibility='default' id='1178d146'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='fi_feature' type-id='d6618c78' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='fi_uname' type-id='80f4b756' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='fi_guid' type-id='80f4b756' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='fi_desc' type-id='80f4b756' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='fi_flags' type-id='fc329033' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='288'> + <var-decl name='fi_zfs_mod_supported' type-id='c19b74c3' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='fi_type' type-id='732d2bb2' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='fi_depends' type-id='1acff326' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='zfeature_info_t' type-id='1178d146' id='83f29ca2'/> + <typedef-decl name='__free_fn_t' type-id='b7f9d8e6' id='3ff5e51e'/> + <class-decl name='dirent' size-in-bits='2240' is-struct='yes' visibility='default' id='611586a1'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='d_ino' type-id='71288a47' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='d_off' type-id='724e4de6' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='d_reclen' type-id='8efea9e5' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='144'> + <var-decl name='d_type' type-id='002ac4a6' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='152'> + <var-decl name='d_name' type-id='d1617432' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='zfs_mod_supported_features' size-in-bits='128' is-struct='yes' visibility='default' id='3eee3342'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='tree' type-id='eaa32e2f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='all_features' type-id='c19b74c3' visibility='default'/> + </data-member> + </class-decl> + <qualified-type-def type-id='d6618c78' const='yes' id='81a65028'/> + <pointer-type-def type-id='81a65028' size-in-bits='64' id='1acff326'/> + <qualified-type-def type-id='3eee3342' const='yes' id='0c1d5bbb'/> + <pointer-type-def type-id='0c1d5bbb' size-in-bits='64' id='a3372543'/> + <pointer-type-def type-id='611586a1' size-in-bits='64' id='2e243169'/> + <qualified-type-def type-id='eaa32e2f' const='yes' id='83be723c'/> + <pointer-type-def type-id='83be723c' size-in-bits='64' id='7acd98a2'/> + <var-decl name='spa_feature_table' type-id='fd4573e5' mangled-name='spa_feature_table' visibility='default' elf-symbol-id='spa_feature_table'/> + <var-decl name='zfeature_checks_disable' type-id='c19b74c3' mangled-name='zfeature_checks_disable' visibility='default' elf-symbol-id='zfeature_checks_disable'/> + <function-decl name='opendir' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <return type-id='f09217ba'/> + </function-decl> + <function-decl name='tsearch' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='eaa32e2f'/> + <parameter type-id='63e171df'/> + <parameter type-id='aba7edd8'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='tfind' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='eaa32e2f'/> + <parameter type-id='7acd98a2'/> + <parameter type-id='aba7edd8'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='tdestroy' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='eaa32e2f'/> + <parameter type-id='3ff5e51e'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='zfeature_is_valid_guid' mangled-name='zfeature_is_valid_guid' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfeature_is_valid_guid'> + <parameter type-id='80f4b756' name='name'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='zfeature_depends_on' mangled-name='zfeature_depends_on' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfeature_depends_on'> + <parameter type-id='d6618c78' name='fid'/> + <parameter type-id='d6618c78' name='check'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='zfs_mod_supported' mangled-name='zfs_mod_supported' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_mod_supported'> + <parameter type-id='80f4b756' name='scope'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='a3372543' name='sfeatures'/> + <return type-id='c19b74c3'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='module/zcommon/zfs_comutil.c' language='LANG_C99'> + <array-type-def dimensions='1' type-id='b99c00c9' size-in-bits='2624' id='5ce15418'> + <subrange length='41' type-id='7359adad' id='cb834f44'/> + </array-type-def> + <pointer-type-def type-id='8f92235e' size-in-bits='64' id='90421557'/> + <function-decl name='nvpair_value_uint32' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='dace003f'/> + <parameter type-id='90421557'/> + <return type-id='95e97e5e'/> + </function-decl> + <var-decl name='zfs_history_event_names' type-id='5ce15418' mangled-name='zfs_history_event_names' visibility='default' elf-symbol-id='zfs_history_event_names'/> + <function-decl name='strpbrk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='zfs_allocatable_devs' mangled-name='zfs_allocatable_devs' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_allocatable_devs'> + <parameter type-id='5ce45b60' name='nv'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='zfs_special_devs' mangled-name='zfs_special_devs' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_special_devs'> + <parameter type-id='5ce45b60' name='nv'/> + <parameter type-id='80f4b756' name='type'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='zfs_zpl_version_map' mangled-name='zfs_zpl_version_map' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_zpl_version_map'> + <parameter type-id='95e97e5e' name='spa_version'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_spa_version_map' mangled-name='zfs_spa_version_map' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_spa_version_map'> + <parameter type-id='95e97e5e' name='zpl_version'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_dataset_name_hidden' mangled-name='zfs_dataset_name_hidden' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_dataset_name_hidden'> + <parameter type-id='80f4b756' name='name'/> + <return type-id='c19b74c3'/> + </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> + <array-type-def dimensions='1' type-id='fa1870fd' size-in-bits='infinite' id='7c00e69d'> + <subrange length='infinite' id='031f2035'/> + </array-type-def> + <enum-decl name='zfs_deleg_who_type_t' naming-typedef-id='36d4bd5a' id='b5fa5816'> + <underlying-type type-id='9cac1fee'/> + <enumerator name='ZFS_DELEG_WHO_UNKNOWN' value='0'/> + <enumerator name='ZFS_DELEG_USER' value='117'/> + <enumerator name='ZFS_DELEG_USER_SETS' value='85'/> + <enumerator name='ZFS_DELEG_GROUP' value='103'/> + <enumerator name='ZFS_DELEG_GROUP_SETS' value='71'/> + <enumerator name='ZFS_DELEG_EVERYONE' value='101'/> + <enumerator name='ZFS_DELEG_EVERYONE_SETS' value='69'/> + <enumerator name='ZFS_DELEG_CREATE' value='99'/> + <enumerator name='ZFS_DELEG_CREATE_SETS' value='67'/> + <enumerator name='ZFS_DELEG_NAMED_SET' value='115'/> + <enumerator name='ZFS_DELEG_NAMED_SET_SETS' value='83'/> + </enum-decl> + <typedef-decl name='zfs_deleg_who_type_t' type-id='b5fa5816' id='36d4bd5a'/> + <enum-decl name='zfs_deleg_note_t' naming-typedef-id='4613c173' id='729d4547'> + <underlying-type type-id='9cac1fee'/> + <enumerator name='ZFS_DELEG_NOTE_CREATE' value='0'/> + <enumerator name='ZFS_DELEG_NOTE_DESTROY' value='1'/> + <enumerator name='ZFS_DELEG_NOTE_SNAPSHOT' value='2'/> + <enumerator name='ZFS_DELEG_NOTE_ROLLBACK' value='3'/> + <enumerator name='ZFS_DELEG_NOTE_CLONE' value='4'/> + <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'/> + </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'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='z_perm' type-id='80f4b756' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='z_note' type-id='4613c173' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='zfs_deleg_perm_tab_t' type-id='5aa05c1f' id='f3f851ad'/> + <qualified-type-def type-id='f3f851ad' const='yes' id='fa1870fd'/> + <var-decl name='zfs_deleg_perm_tab' type-id='7c00e69d' mangled-name='zfs_deleg_perm_tab' visibility='default' elf-symbol-id='zfs_deleg_perm_tab'/> + <function-decl name='permset_namecheck' mangled-name='permset_namecheck' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='permset_namecheck'> + <parameter type-id='80f4b756'/> + <parameter type-id='053457bd'/> + <parameter type-id='26a90f95'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_prop_delegatable' mangled-name='zfs_prop_delegatable' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_delegatable'> + <parameter type-id='58603c44'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='zfs_deleg_canonicalize_perm' mangled-name='zfs_deleg_canonicalize_perm' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_deleg_canonicalize_perm'> + <parameter type-id='80f4b756' name='perm'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='zfs_deleg_verify_nvlist' mangled-name='zfs_deleg_verify_nvlist' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_deleg_verify_nvlist'> + <parameter type-id='5ce45b60' name='nvp'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_deleg_whokey' mangled-name='zfs_deleg_whokey' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_deleg_whokey'> + <parameter type-id='26a90f95' name='attr'/> + <parameter type-id='36d4bd5a' name='type'/> + <parameter type-id='a84c031d' name='inheritchr'/> + <parameter type-id='eaa32e2f' name='data'/> + <return type-id='48b5725f'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='module/zcommon/zfs_fletcher.c' language='LANG_C99'> + <array-type-def dimensions='1' type-id='9c313c2d' size-in-bits='512' id='c5d13f42'> + <subrange length='8' type-id='7359adad' id='56e0c0b1'/> + </array-type-def> + <array-type-def dimensions='1' type-id='90dbb6d6' size-in-bits='2048' id='16582e69'> + <subrange length='4' type-id='7359adad' id='16fe7105'/> + </array-type-def> + <array-type-def dimensions='1' type-id='8240361c' size-in-bits='1024' id='481f90b1'> + <subrange length='4' type-id='7359adad' id='16fe7105'/> + </array-type-def> + <array-type-def dimensions='1' type-id='7c1ab40c' size-in-bits='512' id='cbd91ec1'> + <subrange length='4' type-id='7359adad' id='16fe7105'/> + </array-type-def> + <array-type-def dimensions='1' type-id='6d059eaa' size-in-bits='1024' id='729b6ebb'> + <subrange length='4' type-id='7359adad' id='16fe7105'/> + </array-type-def> + <enum-decl name='zio_byteorder_t' naming-typedef-id='595a65ec' id='fc861be0'> + <underlying-type type-id='9cac1fee'/> + <enumerator name='ZIO_CHECKSUM_NATIVE' value='0'/> + <enumerator name='ZIO_CHECKSUM_BYTESWAP' value='1'/> + </enum-decl> + <typedef-decl name='zio_byteorder_t' type-id='fc861be0' id='595a65ec'/> + <class-decl name='zio_abd_checksum_data' size-in-bits='256' is-struct='yes' visibility='default' id='4bf4b004'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='acd_byteorder' type-id='595a65ec' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='acd_ctx' type-id='0f7df99e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='acd_zcp' type-id='c24fc2ee' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='acd_private' type-id='eaa32e2f' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='zio_abd_checksum_data_t' type-id='4bf4b004' id='74e39470'/> + <typedef-decl name='zio_abd_checksum_init_t' type-id='a5444274' id='029a8ebe'/> + <typedef-decl name='zio_abd_checksum_fini_t' type-id='a5444274' id='d6fd5c6c'/> + <typedef-decl name='zio_abd_checksum_iter_t' type-id='f4a1892e' id='cefa0f4a'/> + <class-decl name='zio_abd_checksum_func' size-in-bits='192' is-struct='yes' visibility='default' id='aa14691a'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='acf_init' type-id='0bcca125' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='acf_fini' type-id='bfe36153' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='acf_iter' type-id='1e276399' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='zio_abd_checksum_func_t' type-id='3f8e8d11' id='c2eb138a'/> + <class-decl name='zfs_fletcher_superscalar' size-in-bits='256' is-struct='yes' visibility='default' id='28efb250'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='v' type-id='85c64d26' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='zfs_fletcher_superscalar_t' type-id='28efb250' id='6d059eaa'/> + <class-decl name='zfs_fletcher_sse' size-in-bits='128' is-struct='yes' visibility='default' id='acd4019a'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='v' type-id='c1c22e6c' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='zfs_fletcher_sse_t' type-id='acd4019a' id='7c1ab40c'/> + <class-decl name='zfs_fletcher_avx' size-in-bits='256' is-struct='yes' visibility='default' id='8c208dfa'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='v' type-id='85c64d26' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='zfs_fletcher_avx_t' type-id='8c208dfa' id='8240361c'/> + <class-decl name='zfs_fletcher_avx512' size-in-bits='512' is-struct='yes' visibility='default' id='c6d0c382'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='v' type-id='c5d13f42' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='zfs_fletcher_avx512_t' type-id='c6d0c382' id='90dbb6d6'/> + <union-decl name='fletcher_4_ctx' size-in-bits='2048' visibility='default' id='1f951ade'> + <data-member access='public'> + <var-decl name='scalar' type-id='39730d0b' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='superscalar' type-id='729b6ebb' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='sse' type-id='cbd91ec1' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='avx' type-id='481f90b1' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='avx512' type-id='16582e69' visibility='default'/> + </data-member> + </union-decl> + <typedef-decl name='fletcher_4_ctx_t' type-id='1f951ade' id='4b675395'/> + <qualified-type-def type-id='aa14691a' const='yes' id='3f8e8d11'/> + <pointer-type-def type-id='4b675395' size-in-bits='64' id='0f7df99e'/> + <qualified-type-def type-id='8f92235e' volatile='yes' id='430e0681'/> + <pointer-type-def type-id='430e0681' size-in-bits='64' id='3a147f31'/> + <pointer-type-def type-id='74e39470' size-in-bits='64' id='eefe7427'/> + <pointer-type-def type-id='d6fd5c6c' size-in-bits='64' id='bfe36153'/> + <pointer-type-def type-id='029a8ebe' size-in-bits='64' id='0bcca125'/> + <pointer-type-def type-id='cefa0f4a' size-in-bits='64' id='1e276399'/> + <var-decl name='fletcher_4_abd_ops' type-id='c2eb138a' mangled-name='fletcher_4_abd_ops' visibility='default' elf-symbol-id='fletcher_4_abd_ops'/> + <function-decl name='atomic_swap_32' mangled-name='atomic_swap_32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_swap_32'> + <parameter type-id='3a147f31'/> + <parameter type-id='8f92235e'/> + <return type-id='8f92235e'/> + </function-decl> + <function-decl name='membar_producer' mangled-name='membar_producer' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='membar_producer'> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fletcher_init' mangled-name='fletcher_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fletcher_init'> + <parameter type-id='c24fc2ee' name='zcp'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fletcher_2_incremental_native' mangled-name='fletcher_2_incremental_native' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fletcher_2_incremental_native'> + <parameter type-id='eaa32e2f' name='buf'/> + <parameter type-id='b59d7dce' name='size'/> + <parameter type-id='eaa32e2f' name='data'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='fletcher_2_native' mangled-name='fletcher_2_native' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fletcher_2_native'> + <parameter type-id='eaa32e2f' name='buf'/> + <parameter type-id='9c313c2d' name='size'/> + <parameter type-id='eaa32e2f' name='ctx_template'/> + <parameter type-id='c24fc2ee' name='zcp'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fletcher_2_incremental_byteswap' mangled-name='fletcher_2_incremental_byteswap' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fletcher_2_incremental_byteswap'> + <parameter type-id='eaa32e2f' name='buf'/> + <parameter type-id='b59d7dce' name='size'/> + <parameter type-id='eaa32e2f' name='data'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='fletcher_2_byteswap' mangled-name='fletcher_2_byteswap' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fletcher_2_byteswap'> + <parameter type-id='eaa32e2f' name='buf'/> + <parameter type-id='9c313c2d' name='size'/> + <parameter type-id='eaa32e2f' name='ctx_template'/> + <parameter type-id='c24fc2ee' name='zcp'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fletcher_4_impl_set' mangled-name='fletcher_4_impl_set' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fletcher_4_impl_set'> + <parameter type-id='80f4b756' name='val'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='fletcher_4_native' mangled-name='fletcher_4_native' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fletcher_4_native'> + <parameter type-id='eaa32e2f' name='buf'/> + <parameter type-id='9c313c2d' name='size'/> + <parameter type-id='eaa32e2f' name='ctx_template'/> + <parameter type-id='c24fc2ee' name='zcp'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fletcher_4_byteswap' mangled-name='fletcher_4_byteswap' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fletcher_4_byteswap'> + <parameter type-id='eaa32e2f' name='buf'/> + <parameter type-id='9c313c2d' name='size'/> + <parameter type-id='eaa32e2f' name='ctx_template'/> + <parameter type-id='c24fc2ee' name='zcp'/> + <return type-id='48b5725f'/> + </function-decl> + <function-type size-in-bits='64' id='f4a1892e'> + <parameter type-id='eaa32e2f'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='eaa32e2f'/> + <return type-id='95e97e5e'/> + </function-type> + <function-type size-in-bits='64' id='a5444274'> + <parameter type-id='eefe7427'/> + <return type-id='48b5725f'/> + </function-type> + </abi-instr> + <abi-instr address-size='64' path='module/zcommon/zfs_fletcher_avx512.c' language='LANG_C99'> + <typedef-decl name='fletcher_4_init_f' type-id='173aa527' id='b9ae1656'/> + <typedef-decl name='fletcher_4_fini_f' type-id='0ad5b8a8' id='c4c1f4fc'/> + <typedef-decl name='fletcher_4_compute_f' type-id='38147eff' id='ad1dc4cb'/> + <class-decl name='fletcher_4_func' size-in-bits='1024' is-struct='yes' visibility='default' id='57f479a0'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='init_native' type-id='b9ae1656' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='fini_native' type-id='c4c1f4fc' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='compute_native' type-id='ad1dc4cb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='init_byteswap' type-id='b9ae1656' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='fini_byteswap' type-id='c4c1f4fc' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='compute_byteswap' type-id='ad1dc4cb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='valid' type-id='297d38bc' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='uses_fpu' type-id='c19b74c3' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='name' type-id='80f4b756' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='fletcher_4_ops_t' type-id='57f479a0' id='eba91718'/> + <qualified-type-def type-id='eba91718' const='yes' id='9eeabdc8'/> + <pointer-type-def type-id='e9e61702' size-in-bits='64' id='297d38bc'/> + <pointer-type-def type-id='fe40251b' size-in-bits='64' id='173aa527'/> + <pointer-type-def type-id='17fb1f83' size-in-bits='64' id='38147eff'/> + <pointer-type-def type-id='fb39e25e' size-in-bits='64' id='0ad5b8a8'/> + <var-decl name='fletcher_4_avx512f_ops' type-id='9eeabdc8' mangled-name='fletcher_4_avx512f_ops' visibility='default' elf-symbol-id='fletcher_4_avx512f_ops'/> + <var-decl name='fletcher_4_avx512bw_ops' type-id='9eeabdc8' mangled-name='fletcher_4_avx512bw_ops' visibility='default' elf-symbol-id='fletcher_4_avx512bw_ops'/> + <function-type size-in-bits='64' id='e9e61702'> + <return type-id='c19b74c3'/> + </function-type> + <function-type size-in-bits='64' id='fe40251b'> + <parameter type-id='0f7df99e'/> + <return type-id='48b5725f'/> + </function-type> + <function-type size-in-bits='64' id='17fb1f83'> + <parameter type-id='0f7df99e'/> + <parameter type-id='eaa32e2f'/> + <parameter type-id='9c313c2d'/> + <return type-id='48b5725f'/> + </function-type> + <function-type size-in-bits='64' id='fb39e25e'> + <parameter type-id='0f7df99e'/> + <parameter type-id='c24fc2ee'/> + <return type-id='48b5725f'/> + </function-type> + </abi-instr> + <abi-instr address-size='64' path='module/zcommon/zfs_fletcher_intel.c' language='LANG_C99'> + <var-decl name='fletcher_4_avx2_ops' type-id='9eeabdc8' mangled-name='fletcher_4_avx2_ops' visibility='default' elf-symbol-id='fletcher_4_avx2_ops'/> + </abi-instr> + <abi-instr address-size='64' path='module/zcommon/zfs_fletcher_sse.c' language='LANG_C99'> + <var-decl name='fletcher_4_sse2_ops' type-id='9eeabdc8' mangled-name='fletcher_4_sse2_ops' visibility='default' elf-symbol-id='fletcher_4_sse2_ops'/> + <var-decl name='fletcher_4_ssse3_ops' type-id='9eeabdc8' mangled-name='fletcher_4_ssse3_ops' visibility='default' elf-symbol-id='fletcher_4_ssse3_ops'/> + </abi-instr> + <abi-instr address-size='64' path='module/zcommon/zfs_fletcher_superscalar.c' language='LANG_C99'> + <var-decl name='fletcher_4_superscalar_ops' type-id='9eeabdc8' mangled-name='fletcher_4_superscalar_ops' visibility='default' elf-symbol-id='fletcher_4_superscalar_ops'/> + </abi-instr> + <abi-instr address-size='64' path='module/zcommon/zfs_fletcher_superscalar4.c' language='LANG_C99'> + <var-decl name='fletcher_4_superscalar4_ops' type-id='9eeabdc8' mangled-name='fletcher_4_superscalar4_ops' visibility='default' elf-symbol-id='fletcher_4_superscalar4_ops'/> + </abi-instr> + <abi-instr address-size='64' path='module/zcommon/zfs_namecheck.c' language='LANG_C99'> + <var-decl name='zfs_max_dataset_nesting' type-id='95e97e5e' mangled-name='zfs_max_dataset_nesting' visibility='default' elf-symbol-id='zfs_max_dataset_nesting'/> + <function-decl name='get_dataset_depth' mangled-name='get_dataset_depth' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_dataset_depth'> + <parameter type-id='80f4b756' name='path'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_component_namecheck' mangled-name='zfs_component_namecheck' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_component_namecheck'> + <parameter type-id='80f4b756' name='path'/> + <parameter type-id='053457bd' name='why'/> + <parameter type-id='26a90f95' name='what'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='dataset_namecheck' mangled-name='dataset_namecheck' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dataset_namecheck'> + <parameter type-id='80f4b756' name='path'/> + <parameter type-id='053457bd' name='why'/> + <parameter type-id='26a90f95' name='what'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='bookmark_namecheck' mangled-name='bookmark_namecheck' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bookmark_namecheck'> + <parameter type-id='80f4b756' name='path'/> + <parameter type-id='053457bd' name='why'/> + <parameter type-id='26a90f95' name='what'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='snapshot_namecheck' mangled-name='snapshot_namecheck' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='snapshot_namecheck'> + <parameter type-id='80f4b756' name='path'/> + <parameter type-id='053457bd' name='why'/> + <parameter type-id='26a90f95' name='what'/> + <return type-id='95e97e5e'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='module/zcommon/zfs_prop.c' language='LANG_C99'> + <array-type-def dimensions='1' type-id='b99c00c9' size-in-bits='768' id='bcc77e38'> + <subrange length='12' type-id='7359adad' id='84827bdc'/> + </array-type-def> + <pointer-type-def type-id='3eee3342' size-in-bits='64' id='73f8e240'/> + <var-decl name='zfs_userquota_prop_prefixes' type-id='bcc77e38' mangled-name='zfs_userquota_prop_prefixes' visibility='default' elf-symbol-id='zfs_userquota_prop_prefixes'/> + <function-decl name='zfs_mod_list_supported' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <return type-id='73f8e240'/> + </function-decl> + <function-decl name='zfs_mod_list_supported_free' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='73f8e240'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='zprop_register_impl' mangled-name='zprop_register_impl' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_register_impl'> + <parameter type-id='95e97e5e'/> + <parameter type-id='80f4b756'/> + <parameter type-id='31429eff'/> + <parameter type-id='9c313c2d'/> + <parameter type-id='80f4b756'/> + <parameter type-id='999701cc'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <parameter type-id='c19b74c3'/> + <parameter type-id='c19b74c3'/> + <parameter type-id='c19b74c3'/> + <parameter type-id='c8bc397b'/> + <parameter type-id='a3372543'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='zprop_register_string' mangled-name='zprop_register_string' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_register_string'> + <parameter type-id='95e97e5e'/> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <parameter type-id='999701cc'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <parameter type-id='a3372543'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='zprop_register_number' mangled-name='zprop_register_number' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_register_number'> + <parameter type-id='95e97e5e'/> + <parameter type-id='80f4b756'/> + <parameter type-id='9c313c2d'/> + <parameter type-id='999701cc'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <parameter type-id='c19b74c3'/> + <parameter type-id='a3372543'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='zprop_register_index' mangled-name='zprop_register_index' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_register_index'> + <parameter type-id='95e97e5e'/> + <parameter type-id='80f4b756'/> + <parameter type-id='9c313c2d'/> + <parameter type-id='999701cc'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <parameter type-id='c8bc397b'/> + <parameter type-id='a3372543'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='zprop_register_hidden' mangled-name='zprop_register_hidden' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_register_hidden'> + <parameter type-id='95e97e5e'/> + <parameter type-id='80f4b756'/> + <parameter type-id='31429eff'/> + <parameter type-id='999701cc'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='80f4b756'/> + <parameter type-id='c19b74c3'/> + <parameter type-id='a3372543'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='zprop_index_to_string' mangled-name='zprop_index_to_string' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_index_to_string'> + <parameter type-id='95e97e5e'/> + <parameter type-id='9c313c2d'/> + <parameter type-id='7d3cd834'/> + <parameter type-id='2e45de5d'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zprop_random_value' mangled-name='zprop_random_value' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_random_value'> + <parameter type-id='95e97e5e'/> + <parameter type-id='9c313c2d'/> + <parameter type-id='2e45de5d'/> + <return type-id='9c313c2d'/> + </function-decl> + <function-decl name='zprop_valid_char' mangled-name='zprop_valid_char' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zprop_valid_char'> + <parameter type-id='a84c031d'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_prop_string_to_index' mangled-name='zfs_prop_string_to_index' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_string_to_index'> + <parameter type-id='58603c44' name='prop'/> + <parameter type-id='80f4b756' name='string'/> + <parameter type-id='5d6479ae' name='index'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_prop_random_value' mangled-name='zfs_prop_random_value' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_random_value'> + <parameter type-id='58603c44' name='prop'/> + <parameter type-id='9c313c2d' name='seed'/> + <return type-id='9c313c2d'/> + </function-decl> + <function-decl name='zfs_prop_visible' mangled-name='zfs_prop_visible' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_visible'> + <parameter type-id='58603c44' name='prop'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='zfs_prop_values' mangled-name='zfs_prop_values' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_values'> + <parameter type-id='58603c44' name='prop'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='zfs_prop_is_string' mangled-name='zfs_prop_is_string' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_is_string'> + <parameter type-id='58603c44' name='prop'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zfs_prop_column_name' mangled-name='zfs_prop_column_name' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_column_name'> + <parameter type-id='58603c44' name='prop'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='zfs_prop_align_right' mangled-name='zfs_prop_align_right' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_align_right'> + <parameter type-id='58603c44' name='prop'/> + <return type-id='c19b74c3'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='module/zcommon/zfs_valstr.c' language='LANG_C99'> + <function-decl name='zfs_valstr_zio_flag' mangled-name='zfs_valstr_zio_flag' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_valstr_zio_flag'> + <parameter type-id='9c313c2d' name='bits'/> + <parameter type-id='26a90f95' name='out'/> + <parameter type-id='b59d7dce' name='outlen'/> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='zfs_valstr_zio_flag_bits' mangled-name='zfs_valstr_zio_flag_bits' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_valstr_zio_flag_bits'> + <parameter type-id='9c313c2d' name='bits'/> + <parameter type-id='26a90f95' name='out'/> + <parameter type-id='b59d7dce' name='outlen'/> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='zfs_valstr_zio_flag_pairs' mangled-name='zfs_valstr_zio_flag_pairs' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_valstr_zio_flag_pairs'> + <parameter type-id='9c313c2d' name='bits'/> + <parameter type-id='26a90f95' name='out'/> + <parameter type-id='b59d7dce' name='outlen'/> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='zfs_valstr_zio_stage' mangled-name='zfs_valstr_zio_stage' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_valstr_zio_stage'> + <parameter type-id='9c313c2d' name='bits'/> + <parameter type-id='26a90f95' name='out'/> + <parameter type-id='b59d7dce' name='outlen'/> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='zfs_valstr_zio_stage_bits' mangled-name='zfs_valstr_zio_stage_bits' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_valstr_zio_stage_bits'> + <parameter type-id='9c313c2d' name='bits'/> + <parameter type-id='26a90f95' name='out'/> + <parameter type-id='b59d7dce' name='outlen'/> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='zfs_valstr_zio_stage_pairs' mangled-name='zfs_valstr_zio_stage_pairs' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_valstr_zio_stage_pairs'> + <parameter type-id='9c313c2d' name='bits'/> + <parameter type-id='26a90f95' name='out'/> + <parameter type-id='b59d7dce' name='outlen'/> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='zfs_valstr_zio_type' mangled-name='zfs_valstr_zio_type' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_valstr_zio_type'> + <parameter type-id='95e97e5e' name='v'/> + <parameter type-id='26a90f95' name='out'/> + <parameter type-id='b59d7dce' name='outlen'/> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='zfs_valstr_zio_priority' mangled-name='zfs_valstr_zio_priority' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_valstr_zio_priority'> + <parameter type-id='95e97e5e' name='v'/> + <parameter type-id='26a90f95' name='out'/> + <parameter type-id='b59d7dce' name='outlen'/> + <return type-id='b59d7dce'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='module/zcommon/zpool_prop.c' language='LANG_C99'> + <function-decl name='zpool_prop_string_to_index' mangled-name='zpool_prop_string_to_index' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_string_to_index'> + <parameter type-id='5d0c23fb' name='prop'/> + <parameter type-id='80f4b756' name='string'/> + <parameter type-id='5d6479ae' name='index'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zpool_prop_random_value' mangled-name='zpool_prop_random_value' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_random_value'> + <parameter type-id='5d0c23fb' name='prop'/> + <parameter type-id='9c313c2d' name='seed'/> + <return type-id='9c313c2d'/> + </function-decl> + <function-decl name='zpool_prop_values' mangled-name='zpool_prop_values' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_values'> + <parameter type-id='5d0c23fb' name='prop'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='zpool_prop_column_name' mangled-name='zpool_prop_column_name' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_column_name'> + <parameter type-id='5d0c23fb' name='prop'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='zpool_prop_align_right' mangled-name='zpool_prop_align_right' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_prop_align_right'> + <parameter type-id='5d0c23fb' name='prop'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='vdev_prop_get_table' mangled-name='vdev_prop_get_table' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vdev_prop_get_table'> + <return type-id='76c8174b'/> + </function-decl> + <function-decl name='vdev_prop_string_to_index' mangled-name='vdev_prop_string_to_index' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vdev_prop_string_to_index'> + <parameter type-id='5aa5c90c' name='prop'/> + <parameter type-id='80f4b756' name='string'/> + <parameter type-id='5d6479ae' name='index'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='vdev_prop_random_value' mangled-name='vdev_prop_random_value' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vdev_prop_random_value'> + <parameter type-id='5aa5c90c' name='prop'/> + <parameter type-id='9c313c2d' name='seed'/> + <return type-id='9c313c2d'/> + </function-decl> + <function-decl name='vdev_prop_values' mangled-name='vdev_prop_values' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vdev_prop_values'> + <parameter type-id='5aa5c90c' name='prop'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='vdev_prop_column_name' mangled-name='vdev_prop_column_name' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vdev_prop_column_name'> + <parameter type-id='5aa5c90c' name='prop'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='vdev_prop_align_right' mangled-name='vdev_prop_align_right' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vdev_prop_align_right'> + <parameter type-id='5aa5c90c' name='prop'/> + <return type-id='c19b74c3'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='module/zcommon/zprop_common.c' language='LANG_C99'> + <function-decl name='__ctype_tolower_loc' visibility='default' binding='global' size-in-bits='64'> + <return type-id='24f95ba5'/> + </function-decl> + </abi-instr> </abi-corpus> diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs_changelist.c b/sys/contrib/openzfs/lib/libzfs/libzfs_changelist.c index 4d90a511f607..d290d949f4b2 100644 --- a/sys/contrib/openzfs/lib/libzfs/libzfs_changelist.c +++ b/sys/contrib/openzfs/lib/libzfs/libzfs_changelist.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -98,12 +99,22 @@ changelist_prefix(prop_changelist_t *clp) prop_changenode_t *cn; uu_avl_walk_t *walk; int ret = 0; + const enum sa_protocol smb[] = {SA_PROTOCOL_SMB, SA_NO_PROTOCOL}; boolean_t commit_smb_shares = B_FALSE; if (clp->cl_prop != ZFS_PROP_MOUNTPOINT && clp->cl_prop != ZFS_PROP_SHARESMB) return (0); + /* + * If CL_GATHER_DONT_UNMOUNT is set, don't want to unmount/unshare and + * later (re)mount/(re)share the filesystem in postfix phase, so we + * return from here. If filesystem is mounted or unmounted, leave it + * as it is. + */ + if (clp->cl_gflags & CL_GATHER_DONT_UNMOUNT) + return (0); + if ((walk = uu_avl_walk_start(clp->cl_tree, UU_WALK_ROBUST)) == NULL) return (-1); @@ -128,8 +139,6 @@ changelist_prefix(prop_changelist_t *clp) */ switch (clp->cl_prop) { case ZFS_PROP_MOUNTPOINT: - if (clp->cl_gflags & CL_GATHER_DONT_UNMOUNT) - break; if (zfs_unmount(cn->cn_handle, NULL, clp->cl_mflags) != 0) { ret = -1; @@ -137,7 +146,8 @@ changelist_prefix(prop_changelist_t *clp) } break; case ZFS_PROP_SHARESMB: - (void) zfs_unshare_smb(cn->cn_handle, NULL); + (void) zfs_unshare(cn->cn_handle, NULL, + smb); commit_smb_shares = B_TRUE; break; @@ -148,7 +158,7 @@ changelist_prefix(prop_changelist_t *clp) } if (commit_smb_shares) - zfs_commit_smb_shares(); + zfs_commit_shares(smb); uu_avl_walk_end(walk); if (ret == -1) @@ -162,9 +172,8 @@ changelist_prefix(prop_changelist_t *clp) * reshare the filesystems as necessary. In changelist_gather() we recorded * whether the filesystem was previously shared or mounted. The action we take * depends on the previous state, and whether the value was previously 'legacy'. - * For non-legacy properties, we only remount/reshare the filesystem if it was - * previously mounted/shared. Otherwise, we always remount/reshare the - * filesystem. + * For non-legacy properties, we always remount/reshare the filesystem, + * if CL_GATHER_DONT_UNMOUNT is not set. */ int changelist_postfix(prop_changelist_t *clp) @@ -172,11 +181,18 @@ changelist_postfix(prop_changelist_t *clp) prop_changenode_t *cn; uu_avl_walk_t *walk; char shareopts[ZFS_MAXPROPLEN]; - int errors = 0; boolean_t commit_smb_shares = B_FALSE; boolean_t commit_nfs_shares = B_FALSE; /* + * If CL_GATHER_DONT_UNMOUNT is set, it means we don't want to (un)mount + * or (re/un)share the filesystem, so we return from here. If filesystem + * is mounted or unmounted, leave it as it is. + */ + if (clp->cl_gflags & CL_GATHER_DONT_UNMOUNT) + return (0); + + /* * If we're changing the mountpoint, attempt to destroy the underlying * mountpoint. All other datasets will have inherited from this dataset * (in which case their mountpoints exist in the filesystem in the new @@ -238,17 +254,16 @@ changelist_postfix(prop_changelist_t *clp) needs_key = (zfs_prop_get_int(cn->cn_handle, ZFS_PROP_KEYSTATUS) == ZFS_KEYSTATUS_UNAVAILABLE); - mounted = (clp->cl_gflags & CL_GATHER_DONT_UNMOUNT) || - zfs_is_mounted(cn->cn_handle, NULL); + mounted = zfs_is_mounted(cn->cn_handle, NULL); if (!mounted && !needs_key && (cn->cn_mounted || - ((sharenfs || sharesmb || clp->cl_waslegacy) && + (((clp->cl_prop == ZFS_PROP_MOUNTPOINT && + clp->cl_prop == clp->cl_realprop) || + sharenfs || sharesmb || clp->cl_waslegacy) && (zfs_prop_get_int(cn->cn_handle, ZFS_PROP_CANMOUNT) == ZFS_CANMOUNT_ON)))) { - if (zfs_mount(cn->cn_handle, NULL, 0) != 0) - errors++; - else + if (zfs_mount(cn->cn_handle, NULL, 0) == 0) mounted = TRUE; } @@ -257,28 +272,36 @@ changelist_postfix(prop_changelist_t *clp) * if the filesystem is currently shared, so that we can * adopt any new options. */ + const enum sa_protocol nfs[] = + {SA_PROTOCOL_NFS, SA_NO_PROTOCOL}; if (sharenfs && mounted) { - errors += zfs_share_nfs(cn->cn_handle); + zfs_share(cn->cn_handle, nfs); commit_nfs_shares = B_TRUE; } else if (cn->cn_shared || clp->cl_waslegacy) { - errors += zfs_unshare_nfs(cn->cn_handle, NULL); + zfs_unshare(cn->cn_handle, NULL, nfs); commit_nfs_shares = B_TRUE; } + const enum sa_protocol smb[] = + {SA_PROTOCOL_SMB, SA_NO_PROTOCOL}; if (sharesmb && mounted) { - errors += zfs_share_smb(cn->cn_handle); + zfs_share(cn->cn_handle, smb); commit_smb_shares = B_TRUE; } else if (cn->cn_shared || clp->cl_waslegacy) { - errors += zfs_unshare_smb(cn->cn_handle, NULL); + zfs_unshare(cn->cn_handle, NULL, smb); commit_smb_shares = B_TRUE; } } + + enum sa_protocol proto[SA_PROTOCOL_COUNT + 1], *p = proto; if (commit_nfs_shares) - zfs_commit_nfs_shares(); + *p++ = SA_PROTOCOL_NFS; if (commit_smb_shares) - zfs_commit_smb_shares(); + *p++ = SA_PROTOCOL_SMB; + *p++ = SA_NO_PROTOCOL; + zfs_commit_shares(proto); uu_avl_walk_end(walk); - return (errors ? -1 : 0); + return (0); } /* @@ -345,7 +368,7 @@ changelist_rename(prop_changelist_t *clp, const char *src, const char *dst) * unshare all the datasets in the list. */ int -changelist_unshare(prop_changelist_t *clp, zfs_share_proto_t *proto) +changelist_unshare(prop_changelist_t *clp, const enum sa_protocol *proto) { prop_changenode_t *cn; uu_avl_walk_t *walk; @@ -359,11 +382,12 @@ changelist_unshare(prop_changelist_t *clp, zfs_share_proto_t *proto) return (-1); while ((cn = uu_avl_walk_next(walk)) != NULL) { - if (zfs_unshare_proto(cn->cn_handle, NULL, proto) != 0) + if (zfs_unshare(cn->cn_handle, NULL, proto) != 0) ret = -1; } - zfs_commit_proto(proto); + for (const enum sa_protocol *p = proto; *p != SA_NO_PROTOCOL; ++p) + sa_commit_shares(*p); uu_avl_walk_end(walk); return (ret); @@ -447,16 +471,11 @@ changelist_add_mounted(zfs_handle_t *zhp, void *data) ASSERT3U(clp->cl_prop, ==, ZFS_PROP_MOUNTPOINT); - if ((cn = zfs_alloc(zfs_get_handle(zhp), - sizeof (prop_changenode_t))) == NULL) { - zfs_close(zhp); - return (ENOMEM); - } - + cn = zfs_alloc(zfs_get_handle(zhp), sizeof (prop_changenode_t)); cn->cn_handle = zhp; cn->cn_mounted = zfs_is_mounted(zhp, NULL); ASSERT3U(cn->cn_mounted, ==, B_TRUE); - cn->cn_shared = zfs_is_shared(zhp); + cn->cn_shared = zfs_is_shared(zhp, NULL, NULL); cn->cn_zoned = zfs_prop_get_int(zhp, ZFS_PROP_ZONED); cn->cn_needpost = B_TRUE; @@ -522,16 +541,11 @@ change_one(zfs_handle_t *zhp, void *data) (clp->cl_shareprop != ZPROP_INVAL && (share_sourcetype == ZPROP_SRC_DEFAULT || share_sourcetype == ZPROP_SRC_INHERITED))) { - if ((cn = zfs_alloc(zfs_get_handle(zhp), - sizeof (prop_changenode_t))) == NULL) { - ret = -1; - goto out; - } - + cn = zfs_alloc(zfs_get_handle(zhp), sizeof (prop_changenode_t)); cn->cn_handle = zhp; cn->cn_mounted = (clp->cl_gflags & CL_GATHER_MOUNT_ALWAYS) || zfs_is_mounted(zhp, NULL); - cn->cn_shared = zfs_is_shared(zhp); + cn->cn_shared = zfs_is_shared(zhp, NULL, NULL); cn->cn_zoned = zfs_prop_get_int(zhp, ZFS_PROP_ZONED); cn->cn_needpost = B_TRUE; @@ -550,8 +564,15 @@ change_one(zfs_handle_t *zhp, void *data) cn = NULL; } - if (!clp->cl_alldependents) - ret = zfs_iter_children(zhp, change_one, data); + if (!clp->cl_alldependents) { + if (clp->cl_prop != ZFS_PROP_MOUNTPOINT) { + ret = zfs_iter_filesystems_v2(zhp, 0, + change_one, data); + } else { + ret = zfs_iter_children_v2(zhp, 0, change_one, + data); + } + } /* * If we added the handle to the changelist, we will re-use it @@ -592,7 +613,6 @@ compare_props(const void *a, const void *b, zfs_prop_t prop) return (strcmp(propb, propa)); } -/*ARGSUSED*/ static int compare_mountpoints(const void *a, const void *b, void *unused) { @@ -602,13 +622,14 @@ compare_mountpoints(const void *a, const void *b, void *unused) * hierarchy that is different from the dataset hierarchy, and still * allow it to be changed. */ + (void) unused; return (compare_props(a, b, ZFS_PROP_MOUNTPOINT)); } -/*ARGSUSED*/ static int compare_dataset_names(const void *a, const void *b, void *unused) { + (void) unused; return (compare_props(a, b, ZFS_PROP_NAME)); } @@ -630,8 +651,7 @@ changelist_gather(zfs_handle_t *zhp, zfs_prop_t prop, int gather_flags, char property[ZFS_MAXPROPLEN]; boolean_t legacy = B_FALSE; - if ((clp = zfs_alloc(zhp->zfs_hdl, sizeof (prop_changelist_t))) == NULL) - return (NULL); + clp = zfs_alloc(zhp->zfs_hdl, sizeof (prop_changelist_t)); /* * For mountpoint-related tasks, we want to sort everything by @@ -721,11 +741,17 @@ changelist_gather(zfs_handle_t *zhp, zfs_prop_t prop, int gather_flags, return (NULL); } } else if (clp->cl_alldependents) { - if (zfs_iter_dependents(zhp, B_TRUE, change_one, clp) != 0) { + if (zfs_iter_dependents_v2(zhp, 0, B_TRUE, change_one, + clp) != 0) { changelist_free(clp); return (NULL); } - } else if (zfs_iter_children(zhp, change_one, clp) != 0) { + } else if (clp->cl_prop != ZFS_PROP_MOUNTPOINT) { + if (zfs_iter_filesystems_v2(zhp, 0, change_one, clp) != 0) { + changelist_free(clp); + return (NULL); + } + } else if (zfs_iter_children_v2(zhp, 0, change_one, clp) != 0) { changelist_free(clp); return (NULL); } @@ -744,17 +770,11 @@ changelist_gather(zfs_handle_t *zhp, zfs_prop_t prop, int gather_flags, * Always add ourself to the list. We add ourselves to the end so that * we're the last to be unmounted. */ - if ((cn = zfs_alloc(zhp->zfs_hdl, - sizeof (prop_changenode_t))) == NULL) { - zfs_close(temp); - changelist_free(clp); - return (NULL); - } - + cn = zfs_alloc(zhp->zfs_hdl, sizeof (prop_changenode_t)); cn->cn_handle = temp; cn->cn_mounted = (clp->cl_gflags & CL_GATHER_MOUNT_ALWAYS) || zfs_is_mounted(temp, NULL); - cn->cn_shared = zfs_is_shared(temp); + cn->cn_shared = zfs_is_shared(temp, NULL, NULL); cn->cn_zoned = zfs_prop_get_int(zhp, ZFS_PROP_ZONED); cn->cn_needpost = B_TRUE; diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs_config.c b/sys/contrib/openzfs/lib/libzfs/libzfs_config.c index a3ecc4a327dc..0d2102191389 100644 --- a/sys/contrib/openzfs/lib/libzfs/libzfs_config.c +++ b/sys/contrib/openzfs/lib/libzfs/libzfs_config.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -56,16 +57,14 @@ typedef struct config_node { uu_avl_node_t cn_avl; } config_node_t; -/* ARGSUSED */ static int config_node_compare(const void *a, const void *b, void *unused) { - int ret; - + (void) unused; const config_node_t *ca = (config_node_t *)a; const config_node_t *cb = (config_node_t *)b; - ret = strcmp(ca->cn_name, cb->cn_name); + int ret = strcmp(ca->cn_name, cb->cn_name); if (ret < 0) return (-1); @@ -128,8 +127,7 @@ namespace_reload(libzfs_handle_t *hdl) return (no_memory(hdl)); } - if (zcmd_alloc_dst_nvlist(hdl, &zc, 0) != 0) - return (-1); + zcmd_alloc_dst_nvlist(hdl, &zc, 0); for (;;) { zc.zc_cookie = hdl->libzfs_ns_gen; @@ -143,10 +141,7 @@ namespace_reload(libzfs_handle_t *hdl) return (0); case ENOMEM: - if (zcmd_expand_dst_nvlist(hdl, &zc) != 0) { - zcmd_free_nvlists(&zc); - return (-1); - } + zcmd_expand_dst_nvlist(hdl, &zc); break; default: @@ -183,19 +178,9 @@ namespace_reload(libzfs_handle_t *hdl) nvlist_t *child; uu_avl_index_t where; - if ((cn = zfs_alloc(hdl, sizeof (config_node_t))) == NULL) { - nvlist_free(config); - return (-1); - } - - if ((cn->cn_name = zfs_strdup(hdl, - nvpair_name(elem))) == NULL) { - free(cn); - nvlist_free(config); - return (-1); - } - - verify(nvpair_value_nvlist(elem, &child) == 0); + cn = zfs_alloc(hdl, sizeof (config_node_t)); + cn->cn_name = zfs_strdup(hdl, nvpair_name(elem)); + child = fnvpair_value_nvlist(elem); if (nvlist_dup(child, &cn->cn_config, 0) != 0) { free(cn->cn_name); free(cn); @@ -275,8 +260,7 @@ zpool_refresh_stats(zpool_handle_t *zhp, boolean_t *missing) if (zhp->zpool_config_size == 0) zhp->zpool_config_size = 1 << 16; - if (zcmd_alloc_dst_nvlist(hdl, &zc, zhp->zpool_config_size) != 0) - return (-1); + zcmd_alloc_dst_nvlist(hdl, &zc, zhp->zpool_config_size); for (;;) { if (zfs_ioctl(zhp->zpool_hdl, ZFS_IOC_POOL_STATS, @@ -288,12 +272,9 @@ zpool_refresh_stats(zpool_handle_t *zhp, boolean_t *missing) break; } - if (errno == ENOMEM) { - if (zcmd_expand_dst_nvlist(hdl, &zc) != 0) { - zcmd_free_nvlists(&zc); - return (-1); - } - } else { + if (errno == ENOMEM) + zcmd_expand_dst_nvlist(hdl, &zc); + else { zcmd_free_nvlists(&zc); if (errno == ENOENT || errno == EINVAL) *missing = B_TRUE; diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs_crypto.c b/sys/contrib/openzfs/lib/libzfs/libzfs_crypto.c index 644dd26859f1..8907802ec259 100644 --- a/sys/contrib/openzfs/lib/libzfs/libzfs_crypto.c +++ b/sys/contrib/openzfs/lib/libzfs/libzfs_crypto.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -37,6 +38,7 @@ #include <curl/curl.h> #endif #include <libzfs.h> +#include <libzutil.h> #include "libzfs_impl.h" #include "zfeature_common.h" @@ -200,7 +202,7 @@ get_format_prompt_string(zfs_keyformat_t format) /* do basic validation of the key material */ static int validate_key(libzfs_handle_t *hdl, zfs_keyformat_t keyformat, - const char *key, size_t keylen) + const char *key, size_t keylen, boolean_t do_verify) { switch (keyformat) { case ZFS_KEYFORMAT_RAW: @@ -245,7 +247,12 @@ validate_key(libzfs_handle_t *hdl, zfs_keyformat_t keyformat, } break; case ZFS_KEYFORMAT_PASSPHRASE: - /* verify the length is within bounds */ + /* + * Verify the length is within bounds when setting a new key, + * but not when loading an existing key. + */ + if (!do_verify) + break; if (keylen > MAX_PASSPHRASE_LEN) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "Passphrase too long (max %u)."), @@ -380,7 +387,8 @@ get_key_interactive(libzfs_handle_t *restrict hdl, const char *fsname, if (!confirm_key) goto out; - if ((ret = validate_key(hdl, keyformat, buf, buflen)) != 0) { + if ((ret = validate_key(hdl, keyformat, buf, buflen, confirm_key)) != + 0) { free(buf); return (ret); } @@ -476,6 +484,7 @@ get_key_material_file(libzfs_handle_t *hdl, const char *uri, const char *fsname, zfs_keyformat_t keyformat, boolean_t newkey, uint8_t **restrict buf, size_t *restrict len_out) { + (void) fsname, (void) newkey; FILE *f = NULL; int ret = 0; @@ -486,7 +495,7 @@ get_key_material_file(libzfs_handle_t *hdl, const char *uri, ret = errno; errno = 0; zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, - "Failed to open key material file: %s"), strerror(ret)); + "Failed to open key material file: %s"), zfs_strerror(ret)); return (ret); } @@ -502,6 +511,7 @@ get_key_material_https(libzfs_handle_t *hdl, const char *uri, const char *fsname, zfs_keyformat_t keyformat, boolean_t newkey, uint8_t **restrict buf, size_t *restrict len_out) { + (void) fsname, (void) newkey; int ret = 0; FILE *key = NULL; boolean_t is_http = strncmp(uri, "http:", strlen("http:")) == 0; @@ -587,7 +597,7 @@ get_key_material_https(libzfs_handle_t *hdl, const char *uri, "%s/libzfs-XXXXXXXX.https", getenv("TMPDIR") ?: "/tmp") == -1) { ret = ENOMEM; zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "%s"), - strerror(ret)); + zfs_strerror(ret)); goto end; } @@ -596,7 +606,7 @@ get_key_material_https(libzfs_handle_t *hdl, const char *uri, ret = errno; zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "Couldn't create temporary file %s: %s"), - path, strerror(ret)); + path, zfs_strerror(ret)); free(path); goto end; } @@ -606,10 +616,9 @@ get_key_material_https(libzfs_handle_t *hdl, const char *uri, kfdok: if ((key = fdopen(kfd, "r+")) == NULL) { ret = errno; - free(path); (void) close(kfd); zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, - "Couldn't reopen temporary file: %s"), strerror(ret)); + "Couldn't reopen temporary file: %s"), zfs_strerror(ret)); goto end; } @@ -677,7 +686,7 @@ end: */ static int get_key_material(libzfs_handle_t *hdl, boolean_t do_verify, boolean_t newkey, - zfs_keyformat_t keyformat, char *keylocation, const char *fsname, + zfs_keyformat_t keyformat, const char *keylocation, const char *fsname, uint8_t **km_out, size_t *kmlen_out, boolean_t *can_retry_out) { int ret; @@ -740,7 +749,8 @@ get_key_material(libzfs_handle_t *hdl, boolean_t do_verify, boolean_t newkey, goto error; } - if ((ret = validate_key(hdl, keyformat, (const char *)km, kmlen)) != 0) + if ((ret = validate_key(hdl, keyformat, (const char *)km, kmlen, + do_verify)) != 0) goto error; *km_out = km; @@ -766,7 +776,7 @@ error: static int derive_key(libzfs_handle_t *hdl, zfs_keyformat_t format, uint64_t iters, - uint8_t *key_material, size_t key_material_len, uint64_t salt, + uint8_t *key_material, uint64_t salt, uint8_t **key_out) { int ret; @@ -775,12 +785,10 @@ derive_key(libzfs_handle_t *hdl, zfs_keyformat_t format, uint64_t iters, *key_out = NULL; key = zfs_alloc(hdl, WRAPPING_KEY_LEN); - if (!key) - return (ENOMEM); switch (format) { case ZFS_KEYFORMAT_RAW: - bcopy(key_material, key, WRAPPING_KEY_LEN); + memcpy(key, key_material, WRAPPING_KEY_LEN); break; case ZFS_KEYFORMAT_HEX: ret = hex_key_to_raw((char *)key_material, @@ -843,7 +851,8 @@ encryption_feature_is_enabled(zpool_handle_t *zph) static int populate_create_encryption_params_nvlists(libzfs_handle_t *hdl, zfs_handle_t *zhp, boolean_t newkey, zfs_keyformat_t keyformat, - char *keylocation, nvlist_t *props, uint8_t **wkeydata, uint_t *wkeylen) + const char *keylocation, nvlist_t *props, uint8_t **wkeydata, + uint_t *wkeylen) { int ret; uint64_t iters = 0, salt = 0; @@ -909,8 +918,7 @@ populate_create_encryption_params_nvlists(libzfs_handle_t *hdl, } /* derive a key from the key material */ - ret = derive_key(hdl, keyformat, iters, key_material, key_material_len, - salt, &key_data); + ret = derive_key(hdl, keyformat, iters, key_material, salt, &key_data); if (ret != 0) goto error; @@ -936,7 +944,7 @@ proplist_has_encryption_props(nvlist_t *props) { int ret; uint64_t intval; - char *strval; + const char *strval; ret = nvlist_lookup_uint64(props, zfs_prop_to_name(ZFS_PROP_ENCRYPTION), &intval); @@ -998,10 +1006,10 @@ zfs_crypto_create(libzfs_handle_t *hdl, char *parent_name, nvlist_t *props, uint_t *wkeylen_out) { int ret; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; uint64_t crypt = ZIO_CRYPT_INHERIT, pcrypt = ZIO_CRYPT_INHERIT; uint64_t keyformat = ZFS_KEYFORMAT_NONE; - char *keylocation = NULL; + const char *keylocation = NULL; zfs_handle_t *pzhp = NULL; uint8_t *wkeydata = NULL; uint_t wkeylen = 0; @@ -1116,7 +1124,7 @@ zfs_crypto_create(libzfs_handle_t *hdl, char *parent_name, nvlist_t *props, /* default to prompt if no keylocation is specified */ if (keyformat != ZFS_KEYFORMAT_NONE && keylocation == NULL) { - keylocation = "prompt"; + keylocation = (char *)"prompt"; ret = nvlist_add_string(props, zfs_prop_to_name(ZFS_PROP_KEYLOCATION), keylocation); if (ret != 0) @@ -1168,7 +1176,8 @@ int zfs_crypto_clone_check(libzfs_handle_t *hdl, zfs_handle_t *origin_zhp, char *parent_name, nvlist_t *props) { - char errbuf[1024]; + (void) origin_zhp, (void) parent_name; + char errbuf[ERRBUFLEN]; (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "Encryption clone error")); @@ -1219,7 +1228,7 @@ load_keys_cb(zfs_handle_t *zhp, void *arg) cb->cb_numfailed++; out: - (void) zfs_iter_filesystems(zhp, load_keys_cb, cb); + (void) zfs_iter_filesystems_v2(zhp, 0, load_keys_cb, cb); zfs_close(zhp); /* always return 0, since this function is best effort */ @@ -1231,7 +1240,7 @@ out: * filesystem and all of its children. */ int -zfs_crypto_attempt_load_keys(libzfs_handle_t *hdl, char *fsname) +zfs_crypto_attempt_load_keys(libzfs_handle_t *hdl, const char *fsname) { int ret; zfs_handle_t *zhp = NULL; @@ -1266,15 +1275,16 @@ error: } int -zfs_crypto_load_key(zfs_handle_t *zhp, boolean_t noop, char *alt_keylocation) +zfs_crypto_load_key(zfs_handle_t *zhp, boolean_t noop, + const char *alt_keylocation) { int ret, attempts = 0; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; uint64_t keystatus, iters = 0, salt = 0; uint64_t keyformat = ZFS_KEYFORMAT_NONE; char prop_keylocation[MAXNAMELEN]; char prop_encroot[MAXNAMELEN]; - char *keylocation = NULL; + const char *keylocation = NULL; uint8_t *key_material = NULL, *key_data = NULL; size_t key_material_len; boolean_t is_encroot, can_retry = B_FALSE, correctible = B_FALSE; @@ -1365,8 +1375,8 @@ try_again: goto error; /* derive a key from the key material */ - ret = derive_key(zhp->zfs_hdl, keyformat, iters, key_material, - key_material_len, salt, &key_data); + ret = derive_key(zhp->zfs_hdl, keyformat, iters, key_material, salt, + &key_data); if (ret != 0) goto error; @@ -1399,6 +1409,11 @@ try_again: "Incorrect key provided for '%s'."), zfs_get_name(zhp)); break; + case ZFS_ERR_CRYPTO_NOTSUP: + zfs_error_aux(zhp->zfs_hdl, dgettext(TEXT_DOMAIN, + "'%s' uses an unsupported encryption suite."), + zfs_get_name(zhp)); + break; } goto error; } @@ -1437,7 +1452,7 @@ int zfs_crypto_unload_key(zfs_handle_t *zhp) { int ret; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; char prop_encroot[MAXNAMELEN]; uint64_t keystatus, keyformat; boolean_t is_encroot; @@ -1573,7 +1588,7 @@ int zfs_crypto_rewrap(zfs_handle_t *zhp, nvlist_t *raw_props, boolean_t inheritkey) { int ret; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; boolean_t is_encroot; nvlist_t *props = NULL; uint8_t *wkeydata = NULL; @@ -1582,7 +1597,7 @@ zfs_crypto_rewrap(zfs_handle_t *zhp, nvlist_t *raw_props, boolean_t inheritkey) uint64_t crypt, pcrypt, keystatus, pkeystatus; uint64_t keyformat = ZFS_KEYFORMAT_NONE; zfs_handle_t *pzhp = NULL; - char *keylocation = NULL; + const char *keylocation = NULL; char origin_name[MAXNAMELEN]; char prop_keylocation[MAXNAMELEN]; char parent_name[ZFS_MAX_DATASET_NAME_LEN]; @@ -1803,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/sys/contrib/openzfs/lib/libzfs/libzfs_dataset.c b/sys/contrib/openzfs/lib/libzfs/libzfs_dataset.c index 5836587d27e2..91560b40b022 100644 --- a/sys/contrib/openzfs/lib/libzfs/libzfs_dataset.c +++ b/sys/contrib/openzfs/lib/libzfs/libzfs_dataset.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -49,7 +50,6 @@ #include <sys/mount.h> #include <pwd.h> #include <grp.h> -#include <ucred.h> #ifdef HAVE_IDMAP #include <idmap.h> #include <aclutils.h> @@ -68,6 +68,10 @@ #include "libzfs_impl.h" #include "zfs_deleg.h" +static __thread struct passwd gpwd; +static __thread struct group ggrp; +static __thread char rpbuf[2048]; + static int userquota_propname_decode(const char *propname, boolean_t zoned, zfs_userquota_prop_t *typep, char *domain, int domainlen, uint64_t *ridp); @@ -234,7 +238,6 @@ process_user_props(zfs_handle_t *zhp, nvlist_t *props) { libzfs_handle_t *hdl = zhp->zfs_hdl; nvpair_t *elem; - nvlist_t *propval; nvlist_t *nvl; if (nvlist_alloc(&nvl, NV_UNIQUE_NAME, 0) != 0) { @@ -247,7 +250,7 @@ process_user_props(zfs_handle_t *zhp, nvlist_t *props) if (!zfs_prop_user(nvpair_name(elem))) continue; - verify(nvpair_value_nvlist(elem, &propval) == 0); + nvlist_t *propval = fnvpair_value_nvlist(elem); if (nvlist_add_nvlist(nvl, nvpair_name(elem), propval) != 0) { nvlist_free(nvl); (void) no_memory(hdl); @@ -332,13 +335,10 @@ get_stats_ioctl(zfs_handle_t *zhp, zfs_cmd_t *zc) (void) strlcpy(zc->zc_name, zhp->zfs_name, sizeof (zc->zc_name)); while (zfs_ioctl(hdl, ZFS_IOC_OBJSET_STATS, zc) != 0) { - if (errno == ENOMEM) { - if (zcmd_expand_dst_nvlist(hdl, zc) != 0) { - return (-1); - } - } else { + if (errno == ENOMEM) + zcmd_expand_dst_nvlist(hdl, zc); + else return (-1); - } } return (0); } @@ -354,17 +354,14 @@ get_recvd_props_ioctl(zfs_handle_t *zhp) zfs_cmd_t zc = {"\0"}; int err; - if (zcmd_alloc_dst_nvlist(hdl, &zc, 0) != 0) - return (-1); + zcmd_alloc_dst_nvlist(hdl, &zc, 0); (void) strlcpy(zc.zc_name, zhp->zfs_name, sizeof (zc.zc_name)); while (zfs_ioctl(hdl, ZFS_IOC_OBJSET_RECVD_PROPS, &zc) != 0) { - if (errno == ENOMEM) { - if (zcmd_expand_dst_nvlist(hdl, &zc) != 0) { - return (-1); - } - } else { + if (errno == ENOMEM) + zcmd_expand_dst_nvlist(hdl, &zc); + else { zcmd_free_nvlists(&zc); return (-1); } @@ -416,8 +413,8 @@ get_stats(zfs_handle_t *zhp) int rc = 0; zfs_cmd_t zc = {"\0"}; - if (zcmd_alloc_dst_nvlist(zhp->zfs_hdl, &zc, 0) != 0) - return (-1); + zcmd_alloc_dst_nvlist(zhp->zfs_hdl, &zc, 0); + if (get_stats_ioctl(zhp, &zc) != 0) rc = -1; else if (put_stats_zhdl(zhp, &zc) != 0) @@ -449,14 +446,19 @@ make_dataset_handle_common(zfs_handle_t *zhp, zfs_cmd_t *zc) * We've managed to open the dataset and gather statistics. Determine * the high-level type. */ - if (zhp->zfs_dmustats.dds_type == DMU_OST_ZVOL) + if (zhp->zfs_dmustats.dds_type == DMU_OST_ZVOL) { zhp->zfs_head_type = ZFS_TYPE_VOLUME; - else if (zhp->zfs_dmustats.dds_type == DMU_OST_ZFS) + } else if (zhp->zfs_dmustats.dds_type == DMU_OST_ZFS) { zhp->zfs_head_type = ZFS_TYPE_FILESYSTEM; - else if (zhp->zfs_dmustats.dds_type == DMU_OST_OTHER) + } else if (zhp->zfs_dmustats.dds_type == DMU_OST_OTHER) { + errno = EINVAL; return (-1); - else + } else if (zhp->zfs_dmustats.dds_inconsistent) { + errno = EBUSY; + return (-1); + } else { abort(); + } if (zhp->zfs_dmustats.dds_is_snapshot) zhp->zfs_type = ZFS_TYPE_SNAPSHOT; @@ -485,10 +487,8 @@ make_dataset_handle(libzfs_handle_t *hdl, const char *path) zhp->zfs_hdl = hdl; (void) strlcpy(zhp->zfs_name, path, sizeof (zhp->zfs_name)); - if (zcmd_alloc_dst_nvlist(hdl, &zc, 0) != 0) { - free(zhp); - return (NULL); - } + zcmd_alloc_dst_nvlist(hdl, &zc, 0); + if (get_stats_ioctl(zhp, &zc) == -1) { zcmd_free_nvlists(&zc); free(zhp); @@ -533,6 +533,30 @@ make_dataset_simple_handle_zc(zfs_handle_t *pzhp, zfs_cmd_t *zc) zhp->zfs_type = ZFS_TYPE_SNAPSHOT; zhp->zpool_hdl = zpool_handle(zhp); + if (zc->zc_objset_stats.dds_creation_txg != 0) { + /* structure assignment */ + zhp->zfs_dmustats = zc->zc_objset_stats; + } else { + if (get_stats_ioctl(zhp, zc) == -1) { + zcmd_free_nvlists(zc); + free(zhp); + return (NULL); + } + if (make_dataset_handle_common(zhp, zc) == -1) { + zcmd_free_nvlists(zc); + free(zhp); + return (NULL); + } + } + + if (zhp->zfs_dmustats.dds_is_snapshot || + strchr(zc->zc_name, '@') != NULL) + zhp->zfs_type = ZFS_TYPE_SNAPSHOT; + else if (zhp->zfs_dmustats.dds_type == DMU_OST_ZVOL) + zhp->zfs_type = ZFS_TYPE_VOLUME; + else if (zhp->zfs_dmustats.dds_type == DMU_OST_ZFS) + zhp->zfs_type = ZFS_TYPE_FILESYSTEM; + return (zhp); } @@ -683,7 +707,7 @@ zfs_handle_t * zfs_open(libzfs_handle_t *hdl, const char *path, int types) { zfs_handle_t *zhp; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; char *bookp; (void) snprintf(errbuf, sizeof (errbuf), @@ -694,6 +718,7 @@ zfs_open(libzfs_handle_t *hdl, const char *path, int types) */ if (!zfs_validate_name(hdl, path, types, B_FALSE)) { (void) zfs_error(hdl, EZFS_INVALIDNAME, errbuf); + errno = EINVAL; return (NULL); } @@ -721,8 +746,8 @@ zfs_open(libzfs_handle_t *hdl, const char *path, int types) * to get the parent dataset name only. */ assert(bookp - path < sizeof (dsname)); - (void) strncpy(dsname, path, bookp - path); - dsname[bookp - path] = '\0'; + (void) strlcpy(dsname, path, + MIN(sizeof (dsname), bookp - path + 1)); /* * Create handle for the parent dataset. @@ -737,10 +762,11 @@ zfs_open(libzfs_handle_t *hdl, const char *path, int types) * Iterate bookmarks to find the right one. */ errno = 0; - if ((zfs_iter_bookmarks(pzhp, zfs_open_bookmarks_cb, + if ((zfs_iter_bookmarks_v2(pzhp, 0, zfs_open_bookmarks_cb, &cb_data) == 0) && (cb_data.zhp == NULL)) { (void) zfs_error(hdl, EZFS_NOENT, errbuf); zfs_close(pzhp); + errno = ENOENT; return (NULL); } if (cb_data.zhp == NULL) { @@ -759,6 +785,7 @@ zfs_open(libzfs_handle_t *hdl, const char *path, int types) if (!(types & zhp->zfs_type)) { (void) zfs_error(hdl, EZFS_BADTYPE, errbuf); zfs_close(zhp); + errno = EINVAL; return (NULL); } @@ -887,7 +914,7 @@ libzfs_mnttab_find(libzfs_handle_t *hdl, const char *fsname, return (ENOENT); srch.mnt_special = (char *)fsname; - srch.mnt_fstype = MNTTYPE_ZFS; + srch.mnt_fstype = (char *)MNTTYPE_ZFS; ret = getmntany(mnttab, entry, &srch) ? ENOENT : 0; (void) fclose(mnttab); return (ret); @@ -1007,11 +1034,12 @@ zfs_valid_proplist(libzfs_handle_t *hdl, zfs_type_t type, nvlist_t *nvl, { nvpair_t *elem; uint64_t intval; - char *strval; + const char *strval; zfs_prop_t prop; nvlist_t *ret; int chosen_normal = -1; int chosen_utf = -1; + int set_maxbs = 0; if (nvlist_alloc(&ret, NV_UNIQUE_NAME, 0) != 0) { (void) no_memory(hdl); @@ -1027,7 +1055,7 @@ zfs_valid_proplist(libzfs_handle_t *hdl, zfs_type_t type, nvlist_t *nvl, const char *propname = nvpair_name(elem); prop = zfs_name_to_prop(propname); - if (prop == ZPROP_INVAL && zfs_prop_user(propname)) { + if (prop == ZPROP_USERPROP && zfs_prop_user(propname)) { /* * This is a user property: make sure it's a * string, and that it's less than ZAP_MAXNAMELEN. @@ -1066,7 +1094,7 @@ zfs_valid_proplist(libzfs_handle_t *hdl, zfs_type_t type, nvlist_t *nvl, goto error; } - if (prop == ZPROP_INVAL && zfs_prop_userquota(propname)) { + if (prop == ZPROP_USERPROP && zfs_prop_userquota(propname)) { zfs_userquota_prop_t uqtype; char *newpropname = NULL; char domain[128]; @@ -1148,7 +1176,8 @@ zfs_valid_proplist(libzfs_handle_t *hdl, zfs_type_t type, nvlist_t *nvl, } free(newpropname); continue; - } else if (prop == ZPROP_INVAL && zfs_prop_written(propname)) { + } else if (prop == ZPROP_USERPROP && + zfs_prop_written(propname)) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "'%s' is readonly"), propname); @@ -1229,12 +1258,17 @@ zfs_valid_proplist(libzfs_handle_t *hdl, zfs_type_t type, nvlist_t *nvl, (void) zfs_error(hdl, EZFS_BADPROP, errbuf); goto error; } + /* save the ZFS_PROP_RECORDSIZE during create op */ + if (zpool_hdl == NULL && prop == ZFS_PROP_RECORDSIZE) { + set_maxbs = intval; + } break; } case ZFS_PROP_SPECIAL_SMALL_BLOCKS: { - int maxbs = SPA_OLD_MAXBLOCKSIZE; + int maxbs = + set_maxbs == 0 ? SPA_OLD_MAXBLOCKSIZE : set_maxbs; char buf[64]; if (zpool_hdl != NULL) { @@ -1310,8 +1344,7 @@ zfs_valid_proplist(libzfs_handle_t *hdl, zfs_type_t type, nvlist_t *nvl, /* Replace the label string with the internal form. */ (void) nvlist_remove(ret, zfs_prop_to_name(prop), DATA_TYPE_STRING); - verify(nvlist_add_string(ret, zfs_prop_to_name(prop), - hex) == 0); + fnvlist_add_string(ret, zfs_prop_to_name(prop), hex); free(hex); break; @@ -1363,7 +1396,7 @@ badlabel: (void) zfs_error(hdl, EZFS_BADPROP, errbuf); goto error; } - fallthrough; + zfs_fallthrough; } case ZFS_PROP_SHARESMB: @@ -1423,14 +1456,15 @@ badlabel: prop == ZFS_PROP_SHARESMB) && strcmp(strval, "on") != 0 && strcmp(strval, "off") != 0) { - zfs_share_proto_t proto; + enum sa_protocol proto; if (prop == ZFS_PROP_SHARESMB) - proto = PROTO_SMB; + proto = SA_PROTOCOL_SMB; else - proto = PROTO_NFS; + proto = SA_PROTOCOL_NFS; - if (zfs_parse_options(strval, proto) != SA_OK) { + if (sa_validate_shareopts(strval, proto) != + SA_OK) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "'%s' cannot be set to invalid " "options"), propname); @@ -1721,7 +1755,7 @@ int zfs_prop_set(zfs_handle_t *zhp, const char *propname, const char *propval) { int ret = -1; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; libzfs_handle_t *hdl = zhp->zfs_hdl; nvlist_t *nvl = NULL; @@ -1742,8 +1776,6 @@ error: return (ret); } - - /* * Given an nvlist of property names and values, set the properties for the * given dataset. @@ -1751,16 +1783,29 @@ error: int zfs_prop_set_list(zfs_handle_t *zhp, nvlist_t *props) { + return (zfs_prop_set_list_flags(zhp, props, 0)); +} + +/* + * Given an nvlist of property names, values and flags, set the properties + * for the given dataset. If ZFS_SET_NOMOUNT is set, it allows to update + * mountpoint, sharenfs and sharesmb properties without (un/re)mounting + * and (un/re)sharing the dataset. + */ +int +zfs_prop_set_list_flags(zfs_handle_t *zhp, nvlist_t *props, int flags) +{ zfs_cmd_t zc = {"\0"}; int ret = -1; prop_changelist_t **cls = NULL; int cl_idx; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; libzfs_handle_t *hdl = zhp->zfs_hdl; nvlist_t *nvl; int nvl_len = 0; int added_resv = 0; - zfs_prop_t prop = 0; + zfs_prop_t prop; + boolean_t nsprop = B_FALSE; nvpair_t *elem; (void) snprintf(errbuf, sizeof (errbuf), @@ -1807,6 +1852,7 @@ zfs_prop_set_list(zfs_handle_t *zhp, nvlist_t *props) elem = nvlist_next_nvpair(nvl, elem)) { prop = zfs_name_to_prop(nvpair_name(elem)); + nsprop |= zfs_is_namespace_prop(prop); assert(cl_idx < nvl_len); /* @@ -1817,7 +1863,9 @@ zfs_prop_set_list(zfs_handle_t *zhp, nvlist_t *props) if (prop != ZFS_PROP_CANMOUNT || (fnvpair_value_uint64(elem) == ZFS_CANMOUNT_OFF && zfs_is_mounted(zhp, NULL))) { - cls[cl_idx] = changelist_gather(zhp, prop, 0, 0); + cls[cl_idx] = changelist_gather(zhp, prop, + ((flags & ZFS_SET_NOMOUNT) ? + CL_GATHER_DONT_UNMOUNT : 0), 0); if (cls[cl_idx] == NULL) goto error; } @@ -1844,9 +1892,8 @@ zfs_prop_set_list(zfs_handle_t *zhp, nvlist_t *props) */ (void) strlcpy(zc.zc_name, zhp->zfs_name, sizeof (zc.zc_name)); - if ((ret = zcmd_write_src_nvlist(hdl, &zc, nvl)) != 0 || - (ret = zcmd_alloc_dst_nvlist(hdl, &zc, 0)) != 0) - goto error; + zcmd_write_src_nvlist(hdl, &zc, nvl); + zcmd_alloc_dst_nvlist(hdl, &zc, 0); ret = zfs_ioctl(hdl, ZFS_IOC_SET_PROP, &zc); @@ -1882,8 +1929,7 @@ zfs_prop_set_list(zfs_handle_t *zhp, nvlist_t *props) zfs_prop_to_name(ZFS_PROP_VOLSIZE), old_volsize) != 0) goto error; - if (zcmd_write_src_nvlist(hdl, &zc, nvl) != 0) - goto error; + zcmd_write_src_nvlist(hdl, &zc, nvl); (void) zfs_ioctl(hdl, ZFS_IOC_SET_PROP, &zc); } } else { @@ -1907,8 +1953,7 @@ zfs_prop_set_list(zfs_handle_t *zhp, nvlist_t *props) * if one of the options handled by the generic * Linux namespace layer has been modified. */ - if (zfs_is_namespace_prop(prop) && - zfs_is_mounted(zhp, NULL)) + if (nsprop && zfs_is_mounted(zhp, NULL)) ret = zfs_mount(zhp, MNTOPT_REMOUNT, 0); } } @@ -1937,14 +1982,14 @@ zfs_prop_inherit(zfs_handle_t *zhp, const char *propname, boolean_t received) int ret; prop_changelist_t *cl; libzfs_handle_t *hdl = zhp->zfs_hdl; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; zfs_prop_t prop; (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot inherit %s for '%s'"), propname, zhp->zfs_name); zc.zc_cookie = received; - if ((prop = zfs_name_to_prop(propname)) == ZPROP_INVAL) { + if ((prop = zfs_name_to_prop(propname)) == ZPROP_USERPROP) { /* * For user properties, the amount of work we have to do is very * small, so just do it here. @@ -2011,7 +2056,8 @@ zfs_prop_inherit(zfs_handle_t *zhp, const char *propname, boolean_t received) if ((ret = changelist_prefix(cl)) != 0) goto error; - if ((ret = zfs_ioctl(zhp->zfs_hdl, ZFS_IOC_INHERIT_PROP, &zc)) != 0) { + if (zfs_ioctl(zhp->zfs_hdl, ZFS_IOC_INHERIT_PROP, &zc) != 0) { + changelist_free(cl); return (zfs_standard_error(hdl, errno, errbuf)); } else { @@ -2043,7 +2089,7 @@ error: * extract them appropriately. */ uint64_t -getprop_uint64(zfs_handle_t *zhp, zfs_prop_t prop, char **source) +getprop_uint64(zfs_handle_t *zhp, zfs_prop_t prop, const char **source) { nvlist_t *nv; uint64_t value; @@ -2051,7 +2097,7 @@ getprop_uint64(zfs_handle_t *zhp, zfs_prop_t prop, char **source) *source = NULL; if (nvlist_lookup_nvlist(zhp->zfs_props, zfs_prop_to_name(prop), &nv) == 0) { - verify(nvlist_lookup_uint64(nv, ZPROP_VALUE, &value) == 0); + value = fnvlist_lookup_uint64(nv, ZPROP_VALUE); (void) nvlist_lookup_string(nv, ZPROP_SOURCE, source); } else { verify(!zhp->zfs_props_table || @@ -2064,7 +2110,7 @@ getprop_uint64(zfs_handle_t *zhp, zfs_prop_t prop, char **source) } static const char * -getprop_string(zfs_handle_t *zhp, zfs_prop_t prop, char **source) +getprop_string(zfs_handle_t *zhp, zfs_prop_t prop, const char **source) { nvlist_t *nv; const char *value; @@ -2087,20 +2133,21 @@ getprop_string(zfs_handle_t *zhp, zfs_prop_t prop, char **source) static boolean_t zfs_is_recvd_props_mode(zfs_handle_t *zhp) { - return (zhp->zfs_props == zhp->zfs_recvd_props); + return (zhp->zfs_props != NULL && + zhp->zfs_props == zhp->zfs_recvd_props); } static void -zfs_set_recvd_props_mode(zfs_handle_t *zhp, uint64_t *cookie) +zfs_set_recvd_props_mode(zfs_handle_t *zhp, uintptr_t *cookie) { - *cookie = (uint64_t)(uintptr_t)zhp->zfs_props; + *cookie = (uintptr_t)zhp->zfs_props; zhp->zfs_props = zhp->zfs_recvd_props; } static void -zfs_unset_recvd_props_mode(zfs_handle_t *zhp, uint64_t *cookie) +zfs_unset_recvd_props_mode(zfs_handle_t *zhp, uintptr_t *cookie) { - zhp->zfs_props = (nvlist_t *)(uintptr_t)*cookie; + zhp->zfs_props = (nvlist_t *)*cookie; *cookie = 0; } @@ -2115,13 +2162,13 @@ zfs_unset_recvd_props_mode(zfs_handle_t *zhp, uint64_t *cookie) */ static int get_numeric_property(zfs_handle_t *zhp, zfs_prop_t prop, zprop_source_t *src, - char **source, uint64_t *val) + const char **source, uint64_t *val) { zfs_cmd_t zc = {"\0"}; nvlist_t *zplprops = NULL; struct mnttab mnt; - char *mntopt_on = NULL; - char *mntopt_off = NULL; + const char *mntopt_on = NULL; + const char *mntopt_off = NULL; boolean_t received = zfs_is_recvd_props_mode(zhp); *source = NULL; @@ -2192,18 +2239,15 @@ get_numeric_property(zfs_handle_t *zhp, zfs_prop_t prop, zprop_source_t *src, libzfs_handle_t *hdl = zhp->zfs_hdl; struct mnttab entry; - if (libzfs_mnttab_find(hdl, zhp->zfs_name, &entry) == 0) { + if (libzfs_mnttab_find(hdl, zhp->zfs_name, &entry) == 0) zhp->zfs_mntopts = zfs_strdup(hdl, entry.mnt_mntopts); - if (zhp->zfs_mntopts == NULL) - return (-1); - } zhp->zfs_mntcheck = B_TRUE; } if (zhp->zfs_mntopts == NULL) - mnt.mnt_mntopts = ""; + mnt.mnt_mntopts = (char *)""; else mnt.mnt_mntopts = zhp->zfs_mntopts; @@ -2264,8 +2308,14 @@ get_numeric_property(zfs_handle_t *zhp, zfs_prop_t prop, zprop_source_t *src, case ZFS_PROP_NORMALIZE: case ZFS_PROP_UTF8ONLY: case ZFS_PROP_CASE: - if (zcmd_alloc_dst_nvlist(zhp->zfs_hdl, &zc, 0) != 0) - return (-1); + case ZFS_PROP_DEFAULTUSERQUOTA: + case ZFS_PROP_DEFAULTGROUPQUOTA: + case ZFS_PROP_DEFAULTPROJECTQUOTA: + case ZFS_PROP_DEFAULTUSEROBJQUOTA: + case ZFS_PROP_DEFAULTGROUPOBJQUOTA: + case ZFS_PROP_DEFAULTPROJECTOBJQUOTA: + zcmd_alloc_dst_nvlist(zhp->zfs_hdl, &zc, 0); + (void) strlcpy(zc.zc_name, zhp->zfs_name, sizeof (zc.zc_name)); if (zfs_ioctl(zhp->zfs_hdl, ZFS_IOC_OBJSET_ZPLPROPS, &zc)) { zcmd_free_nvlists(&zc); @@ -2292,6 +2342,28 @@ get_numeric_property(zfs_handle_t *zhp, zfs_prop_t prop, zprop_source_t *src, *val = zhp->zfs_dmustats.dds_redacted; break; + case ZFS_PROP_GUID: + if (zhp->zfs_dmustats.dds_guid != 0) + *val = zhp->zfs_dmustats.dds_guid; + else + *val = getprop_uint64(zhp, prop, source); + break; + + case ZFS_PROP_CREATETXG: + /* + * We can directly read createtxg property from zfs + * handle for Filesystem, Snapshot and ZVOL types. + */ + if (((zhp->zfs_type == ZFS_TYPE_FILESYSTEM) || + (zhp->zfs_type == ZFS_TYPE_SNAPSHOT) || + (zhp->zfs_type == ZFS_TYPE_VOLUME)) && + (zhp->zfs_dmustats.dds_creation_txg != 0)) { + *val = zhp->zfs_dmustats.dds_creation_txg; + break; + } else { + *val = getprop_uint64(zhp, prop, source); + } + zfs_fallthrough; default: switch (zfs_prop_get_type(prop)) { case PROP_TYPE_NUMBER: @@ -2328,7 +2400,7 @@ get_numeric_property(zfs_handle_t *zhp, zfs_prop_t prop, zprop_source_t *src, * Calculate the source type, given the raw source string. */ static void -get_source(zfs_handle_t *zhp, zprop_source_t *srctype, char *source, +get_source(zfs_handle_t *zhp, zprop_source_t *srctype, const char *source, char *statbuf, size_t statlen) { if (statbuf == NULL || @@ -2366,8 +2438,8 @@ zfs_prop_get_recvd(zfs_handle_t *zhp, const char *propname, char *propbuf, prop = zfs_name_to_prop(propname); - if (prop != ZPROP_INVAL) { - uint64_t cookie; + if (prop != ZPROP_USERPROP) { + uintptr_t cookie; if (!nvlist_exists(zhp->zfs_recvd_props, propname)) return (-1); zfs_set_recvd_props_mode(zhp, &cookie); @@ -2376,12 +2448,11 @@ zfs_prop_get_recvd(zfs_handle_t *zhp, const char *propname, char *propbuf, zfs_unset_recvd_props_mode(zhp, &cookie); } else { nvlist_t *propval; - char *recvdval; + const char *recvdval; if (nvlist_lookup_nvlist(zhp->zfs_recvd_props, propname, &propval) != 0) return (-1); - verify(nvlist_lookup_string(propval, ZPROP_VALUE, - &recvdval) == 0); + recvdval = fnvlist_lookup_string(propval, ZPROP_VALUE); (void) strlcpy(propbuf, recvdval, proplen); } @@ -2435,7 +2506,7 @@ get_clones_cb(zfs_handle_t *zhp, void *arg) } out: - (void) zfs_iter_children(zhp, get_clones_cb, gca); + (void) zfs_iter_children_v2(zhp, 0, get_clones_cb, gca); zfs_close(zhp); return (0); } @@ -2495,13 +2566,11 @@ zfs_get_clones_nvl(zfs_handle_t *zhp) } nvlist_free(nv); nvlist_free(value); - verify(0 == nvlist_lookup_nvlist(zhp->zfs_props, - zfs_prop_to_name(ZFS_PROP_CLONES), &nv)); + nv = fnvlist_lookup_nvlist(zhp->zfs_props, + zfs_prop_to_name(ZFS_PROP_CLONES)); } - verify(nvlist_lookup_nvlist(nv, ZPROP_VALUE, &value) == 0); - - return (value); + return (fnvlist_lookup_nvlist(nv, ZPROP_VALUE)); } static int @@ -2581,7 +2650,7 @@ zcp_check(zfs_handle_t *zhp, zfs_prop_t prop, uint64_t intval, (u_longlong_t)intval, (u_longlong_t)ans); } } else { - char *str_ans; + const char *str_ans; error = nvlist_lookup_string(retnvl, "value", &str_ans); if (error != 0) { (void) fprintf(stderr, "%s: zcp check error: " @@ -2613,7 +2682,7 @@ int zfs_prop_get(zfs_handle_t *zhp, zfs_prop_t prop, char *propbuf, size_t proplen, zprop_source_t *src, char *statbuf, size_t statlen, boolean_t literal) { - char *source = NULL; + const char *source = NULL; uint64_t val; const char *str; const char *strval; @@ -2722,7 +2791,13 @@ zfs_prop_get(zfs_handle_t *zhp, zfs_prop_t prop, char *propbuf, size_t proplen, break; case ZFS_PROP_ORIGIN: - str = getprop_string(zhp, prop, &source); + if (*zhp->zfs_dmustats.dds_origin != '\0') { + str = (char *)&zhp->zfs_dmustats.dds_origin; + } else { + str = getprop_string(zhp, prop, &source); + } + if (str == NULL || *str == '\0') + str = zfs_prop_default_string(prop); if (str == NULL) return (-1); (void) strlcpy(propbuf, str, proplen); @@ -2898,6 +2973,8 @@ zfs_prop_get(zfs_handle_t *zhp, zfs_prop_t prop, char *propbuf, size_t proplen, break; case ZFS_PROP_GUID: + case ZFS_PROP_KEY_GUID: + case ZFS_PROP_IVSET_GUID: case ZFS_PROP_CREATETXG: case ZFS_PROP_OBJSETID: case ZFS_PROP_PBKDF2_ITERS: @@ -2931,6 +3008,26 @@ zfs_prop_get(zfs_handle_t *zhp, zfs_prop_t prop, char *propbuf, size_t proplen, zcp_check(zhp, prop, val, NULL); break; + case ZFS_PROP_SNAPSHOTS_CHANGED: + { + if ((get_numeric_property(zhp, prop, src, &source, + &val) != 0) || val == 0) { + return (-1); + } + + time_t time = (time_t)val; + struct tm t; + + if (literal || + localtime_r(&time, &t) == NULL || + strftime(propbuf, proplen, "%a %b %e %k:%M:%S %Y", + &t) == 0) + (void) snprintf(propbuf, proplen, "%llu", + (u_longlong_t)val); + } + zcp_check(zhp, prop, val, NULL); + break; + default: switch (zfs_prop_get_type(prop)) { case PROP_TYPE_NUMBER: @@ -2986,7 +3083,7 @@ zfs_prop_get(zfs_handle_t *zhp, zfs_prop_t prop, char *propbuf, size_t proplen, uint64_t zfs_prop_get_int(zfs_handle_t *zhp, zfs_prop_t prop) { - char *source; + const char *source; uint64_t val = 0; (void) get_numeric_property(zhp, prop, NULL, &source, &val); @@ -3010,7 +3107,7 @@ int zfs_prop_get_numeric(zfs_handle_t *zhp, zfs_prop_t prop, uint64_t *value, zprop_source_t *src, char *statbuf, size_t statlen) { - char *source; + const char *source; /* * Check to see if this property applies to our object @@ -3109,11 +3206,15 @@ userquota_propname_decode(const char *propname, boolean_t zoned, cp = strchr(propname, '@') + 1; - if (isuser && (pw = getpwnam(cp)) != NULL) { + if (isuser && + getpwnam_r(cp, &gpwd, rpbuf, sizeof (rpbuf), &pw) == 0 && + pw != NULL) { if (zoned && getzoneid() == GLOBAL_ZONEID) return (ENOENT); *ridp = pw->pw_uid; - } else if (isgroup && (gr = getgrnam(cp)) != NULL) { + } else if (isgroup && + getgrnam_r(cp, &ggrp, rpbuf, sizeof (rpbuf), &gr) == 0 && + gr != NULL) { if (zoned && getzoneid() == GLOBAL_ZONEID) return (ENOENT); *ridp = gr->gr_gid; @@ -3155,6 +3256,7 @@ userquota_propname_decode(const char *propname, boolean_t zoned, if (errno != 0 || *end != '\0') return (EINVAL); #else + (void) domainlen; return (ENOSYS); #endif /* HAVE_IDMAP */ } else { @@ -3412,7 +3514,7 @@ check_parents(libzfs_handle_t *hdl, const char *path, uint64_t *zoned, char parent[ZFS_MAX_DATASET_NAME_LEN]; char *slash; zfs_handle_t *zhp; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; uint64_t is_zoned; (void) snprintf(errbuf, sizeof (errbuf), @@ -3428,8 +3530,8 @@ check_parents(libzfs_handle_t *hdl, const char *path, uint64_t *zoned, /* check to see if the pool exists */ if ((slash = strchr(parent, '/')) == NULL) slash = parent + strlen(parent); - (void) strncpy(zc.zc_name, parent, slash - parent); - zc.zc_name[slash - parent] = '\0'; + (void) strlcpy(zc.zc_name, parent, + MIN(sizeof (zc.zc_name), slash - parent + 1)); if (zfs_ioctl(hdl, ZFS_IOC_OBJSET_STATS, &zc) != 0 && errno == ENOENT) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, @@ -3565,14 +3667,14 @@ create_parents(libzfs_handle_t *hdl, char *target, int prefixlen) goto ancestorerr; } - if (zfs_share(h) != 0) { + if (zfs_share(h, NULL) != 0) { opname = dgettext(TEXT_DOMAIN, "share"); goto ancestorerr; } zfs_close(h); } - zfs_commit_all_shares(); + zfs_commit_shares(NULL); return (0); @@ -3590,7 +3692,7 @@ zfs_create_ancestors(libzfs_handle_t *hdl, const char *path) { int prefix; char *path_copy; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; int rc = 0; (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, @@ -3634,7 +3736,7 @@ zfs_create(libzfs_handle_t *hdl, const char *path, zfs_type_t type, zpool_handle_t *zpool_handle; uint8_t *wkeydata = NULL; uint_t wkeylen = 0; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; char parent[ZFS_MAX_DATASET_NAME_LEN]; (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, @@ -3782,7 +3884,7 @@ zfs_create(libzfs_handle_t *hdl, const char *path, zfs_type_t type, if (type == ZFS_TYPE_VOLUME) return (zfs_error(hdl, EZFS_VOLTOOBIG, errbuf)); - fallthrough; + zfs_fallthrough; #endif default: return (zfs_standard_error(hdl, errno, errbuf)); @@ -3855,9 +3957,9 @@ zfs_check_snap_cb(zfs_handle_t *zhp, void *arg) return (EINVAL); if (lzc_exists(name)) - verify(nvlist_add_boolean(dd->nvl, name) == 0); + fnvlist_add_boolean(dd->nvl, name); - rv = zfs_iter_filesystems(zhp, zfs_check_snap_cb, dd); + rv = zfs_iter_filesystems_v2(zhp, 0, zfs_check_snap_cb, dd); zfs_close(zhp); return (rv); } @@ -3872,7 +3974,7 @@ zfs_destroy_snaps(zfs_handle_t *zhp, char *snapname, boolean_t defer) struct destroydata dd = { 0 }; dd.snapname = snapname; - verify(nvlist_alloc(&dd.nvl, NV_UNIQUE_NAME, 0) == 0); + dd.nvl = fnvlist_alloc(); (void) zfs_check_snap_cb(zfs_handle_dup(zhp), &dd); if (nvlist_empty(dd.nvl)) { @@ -3882,7 +3984,7 @@ zfs_destroy_snaps(zfs_handle_t *zhp, char *snapname, boolean_t defer) } else { ret = zfs_destroy_snaps_nvl(zhp->zfs_hdl, dd.nvl, defer); } - nvlist_free(dd.nvl); + fnvlist_free(dd.nvl); return (ret); } @@ -3907,7 +4009,7 @@ zfs_destroy_snaps_nvl(libzfs_handle_t *hdl, nvlist_t *snaps, boolean_t defer) } if (nvlist_empty(errlist)) { - char errbuf[1024]; + char errbuf[ERRBUFLEN]; (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot destroy snapshots")); @@ -3915,7 +4017,7 @@ zfs_destroy_snaps_nvl(libzfs_handle_t *hdl, nvlist_t *snaps, boolean_t defer) } for (pair = nvlist_next_nvpair(errlist, NULL); pair != NULL; pair = nvlist_next_nvpair(errlist, pair)) { - char errbuf[1024]; + char errbuf[ERRBUFLEN]; (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot destroy snapshot %s"), nvpair_name(pair)); @@ -3926,6 +4028,26 @@ zfs_destroy_snaps_nvl(libzfs_handle_t *hdl, nvlist_t *snaps, boolean_t defer) dgettext(TEXT_DOMAIN, "snapshot is cloned")); ret = zfs_error(hdl, EZFS_EXISTS, errbuf); break; + case EBUSY: { + nvlist_t *existing_holds; + int err = lzc_get_holds(nvpair_name(pair), + &existing_holds); + + /* check the presence of holders */ + if (err == 0 && !nvlist_empty(existing_holds)) { + zfs_error_aux(hdl, + dgettext(TEXT_DOMAIN, "it's being held. " + "Run 'zfs holds -r %s' to see holders."), + nvpair_name(pair)); + ret = zfs_error(hdl, EBUSY, errbuf); + } else { + ret = zfs_standard_error(hdl, errno, errbuf); + } + + if (err == 0) + nvlist_free(existing_holds); + break; + } default: ret = zfs_standard_error(hdl, errno, errbuf); break; @@ -3944,7 +4066,7 @@ zfs_clone(zfs_handle_t *zhp, const char *target, nvlist_t *props) { char parent[ZFS_MAX_DATASET_NAME_LEN]; int ret; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; libzfs_handle_t *hdl = zhp->zfs_hdl; uint64_t zoned; @@ -3966,13 +4088,10 @@ zfs_clone(zfs_handle_t *zhp, const char *target, nvlist_t *props) /* do the clone */ if (props) { - zfs_type_t type; + zfs_type_t type = ZFS_TYPE_FILESYSTEM; - if (ZFS_IS_VOLUME(zhp)) { + if (ZFS_IS_VOLUME(zhp)) type = ZFS_TYPE_VOLUME; - } else { - type = ZFS_TYPE_FILESYSTEM; - } if ((props = zfs_valid_proplist(hdl, type, props, zoned, zhp, zhp->zpool_hdl, B_TRUE, errbuf)) == NULL) return (-1); @@ -4031,7 +4150,7 @@ zfs_promote(zfs_handle_t *zhp) libzfs_handle_t *hdl = zhp->zfs_hdl; char snapname[ZFS_MAX_DATASET_NAME_LEN]; int ret; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot promote '%s'"), zhp->zfs_name); @@ -4098,7 +4217,7 @@ zfs_snapshot_cb(zfs_handle_t *zhp, void *arg) fnvlist_add_boolean(sd->sd_nvl, name); - rv = zfs_iter_filesystems(zhp, zfs_snapshot_cb, sd); + rv = zfs_iter_filesystems_v2(zhp, 0, zfs_snapshot_cb, sd); } zfs_close(zhp); @@ -4113,7 +4232,7 @@ int zfs_snapshot_nvl(libzfs_handle_t *hdl, nvlist_t *snaps, nvlist_t *props) { int ret; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; nvpair_t *elem; nvlist_t *errors; zpool_handle_t *zpool_hdl; @@ -4141,6 +4260,8 @@ zfs_snapshot_nvl(libzfs_handle_t *hdl, nvlist_t *snaps, nvlist_t *props) * same pool, as does lzc_snapshot (below). */ elem = nvlist_next_nvpair(snaps, NULL); + if (elem == NULL) + return (-1); (void) strlcpy(pool, nvpair_name(elem), sizeof (pool)); pool[strcspn(pool, "/@")] = '\0'; zpool_hdl = zpool_open(hdl, pool); @@ -4198,7 +4319,7 @@ zfs_snapshot(libzfs_handle_t *hdl, const char *path, boolean_t recursive, char fsname[ZFS_MAX_DATASET_NAME_LEN]; char *cp; zfs_handle_t *zhp; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot snapshot %s"), path); @@ -4216,7 +4337,7 @@ zfs_snapshot(libzfs_handle_t *hdl, const char *path, boolean_t recursive, return (-1); } - verify(nvlist_alloc(&sd.sd_nvl, NV_UNIQUE_NAME, 0) == 0); + sd.sd_nvl = fnvlist_alloc(); if (recursive) { (void) zfs_snapshot_cb(zfs_handle_dup(zhp), &sd); } else { @@ -4224,7 +4345,7 @@ zfs_snapshot(libzfs_handle_t *hdl, const char *path, boolean_t recursive, } ret = zfs_snapshot_nvl(hdl, sd.sd_nvl, props); - nvlist_free(sd.sd_nvl); + fnvlist_free(sd.sd_nvl); zfs_close(zhp); return (ret); } @@ -4273,7 +4394,7 @@ rollback_destroy(zfs_handle_t *zhp, void *data) rollback_data_t *cbp = data; if (zfs_prop_get_int(zhp, ZFS_PROP_CREATETXG) > cbp->cb_create) { - cbp->cb_error |= zfs_iter_dependents(zhp, B_FALSE, + cbp->cb_error |= zfs_iter_dependents_v2(zhp, 0, B_FALSE, rollback_destroy_dependent, cbp); cbp->cb_error |= zfs_destroy(zhp, B_FALSE); @@ -4313,10 +4434,10 @@ zfs_rollback(zfs_handle_t *zhp, zfs_handle_t *snap, boolean_t force) if (cb.cb_create > 0) min_txg = cb.cb_create; - (void) zfs_iter_snapshots(zhp, B_FALSE, rollback_destroy, &cb, + (void) zfs_iter_snapshots_v2(zhp, 0, rollback_destroy, &cb, min_txg, 0); - (void) zfs_iter_bookmarks(zhp, rollback_destroy, &cb); + (void) zfs_iter_bookmarks_v2(zhp, 0, rollback_destroy, &cb); if (cb.cb_error) return (-1); @@ -4341,7 +4462,7 @@ zfs_rollback(zfs_handle_t *zhp, zfs_handle_t *snap, boolean_t force) */ err = lzc_rollback_to(zhp->zfs_name, snap->zfs_name); if (err != 0) { - char errbuf[1024]; + char errbuf[ERRBUFLEN]; (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot rollback '%s'"), @@ -4400,7 +4521,7 @@ zfs_rename(zfs_handle_t *zhp, const char *target, renameflags_t flags) char parent[ZFS_MAX_DATASET_NAME_LEN]; char property[ZFS_MAXPROPLEN]; libzfs_handle_t *hdl = zhp->zfs_hdl; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; /* if we have the same exact name, just return success */ if (strcmp(zhp->zfs_name, target) == 0) @@ -4505,10 +4626,6 @@ zfs_rename(zfs_handle_t *zhp, const char *target, renameflags_t flags) } if (flags.recursive) { char *parentname = zfs_strdup(zhp->zfs_hdl, zhp->zfs_name); - if (parentname == NULL) { - ret = -1; - goto error; - } delim = strchr(parentname, '@'); *delim = '\0'; zfs_handle_t *zhrp = zfs_open(zhp->zfs_hdl, parentname, @@ -4583,6 +4700,7 @@ zfs_rename(zfs_handle_t *zhp, const char *target, renameflags_t flags) changelist_rename(cl, zfs_get_name(zhp), target); ret = changelist_postfix(cl); } + (void) strlcpy(zhp->zfs_name, target, sizeof (zhp->zfs_name)); } error: @@ -4635,7 +4753,7 @@ zfs_expand_proplist(zfs_handle_t *zhp, zprop_list_t **plp, boolean_t received, zprop_list_t **last, **start; nvlist_t *userprops, *propval; nvpair_t *elem; - char *strval; + const char *strval; char buf[ZFS_MAXPROPLEN]; if (zprop_expand_list(hdl, plp, ZFS_TYPE_DATASET) != 0) @@ -4652,7 +4770,7 @@ zfs_expand_proplist(zfs_handle_t *zhp, zprop_list_t **plp, boolean_t received, */ start = plp; while (*start != NULL) { - if ((*start)->pl_prop == ZPROP_INVAL) + if ((*start)->pl_prop == ZPROP_USERPROP) break; start = &(*start)->pl_next; } @@ -4670,15 +4788,10 @@ zfs_expand_proplist(zfs_handle_t *zhp, zprop_list_t **plp, boolean_t received, } if (*last == NULL) { - if ((entry = zfs_alloc(hdl, - sizeof (zprop_list_t))) == NULL || - ((entry->pl_user_prop = zfs_strdup(hdl, - nvpair_name(elem)))) == NULL) { - free(entry); - return (-1); - } - - entry->pl_prop = ZPROP_INVAL; + entry = zfs_alloc(hdl, sizeof (zprop_list_t)); + entry->pl_user_prop = + zfs_strdup(hdl, nvpair_name(elem)); + entry->pl_prop = ZPROP_USERPROP; entry->pl_width = strlen(nvpair_name(elem)); entry->pl_all = B_TRUE; *last = entry; @@ -4693,7 +4806,7 @@ zfs_expand_proplist(zfs_handle_t *zhp, zprop_list_t **plp, boolean_t received, if (entry->pl_fixed && !literal) continue; - if (entry->pl_prop != ZPROP_INVAL) { + if (entry->pl_prop != ZPROP_USERPROP) { if (zfs_prop_get(zhp, entry->pl_prop, buf, sizeof (buf), NULL, NULL, 0, literal) == 0) { if (strlen(buf) > entry->pl_width) @@ -4707,8 +4820,8 @@ zfs_expand_proplist(zfs_handle_t *zhp, zprop_list_t **plp, boolean_t received, } else { if (nvlist_lookup_nvlist(userprops, entry->pl_user_prop, &propval) == 0) { - verify(nvlist_lookup_string(propval, - ZPROP_VALUE, &strval) == 0); + strval = fnvlist_lookup_string(propval, + ZPROP_VALUE); if (strlen(strval) > entry->pl_width) entry->pl_width = strlen(strval); } @@ -4742,13 +4855,14 @@ zfs_prune_proplist(zfs_handle_t *zhp, uint8_t *props) next = nvlist_next_nvpair(zhp->zfs_props, curr); /* - * User properties will result in ZPROP_INVAL, and since we + * User properties will result in ZPROP_USERPROP (an alias + * for ZPROP_INVAL), and since we * only know how to prune standard ZFS properties, we always * leave these in the list. This can also happen if we * encounter an unknown DSL property (when running older * software, for example). */ - if (zfs_prop != ZPROP_INVAL && props[zfs_prop] == B_FALSE) + if (zfs_prop != ZPROP_USERPROP && props[zfs_prop] == B_FALSE) (void) nvlist_remove(zhp->zfs_props, nvpair_name(curr), nvpair_type(curr)); curr = next; @@ -4790,17 +4904,14 @@ zfs_smb_acl_mgmt(libzfs_handle_t *hdl, char *dataset, char *path, (void) no_memory(hdl); return (-1); } - if (zcmd_write_src_nvlist(hdl, &zc, nvlist) != 0) { - nvlist_free(nvlist); - return (-1); - } + zcmd_write_src_nvlist(hdl, &zc, nvlist); break; case ZFS_SMB_ACL_PURGE: break; default: return (-1); } - error = ioctl(hdl->libzfs_fd, ZFS_IOC_SMB_ACL, &zc); + error = lzc_ioctl_fd(hdl->libzfs_fd, ZFS_IOC_SMB_ACL, &zc); nvlist_free(nvlist); return (error); } @@ -4875,7 +4986,7 @@ zfs_userspace(zfs_handle_t *zhp, zfs_userquota_prop_t type, while (zc.zc_nvlist_dst_size > 0) { if ((ret = func(arg, zua->zu_domain, zua->zu_rid, - zua->zu_space)) != 0) + zua->zu_space, zc.zc_guid)) != 0) return (ret); zua++; zc.zc_nvlist_dst_size -= sizeof (zfs_useracct_t); @@ -4908,7 +5019,7 @@ zfs_hold_one(zfs_handle_t *zhp, void *arg) fnvlist_add_string(ha->nvl, name, ha->tag); if (ha->recursive) - rv = zfs_iter_filesystems(zhp, zfs_hold_one, ha); + rv = zfs_iter_filesystems_v2(zhp, 0, zfs_hold_one, ha); zfs_close(zhp); return (rv); } @@ -4927,7 +5038,7 @@ zfs_hold(zfs_handle_t *zhp, const char *snapname, const char *tag, (void) zfs_hold_one(zfs_handle_dup(zhp), &ha); if (nvlist_empty(ha.nvl)) { - char errbuf[1024]; + char errbuf[ERRBUFLEN]; fnvlist_free(ha.nvl); ret = ENOENT; @@ -4951,7 +5062,7 @@ zfs_hold_nvl(zfs_handle_t *zhp, int cleanup_fd, nvlist_t *holds) int ret; nvlist_t *errors; libzfs_handle_t *hdl = zhp->zfs_hdl; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; nvpair_t *elem; errors = NULL; @@ -5039,7 +5150,7 @@ zfs_release_one(zfs_handle_t *zhp, void *arg) } if (ha->recursive) - rv = zfs_iter_filesystems(zhp, zfs_release_one, ha); + rv = zfs_iter_filesystems_v2(zhp, 0, zfs_release_one, ha); zfs_close(zhp); return (rv); } @@ -5053,7 +5164,7 @@ zfs_release(zfs_handle_t *zhp, const char *snapname, const char *tag, nvlist_t *errors = NULL; nvpair_t *elem; libzfs_handle_t *hdl = zhp->zfs_hdl; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; ha.nvl = fnvlist_alloc(); ha.snapname = snapname; @@ -5133,7 +5244,7 @@ zfs_get_fsacl(zfs_handle_t *zhp, nvlist_t **nvl) int nvsz = 2048; void *nvbuf; int err = 0; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; assert(zhp->zfs_type == ZFS_TYPE_VOLUME || zhp->zfs_type == ZFS_TYPE_FILESYSTEM); @@ -5142,7 +5253,7 @@ tryagain: nvbuf = malloc(nvsz); if (nvbuf == NULL) { - err = (zfs_error(hdl, EZFS_NOMEM, strerror(errno))); + err = (zfs_error(hdl, EZFS_NOMEM, zfs_strerror(errno))); goto out; } @@ -5197,7 +5308,7 @@ zfs_set_fsacl(zfs_handle_t *zhp, boolean_t un, nvlist_t *nvl) zfs_cmd_t zc = {"\0"}; libzfs_handle_t *hdl = zhp->zfs_hdl; char *nvbuf; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; size_t nvsz; int err; @@ -5249,7 +5360,7 @@ int zfs_get_holds(zfs_handle_t *zhp, nvlist_t **nvl) { int err; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; err = lzc_get_holds(zhp->zfs_name, nvl); @@ -5325,12 +5436,12 @@ zfs_get_holds(zfs_handle_t *zhp, nvlist_t **nvl) * +-------+-------+-------+-------+-------+ * * Above, notice that the 4k block required one sector for parity and another - * for data. vdev_raidz_asize() will return 8k and as such the pool's allocated - * and free properties will be adjusted by 8k. The dataset will not be charged - * 8k. Rather, it will be charged a value that is scaled according to the - * overhead of the 128k block on the same vdev. This 8k allocation will be - * charged 8k * 128k / 160k. 128k is from SPA_OLD_MAXBLOCKSIZE and 160k is as - * calculated in the 128k block example above. + * for data. vdev_raidz_psize_to_asize() will return 8k and as such the pool's + * allocated and free properties will be adjusted by 8k. The dataset will not + * be charged 8k. Rather, it will be charged a value that is scaled according + * to the overhead of the 128k block on the same vdev. This 8k allocation will + * be charged 8k * 128k / 160k. 128k is from SPA_OLD_MAXBLOCKSIZE and 160k is + * as calculated in the 128k block example above. * * Every raidz allocation is sized to be a multiple of nparity+1 sectors. That * is, every raidz1 allocation will be a multiple of 2 sectors, raidz2 @@ -5377,7 +5488,7 @@ zfs_get_holds(zfs_handle_t *zhp, nvlist_t **nvl) * not necessarily equal to "blksize", due to RAIDZ deflation. */ static uint64_t -vdev_raidz_asize(uint64_t ndisks, uint64_t nparity, uint64_t ashift, +vdev_raidz_psize_to_asize(uint64_t ndisks, uint64_t nparity, uint64_t ashift, uint64_t blksize) { uint64_t asize, ndata; @@ -5397,7 +5508,7 @@ vdev_raidz_asize(uint64_t ndisks, uint64_t nparity, uint64_t ashift, * size. */ static uint64_t -vdev_draid_asize(uint64_t ndisks, uint64_t nparity, uint64_t ashift, +vdev_draid_psize_to_asize(uint64_t ndisks, uint64_t nparity, uint64_t ashift, uint64_t blksize) { ASSERT3U(ndisks, >, nparity); @@ -5428,7 +5539,7 @@ volsize_from_vdevs(zpool_handle_t *zhp, uint64_t nblocks, uint64_t blksize) } for (int v = 0; v < nvdevs; v++) { - char *type; + const char *type; uint64_t nparity, ashift, asize, tsize; uint64_t volsize; @@ -5457,12 +5568,12 @@ volsize_from_vdevs(zpool_handle_t *zhp, uint64_t nblocks, uint64_t blksize) continue; /* allocation size for the "typical" 128k block */ - tsize = vdev_raidz_asize(ndisks, nparity, ashift, - SPA_OLD_MAXBLOCKSIZE); + tsize = vdev_raidz_psize_to_asize(ndisks, nparity, + ashift, SPA_OLD_MAXBLOCKSIZE); /* allocation size for the blksize block */ - asize = vdev_raidz_asize(ndisks, nparity, ashift, - blksize); + asize = vdev_raidz_psize_to_asize(ndisks, nparity, + ashift, blksize); } else { uint64_t ndata; @@ -5471,19 +5582,32 @@ volsize_from_vdevs(zpool_handle_t *zhp, uint64_t nblocks, uint64_t blksize) continue; /* allocation size for the "typical" 128k block */ - tsize = vdev_draid_asize(ndata + nparity, nparity, - ashift, SPA_OLD_MAXBLOCKSIZE); + tsize = vdev_draid_psize_to_asize(ndata + nparity, + nparity, ashift, SPA_OLD_MAXBLOCKSIZE); /* allocation size for the blksize block */ - asize = vdev_draid_asize(ndata + nparity, nparity, - ashift, blksize); + asize = vdev_draid_psize_to_asize(ndata + nparity, + nparity, ashift, blksize); } /* * Scale this size down as a ratio of 128k / tsize. * See theory statement above. + * + * Bitshift is to avoid the case of nblocks * asize < tsize + * producing a size of 0. + */ + volsize = (nblocks * asize) / (tsize >> SPA_MINBLOCKSHIFT); + /* + * If we would blow UINT64_MAX with this next multiplication, + * don't. */ - volsize = nblocks * asize * SPA_OLD_MAXBLOCKSIZE / tsize; + if (volsize > + (UINT64_MAX / (SPA_OLD_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT))) + volsize = UINT64_MAX; + else + volsize *= (SPA_OLD_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT); + if (volsize > ret) { ret = volsize; } @@ -5510,7 +5634,7 @@ zvol_volsize_to_reservation(zpool_handle_t *zph, uint64_t volsize, uint64_t numdb; uint64_t nblocks, volblocksize; int ncopies; - char *strval; + const char *strval; if (nvlist_lookup_string(props, zfs_prop_to_name(ZFS_PROP_COPIES), &strval) == 0) diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs_diff.c b/sys/contrib/openzfs/lib/libzfs/libzfs_diff.c index d46e23a2fc0e..6aa0375f98d7 100644 --- a/sys/contrib/openzfs/lib/libzfs/libzfs_diff.c +++ b/sys/contrib/openzfs/lib/libzfs/libzfs_diff.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -41,20 +42,24 @@ #include <unistd.h> #include <stdio.h> #include <stdlib.h> -#include <stropts.h> #include <pthread.h> #include <sys/zfs_ioctl.h> #include <libzfs.h> +#include <libzutil.h> #include "libzfs_impl.h" #define ZDIFF_SNAPDIR "/.zfs/snapshot/" #define ZDIFF_PREFIX "zfs-diff-%d" #define ZDIFF_ADDED '+' -#define ZDIFF_MODIFIED 'M' +#define ZDIFF_MODIFIED "M" #define ZDIFF_REMOVED '-' -#define ZDIFF_RENAMED 'R' +#define ZDIFF_RENAMED "R" +#define ZDIFF_ADDED_COLOR ANSI_GREEN +#define ZDIFF_MODIFIED_COLOR ANSI_YELLOW +#define ZDIFF_REMOVED_COLOR ANSI_RED +#define ZDIFF_RENAMED_COLOR ANSI_BOLD_BLUE /* * Given a {dsname, object id}, get the object path @@ -122,119 +127,136 @@ stream_bytes(FILE *fp, const char *string) while ((c = *string++) != '\0') { if (c > ' ' && c != '\\' && c < '\177') { - (void) fprintf(fp, "%c", c); + (void) fputc(c, fp); } else { - (void) fprintf(fp, "\\%04o", (uint8_t)c); + (void) fprintf(fp, "\\%04hho", (uint8_t)c); } } } -static void -print_what(FILE *fp, mode_t what) +/* + * Takes the type of change (like `print_file`), outputs the appropriate color + */ +static const char * +type_to_color(char type) { - char symbol; + if (type == '+') + return (ZDIFF_ADDED_COLOR); + else if (type == '-') + return (ZDIFF_REMOVED_COLOR); + else if (type == 'M') + return (ZDIFF_MODIFIED_COLOR); + else if (type == 'R') + return (ZDIFF_RENAMED_COLOR); + else + return (NULL); +} + +static char +get_what(mode_t what) +{ switch (what & S_IFMT) { case S_IFBLK: - symbol = 'B'; - break; + return ('B'); case S_IFCHR: - symbol = 'C'; - break; + return ('C'); case S_IFDIR: - symbol = '/'; - break; + return ('/'); #ifdef S_IFDOOR case S_IFDOOR: - symbol = '>'; - break; + return ('>'); #endif case S_IFIFO: - symbol = '|'; - break; + return ('|'); case S_IFLNK: - symbol = '@'; - break; + return ('@'); #ifdef S_IFPORT case S_IFPORT: - symbol = 'P'; - break; + return ('P'); #endif case S_IFSOCK: - symbol = '='; - break; + return ('='); case S_IFREG: - symbol = 'F'; - break; + return ('F'); default: - symbol = '?'; - break; + return ('?'); } - (void) fprintf(fp, "%c", symbol); } static void print_cmn(FILE *fp, differ_info_t *di, const char *file) { - stream_bytes(fp, di->dsmnt); - stream_bytes(fp, file); + if (!di->no_mangle) { + stream_bytes(fp, di->dsmnt); + stream_bytes(fp, file); + } else { + (void) fputs(di->dsmnt, fp); + (void) fputs(file, fp); + } } static void print_rename(FILE *fp, differ_info_t *di, const char *old, const char *new, zfs_stat_t *isb) { + if (isatty(fileno(fp))) + color_start(ZDIFF_RENAMED_COLOR); if (di->timestamped) (void) fprintf(fp, "%10lld.%09lld\t", (longlong_t)isb->zs_ctime[0], (longlong_t)isb->zs_ctime[1]); - (void) fprintf(fp, "%c\t", ZDIFF_RENAMED); - if (di->classify) { - print_what(fp, isb->zs_mode); - (void) fprintf(fp, "\t"); - } + (void) fputs(ZDIFF_RENAMED "\t", fp); + if (di->classify) + (void) fprintf(fp, "%c\t", get_what(isb->zs_mode)); print_cmn(fp, di, old); - if (di->scripted) - (void) fprintf(fp, "\t"); - else - (void) fprintf(fp, " -> "); + (void) fputs(di->scripted ? "\t" : " -> ", fp); print_cmn(fp, di, new); - (void) fprintf(fp, "\n"); + (void) fputc('\n', fp); + + if (isatty(fileno(fp))) + color_end(); } static void print_link_change(FILE *fp, differ_info_t *di, int delta, const char *file, zfs_stat_t *isb) { + if (isatty(fileno(fp))) + color_start(ZDIFF_MODIFIED_COLOR); + if (di->timestamped) (void) fprintf(fp, "%10lld.%09lld\t", (longlong_t)isb->zs_ctime[0], (longlong_t)isb->zs_ctime[1]); - (void) fprintf(fp, "%c\t", ZDIFF_MODIFIED); - if (di->classify) { - print_what(fp, isb->zs_mode); - (void) fprintf(fp, "\t"); - } + (void) fputs(ZDIFF_MODIFIED "\t", fp); + if (di->classify) + (void) fprintf(fp, "%c\t", get_what(isb->zs_mode)); print_cmn(fp, di, file); - (void) fprintf(fp, "\t(%+d)", delta); - (void) fprintf(fp, "\n"); + (void) fprintf(fp, "\t(%+d)\n", delta); + if (isatty(fileno(fp))) + color_end(); } static void print_file(FILE *fp, differ_info_t *di, char type, const char *file, zfs_stat_t *isb) { + if (isatty(fileno(fp))) + color_start(type_to_color(type)); + if (di->timestamped) (void) fprintf(fp, "%10lld.%09lld\t", (longlong_t)isb->zs_ctime[0], (longlong_t)isb->zs_ctime[1]); (void) fprintf(fp, "%c\t", type); - if (di->classify) { - print_what(fp, isb->zs_mode); - (void) fprintf(fp, "\t"); - } + if (di->classify) + (void) fprintf(fp, "%c\t", get_what(isb->zs_mode)); print_cmn(fp, di, file); - (void) fprintf(fp, "\n"); + (void) fputc('\n', fp); + + if (isatty(fileno(fp))) + color_end(); } static int @@ -262,7 +284,7 @@ write_inuse_diffs_one(FILE *fp, differ_info_t *di, uint64_t dobj) fobjerr = get_stats_for_obj(di, di->fromsnap, dobj, fobjname, MAXPATHLEN, &fsb); if (fobjerr && di->zerr != ENOTSUP && di->zerr != ENOENT) { - zfs_error_aux(di->zhp->zfs_hdl, "%s", strerror(di->zerr)); + zfs_error_aux(di->zhp->zfs_hdl, "%s", zfs_strerror(di->zerr)); zfs_error(di->zhp->zfs_hdl, di->zerr, di->errbuf); /* * Let's not print an error for the same object more than @@ -277,7 +299,7 @@ write_inuse_diffs_one(FILE *fp, differ_info_t *di, uint64_t dobj) if (tobjerr && di->zerr != ENOTSUP && di->zerr != ENOENT) { if (!already_logged) { zfs_error_aux(di->zhp->zfs_hdl, - "%s", strerror(di->zerr)); + "%s", zfs_strerror(di->zerr)); zfs_error(di->zhp->zfs_hdl, di->zerr, di->errbuf); } } @@ -327,7 +349,7 @@ write_inuse_diffs_one(FILE *fp, differ_info_t *di, uint64_t dobj) print_link_change(fp, di, change, change > 0 ? fobjname : tobjname, &tsb); } else if (strcmp(fobjname, tobjname) == 0) { - print_file(fp, di, ZDIFF_MODIFIED, fobjname, &tsb); + print_file(fp, di, *ZDIFF_MODIFIED, fobjname, &tsb); } else { print_rename(fp, di, fobjname, tobjname, &tsb); } @@ -396,7 +418,7 @@ write_free_diffs(FILE *fp, differ_info_t *di, dmu_diff_record_t *dr) if (zc.zc_obj > dr->ddr_last) { break; } - err = describe_free(fp, di, zc.zc_obj, fobjname, + (void) describe_free(fp, di, zc.zc_obj, fobjname, MAXPATHLEN); } else if (errno == ESRCH) { break; @@ -424,7 +446,7 @@ differ(void *arg) if ((ofp = fdopen(di->outputfd, "w")) == NULL) { di->zerr = errno; - strlcpy(di->errbuf, strerror(errno), sizeof (di->errbuf)); + strlcpy(di->errbuf, zfs_strerror(errno), sizeof (di->errbuf)); (void) close(di->datafd); return ((void *)-1); } @@ -591,8 +613,7 @@ get_snapshot_names(differ_info_t *di, const char *fromsnap, zfs_handle_t *zhp; di->ds = zfs_alloc(di->zhp->zfs_hdl, tdslen + 1); - (void) strncpy(di->ds, tosnap, tdslen); - di->ds[tdslen] = '\0'; + (void) strlcpy(di->ds, tosnap, tdslen + 1); zhp = zfs_open(hdl, di->ds, ZFS_TYPE_FILESYSTEM); while (zhp != NULL) { @@ -620,17 +641,15 @@ get_snapshot_names(differ_info_t *di, const char *fromsnap, di->isclone = B_TRUE; di->fromsnap = zfs_strdup(hdl, fromsnap); - if (tsnlen) { + if (tsnlen) di->tosnap = zfs_strdup(hdl, tosnap); - } else { + else return (make_temp_snapshot(di)); - } } else { int dslen = fdslen ? fdslen : tdslen; di->ds = zfs_alloc(hdl, dslen + 1); - (void) strncpy(di->ds, fdslen ? fromsnap : tosnap, dslen); - di->ds[dslen] = '\0'; + (void) strlcpy(di->ds, fdslen ? fromsnap : tosnap, dslen + 1); di->fromsnap = zfs_asprintf(hdl, "%s%s", di->ds, atptrf); if (tsnlen) { @@ -729,7 +748,7 @@ zfs_show_diffs(zfs_handle_t *zhp, int outfd, const char *fromsnap, const char *tosnap, int flags) { zfs_cmd_t zc = {"\0"}; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; differ_info_t di = { 0 }; pthread_t tid; int pipefd[2]; @@ -744,7 +763,7 @@ zfs_show_diffs(zfs_handle_t *zhp, int outfd, const char *fromsnap, } if (pipe2(pipefd, O_CLOEXEC)) { - zfs_error_aux(zhp->zfs_hdl, "%s", strerror(errno)); + zfs_error_aux(zhp->zfs_hdl, "%s", zfs_strerror(errno)); teardown_differ_info(&di); return (zfs_error(zhp->zfs_hdl, EZFS_PIPEFAILED, errbuf)); } @@ -752,12 +771,13 @@ zfs_show_diffs(zfs_handle_t *zhp, int outfd, const char *fromsnap, di.scripted = (flags & ZFS_DIFF_PARSEABLE); di.classify = (flags & ZFS_DIFF_CLASSIFY); di.timestamped = (flags & ZFS_DIFF_TIMESTAMP); + di.no_mangle = (flags & ZFS_DIFF_NO_MANGLE); di.outputfd = outfd; di.datafd = pipefd[0]; if (pthread_create(&tid, NULL, differ, &di)) { - zfs_error_aux(zhp->zfs_hdl, "%s", strerror(errno)); + zfs_error_aux(zhp->zfs_hdl, "%s", zfs_strerror(errno)); (void) close(pipefd[0]); (void) close(pipefd[1]); teardown_differ_info(&di); @@ -783,14 +803,15 @@ zfs_show_diffs(zfs_handle_t *zhp, int outfd, const char *fromsnap, zfs_error_aux(zhp->zfs_hdl, dgettext(TEXT_DOMAIN, "\n Not an earlier snapshot from the same fs")); } else if (errno != EPIPE || di.zerr == 0) { - zfs_error_aux(zhp->zfs_hdl, "%s", strerror(errno)); + zfs_error_aux(zhp->zfs_hdl, "%s", zfs_strerror(errno)); } (void) close(pipefd[1]); (void) pthread_cancel(tid); (void) pthread_join(tid, NULL); teardown_differ_info(&di); if (di.zerr != 0 && di.zerr != EPIPE) { - zfs_error_aux(zhp->zfs_hdl, "%s", strerror(di.zerr)); + zfs_error_aux(zhp->zfs_hdl, "%s", + zfs_strerror(di.zerr)); return (zfs_error(zhp->zfs_hdl, EZFS_DIFF, di.errbuf)); } else { return (zfs_error(zhp->zfs_hdl, EZFS_DIFFDATA, errbuf)); @@ -801,7 +822,7 @@ zfs_show_diffs(zfs_handle_t *zhp, int outfd, const char *fromsnap, (void) pthread_join(tid, NULL); if (di.zerr != 0) { - zfs_error_aux(zhp->zfs_hdl, "%s", strerror(di.zerr)); + zfs_error_aux(zhp->zfs_hdl, "%s", zfs_strerror(di.zerr)); return (zfs_error(zhp->zfs_hdl, EZFS_DIFF, di.errbuf)); } teardown_differ_info(&di); diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs_impl.h b/sys/contrib/openzfs/lib/libzfs/libzfs_impl.h index b1cf4f825f8a..9053740ec2f0 100644 --- a/sys/contrib/openzfs/lib/libzfs/libzfs_impl.h +++ b/sys/contrib/openzfs/lib/libzfs/libzfs_impl.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -44,6 +45,8 @@ extern "C" { #endif +#define ERRBUFLEN 1024 + struct libzfs_handle { int libzfs_error; int libzfs_fd; @@ -92,12 +95,15 @@ struct zfs_handle { * snapshots of volumes. */ #define ZFS_IS_VOLUME(zhp) ((zhp)->zfs_head_type == ZFS_TYPE_VOLUME) +#define ZHP_MAX_PROPNAMES 4 struct zpool_handle { libzfs_handle_t *zpool_hdl; zpool_handle_t *zpool_next; char zpool_name[ZFS_MAX_DATASET_NAME_LEN]; int zpool_state; + unsigned int zpool_n_propnames; + const char *zpool_propnames[ZHP_MAX_PROPNAMES]; size_t zpool_config_size; nvlist_t *zpool_config; nvlist_t *zpool_old_config; @@ -105,22 +111,6 @@ struct zpool_handle { diskaddr_t zpool_start_block; }; -typedef enum { - PROTO_NFS = 0, - PROTO_SMB = 1, - PROTO_END = 2 -} zfs_share_proto_t; - -/* - * The following can be used as a bitmask and any new values - * added must preserve that capability. - */ -typedef enum { - SHARED_NOT_SHARED = 0x0, - SHARED_NFS = 0x2, - SHARED_SMB = 0x4 -} zfs_share_type_t; - typedef int (*zfs_uri_handler_fn_t)(struct libzfs_handle *, const char *, const char *, zfs_keyformat_t, boolean_t, uint8_t **, size_t *); @@ -154,7 +144,7 @@ extern zfs_handle_t *make_dataset_handle_zc(libzfs_handle_t *, zfs_cmd_t *); extern zfs_handle_t *make_dataset_simple_handle_zc(zfs_handle_t *, zfs_cmd_t *); extern int zprop_parse_value(libzfs_handle_t *, nvpair_t *, int, zfs_type_t, - nvlist_t *, char **, uint64_t *, const char *); + nvlist_t *, const char **, uint64_t *, const char *); extern int zprop_expand_list(libzfs_handle_t *hdl, zprop_list_t **plp, zfs_type_t type); @@ -175,10 +165,10 @@ extern int zprop_expand_list(libzfs_handle_t *hdl, zprop_list_t **plp, typedef struct prop_changelist prop_changelist_t; -extern int zcmd_alloc_dst_nvlist(libzfs_handle_t *, zfs_cmd_t *, size_t); -extern int zcmd_write_src_nvlist(libzfs_handle_t *, zfs_cmd_t *, nvlist_t *); -extern int zcmd_write_conf_nvlist(libzfs_handle_t *, zfs_cmd_t *, nvlist_t *); -extern int zcmd_expand_dst_nvlist(libzfs_handle_t *, zfs_cmd_t *); +extern void zcmd_alloc_dst_nvlist(libzfs_handle_t *, zfs_cmd_t *, size_t); +extern void zcmd_write_src_nvlist(libzfs_handle_t *, zfs_cmd_t *, nvlist_t *); +extern void zcmd_write_conf_nvlist(libzfs_handle_t *, zfs_cmd_t *, nvlist_t *); +extern void zcmd_expand_dst_nvlist(libzfs_handle_t *, zfs_cmd_t *); extern int zcmd_read_dst_nvlist(libzfs_handle_t *, zfs_cmd_t *, nvlist_t **); extern void zcmd_free_nvlists(zfs_cmd_t *); @@ -189,7 +179,7 @@ extern void changelist_remove(prop_changelist_t *, const char *); extern void changelist_free(prop_changelist_t *); extern prop_changelist_t *changelist_gather(zfs_handle_t *, zfs_prop_t, int, int); -extern int changelist_unshare(prop_changelist_t *, zfs_share_proto_t *); +extern int changelist_unshare(prop_changelist_t *, const enum sa_protocol *); extern int changelist_haszonedchild(prop_changelist_t *); extern void remove_mountpoint(zfs_handle_t *); @@ -209,11 +199,8 @@ extern int zfs_validate_name(libzfs_handle_t *hdl, const char *path, int type, extern void namespace_clear(libzfs_handle_t *); -extern int zfs_parse_options(char *, zfs_share_proto_t); - typedef struct { zfs_prop_t p_prop; - char *p_name; int p_share_err; int p_unshare_err; } proto_table_t; @@ -227,11 +214,12 @@ typedef struct differ_info { char *ds; char *dsmnt; char *tmpsnap; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; boolean_t isclone; boolean_t scripted; boolean_t classify; boolean_t timestamped; + boolean_t no_mangle; uint64_t shares; int zerr; int cleanupfd; @@ -239,26 +227,13 @@ typedef struct differ_info { int datafd; } differ_info_t; -extern proto_table_t proto_table[PROTO_END]; - -extern int do_mount(zfs_handle_t *zhp, const char *mntpt, char *opts, +extern int do_mount(zfs_handle_t *zhp, const char *mntpt, const char *opts, int flags); extern int do_unmount(zfs_handle_t *zhp, const char *mntpt, int flags); -extern int zfs_mount_delegation_check(void); -extern int zfs_share_proto(zfs_handle_t *zhp, zfs_share_proto_t *proto); -extern int zfs_unshare_proto(zfs_handle_t *, const char *, zfs_share_proto_t *); -extern int unshare_one(libzfs_handle_t *hdl, const char *name, - const char *mountpoint, zfs_share_proto_t proto); -extern boolean_t zfs_is_mountable(zfs_handle_t *zhp, char *buf, size_t buflen, - zprop_source_t *source, int flags); -extern zfs_share_type_t is_shared(const char *mountpoint, - zfs_share_proto_t proto); extern int libzfs_load_module(void); extern int zpool_relabel_disk(libzfs_handle_t *hdl, const char *path, const char *msg); extern int find_shares_object(differ_info_t *di); -extern void libzfs_set_pipe_max(int infd); -extern void zfs_commit_proto(zfs_share_proto_t *); #ifdef __cplusplus } diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs_import.c b/sys/contrib/openzfs/lib/libzfs/libzfs_import.c index 0d375b355166..599e8e6f7819 100644 --- a/sys/contrib/openzfs/lib/libzfs/libzfs_import.c +++ b/sys/contrib/openzfs/lib/libzfs/libzfs_import.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -48,7 +49,6 @@ pool_active(libzfs_handle_t *hdl, const char *name, uint64_t guid, boolean_t *isactive) { zpool_handle_t *zhp; - uint64_t theguid; if (zpool_open_silent(hdl, name, &zhp) != 0) return (-1); @@ -58,8 +58,8 @@ pool_active(libzfs_handle_t *hdl, const char *name, uint64_t guid, return (0); } - verify(nvlist_lookup_uint64(zhp->zpool_config, ZPOOL_CONFIG_POOL_GUID, - &theguid) == 0); + uint64_t theguid = fnvlist_lookup_uint64(zhp->zpool_config, + ZPOOL_CONFIG_POOL_GUID); zpool_close(zhp); @@ -74,23 +74,15 @@ refresh_config(libzfs_handle_t *hdl, nvlist_t *config) zfs_cmd_t zc = {"\0"}; int err, dstbuf_size; - if (zcmd_write_conf_nvlist(hdl, &zc, config) != 0) - return (NULL); + zcmd_write_conf_nvlist(hdl, &zc, config); dstbuf_size = MAX(CONFIG_BUF_MINSIZE, zc.zc_nvlist_conf_size * 32); - if (zcmd_alloc_dst_nvlist(hdl, &zc, dstbuf_size) != 0) { - zcmd_free_nvlists(&zc); - return (NULL); - } + zcmd_alloc_dst_nvlist(hdl, &zc, dstbuf_size); while ((err = zfs_ioctl(hdl, ZFS_IOC_POOL_TRYIMPORT, - &zc)) != 0 && errno == ENOMEM) { - if (zcmd_expand_dst_nvlist(hdl, &zc) != 0) { - zcmd_free_nvlists(&zc); - return (NULL); - } - } + &zc)) != 0 && errno == ENOMEM) + zcmd_expand_dst_nvlist(hdl, &zc); if (err) { zcmd_free_nvlists(&zc); @@ -146,10 +138,9 @@ zpool_clear_label(int fd) struct stat64 statbuf; int l; vdev_label_t *label; - l2arc_dev_hdr_phys_t *l2dhdr; uint64_t size; - int labels_cleared = 0, header_cleared = 0; - boolean_t clear_l2arc_header = B_FALSE; + boolean_t labels_cleared = B_FALSE, clear_l2arc_header = B_FALSE, + header_cleared = B_FALSE; if (fstat64_blk(fd, &statbuf) == -1) return (0); @@ -159,11 +150,6 @@ zpool_clear_label(int fd) if ((label = calloc(1, sizeof (vdev_label_t))) == NULL) return (-1); - if ((l2dhdr = calloc(1, sizeof (l2arc_dev_hdr_phys_t))) == NULL) { - free(label); - return (-1); - } - for (l = 0; l < VDEV_LABELS; l++) { uint64_t state, guid, l2cache; nvlist_t *config; @@ -213,24 +199,22 @@ zpool_clear_label(int fd) size_t label_size = sizeof (vdev_label_t) - (2 * VDEV_PAD_SIZE); if (pwrite64(fd, label, label_size, label_offset(size, l) + - (2 * VDEV_PAD_SIZE)) == label_size) { - labels_cleared++; - } + (2 * VDEV_PAD_SIZE)) == label_size) + labels_cleared = B_TRUE; } - /* Clear the L2ARC header. */ if (clear_l2arc_header) { - memset(l2dhdr, 0, sizeof (l2arc_dev_hdr_phys_t)); - if (pwrite64(fd, l2dhdr, sizeof (l2arc_dev_hdr_phys_t), - VDEV_LABEL_START_SIZE) == sizeof (l2arc_dev_hdr_phys_t)) { - header_cleared++; - } + _Static_assert(sizeof (*label) >= sizeof (l2arc_dev_hdr_phys_t), + "label < l2arc_dev_hdr_phys_t"); + memset(label, 0, sizeof (l2arc_dev_hdr_phys_t)); + if (pwrite64(fd, label, sizeof (l2arc_dev_hdr_phys_t), + VDEV_LABEL_START_SIZE) == sizeof (l2arc_dev_hdr_phys_t)) + header_cleared = B_TRUE; } free(label); - free(l2dhdr); - if (labels_cleared == 0) + if (!labels_cleared || (clear_l2arc_header && !header_cleared)) return (-1); return (0); @@ -239,12 +223,10 @@ zpool_clear_label(int fd) static boolean_t find_guid(nvlist_t *nv, uint64_t guid) { - uint64_t tmp; nvlist_t **child; uint_t c, children; - verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID, &tmp) == 0); - if (tmp == guid) + if (fnvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID) == guid) return (B_TRUE); if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN, @@ -268,18 +250,16 @@ find_aux(zpool_handle_t *zhp, void *data) { aux_cbdata_t *cbp = data; nvlist_t **list; - uint_t i, count; - uint64_t guid; - nvlist_t *nvroot; + uint_t count; - verify(nvlist_lookup_nvlist(zhp->zpool_config, ZPOOL_CONFIG_VDEV_TREE, - &nvroot) == 0); + nvlist_t *nvroot = fnvlist_lookup_nvlist(zhp->zpool_config, + ZPOOL_CONFIG_VDEV_TREE); if (nvlist_lookup_nvlist_array(nvroot, cbp->cb_type, &list, &count) == 0) { - for (i = 0; i < count; i++) { - verify(nvlist_lookup_uint64(list[i], - ZPOOL_CONFIG_GUID, &guid) == 0); + for (uint_t i = 0; i < count; i++) { + uint64_t guid = fnvlist_lookup_uint64(list[i], + ZPOOL_CONFIG_GUID); if (guid == cbp->cb_guid) { cbp->cb_zhp = zhp; return (1); @@ -301,9 +281,9 @@ zpool_in_use(libzfs_handle_t *hdl, int fd, pool_state_t *state, char **namestr, boolean_t *inuse) { nvlist_t *config; - char *name; + const char *name = NULL; boolean_t ret; - uint64_t guid, vdev_guid; + uint64_t guid = 0, vdev_guid; zpool_handle_t *zhp; nvlist_t *pool_config; uint64_t stateval, isspare; @@ -312,24 +292,18 @@ zpool_in_use(libzfs_handle_t *hdl, int fd, pool_state_t *state, char **namestr, *inuse = B_FALSE; - if (zpool_read_label(fd, &config, NULL) != 0) { - (void) no_memory(hdl); + if (zpool_read_label(fd, &config, NULL) != 0) return (-1); - } if (config == NULL) return (0); - verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_STATE, - &stateval) == 0); - verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_GUID, - &vdev_guid) == 0); + stateval = fnvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_STATE); + vdev_guid = fnvlist_lookup_uint64(config, ZPOOL_CONFIG_GUID); if (stateval != POOL_STATE_SPARE && stateval != POOL_STATE_L2CACHE) { - verify(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME, - &name) == 0); - verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID, - &guid) == 0); + name = fnvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME); + guid = fnvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID); } switch (stateval) { @@ -378,10 +352,8 @@ zpool_in_use(libzfs_handle_t *hdl, int fd, pool_state_t *state, char **namestr, if ((zhp = zpool_open_canfail(hdl, name)) != NULL && (pool_config = zpool_get_config(zhp, NULL)) != NULL) { - nvlist_t *nvroot; - - verify(nvlist_lookup_nvlist(pool_config, - ZPOOL_CONFIG_VDEV_TREE, &nvroot) == 0); + nvlist_t *nvroot = fnvlist_lookup_nvlist( + pool_config, ZPOOL_CONFIG_VDEV_TREE); ret = find_guid(nvroot, vdev_guid); } else { ret = B_FALSE; @@ -453,12 +425,7 @@ zpool_in_use(libzfs_handle_t *hdl, int fd, pool_state_t *state, char **namestr, if (ret) { - if ((*namestr = zfs_strdup(hdl, name)) == NULL) { - if (cb.cb_zhp) - zpool_close(cb.cb_zhp); - nvlist_free(config); - return (-1); - } + *namestr = zfs_strdup(hdl, name); *state = (pool_state_t)stateval; } diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs_iter.c b/sys/contrib/openzfs/lib/libzfs/libzfs_iter.c index 3c537be79487..1844ce1624b3 100644 --- a/sys/contrib/openzfs/lib/libzfs/libzfs_iter.c +++ b/sys/contrib/openzfs/lib/libzfs/libzfs_iter.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -28,7 +29,7 @@ #include <stdio.h> #include <stdlib.h> -#include <strings.h> +#include <string.h> #include <unistd.h> #include <stddef.h> #include <libintl.h> @@ -39,7 +40,8 @@ #include "libzfs_impl.h" static int -zfs_iter_clones(zfs_handle_t *zhp, zfs_iter_f func, void *data) +zfs_iter_clones(zfs_handle_t *zhp, int flags __maybe_unused, zfs_iter_f func, + void *data) { nvlist_t *nvl = zfs_get_clones_nvl(zhp); nvpair_t *pair; @@ -69,16 +71,14 @@ zfs_do_list_ioctl(zfs_handle_t *zhp, int arg, zfs_cmd_t *zc) orig_cookie = zc->zc_cookie; top: (void) strlcpy(zc->zc_name, zhp->zfs_name, sizeof (zc->zc_name)); + zc->zc_objset_stats.dds_creation_txg = 0; rc = zfs_ioctl(zhp->zfs_hdl, arg, zc); if (rc == -1) { switch (errno) { case ENOMEM: /* expand nvlist memory and try again */ - if (zcmd_expand_dst_nvlist(zhp->zfs_hdl, zc) != 0) { - zcmd_free_nvlists(zc); - return (-1); - } + zcmd_expand_dst_nvlist(zhp->zfs_hdl, zc); zc->zc_cookie = orig_cookie; goto top; /* @@ -106,6 +106,13 @@ top: int zfs_iter_filesystems(zfs_handle_t *zhp, zfs_iter_f func, void *data) { + return (zfs_iter_filesystems_v2(zhp, 0, func, data)); +} + +int +zfs_iter_filesystems_v2(zfs_handle_t *zhp, int flags, zfs_iter_f func, + void *data) +{ zfs_cmd_t zc = {"\0"}; zfs_handle_t *nzhp; int ret; @@ -113,19 +120,23 @@ zfs_iter_filesystems(zfs_handle_t *zhp, zfs_iter_f func, void *data) if (zhp->zfs_type != ZFS_TYPE_FILESYSTEM) return (0); - if (zcmd_alloc_dst_nvlist(zhp->zfs_hdl, &zc, 0) != 0) - return (-1); + zcmd_alloc_dst_nvlist(zhp->zfs_hdl, &zc, 0); + + if ((flags & ZFS_ITER_SIMPLE) == ZFS_ITER_SIMPLE) + zc.zc_simple = B_TRUE; while ((ret = zfs_do_list_ioctl(zhp, ZFS_IOC_DATASET_LIST_NEXT, &zc)) == 0) { + if (zc.zc_simple) + nzhp = make_dataset_simple_handle_zc(zhp, &zc); + else + nzhp = make_dataset_handle_zc(zhp->zfs_hdl, &zc); /* * Silently ignore errors, as the only plausible explanation is * that the pool has since been removed. */ - if ((nzhp = make_dataset_handle_zc(zhp->zfs_hdl, - &zc)) == NULL) { + if (nzhp == NULL) continue; - } if ((ret = func(nzhp, data)) != 0) { zcmd_free_nvlists(&zc); @@ -143,6 +154,14 @@ int zfs_iter_snapshots(zfs_handle_t *zhp, boolean_t simple, zfs_iter_f func, void *data, uint64_t min_txg, uint64_t max_txg) { + return (zfs_iter_snapshots_v2(zhp, simple ? ZFS_ITER_SIMPLE : 0, func, + data, min_txg, max_txg)); +} + +int +zfs_iter_snapshots_v2(zfs_handle_t *zhp, int flags, zfs_iter_f func, + void *data, uint64_t min_txg, uint64_t max_txg) +{ zfs_cmd_t zc = {"\0"}; zfs_handle_t *nzhp; int ret; @@ -152,10 +171,9 @@ zfs_iter_snapshots(zfs_handle_t *zhp, boolean_t simple, zfs_iter_f func, zhp->zfs_type == ZFS_TYPE_BOOKMARK) return (0); - zc.zc_simple = simple; + zc.zc_simple = (flags & ZFS_ITER_SIMPLE) != 0; - if (zcmd_alloc_dst_nvlist(zhp->zfs_hdl, &zc, 0) != 0) - return (-1); + zcmd_alloc_dst_nvlist(zhp->zfs_hdl, &zc, 0); if (min_txg != 0) { range_nvl = fnvlist_alloc(); @@ -167,17 +185,13 @@ zfs_iter_snapshots(zfs_handle_t *zhp, boolean_t simple, zfs_iter_f func, fnvlist_add_uint64(range_nvl, SNAP_ITER_MAX_TXG, max_txg); } - if (range_nvl != NULL && - zcmd_write_src_nvlist(zhp->zfs_hdl, &zc, range_nvl) != 0) { - zcmd_free_nvlists(&zc); - fnvlist_free(range_nvl); - return (-1); - } + if (range_nvl != NULL) + zcmd_write_src_nvlist(zhp->zfs_hdl, &zc, range_nvl); while ((ret = zfs_do_list_ioctl(zhp, ZFS_IOC_SNAPSHOT_LIST_NEXT, &zc)) == 0) { - if (simple) + if (zc.zc_simple) nzhp = make_dataset_simple_handle_zc(zhp, &zc); else nzhp = make_dataset_handle_zc(zhp->zfs_hdl, &zc); @@ -201,6 +215,13 @@ zfs_iter_snapshots(zfs_handle_t *zhp, boolean_t simple, zfs_iter_f func, int zfs_iter_bookmarks(zfs_handle_t *zhp, zfs_iter_f func, void *data) { + return (zfs_iter_bookmarks_v2(zhp, 0, func, data)); +} + +int +zfs_iter_bookmarks_v2(zfs_handle_t *zhp, int flags __maybe_unused, + zfs_iter_f func, void *data) +{ zfs_handle_t *nzhp; nvlist_t *props = NULL; nvlist_t *bmarks = NULL; @@ -225,7 +246,7 @@ zfs_iter_bookmarks(zfs_handle_t *zhp, zfs_iter_f func, void *data) for (pair = nvlist_next_nvpair(bmarks, NULL); pair != NULL; pair = nvlist_next_nvpair(bmarks, pair)) { char name[ZFS_MAX_DATASET_NAME_LEN]; - char *bmark_name; + const char *bmark_name; nvlist_t *bmark_props; bmark_name = nvpair_name(pair); @@ -306,8 +327,16 @@ zfs_snapshot_compare(const void *larg, const void *rarg) } int -zfs_iter_snapshots_sorted(zfs_handle_t *zhp, zfs_iter_f callback, void *data, - uint64_t min_txg, uint64_t max_txg) +zfs_iter_snapshots_sorted(zfs_handle_t *zhp, zfs_iter_f callback, + void *data, uint64_t min_txg, uint64_t max_txg) +{ + return (zfs_iter_snapshots_sorted_v2(zhp, 0, callback, data, + min_txg, max_txg)); +} + +int +zfs_iter_snapshots_sorted_v2(zfs_handle_t *zhp, int flags, zfs_iter_f callback, + void *data, uint64_t min_txg, uint64_t max_txg) { int ret = 0; zfs_node_t *node; @@ -317,7 +346,7 @@ zfs_iter_snapshots_sorted(zfs_handle_t *zhp, zfs_iter_f callback, void *data, avl_create(&avl, zfs_snapshot_compare, sizeof (zfs_node_t), offsetof(zfs_node_t, zn_avlnode)); - ret = zfs_iter_snapshots(zhp, B_FALSE, zfs_sort_snaps, &avl, min_txg, + ret = zfs_iter_snapshots_v2(zhp, flags, zfs_sort_snaps, &avl, min_txg, max_txg); for (node = avl_first(&avl); node != NULL; node = AVL_NEXT(&avl, node)) @@ -383,6 +412,13 @@ int zfs_iter_snapspec(zfs_handle_t *fs_zhp, const char *spec_orig, zfs_iter_f func, void *arg) { + return (zfs_iter_snapspec_v2(fs_zhp, 0, spec_orig, func, arg)); +} + +int +zfs_iter_snapspec_v2(zfs_handle_t *fs_zhp, int flags, const char *spec_orig, + zfs_iter_f func, void *arg) +{ char *buf, *comma_separated, *cp; int err = 0; int ret = 0; @@ -420,7 +456,7 @@ zfs_iter_snapspec(zfs_handle_t *fs_zhp, const char *spec_orig, } } - err = zfs_iter_snapshots_sorted(fs_zhp, + err = zfs_iter_snapshots_sorted_v2(fs_zhp, flags, snapspec_cb, &ssa, 0, 0); if (ret == 0) ret = err; @@ -459,12 +495,18 @@ zfs_iter_snapspec(zfs_handle_t *fs_zhp, const char *spec_orig, int zfs_iter_children(zfs_handle_t *zhp, zfs_iter_f func, void *data) { + return (zfs_iter_children_v2(zhp, 0, func, data)); +} + +int +zfs_iter_children_v2(zfs_handle_t *zhp, int flags, zfs_iter_f func, void *data) +{ int ret; - if ((ret = zfs_iter_snapshots(zhp, B_FALSE, func, data, 0, 0)) != 0) + if ((ret = zfs_iter_snapshots_v2(zhp, flags, func, data, 0, 0)) != 0) return (ret); - return (zfs_iter_filesystems(zhp, func, data)); + return (zfs_iter_filesystems_v2(zhp, flags, func, data)); } @@ -475,6 +517,7 @@ typedef struct iter_stack_frame { typedef struct iter_dependents_arg { boolean_t first; + int flags; boolean_t allowrecursion; iter_stack_frame_t *stack; zfs_iter_f func; @@ -490,7 +533,7 @@ iter_dependents_cb(zfs_handle_t *zhp, void *arg) ida->first = B_FALSE; if (zhp->zfs_type == ZFS_TYPE_SNAPSHOT) { - err = zfs_iter_clones(zhp, iter_dependents_cb, ida); + err = zfs_iter_clones(zhp, ida->flags, iter_dependents_cb, ida); } else if (zhp->zfs_type != ZFS_TYPE_BOOKMARK) { iter_stack_frame_t isf; iter_stack_frame_t *f; @@ -524,9 +567,10 @@ iter_dependents_cb(zfs_handle_t *zhp, void *arg) isf.zhp = zhp; isf.next = ida->stack; ida->stack = &isf; - err = zfs_iter_filesystems(zhp, iter_dependents_cb, ida); + err = zfs_iter_filesystems_v2(zhp, ida->flags, + iter_dependents_cb, ida); if (err == 0) - err = zfs_iter_snapshots(zhp, B_FALSE, + err = zfs_iter_snapshots_sorted_v2(zhp, ida->flags, iter_dependents_cb, ida, 0, 0); ida->stack = isf.next; } @@ -543,7 +587,15 @@ int zfs_iter_dependents(zfs_handle_t *zhp, boolean_t allowrecursion, zfs_iter_f func, void *data) { + return (zfs_iter_dependents_v2(zhp, 0, allowrecursion, func, data)); +} + +int +zfs_iter_dependents_v2(zfs_handle_t *zhp, int flags, boolean_t allowrecursion, + zfs_iter_f func, void *data) +{ iter_dependents_arg_t ida; + ida.flags = flags; ida.allowrecursion = allowrecursion; ida.stack = NULL; ida.func = func; diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs_mount.c b/sys/contrib/openzfs/lib/libzfs/libzfs_mount.c index b0279d8fbc3f..2a81b658d342 100644 --- a/sys/contrib/openzfs/lib/libzfs/libzfs_mount.c +++ b/sys/contrib/openzfs/lib/libzfs/libzfs_mount.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -22,7 +23,7 @@ /* * Copyright 2015 Nexenta Systems, Inc. All rights reserved. * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2014, 2021 by Delphix. All rights reserved. + * Copyright (c) 2014, 2022 by Delphix. All rights reserved. * Copyright 2016 Igor Kozhukhov <ikozhukhov@gmail.com> * Copyright 2017 RackTop Systems. * Copyright (c) 2018 Datto Inc. @@ -41,23 +42,13 @@ * zfs_unmount() * zfs_unmountall() * - * This file also contains the functions used to manage sharing filesystems via - * NFS and iSCSI: + * This file also contains the functions used to manage sharing filesystems: * * zfs_is_shared() * zfs_share() * zfs_unshare() - * - * zfs_is_shared_nfs() - * zfs_is_shared_smb() - * zfs_share_proto() - * zfs_shareall(); - * zfs_unshare_nfs() - * zfs_unshare_smb() - * zfs_unshareall_nfs() - * zfs_unshareall_smb() * zfs_unshareall() - * zfs_unshareall_bypath() + * zfs_commit_shares() * * The following functions are available for pool consumers, and will * mount/unmount and share/unshare all datasets within pool: @@ -74,7 +65,7 @@ #include <libintl.h> #include <stdio.h> #include <stdlib.h> -#include <strings.h> +#include <string.h> #include <unistd.h> #include <zone.h> #include <sys/mntent.h> @@ -84,6 +75,7 @@ #include <sys/dsl_crypt.h> #include <libzfs.h> +#include <libzutil.h> #include "libzfs_impl.h" #include <thread_pool.h> @@ -92,34 +84,19 @@ #include <sys/systeminfo.h> #define MAXISALEN 257 /* based on sysinfo(2) man page */ -static int mount_tp_nthr = 512; /* tpool threads for multi-threaded mounting */ - static void zfs_mount_task(void *); -static zfs_share_type_t zfs_is_shared_proto(zfs_handle_t *, char **, - zfs_share_proto_t); - -/* - * The share protocols table must be in the same order as the zfs_share_proto_t - * enum in libzfs_impl.h - */ -proto_table_t proto_table[PROTO_END] = { - {ZFS_PROP_SHARENFS, "nfs", EZFS_SHARENFSFAILED, EZFS_UNSHARENFSFAILED}, - {ZFS_PROP_SHARESMB, "smb", EZFS_SHARESMBFAILED, EZFS_UNSHARESMBFAILED}, -}; -static zfs_share_proto_t nfs_only[] = { - PROTO_NFS, - PROTO_END +static const proto_table_t proto_table[SA_PROTOCOL_COUNT] = { + [SA_PROTOCOL_NFS] = + {ZFS_PROP_SHARENFS, EZFS_SHARENFSFAILED, EZFS_UNSHARENFSFAILED}, + [SA_PROTOCOL_SMB] = + {ZFS_PROP_SHARESMB, EZFS_SHARESMBFAILED, EZFS_UNSHARESMBFAILED}, }; -static zfs_share_proto_t smb_only[] = { - PROTO_SMB, - PROTO_END -}; -static zfs_share_proto_t share_all_proto[] = { - PROTO_NFS, - PROTO_SMB, - PROTO_END +static const enum sa_protocol share_all_proto[SA_PROTOCOL_COUNT + 1] = { + SA_PROTOCOL_NFS, + SA_PROTOCOL_SMB, + SA_NO_PROTOCOL }; @@ -244,12 +221,11 @@ zfs_is_mounted(zfs_handle_t *zhp, char **where) * Checks any higher order concerns about whether the given dataset is * mountable, false otherwise. zfs_is_mountable_internal specifically assumes * that the caller has verified the sanity of mounting the dataset at - * mountpoint to the extent the caller wants. + * its mountpoint to the extent the caller wants. */ static boolean_t -zfs_is_mountable_internal(zfs_handle_t *zhp, const char *mountpoint) +zfs_is_mountable_internal(zfs_handle_t *zhp) { - if (zfs_prop_get_int(zhp, ZFS_PROP_ZONED) && getzoneid() == GLOBAL_ZONEID) return (B_FALSE); @@ -261,7 +237,7 @@ zfs_is_mountable_internal(zfs_handle_t *zhp, const char *mountpoint) * Returns true if the given dataset is mountable, false otherwise. Returns the * mountpoint in 'buf'. */ -boolean_t +static boolean_t zfs_is_mountable(zfs_handle_t *zhp, char *buf, size_t buflen, zprop_source_t *source, int flags) { @@ -282,7 +258,7 @@ zfs_is_mountable(zfs_handle_t *zhp, char *buf, size_t buflen, if (zfs_prop_get_int(zhp, ZFS_PROP_CANMOUNT) == ZFS_CANMOUNT_OFF) return (B_FALSE); - if (!zfs_is_mountable_internal(zhp, buf)) + if (!zfs_is_mountable_internal(zhp)) return (B_FALSE); if (zfs_prop_get_int(zhp, ZFS_PROP_REDACTED) && !(flags & MS_FORCE)) @@ -313,9 +289,9 @@ zfs_is_mountable(zfs_handle_t *zhp, char *buf, size_t buflen, static int zfs_add_option(zfs_handle_t *zhp, char *options, int len, - zfs_prop_t prop, char *on, char *off) + zfs_prop_t prop, const char *on, const char *off) { - char *source; + const char *source; uint64_t value; /* Skip adding duplicate default options */ @@ -402,7 +378,7 @@ zfs_mount_at(zfs_handle_t *zhp, const char *options, int flags, remount = 1; /* Potentially duplicates some checks if invoked by zfs_mount(). */ - if (!zfs_is_mountable_internal(zhp, mountpoint)) + if (!zfs_is_mountable_internal(zhp)) return (0); /* @@ -490,7 +466,7 @@ zfs_mount_at(zfs_handle_t *zhp, const char *options, int flags, if (mkdirp(mountpoint, 0755) != 0) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "failed to create mountpoint: %s"), - strerror(errno)); + zfs_strerror(errno)); return (zfs_error_fmt(hdl, EZFS_MOUNTFAILED, dgettext(TEXT_DOMAIN, "cannot mount '%s'"), mountpoint)); @@ -548,7 +524,7 @@ zfs_mount_at(zfs_handle_t *zhp, const char *options, int flags, (u_longlong_t)zfs_prop_get_int(zhp, ZFS_PROP_VERSION), spa_version); } else { - zfs_error_aux(hdl, "%s", strerror(rc)); + zfs_error_aux(hdl, "%s", zfs_strerror(rc)); } return (zfs_error_fmt(hdl, EZFS_MOUNTFAILED, dgettext(TEXT_DOMAIN, "cannot mount '%s'"), @@ -595,9 +571,13 @@ unmount_one(zfs_handle_t *zhp, const char *mountpoint, int flags) default: libzfs_err = EZFS_UMOUNTFAILED; } - return (zfs_error_fmt(zhp->zfs_hdl, libzfs_err, - dgettext(TEXT_DOMAIN, "cannot unmount '%s'"), - mountpoint)); + if (zhp) { + return (zfs_error_fmt(zhp->zfs_hdl, libzfs_err, + dgettext(TEXT_DOMAIN, "cannot unmount '%s'"), + mountpoint)); + } else { + return (-1); + } } return (0); @@ -631,16 +611,16 @@ zfs_unmount(zfs_handle_t *zhp, const char *mountpoint, int flags) /* * Unshare and unmount the filesystem */ - if (zfs_unshare_proto(zhp, mntpt, share_all_proto) != 0) { + if (zfs_unshare(zhp, mntpt, share_all_proto) != 0) { free(mntpt); return (-1); } - zfs_commit_all_shares(); + zfs_commit_shares(NULL); if (unmount_one(zhp, mntpt, flags) != 0) { free(mntpt); - (void) zfs_shareall(zhp); - zfs_commit_all_shares(); + (void) zfs_share(zhp, NULL); + zfs_commit_shares(NULL); return (-1); } @@ -699,58 +679,20 @@ zfs_unmountall(zfs_handle_t *zhp, int flags) return (ret); } -boolean_t -zfs_is_shared(zfs_handle_t *zhp) -{ - zfs_share_type_t rc = 0; - zfs_share_proto_t *curr_proto; - - if (ZFS_IS_VOLUME(zhp)) - return (B_FALSE); - - for (curr_proto = share_all_proto; *curr_proto != PROTO_END; - curr_proto++) - rc |= zfs_is_shared_proto(zhp, NULL, *curr_proto); - - return (rc ? B_TRUE : B_FALSE); -} - /* * Unshare a filesystem by mountpoint. */ -int +static int unshare_one(libzfs_handle_t *hdl, const char *name, const char *mountpoint, - zfs_share_proto_t proto) + enum sa_protocol proto) { - int err; - - err = sa_disable_share(mountpoint, proto_table[proto].p_name); - if (err != SA_OK) { + int err = sa_disable_share(mountpoint, proto); + if (err != SA_OK) return (zfs_error_fmt(hdl, proto_table[proto].p_unshare_err, dgettext(TEXT_DOMAIN, "cannot unshare '%s': %s"), name, sa_errorstr(err))); - } - return (0); -} -/* - * Query libshare for the given mountpoint and protocol, returning - * a zfs_share_type_t value. - */ -zfs_share_type_t -is_shared(const char *mountpoint, zfs_share_proto_t proto) -{ - if (sa_is_shared(mountpoint, proto_table[proto].p_name)) { - switch (proto) { - case PROTO_NFS: - return (SHARED_NFS); - case PROTO_SMB: - return (SHARED_SMB); - default: - return (SHARED_NOT_SHARED); - } - } - return (SHARED_NOT_SHARED); + return (0); } /* @@ -759,19 +701,22 @@ is_shared(const char *mountpoint, zfs_share_proto_t proto) * on "libshare" to do the dirty work for us. */ int -zfs_share_proto(zfs_handle_t *zhp, zfs_share_proto_t *proto) +zfs_share(zfs_handle_t *zhp, const enum sa_protocol *proto) { char mountpoint[ZFS_MAXPROPLEN]; char shareopts[ZFS_MAXPROPLEN]; char sourcestr[ZFS_MAXPROPLEN]; - zfs_share_proto_t *curr_proto; + const enum sa_protocol *curr_proto; zprop_source_t sourcetype; int err = 0; + if (proto == NULL) + proto = share_all_proto; + if (!zfs_is_mountable(zhp, mountpoint, sizeof (mountpoint), NULL, 0)) return (0); - for (curr_proto = proto; *curr_proto != PROTO_END; curr_proto++) { + for (curr_proto = proto; *curr_proto != SA_NO_PROTOCOL; curr_proto++) { /* * Return success if there are no share options. */ @@ -791,7 +736,7 @@ zfs_share_proto(zfs_handle_t *zhp, zfs_share_proto_t *proto) continue; err = sa_enable_share(zfs_get_name(zhp), mountpoint, shareopts, - proto_table[*curr_proto].p_name); + *curr_proto); if (err != SA_OK) { return (zfs_error_fmt(zhp->zfs_hdl, proto_table[*curr_proto].p_share_err, @@ -803,189 +748,98 @@ zfs_share_proto(zfs_handle_t *zhp, zfs_share_proto_t *proto) return (0); } -int -zfs_share(zfs_handle_t *zhp) -{ - assert(!ZFS_IS_VOLUME(zhp)); - return (zfs_share_proto(zhp, share_all_proto)); -} - -int -zfs_unshare(zfs_handle_t *zhp) -{ - assert(!ZFS_IS_VOLUME(zhp)); - return (zfs_unshareall(zhp)); -} - /* * Check to see if the filesystem is currently shared. */ -static zfs_share_type_t -zfs_is_shared_proto(zfs_handle_t *zhp, char **where, zfs_share_proto_t proto) -{ - char *mountpoint; - zfs_share_type_t rc; - - if (!zfs_is_mounted(zhp, &mountpoint)) - return (SHARED_NOT_SHARED); - - if ((rc = is_shared(mountpoint, proto)) - != SHARED_NOT_SHARED) { - if (where != NULL) - *where = mountpoint; - else - free(mountpoint); - return (rc); - } else { - free(mountpoint); - return (SHARED_NOT_SHARED); - } -} - boolean_t -zfs_is_shared_nfs(zfs_handle_t *zhp, char **where) +zfs_is_shared(zfs_handle_t *zhp, char **where, + const enum sa_protocol *proto) { - return (zfs_is_shared_proto(zhp, where, - PROTO_NFS) != SHARED_NOT_SHARED); -} + char *mountpoint; + if (proto == NULL) + proto = share_all_proto; -boolean_t -zfs_is_shared_smb(zfs_handle_t *zhp, char **where) -{ - return (zfs_is_shared_proto(zhp, where, - PROTO_SMB) != SHARED_NOT_SHARED); -} + if (ZFS_IS_VOLUME(zhp)) + return (B_FALSE); -/* - * zfs_parse_options(options, proto) - * - * Call the legacy parse interface to get the protocol specific - * options using the NULL arg to indicate that this is a "parse" only. - */ -int -zfs_parse_options(char *options, zfs_share_proto_t proto) -{ - return (sa_validate_shareopts(options, proto_table[proto].p_name)); -} + if (!zfs_is_mounted(zhp, &mountpoint)) + return (B_FALSE); -void -zfs_commit_proto(zfs_share_proto_t *proto) -{ - zfs_share_proto_t *curr_proto; - for (curr_proto = proto; *curr_proto != PROTO_END; curr_proto++) { - sa_commit_shares(proto_table[*curr_proto].p_name); - } -} + for (const enum sa_protocol *p = proto; *p != SA_NO_PROTOCOL; ++p) + if (sa_is_shared(mountpoint, *p)) { + if (where != NULL) + *where = mountpoint; + else + free(mountpoint); + return (B_TRUE); + } -void -zfs_commit_nfs_shares(void) -{ - zfs_commit_proto(nfs_only); + free(mountpoint); + return (B_FALSE); } void -zfs_commit_smb_shares(void) +zfs_commit_shares(const enum sa_protocol *proto) { - zfs_commit_proto(smb_only); -} + if (proto == NULL) + proto = share_all_proto; -void -zfs_commit_all_shares(void) -{ - zfs_commit_proto(share_all_proto); + for (const enum sa_protocol *p = proto; *p != SA_NO_PROTOCOL; ++p) + sa_commit_shares(*p); } void -zfs_commit_shares(const char *proto) +zfs_truncate_shares(const enum sa_protocol *proto) { if (proto == NULL) - zfs_commit_proto(share_all_proto); - else if (strcmp(proto, "nfs") == 0) - zfs_commit_proto(nfs_only); - else if (strcmp(proto, "smb") == 0) - zfs_commit_proto(smb_only); -} + proto = share_all_proto; -int -zfs_share_nfs(zfs_handle_t *zhp) -{ - return (zfs_share_proto(zhp, nfs_only)); -} - -int -zfs_share_smb(zfs_handle_t *zhp) -{ - return (zfs_share_proto(zhp, smb_only)); -} - -int -zfs_shareall(zfs_handle_t *zhp) -{ - return (zfs_share_proto(zhp, share_all_proto)); + for (const enum sa_protocol *p = proto; *p != SA_NO_PROTOCOL; ++p) + sa_truncate_shares(*p); } /* * Unshare the given filesystem. */ int -zfs_unshare_proto(zfs_handle_t *zhp, const char *mountpoint, - zfs_share_proto_t *proto) +zfs_unshare(zfs_handle_t *zhp, const char *mountpoint, + const enum sa_protocol *proto) { libzfs_handle_t *hdl = zhp->zfs_hdl; struct mnttab entry; - char *mntpt = NULL; - /* check to see if need to unmount the filesystem */ - if (mountpoint != NULL) - mntpt = zfs_strdup(hdl, mountpoint); + if (proto == NULL) + proto = share_all_proto; if (mountpoint != NULL || ((zfs_get_type(zhp) == ZFS_TYPE_FILESYSTEM) && libzfs_mnttab_find(hdl, zfs_get_name(zhp), &entry) == 0)) { - zfs_share_proto_t *curr_proto; - if (mountpoint == NULL) - mntpt = zfs_strdup(zhp->zfs_hdl, entry.mnt_mountp); + /* check to see if need to unmount the filesystem */ + const char *mntpt = mountpoint ?: entry.mnt_mountp; - for (curr_proto = proto; *curr_proto != PROTO_END; - curr_proto++) { - - if (is_shared(mntpt, *curr_proto)) { - if (unshare_one(hdl, zhp->zfs_name, - mntpt, *curr_proto) != 0) { - if (mntpt != NULL) - free(mntpt); + for (const enum sa_protocol *curr_proto = proto; + *curr_proto != SA_NO_PROTOCOL; curr_proto++) + if (sa_is_shared(mntpt, *curr_proto) && + unshare_one(hdl, zhp->zfs_name, + mntpt, *curr_proto) != 0) return (-1); - } - } - } } - if (mntpt != NULL) - free(mntpt); return (0); } -int -zfs_unshare_nfs(zfs_handle_t *zhp, const char *mountpoint) -{ - return (zfs_unshare_proto(zhp, mountpoint, nfs_only)); -} - -int -zfs_unshare_smb(zfs_handle_t *zhp, const char *mountpoint) -{ - return (zfs_unshare_proto(zhp, mountpoint, smb_only)); -} - /* * Same as zfs_unmountall(), but for NFS and SMB unshares. */ -static int -zfs_unshareall_proto(zfs_handle_t *zhp, zfs_share_proto_t *proto) +int +zfs_unshareall(zfs_handle_t *zhp, const enum sa_protocol *proto) { prop_changelist_t *clp; int ret; + if (proto == NULL) + proto = share_all_proto; + clp = changelist_gather(zhp, ZFS_PROP_SHARENFS, 0, 0); if (clp == NULL) return (-1); @@ -996,44 +850,6 @@ zfs_unshareall_proto(zfs_handle_t *zhp, zfs_share_proto_t *proto) return (ret); } -int -zfs_unshareall_nfs(zfs_handle_t *zhp) -{ - return (zfs_unshareall_proto(zhp, nfs_only)); -} - -int -zfs_unshareall_smb(zfs_handle_t *zhp) -{ - return (zfs_unshareall_proto(zhp, smb_only)); -} - -int -zfs_unshareall(zfs_handle_t *zhp) -{ - return (zfs_unshareall_proto(zhp, share_all_proto)); -} - -int -zfs_unshareall_bypath(zfs_handle_t *zhp, const char *mountpoint) -{ - return (zfs_unshare_proto(zhp, mountpoint, share_all_proto)); -} - -int -zfs_unshareall_bytype(zfs_handle_t *zhp, const char *mountpoint, - const char *proto) -{ - if (proto == NULL) - return (zfs_unshare_proto(zhp, mountpoint, share_all_proto)); - if (strcmp(proto, "nfs") == 0) - return (zfs_unshare_proto(zhp, mountpoint, nfs_only)); - else if (strcmp(proto, "smb") == 0) - return (zfs_unshare_proto(zhp, mountpoint, smb_only)); - else - return (1); -} - /* * Remove the mountpoint associated with the current dataset, if necessary. * We only remove the underlying directory if: @@ -1124,7 +940,7 @@ zfs_iter_cb(zfs_handle_t *zhp, void *data) } libzfs_add_handle(cbp, zhp); - if (zfs_iter_filesystems(zhp, zfs_iter_cb, cbp) != 0) { + if (zfs_iter_filesystems_v2(zhp, 0, zfs_iter_cb, cbp) != 0) { zfs_close(zhp); return (-1); } @@ -1281,7 +1097,10 @@ zfs_dispatch_mount(libzfs_handle_t *hdl, zfs_handle_t **handles, mnt_param->mnt_func = func; mnt_param->mnt_data = data; - (void) tpool_dispatch(tp, zfs_mount_task, (void*)mnt_param); + if (tpool_dispatch(tp, zfs_mount_task, (void*)mnt_param)) { + /* Could not dispatch to thread pool; execute directly */ + zfs_mount_task((void*)mnt_param); + } } /* @@ -1324,7 +1143,7 @@ zfs_share_one(zfs_handle_t *zhp, void *arg) mount_state_t *ms = arg; int ret = 0; - if (zfs_share(zhp) != 0) + if (zfs_share(zhp, NULL) != 0) ret = ms->ms_mntstatus = -1; return (ret); } @@ -1350,7 +1169,7 @@ zfs_mount_task(void *arg) sizeof (mountpoint), NULL, NULL, 0, B_FALSE) == 0); if (mp->mnt_func(handles[idx], mp->mnt_data) != 0) - return; + goto out; /* * We dispatch tasks to mount filesystems with mountpoints underneath @@ -1371,6 +1190,8 @@ zfs_mount_task(void *arg) zfs_dispatch_mount(mp->mnt_hdl, handles, num_handles, i, mp->mnt_func, mp->mnt_data, mp->mnt_tp); } + +out: free(mp); } @@ -1383,19 +1204,20 @@ zfs_mount_task(void *arg) * * Callbacks are issued in one of two ways: * - * 1. Sequentially: If the parallel argument is B_FALSE or the ZFS_SERIAL_MOUNT + * 1. Sequentially: If the nthr argument is <= 1 or the ZFS_SERIAL_MOUNT * environment variable is set, then we issue callbacks sequentially. * - * 2. In parallel: If the parallel argument is B_TRUE and the ZFS_SERIAL_MOUNT + * 2. In parallel: If the nthr argument is > 1 and the ZFS_SERIAL_MOUNT * environment variable is not set, then we use a tpool to dispatch threads * to mount filesystems in parallel. This function dispatches tasks to mount * the filesystems at the top-level mountpoints, and these tasks in turn * are responsible for recursively mounting filesystems in their children - * mountpoints. + * mountpoints. The value of the nthr argument will be the number of worker + * threads for the thread pool. */ void zfs_foreach_mountpoint(libzfs_handle_t *hdl, zfs_handle_t **handles, - size_t num_handles, zfs_iter_f func, void *data, boolean_t parallel) + size_t num_handles, zfs_iter_f func, void *data, uint_t nthr) { zoneid_t zoneid = getzoneid(); @@ -1404,7 +1226,7 @@ zfs_foreach_mountpoint(libzfs_handle_t *hdl, zfs_handle_t **handles, * variable that can be used as a convenience to do a/b comparison * of serial vs. parallel mounting. */ - boolean_t serial_mount = !parallel || + boolean_t serial_mount = nthr <= 1 || (getenv("ZFS_SERIAL_MOUNT") != NULL); /* @@ -1424,7 +1246,7 @@ zfs_foreach_mountpoint(libzfs_handle_t *hdl, zfs_handle_t **handles, * Issue the callback function for each dataset using a parallel * algorithm that uses a thread pool to manage threads. */ - tpool_t *tp = tpool_create(1, mount_tp_nthr, 0, NULL); + tpool_t *tp = tpool_create(1, nthr, 0, NULL); /* * There may be multiple "top level" mountpoints outside of the pool's @@ -1451,10 +1273,12 @@ zfs_foreach_mountpoint(libzfs_handle_t *hdl, zfs_handle_t **handles, /* * Mount and share all datasets within the given pool. This assumes that no - * datasets within the pool are currently mounted. + * datasets within the pool are currently mounted. nthr will be number of + * worker threads to use while mounting datasets. */ int -zpool_enable_datasets(zpool_handle_t *zhp, const char *mntopts, int flags) +zpool_enable_datasets(zpool_handle_t *zhp, const char *mntopts, int flags, + uint_t nthr) { get_all_cb_t cb = { 0 }; mount_state_t ms = { 0 }; @@ -1471,7 +1295,7 @@ zpool_enable_datasets(zpool_handle_t *zhp, const char *mntopts, int flags) * over all child filesystems. */ libzfs_add_handle(&cb, zfsp); - if (zfs_iter_filesystems(zfsp, zfs_iter_cb, &cb) != 0) + if (zfs_iter_filesystems_v2(zfsp, 0, zfs_iter_cb, &cb) != 0) goto out; /* @@ -1480,9 +1304,9 @@ zpool_enable_datasets(zpool_handle_t *zhp, const char *mntopts, int flags) ms.ms_mntopts = mntopts; ms.ms_mntflags = flags; zfs_foreach_mountpoint(zhp->zpool_hdl, cb.cb_handles, cb.cb_used, - zfs_mount_one, &ms, B_TRUE); + zfs_mount_one, &ms, nthr); if (ms.ms_mntstatus != 0) - ret = ms.ms_mntstatus; + ret = EZFS_MOUNTFAILED; /* * Share all filesystems that need to be shared. This needs to be @@ -1491,11 +1315,11 @@ zpool_enable_datasets(zpool_handle_t *zhp, const char *mntopts, int flags) */ ms.ms_mntstatus = 0; zfs_foreach_mountpoint(zhp->zpool_hdl, cb.cb_handles, cb.cb_used, - zfs_share_one, &ms, B_FALSE); + zfs_share_one, &ms, 1); if (ms.ms_mntstatus != 0) - ret = ms.ms_mntstatus; + ret = EZFS_SHAREFAILED; else - zfs_commit_all_shares(); + zfs_commit_shares(NULL); out: for (int i = 0; i < cb.cb_used; i++) @@ -1568,29 +1392,19 @@ zpool_disable_datasets(zpool_handle_t *zhp, boolean_t force) */ if (used == alloc) { if (alloc == 0) { - - if ((sets = zfs_alloc(hdl, - 8 * sizeof (struct sets_s))) == NULL) - goto out; - + sets = zfs_alloc(hdl, + 8 * sizeof (struct sets_s)); alloc = 8; } else { - void *ptr; - - if ((ptr = zfs_realloc(hdl, sets, + sets = zfs_realloc(hdl, sets, alloc * sizeof (struct sets_s), - alloc * 2 * sizeof (struct sets_s))) - == NULL) - goto out; - sets = ptr; + alloc * 2 * sizeof (struct sets_s)); alloc *= 2; } } - if ((sets[used].mountpoint = zfs_strdup(hdl, - entry.mnt_mountp)) == NULL) - goto out; + sets[used].mountpoint = zfs_strdup(hdl, entry.mnt_mountp); /* * This is allowed to fail, in case there is some I/O error. It @@ -1607,22 +1421,21 @@ zpool_disable_datasets(zpool_handle_t *zhp, boolean_t force) * At this point, we have the entire list of filesystems, so sort it by * mountpoint. */ - qsort(sets, used, sizeof (struct sets_s), mountpoint_compare); + if (used != 0) + qsort(sets, used, sizeof (struct sets_s), mountpoint_compare); /* * Walk through and first unshare everything. */ for (i = 0; i < used; i++) { - zfs_share_proto_t *curr_proto; - for (curr_proto = share_all_proto; *curr_proto != PROTO_END; - curr_proto++) { - if (is_shared(sets[i].mountpoint, *curr_proto) && + for (enum sa_protocol p = 0; p < SA_PROTOCOL_COUNT; ++p) { + if (sa_is_shared(sets[i].mountpoint, p) && unshare_one(hdl, sets[i].mountpoint, - sets[i].mountpoint, *curr_proto) != 0) + sets[i].mountpoint, p) != 0) goto out; } } - zfs_commit_all_shares(); + zfs_commit_shares(NULL); /* * Now unmount everything, removing the underlying directories as diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs_pool.c b/sys/contrib/openzfs/lib/libzfs/libzfs_pool.c index 8ed96275c4db..6f8fb994f814 100644 --- a/sys/contrib/openzfs/lib/libzfs/libzfs_pool.c +++ b/sys/contrib/openzfs/lib/libzfs/libzfs_pool.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -22,13 +23,14 @@ /* * Copyright 2015 Nexenta Systems, Inc. All rights reserved. * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2011, 2020 by Delphix. All rights reserved. + * Copyright (c) 2011, 2024 by Delphix. All rights reserved. * Copyright 2016 Igor Kozhukhov <ikozhukhov@gmail.com> * Copyright (c) 2018 Datto Inc. * Copyright (c) 2017 Open-E, Inc. All Rights Reserved. * Copyright (c) 2017, Intel Corporation. * Copyright (c) 2018, loli10K <ezomori.nozomu@gmail.com> * Copyright (c) 2021, Colm Buckley <colm@tuatha.org> + * Copyright (c) 2021, 2023, Klara Inc. */ #include <errno.h> @@ -59,8 +61,9 @@ static boolean_t zpool_vdev_is_interior(const char *name); typedef struct prop_flags { - int create:1; /* Validate property on creation */ - int import:1; /* Validate property on import */ + unsigned int create:1; /* Validate property on creation */ + unsigned int import:1; /* Validate property on import */ + unsigned int vdevprop:1; /* Validate property as a VDEV property */ } prop_flags_t; /* @@ -77,16 +80,20 @@ zpool_get_all_props(zpool_handle_t *zhp) (void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name)); - if (zcmd_alloc_dst_nvlist(hdl, &zc, 0) != 0) - return (-1); + if (zhp->zpool_n_propnames > 0) { + nvlist_t *innvl = fnvlist_alloc(); + fnvlist_add_string_array(innvl, ZPOOL_GET_PROPS_NAMES, + zhp->zpool_propnames, zhp->zpool_n_propnames); + zcmd_write_src_nvlist(hdl, &zc, innvl); + fnvlist_free(innvl); + } + + zcmd_alloc_dst_nvlist(hdl, &zc, 0); while (zfs_ioctl(hdl, ZFS_IOC_POOL_GET_PROPS, &zc) != 0) { - if (errno == ENOMEM) { - if (zcmd_expand_dst_nvlist(hdl, &zc) != 0) { - zcmd_free_nvlists(&zc); - return (-1); - } - } else { + if (errno == ENOMEM) + zcmd_expand_dst_nvlist(hdl, &zc); + else { zcmd_free_nvlists(&zc); return (-1); } @@ -121,18 +128,16 @@ zpool_get_prop_string(zpool_handle_t *zhp, zpool_prop_t prop, zprop_source_t *src) { nvlist_t *nv, *nvl; - uint64_t ival; - char *value; + const char *value; zprop_source_t source; nvl = zhp->zpool_props; if (nvlist_lookup_nvlist(nvl, zpool_prop_to_name(prop), &nv) == 0) { - verify(nvlist_lookup_uint64(nv, ZPROP_SOURCE, &ival) == 0); - source = ival; - verify(nvlist_lookup_string(nv, ZPROP_VALUE, &value) == 0); + source = fnvlist_lookup_uint64(nv, ZPROP_SOURCE); + value = fnvlist_lookup_string(nv, ZPROP_VALUE); } else { source = ZPROP_SRC_DEFAULT; - if ((value = (char *)zpool_prop_default_string(prop)) == NULL) + if ((value = zpool_prop_default_string(prop)) == NULL) value = "-"; } @@ -167,9 +172,8 @@ zpool_get_prop_int(zpool_handle_t *zhp, zpool_prop_t prop, zprop_source_t *src) nvl = zhp->zpool_props; if (nvlist_lookup_nvlist(nvl, zpool_prop_to_name(prop), &nv) == 0) { - verify(nvlist_lookup_uint64(nv, ZPROP_SOURCE, &value) == 0); - source = value; - verify(nvlist_lookup_uint64(nv, ZPROP_VALUE, &value) == 0); + source = fnvlist_lookup_uint64(nv, ZPROP_SOURCE); + value = fnvlist_lookup_uint64(nv, ZPROP_VALUE); } else { source = ZPROP_SRC_DEFAULT; value = zpool_prop_default_numeric(prop); @@ -253,9 +257,6 @@ zpool_get_state_str(zpool_handle_t *zhp) { zpool_errata_t errata; zpool_status_t status; - nvlist_t *nvroot; - vdev_stat_t *vs; - uint_t vsc; const char *str; status = zpool_get_status(zhp, NULL, &errata); @@ -263,14 +264,15 @@ zpool_get_state_str(zpool_handle_t *zhp) if (zpool_get_state(zhp) == POOL_STATE_UNAVAIL) { str = gettext("FAULTED"); } else if (status == ZPOOL_STATUS_IO_FAILURE_WAIT || + status == ZPOOL_STATUS_IO_FAILURE_CONTINUE || status == ZPOOL_STATUS_IO_FAILURE_MMP) { str = gettext("SUSPENDED"); } else { - verify(nvlist_lookup_nvlist(zpool_get_config(zhp, NULL), - ZPOOL_CONFIG_VDEV_TREE, &nvroot) == 0); - verify(nvlist_lookup_uint64_array(nvroot, - ZPOOL_CONFIG_VDEV_STATS, (uint64_t **)&vs, &vsc) - == 0); + nvlist_t *nvroot = fnvlist_lookup_nvlist( + zpool_get_config(zhp, NULL), ZPOOL_CONFIG_VDEV_TREE); + uint_t vsc; + vdev_stat_t *vs = (vdev_stat_t *)fnvlist_lookup_uint64_array( + nvroot, ZPOOL_CONFIG_VDEV_STATS, &vsc); str = zpool_state_to_name(vs->vs_state, vs->vs_aux); } return (str); @@ -314,7 +316,7 @@ zpool_get_prop(zpool_handle_t *zhp, zpool_prop_t prop, char *buf, len); break; } - fallthrough; + zfs_fallthrough; default: (void) strlcpy(buf, "-", len); break; @@ -325,6 +327,15 @@ zpool_get_prop(zpool_handle_t *zhp, zpool_prop_t prop, char *buf, return (0); } + /* + * ZPOOL_PROP_DEDUPCACHED can be fetched by name only using + * the ZPOOL_GET_PROPS_NAMES mechanism + */ + if (prop == ZPOOL_PROP_DEDUPCACHED) { + zpool_add_propname(zhp, ZPOOL_DEDUPCACHED_PROP_NAME); + (void) zpool_props_refresh(zhp); + } + if (zhp->zpool_props == NULL && zpool_get_all_props(zhp) && prop != ZPOOL_PROP_NAME) return (-1); @@ -339,12 +350,36 @@ zpool_get_prop(zpool_handle_t *zhp, zpool_prop_t prop, char *buf, intval = zpool_get_prop_int(zhp, prop, &src); switch (prop) { + case ZPOOL_PROP_DEDUP_TABLE_QUOTA: + /* + * If dedup quota is 0, we translate this into 'none' + * (unless literal is set). And if it is UINT64_MAX + * we translate that as 'automatic' (limit to size of + * the dedicated dedup VDEV. Otherwise, fall throught + * into the regular number formating. + */ + if (intval == 0) { + (void) strlcpy(buf, literal ? "0" : "none", + len); + break; + } else if (intval == UINT64_MAX) { + (void) strlcpy(buf, "auto", len); + break; + } + zfs_fallthrough; + case ZPOOL_PROP_SIZE: case ZPOOL_PROP_ALLOCATED: case ZPOOL_PROP_FREE: case ZPOOL_PROP_FREEING: case ZPOOL_PROP_LEAKED: case ZPOOL_PROP_ASHIFT: + case ZPOOL_PROP_MAXBLOCKSIZE: + case ZPOOL_PROP_MAXDNODESIZE: + case ZPOOL_PROP_BCLONESAVED: + case ZPOOL_PROP_BCLONEUSED: + case ZPOOL_PROP_DEDUP_TABLE_SIZE: + case ZPOOL_PROP_DEDUPCACHED: if (literal) (void) snprintf(buf, len, "%llu", (u_longlong_t)intval); @@ -386,6 +421,7 @@ zpool_get_prop(zpool_handle_t *zhp, zpool_prop_t prop, char *buf, } break; + case ZPOOL_PROP_BCLONERATIO: case ZPOOL_PROP_DEDUPRATIO: if (literal) (void) snprintf(buf, len, "%llu.%02llu", @@ -405,7 +441,7 @@ zpool_get_prop(zpool_handle_t *zhp, zpool_prop_t prop, char *buf, (void) snprintf(buf, len, "-"); break; } - fallthrough; + zfs_fallthrough; default: (void) snprintf(buf, len, "%llu", (u_longlong_t)intval); } @@ -430,6 +466,39 @@ zpool_get_prop(zpool_handle_t *zhp, zpool_prop_t prop, char *buf, } /* + * Get a zpool property value for 'propname' and return the value in + * a pre-allocated buffer. + */ +int +zpool_get_userprop(zpool_handle_t *zhp, const char *propname, char *buf, + size_t len, zprop_source_t *srctype) +{ + nvlist_t *nv; + uint64_t ival; + const char *value; + zprop_source_t source = ZPROP_SRC_LOCAL; + + if (zhp->zpool_props == NULL) + zpool_get_all_props(zhp); + + if (nvlist_lookup_nvlist(zhp->zpool_props, propname, &nv) == 0) { + if (nvlist_lookup_uint64(nv, ZPROP_SOURCE, &ival) == 0) + source = ival; + verify(nvlist_lookup_string(nv, ZPROP_VALUE, &value) == 0); + } else { + source = ZPROP_SRC_DEFAULT; + value = "-"; + } + + if (srctype) + *srctype = source; + + (void) strlcpy(buf, value, len); + + return (0); +} + +/* * Check if the bootfs name has the same pool name as it is set to. * Assuming bootfs is a valid dataset name. */ @@ -462,11 +531,12 @@ zpool_valid_proplist(libzfs_handle_t *hdl, const char *poolname, nvpair_t *elem; nvlist_t *retprops; zpool_prop_t prop; - char *strval; + const char *strval; uint64_t intval; - char *slash, *check; + const char *check; struct stat64 statbuf; zpool_handle_t *zhp; + char *parent, *slash; char report[1024]; if (nvlist_alloc(&retprops, NV_UNIQUE_NAME, 0) != 0) { @@ -478,6 +548,35 @@ zpool_valid_proplist(libzfs_handle_t *hdl, const char *poolname, while ((elem = nvlist_next_nvpair(props, elem)) != NULL) { const char *propname = nvpair_name(elem); + if (flags.vdevprop && zpool_prop_vdev(propname)) { + vdev_prop_t vprop = vdev_name_to_prop(propname); + + if (vdev_prop_readonly(vprop)) { + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "'%s' " + "is readonly"), propname); + (void) zfs_error(hdl, EZFS_PROPREADONLY, + errbuf); + goto error; + } + + if (zprop_parse_value(hdl, elem, vprop, ZFS_TYPE_VDEV, + retprops, &strval, &intval, errbuf) != 0) + goto error; + + continue; + } else if (flags.vdevprop && vdev_prop_user(propname)) { + if (nvlist_add_nvpair(retprops, elem) != 0) { + (void) no_memory(hdl); + goto error; + } + continue; + } else if (flags.vdevprop) { + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "invalid property: '%s'"), propname); + (void) zfs_error(hdl, EZFS_BADPROP, errbuf); + goto error; + } + prop = zpool_name_to_prop(propname); if (prop == ZPOOL_PROP_INVAL && zpool_prop_feature(propname)) { int err; @@ -524,6 +623,44 @@ zpool_valid_proplist(libzfs_handle_t *hdl, const char *poolname, goto error; } continue; + } else if (prop == ZPOOL_PROP_INVAL && + zfs_prop_user(propname)) { + /* + * This is a user property: make sure it's a + * string, and that it's less than ZAP_MAXNAMELEN. + */ + if (nvpair_type(elem) != DATA_TYPE_STRING) { + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "'%s' must be a string"), propname); + (void) zfs_error(hdl, EZFS_BADPROP, errbuf); + goto error; + } + + if (strlen(nvpair_name(elem)) >= ZAP_MAXNAMELEN) { + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "property name '%s' is too long"), + propname); + (void) zfs_error(hdl, EZFS_BADPROP, errbuf); + goto error; + } + + (void) nvpair_value_string(elem, &strval); + + if (strlen(strval) >= ZFS_MAXPROPLEN) { + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "property value '%s' is too long"), + strval); + (void) zfs_error(hdl, EZFS_BADPROP, errbuf); + goto error; + } + + if (nvlist_add_string(retprops, propname, + strval) != 0) { + (void) no_memory(hdl); + goto error; + } + + continue; } /* @@ -653,29 +790,36 @@ zpool_valid_proplist(libzfs_handle_t *hdl, const char *poolname, goto error; } - slash = strrchr(strval, '/'); + parent = strdup(strval); + if (parent == NULL) { + (void) zfs_error(hdl, EZFS_NOMEM, errbuf); + goto error; + } + slash = strrchr(parent, '/'); if (slash[1] == '\0' || strcmp(slash, "/.") == 0 || strcmp(slash, "/..") == 0) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, - "'%s' is not a valid file"), strval); + "'%s' is not a valid file"), parent); (void) zfs_error(hdl, EZFS_BADPATH, errbuf); + free(parent); goto error; } *slash = '\0'; - if (strval[0] != '\0' && - (stat64(strval, &statbuf) != 0 || + if (parent[0] != '\0' && + (stat64(parent, &statbuf) != 0 || !S_ISDIR(statbuf.st_mode))) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "'%s' is not a valid directory"), - strval); + parent); (void) zfs_error(hdl, EZFS_BADPATH, errbuf); + free(parent); goto error; } + free(parent); - *slash = '/'; break; case ZPOOL_PROP_COMPATIBILITY: @@ -753,7 +897,7 @@ zpool_set_prop(zpool_handle_t *zhp, const char *propname, const char *propval) { zfs_cmd_t zc = {"\0"}; int ret = -1; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; nvlist_t *nvl = NULL; nvlist_t *realprops; uint64_t version; @@ -786,10 +930,7 @@ zpool_set_prop(zpool_handle_t *zhp, const char *propname, const char *propval) */ (void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name)); - if (zcmd_write_src_nvlist(zhp->zpool_hdl, &zc, nvl) != 0) { - nvlist_free(nvl); - return (-1); - } + zcmd_write_src_nvlist(zhp->zpool_hdl, &zc, nvl); ret = zfs_ioctl(zhp->zpool_hdl, ZFS_IOC_POOL_SET_PROPS, &zc); @@ -806,7 +947,7 @@ zpool_set_prop(zpool_handle_t *zhp, const char *propname, const char *propval) int zpool_expand_proplist(zpool_handle_t *zhp, zprop_list_t **plp, - boolean_t literal) + zfs_type_t type, boolean_t literal) { libzfs_handle_t *hdl = zhp->zpool_hdl; zprop_list_t *entry; @@ -817,9 +958,12 @@ zpool_expand_proplist(zpool_handle_t *zhp, zprop_list_t **plp, boolean_t firstexpand = (NULL == *plp); int i; - if (zprop_expand_list(hdl, plp, ZFS_TYPE_POOL) != 0) + if (zprop_expand_list(hdl, plp, type) != 0) return (-1); + if (type == ZFS_TYPE_VDEV) + return (0); + last = plp; while (*last != NULL) last = &(*last)->pl_next; @@ -828,10 +972,31 @@ zpool_expand_proplist(zpool_handle_t *zhp, zprop_list_t **plp, features = zpool_get_features(zhp); if ((*plp)->pl_all && firstexpand) { + /* Handle userprops in the all properties case */ + if (zhp->zpool_props == NULL && zpool_props_refresh(zhp)) + return (-1); + + nvp = NULL; + while ((nvp = nvlist_next_nvpair(zhp->zpool_props, nvp)) != + NULL) { + const char *propname = nvpair_name(nvp); + + if (!zfs_prop_user(propname)) + continue; + + entry = zfs_alloc(hdl, sizeof (zprop_list_t)); + entry->pl_prop = ZPROP_USERPROP; + entry->pl_user_prop = zfs_strdup(hdl, propname); + entry->pl_width = strlen(entry->pl_user_prop); + entry->pl_all = B_TRUE; + + *last = entry; + last = &entry->pl_next; + } + for (i = 0; i < SPA_FEATURES; i++) { - zprop_list_t *entry = zfs_alloc(hdl, - sizeof (zprop_list_t)); - entry->pl_prop = ZPROP_INVAL; + entry = zfs_alloc(hdl, sizeof (zprop_list_t)); + entry->pl_prop = ZPROP_USERPROP; entry->pl_user_prop = zfs_asprintf(hdl, "feature@%s", spa_feature_table[i].fi_uname); entry->pl_width = strlen(entry->pl_user_prop); @@ -847,7 +1012,6 @@ zpool_expand_proplist(zpool_handle_t *zhp, zprop_list_t **plp, nvp != NULL; nvp = nvlist_next_nvpair(features, nvp)) { char *propname; boolean_t found; - zprop_list_t *entry; if (zfeature_is_supported(nvpair_name(nvp))) continue; @@ -875,7 +1039,7 @@ zpool_expand_proplist(zpool_handle_t *zhp, zprop_list_t **plp, } entry = zfs_alloc(hdl, sizeof (zprop_list_t)); - entry->pl_prop = ZPROP_INVAL; + entry->pl_prop = ZPROP_USERPROP; entry->pl_user_prop = propname; entry->pl_width = strlen(entry->pl_user_prop); entry->pl_all = B_TRUE; @@ -888,11 +1052,85 @@ zpool_expand_proplist(zpool_handle_t *zhp, zprop_list_t **plp, if (entry->pl_fixed && !literal) continue; - if (entry->pl_prop != ZPROP_INVAL && + if (entry->pl_prop != ZPROP_USERPROP && zpool_get_prop(zhp, entry->pl_prop, buf, sizeof (buf), NULL, literal) == 0) { if (strlen(buf) > entry->pl_width) entry->pl_width = strlen(buf); + } else if (entry->pl_prop == ZPROP_INVAL && + zfs_prop_user(entry->pl_user_prop) && + zpool_get_userprop(zhp, entry->pl_user_prop, buf, + sizeof (buf), NULL) == 0) { + if (strlen(buf) > entry->pl_width) + entry->pl_width = strlen(buf); + } + } + + return (0); +} + +int +vdev_expand_proplist(zpool_handle_t *zhp, const char *vdevname, + zprop_list_t **plp) +{ + zprop_list_t *entry; + char buf[ZFS_MAXPROPLEN]; + const char *strval = NULL; + int err = 0; + nvpair_t *elem = NULL; + nvlist_t *vprops = NULL; + nvlist_t *propval = NULL; + const char *propname; + vdev_prop_t prop; + zprop_list_t **last; + + for (entry = *plp; entry != NULL; entry = entry->pl_next) { + if (entry->pl_fixed) + continue; + + if (zpool_get_vdev_prop(zhp, vdevname, entry->pl_prop, + entry->pl_user_prop, buf, sizeof (buf), NULL, + B_FALSE) == 0) { + if (strlen(buf) > entry->pl_width) + entry->pl_width = strlen(buf); + } + if (entry->pl_prop == VDEV_PROP_NAME && + strlen(vdevname) > entry->pl_width) + entry->pl_width = strlen(vdevname); + } + + /* Handle the all properties case */ + last = plp; + if (*last != NULL && (*last)->pl_all == B_TRUE) { + while (*last != NULL) + last = &(*last)->pl_next; + + err = zpool_get_all_vdev_props(zhp, vdevname, &vprops); + if (err != 0) + return (err); + + while ((elem = nvlist_next_nvpair(vprops, elem)) != NULL) { + propname = nvpair_name(elem); + + /* Skip properties that are not user defined */ + if ((prop = vdev_name_to_prop(propname)) != + VDEV_PROP_USERPROP) + continue; + + if (nvpair_value_nvlist(elem, &propval) != 0) + continue; + + strval = fnvlist_lookup_string(propval, ZPROP_VALUE); + + entry = zfs_alloc(zhp->zpool_hdl, + sizeof (zprop_list_t)); + entry->pl_prop = prop; + entry->pl_user_prop = zfs_strdup(zhp->zpool_hdl, + propname); + entry->pl_width = strlen(strval); + entry->pl_all = B_TRUE; + *last = entry; + last = &entry->pl_next; } } @@ -1079,8 +1317,7 @@ zpool_open_canfail(libzfs_handle_t *hdl, const char *pool) return (NULL); } - if ((zhp = zfs_alloc(hdl, sizeof (zpool_handle_t))) == NULL) - return (NULL); + zhp = zfs_alloc(hdl, sizeof (zpool_handle_t)); zhp->zpool_hdl = hdl; (void) strlcpy(zhp->zpool_name, pool, sizeof (zhp->zpool_name)); @@ -1111,8 +1348,7 @@ zpool_open_silent(libzfs_handle_t *hdl, const char *pool, zpool_handle_t **ret) zpool_handle_t *zhp; boolean_t missing; - if ((zhp = zfs_alloc(hdl, sizeof (zpool_handle_t))) == NULL) - return (-1); + zhp = zfs_alloc(hdl, sizeof (zpool_handle_t)); zhp->zpool_hdl = hdl; (void) strlcpy(zhp->zpool_name, pool, sizeof (zhp->zpool_name)); @@ -1197,7 +1433,7 @@ zpool_has_special_vdev(nvlist_t *nvroot) if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_CHILDREN, &child, &children) == 0) { for (uint_t c = 0; c < children; c++) { - char *bias; + const char *bias; if (nvlist_lookup_string(child[c], ZPOOL_CONFIG_ALLOCATION_BIAS, &bias) == 0 && @@ -1221,7 +1457,7 @@ zpool_has_draid_vdev(nvlist_t *nvroot) if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_CHILDREN, &child, &children) == 0) { for (uint_t c = 0; c < children; c++) { - char *type; + const char *type; if (nvlist_lookup_string(child[c], ZPOOL_CONFIG_TYPE, &type) == 0 && @@ -1279,37 +1515,36 @@ zpool_create(libzfs_handle_t *hdl, const char *pool, nvlist_t *nvroot, nvlist_t *hidden_args = NULL; uint8_t *wkeydata = NULL; uint_t wkeylen = 0; - char msg[1024]; + char errbuf[ERRBUFLEN]; int ret = -1; - (void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN, + (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot create '%s'"), pool); if (!zpool_name_valid(hdl, B_FALSE, pool)) - return (zfs_error(hdl, EZFS_INVALIDNAME, msg)); + return (zfs_error(hdl, EZFS_INVALIDNAME, errbuf)); - if (zcmd_write_conf_nvlist(hdl, &zc, nvroot) != 0) - return (-1); + zcmd_write_conf_nvlist(hdl, &zc, nvroot); if (props) { prop_flags_t flags = { .create = B_TRUE, .import = B_FALSE }; if ((zc_props = zpool_valid_proplist(hdl, pool, props, - SPA_VERSION_1, flags, msg)) == NULL) { + SPA_VERSION_1, flags, errbuf)) == NULL) { goto create_failed; } } if (fsprops) { uint64_t zoned; - char *zonestr; + const char *zonestr; zoned = ((nvlist_lookup_string(fsprops, zfs_prop_to_name(ZFS_PROP_ZONED), &zonestr) == 0) && strcmp(zonestr, "on") == 0); if ((zc_fsprops = zfs_valid_proplist(hdl, ZFS_TYPE_FILESYSTEM, - fsprops, zoned, NULL, NULL, B_TRUE, msg)) == NULL) { + fsprops, zoned, NULL, NULL, B_TRUE, errbuf)) == NULL) { goto create_failed; } @@ -1319,7 +1554,7 @@ zpool_create(libzfs_handle_t *hdl, const char *pool, nvlist_t *nvroot, zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "%s property requires a special vdev"), zfs_prop_to_name(ZFS_PROP_SPECIAL_SMALL_BLOCKS)); - (void) zfs_error(hdl, EZFS_BADPROP, msg); + (void) zfs_error(hdl, EZFS_BADPROP, errbuf); goto create_failed; } @@ -1329,7 +1564,7 @@ zpool_create(libzfs_handle_t *hdl, const char *pool, nvlist_t *nvroot, } if (zfs_crypto_create(hdl, NULL, zc_fsprops, props, B_TRUE, &wkeydata, &wkeylen) != 0) { - zfs_error(hdl, EZFS_CRYPTOFAILED, msg); + zfs_error(hdl, EZFS_CRYPTOFAILED, errbuf); goto create_failed; } if (nvlist_add_nvlist(zc_props, @@ -1350,8 +1585,8 @@ zpool_create(libzfs_handle_t *hdl, const char *pool, nvlist_t *nvroot, } } - if (zc_props && zcmd_write_src_nvlist(hdl, &zc, zc_props) != 0) - goto create_failed; + if (zc_props) + zcmd_write_src_nvlist(hdl, &zc, zc_props); (void) strlcpy(zc.zc_name, pool, sizeof (zc.zc_name)); @@ -1377,7 +1612,7 @@ zpool_create(libzfs_handle_t *hdl, const char *pool, nvlist_t *nvroot, "one or more vdevs refer to the same device, or " "one of\nthe devices is part of an active md or " "lvm device")); - return (zfs_error(hdl, EZFS_BADDEV, msg)); + return (zfs_error(hdl, EZFS_BADDEV, errbuf)); case ERANGE: /* @@ -1392,7 +1627,7 @@ zpool_create(libzfs_handle_t *hdl, const char *pool, nvlist_t *nvroot, */ zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "record size invalid")); - return (zfs_error(hdl, EZFS_BADPROP, msg)); + return (zfs_error(hdl, EZFS_BADPROP, errbuf)); case EOVERFLOW: /* @@ -1411,12 +1646,12 @@ zpool_create(libzfs_handle_t *hdl, const char *pool, nvlist_t *nvroot, "one or more devices is less than the " "minimum size (%s)"), buf); } - return (zfs_error(hdl, EZFS_BADDEV, msg)); + return (zfs_error(hdl, EZFS_BADDEV, errbuf)); case ENOSPC: zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "one or more devices is out of space")); - return (zfs_error(hdl, EZFS_BADDEV, msg)); + return (zfs_error(hdl, EZFS_BADDEV, errbuf)); case EINVAL: if (zpool_has_draid_vdev(nvroot) && @@ -1424,13 +1659,14 @@ zpool_create(libzfs_handle_t *hdl, const char *pool, nvlist_t *nvroot, zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "dRAID vdevs are unsupported by the " "kernel")); - return (zfs_error(hdl, EZFS_BADDEV, msg)); + return (zfs_error(hdl, EZFS_BADDEV, errbuf)); } else { - return (zpool_standard_error(hdl, errno, msg)); + return (zpool_standard_error(hdl, errno, + errbuf)); } default: - return (zpool_standard_error(hdl, errno, msg)); + return (zpool_standard_error(hdl, errno, errbuf)); } } @@ -1454,7 +1690,7 @@ zpool_destroy(zpool_handle_t *zhp, const char *log_str) zfs_cmd_t zc = {"\0"}; zfs_handle_t *zfp = NULL; libzfs_handle_t *hdl = zhp->zpool_hdl; - char msg[1024]; + char errbuf[ERRBUFLEN]; if (zhp->zpool_state == POOL_STATE_ACTIVE && (zfp = zfs_open(hdl, zhp->zpool_name, ZFS_TYPE_FILESYSTEM)) == NULL) @@ -1464,15 +1700,15 @@ zpool_destroy(zpool_handle_t *zhp, const char *log_str) zc.zc_history = (uint64_t)(uintptr_t)log_str; if (zfs_ioctl(hdl, ZFS_IOC_POOL_DESTROY, &zc) != 0) { - (void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN, + (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot destroy '%s'"), zhp->zpool_name); if (errno == EROFS) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "one or more devices is read only")); - (void) zfs_error(hdl, EZFS_BADDEV, msg); + (void) zfs_error(hdl, EZFS_BADDEV, errbuf); } else { - (void) zpool_standard_error(hdl, errno, msg); + (void) zpool_standard_error(hdl, errno, errbuf); } if (zfp) @@ -1495,14 +1731,14 @@ int zpool_checkpoint(zpool_handle_t *zhp) { libzfs_handle_t *hdl = zhp->zpool_hdl; - char msg[1024]; + char errbuf[ERRBUFLEN]; int error; error = lzc_pool_checkpoint(zhp->zpool_name); if (error != 0) { - (void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN, + (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot checkpoint '%s'"), zhp->zpool_name); - (void) zpool_standard_error(hdl, error, msg); + (void) zpool_standard_error(hdl, error, errbuf); return (-1); } @@ -1516,13 +1752,35 @@ int zpool_discard_checkpoint(zpool_handle_t *zhp) { libzfs_handle_t *hdl = zhp->zpool_hdl; - char msg[1024]; + char errbuf[ERRBUFLEN]; int error; error = lzc_pool_checkpoint_discard(zhp->zpool_name); if (error != 0) { - (void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN, + (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot discard checkpoint in '%s'"), zhp->zpool_name); + (void) zpool_standard_error(hdl, error, errbuf); + return (-1); + } + + return (0); +} + +/* + * Load data type for the given pool. + */ +int +zpool_prefetch(zpool_handle_t *zhp, zpool_prefetch_type_t type) +{ + libzfs_handle_t *hdl = zhp->zpool_hdl; + char msg[1024]; + int error; + + error = lzc_pool_prefetch(zhp->zpool_name, type); + if (error != 0) { + (void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN, + "cannot prefetch %s in '%s'"), + type == ZPOOL_PREFETCH_DDT ? "ddt" : "", zhp->zpool_name); (void) zpool_standard_error(hdl, error, msg); return (-1); } @@ -1535,16 +1793,16 @@ zpool_discard_checkpoint(zpool_handle_t *zhp) * necessary verification to ensure that the vdev specification is well-formed. */ int -zpool_add(zpool_handle_t *zhp, nvlist_t *nvroot) +zpool_add(zpool_handle_t *zhp, nvlist_t *nvroot, boolean_t check_ashift) { zfs_cmd_t zc = {"\0"}; int ret; libzfs_handle_t *hdl = zhp->zpool_hdl; - char msg[1024]; + char errbuf[ERRBUFLEN]; nvlist_t **spares, **l2cache; uint_t nspares, nl2cache; - (void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN, + (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot add to '%s'"), zhp->zpool_name); if (zpool_get_prop_int(zhp, ZPOOL_PROP_VERSION, NULL) < @@ -1553,7 +1811,7 @@ zpool_add(zpool_handle_t *zhp, nvlist_t *nvroot) &spares, &nspares) == 0) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "pool must be " "upgraded to add hot spares")); - return (zfs_error(hdl, EZFS_BADVERSION, msg)); + return (zfs_error(hdl, EZFS_BADVERSION, errbuf)); } if (zpool_get_prop_int(zhp, ZPOOL_PROP_VERSION, NULL) < @@ -1562,12 +1820,12 @@ zpool_add(zpool_handle_t *zhp, nvlist_t *nvroot) &l2cache, &nl2cache) == 0) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "pool must be " "upgraded to add cache devices")); - return (zfs_error(hdl, EZFS_BADVERSION, msg)); + return (zfs_error(hdl, EZFS_BADVERSION, errbuf)); } - if (zcmd_write_conf_nvlist(hdl, &zc, nvroot) != 0) - return (-1); + zcmd_write_conf_nvlist(hdl, &zc, nvroot); (void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name)); + zc.zc_flags = check_ashift; if (zfs_ioctl(hdl, ZFS_IOC_VDEV_ADD, &zc) != 0) { switch (errno) { @@ -1580,7 +1838,7 @@ zpool_add(zpool_handle_t *zhp, nvlist_t *nvroot) */ zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "one or more vdevs refer to the same device")); - (void) zfs_error(hdl, EZFS_BADDEV, msg); + (void) zfs_error(hdl, EZFS_BADDEV, errbuf); break; case EINVAL: @@ -1597,7 +1855,7 @@ zpool_add(zpool_handle_t *zhp, nvlist_t *nvroot) "raidz or dRAID vdevs")); } - (void) zfs_error(hdl, EZFS_BADDEV, msg); + (void) zfs_error(hdl, EZFS_BADDEV, errbuf); break; case EOVERFLOW: @@ -1617,17 +1875,17 @@ zpool_add(zpool_handle_t *zhp, nvlist_t *nvroot) "device is less than the minimum " "size (%s)"), buf); } - (void) zfs_error(hdl, EZFS_BADDEV, msg); + (void) zfs_error(hdl, EZFS_BADDEV, errbuf); break; case ENOTSUP: zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "pool must be upgraded to add these vdevs")); - (void) zfs_error(hdl, EZFS_BADVERSION, msg); + (void) zfs_error(hdl, EZFS_BADVERSION, errbuf); break; default: - (void) zpool_standard_error(hdl, errno, msg); + (void) zpool_standard_error(hdl, errno, errbuf); } ret = -1; @@ -1711,7 +1969,8 @@ zpool_rewind_exclaim(libzfs_handle_t *hdl, const char *name, boolean_t dryrun, (void) nvlist_lookup_int64(nv, ZPOOL_CONFIG_REWIND_TIME, &loss); if (localtime_r((time_t *)&rewindto, &t) != NULL && - strftime(timestr, 128, "%c", &t) != 0) { + ctime_r((time_t *)&rewindto, timestr) != NULL) { + timestr[24] = 0; if (dryrun) { (void) printf(dgettext(TEXT_DOMAIN, "Would be able to return %s " @@ -1742,23 +2001,18 @@ zpool_rewind_exclaim(libzfs_handle_t *hdl, const char *name, boolean_t dryrun, void zpool_explain_recover(libzfs_handle_t *hdl, const char *name, int reason, - nvlist_t *config) + nvlist_t *config, char *buf, size_t size) { nvlist_t *nv = NULL; int64_t loss = -1; uint64_t edata = UINT64_MAX; uint64_t rewindto; struct tm t; - char timestr[128]; + char timestr[128], temp[1024]; if (!hdl->libzfs_printerr) return; - if (reason >= 0) - (void) printf(dgettext(TEXT_DOMAIN, "action: ")); - else - (void) printf(dgettext(TEXT_DOMAIN, "\t")); - /* All attempted rewinds failed if ZPOOL_CONFIG_LOAD_TIME missing */ if (nvlist_lookup_nvlist(config, ZPOOL_CONFIG_LOAD_INFO, &nv) != 0 || nvlist_lookup_nvlist(nv, ZPOOL_CONFIG_REWIND_INFO, &nv) != 0 || @@ -1769,55 +2023,61 @@ zpool_explain_recover(libzfs_handle_t *hdl, const char *name, int reason, (void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_LOAD_DATA_ERRORS, &edata); - (void) printf(dgettext(TEXT_DOMAIN, + (void) snprintf(buf, size, dgettext(TEXT_DOMAIN, "Recovery is possible, but will result in some data loss.\n")); if (localtime_r((time_t *)&rewindto, &t) != NULL && - strftime(timestr, 128, "%c", &t) != 0) { - (void) printf(dgettext(TEXT_DOMAIN, + ctime_r((time_t *)&rewindto, timestr) != NULL) { + timestr[24] = 0; + (void) snprintf(temp, 1024, dgettext(TEXT_DOMAIN, "\tReturning the pool to its state as of %s\n" - "\tshould correct the problem. "), - timestr); + "\tshould correct the problem. "), timestr); + (void) strlcat(buf, temp, size); } else { - (void) printf(dgettext(TEXT_DOMAIN, + (void) strlcat(buf, dgettext(TEXT_DOMAIN, "\tReverting the pool to an earlier state " - "should correct the problem.\n\t")); + "should correct the problem.\n\t"), size); } if (loss > 120) { - (void) printf(dgettext(TEXT_DOMAIN, + (void) snprintf(temp, 1024, dgettext(TEXT_DOMAIN, "Approximately %lld minutes of data\n" "\tmust be discarded, irreversibly. "), ((longlong_t)loss + 30) / 60); + (void) strlcat(buf, temp, size); } else if (loss > 0) { - (void) printf(dgettext(TEXT_DOMAIN, + (void) snprintf(temp, 1024, dgettext(TEXT_DOMAIN, "Approximately %lld seconds of data\n" "\tmust be discarded, irreversibly. "), (longlong_t)loss); + (void) strlcat(buf, temp, size); } if (edata != 0 && edata != UINT64_MAX) { if (edata == 1) { - (void) printf(dgettext(TEXT_DOMAIN, + (void) strlcat(buf, dgettext(TEXT_DOMAIN, "After rewind, at least\n" - "\tone persistent user-data error will remain. ")); + "\tone persistent user-data error will remain. "), + size); } else { - (void) printf(dgettext(TEXT_DOMAIN, + (void) strlcat(buf, dgettext(TEXT_DOMAIN, "After rewind, several\n" - "\tpersistent user-data errors will remain. ")); + "\tpersistent user-data errors will remain. "), + size); } } - (void) printf(dgettext(TEXT_DOMAIN, + (void) snprintf(temp, 1024, dgettext(TEXT_DOMAIN, "Recovery can be attempted\n\tby executing 'zpool %s -F %s'. "), reason >= 0 ? "clear" : "import", name); + (void) strlcat(buf, temp, size); - (void) printf(dgettext(TEXT_DOMAIN, + (void) strlcat(buf, dgettext(TEXT_DOMAIN, "A scrub of the pool\n" - "\tis strongly recommended after recovery.\n")); + "\tis strongly recommended after recovery.\n"), size); return; no_info: - (void) printf(dgettext(TEXT_DOMAIN, - "Destroy and re-create the pool from\n\ta backup source.\n")); + (void) strlcat(buf, dgettext(TEXT_DOMAIN, + "Destroy and re-create the pool from\n\ta backup source.\n"), size); } /* @@ -1886,27 +2146,25 @@ print_vdev_tree(libzfs_handle_t *hdl, const char *name, nvlist_t *nv, } void -zpool_print_unsup_feat(nvlist_t *config) +zpool_collect_unsup_feat(nvlist_t *config, char *buf, size_t size) { nvlist_t *nvinfo, *unsup_feat; - nvpair_t *nvp; - - verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_LOAD_INFO, &nvinfo) == - 0); - verify(nvlist_lookup_nvlist(nvinfo, ZPOOL_CONFIG_UNSUP_FEAT, - &unsup_feat) == 0); - - for (nvp = nvlist_next_nvpair(unsup_feat, NULL); nvp != NULL; - nvp = nvlist_next_nvpair(unsup_feat, nvp)) { - char *desc; - - verify(nvpair_type(nvp) == DATA_TYPE_STRING); - verify(nvpair_value_string(nvp, &desc) == 0); - - if (strlen(desc) > 0) - (void) printf("\t%s (%s)\n", nvpair_name(nvp), desc); - else - (void) printf("\t%s\n", nvpair_name(nvp)); + char temp[512]; + + nvinfo = fnvlist_lookup_nvlist(config, ZPOOL_CONFIG_LOAD_INFO); + unsup_feat = fnvlist_lookup_nvlist(nvinfo, ZPOOL_CONFIG_UNSUP_FEAT); + + for (nvpair_t *nvp = nvlist_next_nvpair(unsup_feat, NULL); + nvp != NULL; nvp = nvlist_next_nvpair(unsup_feat, nvp)) { + const char *desc = fnvpair_value_string(nvp); + if (strlen(desc) > 0) { + (void) snprintf(temp, 512, "\t%s (%s)\n", + nvpair_name(nvp), desc); + (void) strlcat(buf, temp, size); + } else { + (void) snprintf(temp, 512, "\t%s\n", nvpair_name(nvp)); + (void) strlcat(buf, temp, size); + } } } @@ -1925,14 +2183,14 @@ zpool_import_props(libzfs_handle_t *hdl, nvlist_t *config, const char *newname, nvlist_t *nv = NULL; nvlist_t *nvinfo = NULL; nvlist_t *missing = NULL; - char *thename; - char *origname; + const char *thename; + const char *origname; int ret; int error = 0; - char errbuf[1024]; + char buf[2048]; + char errbuf[ERRBUFLEN]; - verify(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME, - &origname) == 0); + origname = fnvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME); (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot import pool '%s'"), origname); @@ -1942,7 +2200,7 @@ zpool_import_props(libzfs_handle_t *hdl, nvlist_t *config, const char *newname, return (zfs_error_fmt(hdl, EZFS_INVALIDNAME, dgettext(TEXT_DOMAIN, "cannot import '%s'"), newname)); - thename = (char *)newname; + thename = newname; } else { thename = origname; } @@ -1951,41 +2209,26 @@ zpool_import_props(libzfs_handle_t *hdl, nvlist_t *config, const char *newname, uint64_t version; prop_flags_t flags = { .create = B_FALSE, .import = B_TRUE }; - verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION, - &version) == 0); + version = fnvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION); if ((props = zpool_valid_proplist(hdl, origname, props, version, flags, errbuf)) == NULL) return (-1); - if (zcmd_write_src_nvlist(hdl, &zc, props) != 0) { - nvlist_free(props); - return (-1); - } + zcmd_write_src_nvlist(hdl, &zc, props); nvlist_free(props); } (void) strlcpy(zc.zc_name, thename, sizeof (zc.zc_name)); - verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID, - &zc.zc_guid) == 0); + zc.zc_guid = fnvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID); - if (zcmd_write_conf_nvlist(hdl, &zc, config) != 0) { - zcmd_free_nvlists(&zc); - return (-1); - } - if (zcmd_alloc_dst_nvlist(hdl, &zc, zc.zc_nvlist_conf_size * 2) != 0) { - zcmd_free_nvlists(&zc); - return (-1); - } + zcmd_write_conf_nvlist(hdl, &zc, config); + zcmd_alloc_dst_nvlist(hdl, &zc, zc.zc_nvlist_conf_size * 2); zc.zc_cookie = flags; while ((ret = zfs_ioctl(hdl, ZFS_IOC_POOL_IMPORT, &zc)) != 0 && - errno == ENOMEM) { - if (zcmd_expand_dst_nvlist(hdl, &zc) != 0) { - zcmd_free_nvlists(&zc); - return (-1); - } - } + errno == ENOMEM) + zcmd_expand_dst_nvlist(hdl, &zc); if (ret != 0) error = errno; @@ -2027,7 +2270,9 @@ zpool_import_props(libzfs_handle_t *hdl, nvlist_t *config, const char *newname, (void) printf(dgettext(TEXT_DOMAIN, "This " "pool uses the following feature(s) not " "supported by this system:\n")); - zpool_print_unsup_feat(nv); + memset(buf, 0, 2048); + zpool_collect_unsup_feat(nv, buf, 2048); + (void) printf("%s", buf); if (nvlist_exists(nvinfo, ZPOOL_CONFIG_CAN_RDONLY)) { (void) printf(dgettext(TEXT_DOMAIN, @@ -2046,7 +2291,7 @@ zpool_import_props(libzfs_handle_t *hdl, nvlist_t *config, const char *newname, case EREMOTEIO: if (nv != NULL && nvlist_lookup_nvlist(nv, ZPOOL_CONFIG_LOAD_INFO, &nvinfo) == 0) { - char *hostname = "<unknown>"; + const char *hostname = "<unknown>"; uint64_t hostid = 0; mmp_state_t mmp_state; @@ -2126,8 +2371,11 @@ zpool_import_props(libzfs_handle_t *hdl, nvlist_t *config, const char *newname, break; default: (void) zpool_standard_error(hdl, error, desc); + memset(buf, 0, 2048); zpool_explain_recover(hdl, - newname ? origname : thename, -error, nv); + newname ? origname : thename, -error, nv, + buf, 2048); + (void) printf("\t%s", buf); break; } @@ -2149,7 +2397,6 @@ zpool_import_props(libzfs_handle_t *hdl, nvlist_t *config, const char *newname, ((policy.zlp_rewind & ZPOOL_TRY_REWIND) != 0), nv); } nvlist_free(nv); - return (0); } return (ret); @@ -2171,7 +2418,7 @@ zpool_translate_vdev_guids(zpool_handle_t *zhp, nvlist_t *vds, elem = nvlist_next_nvpair(vds, elem)) { boolean_t spare, cache; - char *vd_path = nvpair_name(elem); + const char *vd_path = nvpair_name(elem); nvlist_t *tgt = zpool_find_vdev(zhp, vd_path, &spare, &cache, NULL); @@ -2224,8 +2471,8 @@ xlate_init_err(int err) } /* - * Begin, suspend, or cancel the initialization (initializing of all free - * blocks) for the given vdevs in the given pool. + * Begin, suspend, cancel, or uninit (clear) the initialization (initializing + * of all free blocks) for the given vdevs in the given pool. */ static int zpool_initialize_impl(zpool_handle_t *zhp, pool_initialize_func_t cmd_type, @@ -2251,11 +2498,16 @@ zpool_initialize_impl(zpool_handle_t *zhp, pool_initialize_func_t cmd_type, vdev_guids, &errlist); if (err != 0) { - if (errlist != NULL) { - vd_errlist = fnvlist_lookup_nvlist(errlist, - ZPOOL_INITIALIZE_VDEVS); + if (errlist != NULL && nvlist_lookup_nvlist(errlist, + ZPOOL_INITIALIZE_VDEVS, &vd_errlist) == 0) { goto list_errors; } + + if (err == EINVAL && cmd_type == POOL_INITIALIZE_UNINIT) { + zfs_error_aux(zhp->zpool_hdl, dgettext(TEXT_DOMAIN, + "uninitialize is not supported by kernel")); + } + (void) zpool_standard_error(zhp->zpool_hdl, err, dgettext(TEXT_DOMAIN, "operation failed")); goto out; @@ -2285,7 +2537,7 @@ list_errors: for (elem = nvlist_next_nvpair(vd_errlist, NULL); elem != NULL; elem = nvlist_next_nvpair(vd_errlist, elem)) { int64_t vd_error = xlate_init_err(fnvpair_value_int64(elem)); - char *path; + const char *path; if (nvlist_lookup_string(guids_to_paths, nvpair_name(elem), &path) != 0) @@ -2383,7 +2635,7 @@ check_trim_errs(zpool_handle_t *zhp, trimflags_t *trim_flags, for (elem = nvlist_next_nvpair(errlist, NULL); elem != NULL; elem = nvlist_next_nvpair(errlist, elem)) { int64_t vd_error = xlate_trim_err(fnvpair_value_int64(elem)); - char *path; + const char *path; /* * If only the pool was specified, and it was not a secure @@ -2452,11 +2704,11 @@ zpool_trim(zpool_handle_t *zhp, pool_trim_func_t cmd_type, nvlist_t *vds, goto out; } } else { - char msg[1024]; + char errbuf[ERRBUFLEN]; - (void) snprintf(msg, sizeof (msg), + (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "operation failed")); - zpool_standard_error(zhp->zpool_hdl, err, msg); + zpool_standard_error(zhp->zpool_hdl, err, errbuf); retval = -1; goto out; } @@ -2480,73 +2732,145 @@ out: int zpool_scan(zpool_handle_t *zhp, pool_scan_func_t func, pool_scrub_cmd_t cmd) { - zfs_cmd_t zc = {"\0"}; - char msg[1024]; + char errbuf[ERRBUFLEN]; int err; libzfs_handle_t *hdl = zhp->zpool_hdl; - (void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name)); - zc.zc_cookie = func; - zc.zc_flags = cmd; + nvlist_t *args = fnvlist_alloc(); + fnvlist_add_uint64(args, "scan_type", (uint64_t)func); + fnvlist_add_uint64(args, "scan_command", (uint64_t)cmd); + + err = lzc_scrub(ZFS_IOC_POOL_SCRUB, zhp->zpool_name, args, NULL); + fnvlist_free(args); - if (zfs_ioctl(hdl, ZFS_IOC_POOL_SCAN, &zc) == 0) + if (err == 0) { return (0); + } else if (err == ZFS_ERR_IOC_CMD_UNAVAIL) { + zfs_cmd_t zc = {"\0"}; + (void) strlcpy(zc.zc_name, zhp->zpool_name, + sizeof (zc.zc_name)); + zc.zc_cookie = func; + zc.zc_flags = cmd; - err = errno; + if (zfs_ioctl(hdl, ZFS_IOC_POOL_SCAN, &zc) == 0) + return (0); + } - /* ECANCELED on a scrub means we resumed a paused scrub */ - if (err == ECANCELED && func == POOL_SCAN_SCRUB && - cmd == POOL_SCRUB_NORMAL) + /* + * An ECANCELED on a scrub means one of the following: + * 1. we resumed a paused scrub. + * 2. we resumed a paused error scrub. + * 3. Error scrub is not run because of no error log. + * + * Note that we no longer return ECANCELED in case 1 or 2. However, in + * order to prevent problems where we have a newer userland than + * kernel, we keep this check in place. That prevents erroneous + * failures when an older kernel returns ECANCELED in those cases. + */ + if (err == ECANCELED && (func == POOL_SCAN_SCRUB || + func == POOL_SCAN_ERRORSCRUB) && cmd == POOL_SCRUB_NORMAL) return (0); - - if (err == ENOENT && func != POOL_SCAN_NONE && cmd == POOL_SCRUB_NORMAL) + /* + * The following cases have been handled here: + * 1. Paused a scrub/error scrub if there is none in progress. + */ + if (err == ENOENT && func != POOL_SCAN_NONE && cmd == + POOL_SCRUB_PAUSE) { return (0); + } + + ASSERT3U(func, >=, POOL_SCAN_NONE); + ASSERT3U(func, <, POOL_SCAN_FUNCS); - if (func == POOL_SCAN_SCRUB) { + if (func == POOL_SCAN_SCRUB || func == POOL_SCAN_ERRORSCRUB) { if (cmd == POOL_SCRUB_PAUSE) { - (void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN, - "cannot pause scrubbing %s"), zc.zc_name); + (void) snprintf(errbuf, sizeof (errbuf), + dgettext(TEXT_DOMAIN, "cannot pause scrubbing %s"), + zhp->zpool_name); } else { assert(cmd == POOL_SCRUB_NORMAL); - (void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN, - "cannot scrub %s"), zc.zc_name); + (void) snprintf(errbuf, sizeof (errbuf), + dgettext(TEXT_DOMAIN, "cannot scrub %s"), + zhp->zpool_name); } } else if (func == POOL_SCAN_RESILVER) { assert(cmd == POOL_SCRUB_NORMAL); - (void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN, - "cannot restart resilver on %s"), zc.zc_name); + (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, + "cannot restart resilver on %s"), zhp->zpool_name); } else if (func == POOL_SCAN_NONE) { - (void) snprintf(msg, sizeof (msg), - dgettext(TEXT_DOMAIN, "cannot cancel scrubbing %s"), - zc.zc_name); + (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, + "cannot cancel scrubbing %s"), zhp->zpool_name); } else { assert(!"unexpected result"); } + /* + * With EBUSY, six cases are possible: + * + * Current state Requested + * 1. Normal Scrub Running Normal Scrub or Error Scrub + * 2. Normal Scrub Paused Error Scrub + * 3. Normal Scrub Paused Pause Normal Scrub + * 4. Error Scrub Running Normal Scrub or Error Scrub + * 5. Error Scrub Paused Pause Error Scrub + * 6. Resilvering Anything else + */ if (err == EBUSY) { nvlist_t *nvroot; pool_scan_stat_t *ps = NULL; uint_t psc; - verify(nvlist_lookup_nvlist(zhp->zpool_config, - ZPOOL_CONFIG_VDEV_TREE, &nvroot) == 0); + nvroot = fnvlist_lookup_nvlist(zhp->zpool_config, + ZPOOL_CONFIG_VDEV_TREE); (void) nvlist_lookup_uint64_array(nvroot, ZPOOL_CONFIG_SCAN_STATS, (uint64_t **)&ps, &psc); if (ps && ps->pss_func == POOL_SCAN_SCRUB && ps->pss_state == DSS_SCANNING) { - if (cmd == POOL_SCRUB_PAUSE) - return (zfs_error(hdl, EZFS_SCRUB_PAUSED, msg)); - else - return (zfs_error(hdl, EZFS_SCRUBBING, msg)); + if (ps->pss_pass_scrub_pause == 0) { + /* handles case 1 */ + assert(cmd == POOL_SCRUB_NORMAL); + return (zfs_error(hdl, EZFS_SCRUBBING, + errbuf)); + } else { + if (func == POOL_SCAN_ERRORSCRUB) { + /* handles case 2 */ + ASSERT3U(cmd, ==, POOL_SCRUB_NORMAL); + return (zfs_error(hdl, + EZFS_SCRUB_PAUSED_TO_CANCEL, + errbuf)); + } else { + /* handles case 3 */ + ASSERT3U(func, ==, POOL_SCAN_SCRUB); + ASSERT3U(cmd, ==, POOL_SCRUB_PAUSE); + return (zfs_error(hdl, + EZFS_SCRUB_PAUSED, errbuf)); + } + } + } else if (ps && + ps->pss_error_scrub_func == POOL_SCAN_ERRORSCRUB && + ps->pss_error_scrub_state == DSS_ERRORSCRUBBING) { + if (ps->pss_pass_error_scrub_pause == 0) { + /* handles case 4 */ + ASSERT3U(cmd, ==, POOL_SCRUB_NORMAL); + return (zfs_error(hdl, EZFS_ERRORSCRUBBING, + errbuf)); + } else { + /* handles case 5 */ + ASSERT3U(func, ==, POOL_SCAN_ERRORSCRUB); + ASSERT3U(cmd, ==, POOL_SCRUB_PAUSE); + return (zfs_error(hdl, EZFS_ERRORSCRUB_PAUSED, + errbuf)); + } } else { - return (zfs_error(hdl, EZFS_RESILVERING, msg)); + /* handles case 6 */ + return (zfs_error(hdl, EZFS_RESILVERING, errbuf)); } } else if (err == ENOENT) { - return (zfs_error(hdl, EZFS_NO_SCRUB, msg)); + return (zfs_error(hdl, EZFS_NO_SCRUB, errbuf)); } else if (err == ENOTSUP && func == POOL_SCAN_RESILVER) { - return (zfs_error(hdl, EZFS_NO_RESILVER_DEFER, msg)); + return (zfs_error(hdl, EZFS_NO_RESILVER_DEFER, errbuf)); } else { - return (zpool_standard_error(hdl, err, msg)); + return (zpool_standard_error(hdl, err, errbuf)); } } @@ -2555,17 +2879,22 @@ zpool_scan(zpool_handle_t *zhp, pool_scan_func_t func, pool_scrub_cmd_t cmd) * the nvpair name to determine how we should look for the device. * 'avail_spare' is set to TRUE if the provided guid refers to an AVAIL * spare; but FALSE if its an INUSE spare. + * + * If 'return_parent' is set, then return the *parent* of the vdev you're + * searching for rather than the vdev itself. */ static nvlist_t * vdev_to_nvlist_iter(nvlist_t *nv, nvlist_t *search, boolean_t *avail_spare, - boolean_t *l2cache, boolean_t *log) + boolean_t *l2cache, boolean_t *log, boolean_t return_parent) { uint_t c, children; nvlist_t **child; nvlist_t *ret; uint64_t is_log; - char *srchkey; + const char *srchkey; nvpair_t *pair = nvlist_next_nvpair(search, NULL); + const char *tmp = NULL; + boolean_t is_root; /* Nothing to look for */ if (search == NULL || pair == NULL) @@ -2574,23 +2903,27 @@ vdev_to_nvlist_iter(nvlist_t *nv, nvlist_t *search, boolean_t *avail_spare, /* Obtain the key we will use to search */ srchkey = nvpair_name(pair); + nvlist_lookup_string(nv, ZPOOL_CONFIG_TYPE, &tmp); + if (strcmp(tmp, "root") == 0) + is_root = B_TRUE; + else + is_root = B_FALSE; + switch (nvpair_type(pair)) { case DATA_TYPE_UINT64: if (strcmp(srchkey, ZPOOL_CONFIG_GUID) == 0) { - uint64_t srchval, theguid; - - verify(nvpair_value_uint64(pair, &srchval) == 0); - verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID, - &theguid) == 0); + uint64_t srchval = fnvpair_value_uint64(pair); + uint64_t theguid = fnvlist_lookup_uint64(nv, + ZPOOL_CONFIG_GUID); if (theguid == srchval) return (nv); } break; case DATA_TYPE_STRING: { - char *srchval, *val; + const char *srchval, *val; - verify(nvpair_value_string(pair, &srchval) == 0); + srchval = fnvpair_value_string(pair); if (nvlist_lookup_string(nv, srchkey, &val) != 0) break; @@ -2614,7 +2947,7 @@ vdev_to_nvlist_iter(nvlist_t *nv, nvlist_t *search, boolean_t *avail_spare, if (zfs_strcmp_pathname(srchval, val, wholedisk) == 0) return (nv); - } else if (strcmp(srchkey, ZPOOL_CONFIG_TYPE) == 0 && val) { + } else if (strcmp(srchkey, ZPOOL_CONFIG_TYPE) == 0) { char *type, *idx, *end, *p; uint64_t id, vdev_id; @@ -2634,6 +2967,18 @@ vdev_to_nvlist_iter(nvlist_t *nv, nvlist_t *search, boolean_t *avail_spare, *p = '\0'; /* + * draid names are presented like: draid2:4d:6c:0s + * We match them up to the first ':' so we can still + * do the parity check below, but the other params + * are ignored. + */ + if ((p = strchr(type, ':')) != NULL) { + if (strncmp(type, VDEV_TYPE_DRAID, + strlen(VDEV_TYPE_DRAID)) == 0) + *p = '\0'; + } + + /* * If the types don't match then keep looking. */ if (strncmp(val, type, strlen(val)) != 0) { @@ -2642,9 +2987,8 @@ vdev_to_nvlist_iter(nvlist_t *nv, nvlist_t *search, boolean_t *avail_spare, } verify(zpool_vdev_is_interior(type)); - verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_ID, - &id) == 0); + id = fnvlist_lookup_uint64(nv, ZPOOL_CONFIG_ID); errno = 0; vdev_id = strtoull(idx, &end, 10); @@ -2670,8 +3014,8 @@ vdev_to_nvlist_iter(nvlist_t *nv, nvlist_t *search, boolean_t *avail_spare, free(type); return (NULL); } - verify(nvlist_lookup_uint64(nv, - ZPOOL_CONFIG_NPARITY, &vdev_parity) == 0); + vdev_parity = fnvlist_lookup_uint64(nv, + ZPOOL_CONFIG_NPARITY); if ((int)vdev_parity != parity) { free(type); break; @@ -2707,7 +3051,7 @@ vdev_to_nvlist_iter(nvlist_t *nv, nvlist_t *search, boolean_t *avail_spare, for (c = 0; c < children; c++) { if ((ret = vdev_to_nvlist_iter(child[c], search, - avail_spare, l2cache, NULL)) != NULL) { + avail_spare, l2cache, NULL, return_parent)) != NULL) { /* * The 'is_log' value is only set for the toplevel * vdev, not the leaf vdevs. So we always lookup the @@ -2720,7 +3064,7 @@ vdev_to_nvlist_iter(nvlist_t *nv, nvlist_t *search, boolean_t *avail_spare, is_log) { *log = B_TRUE; } - return (ret); + return (ret && return_parent && !is_root ? nv : ret); } } @@ -2728,9 +3072,11 @@ vdev_to_nvlist_iter(nvlist_t *nv, nvlist_t *search, boolean_t *avail_spare, &child, &children) == 0) { for (c = 0; c < children; c++) { if ((ret = vdev_to_nvlist_iter(child[c], search, - avail_spare, l2cache, NULL)) != NULL) { + avail_spare, l2cache, NULL, return_parent)) + != NULL) { *avail_spare = B_TRUE; - return (ret); + return (ret && return_parent && + !is_root ? nv : ret); } } } @@ -2739,9 +3085,11 @@ vdev_to_nvlist_iter(nvlist_t *nv, nvlist_t *search, boolean_t *avail_spare, &child, &children) == 0) { for (c = 0; c < children; c++) { if ((ret = vdev_to_nvlist_iter(child[c], search, - avail_spare, l2cache, NULL)) != NULL) { + avail_spare, l2cache, NULL, return_parent)) + != NULL) { *l2cache = B_TRUE; - return (ret); + return (ret && return_parent && + !is_root ? nv : ret); } } } @@ -2760,25 +3108,25 @@ zpool_find_vdev_by_physpath(zpool_handle_t *zhp, const char *ppath, uint64_t guid; char *end; - verify(nvlist_alloc(&search, NV_UNIQUE_NAME, KM_SLEEP) == 0); + search = fnvlist_alloc(); guid = strtoull(ppath, &end, 0); if (guid != 0 && *end == '\0') { - verify(nvlist_add_uint64(search, ZPOOL_CONFIG_GUID, guid) == 0); + fnvlist_add_uint64(search, ZPOOL_CONFIG_GUID, guid); } else { - verify(nvlist_add_string(search, ZPOOL_CONFIG_PHYS_PATH, - ppath) == 0); + fnvlist_add_string(search, ZPOOL_CONFIG_PHYS_PATH, ppath); } - verify(nvlist_lookup_nvlist(zhp->zpool_config, ZPOOL_CONFIG_VDEV_TREE, - &nvroot) == 0); + nvroot = fnvlist_lookup_nvlist(zhp->zpool_config, + ZPOOL_CONFIG_VDEV_TREE); *avail_spare = B_FALSE; *l2cache = B_FALSE; if (log != NULL) *log = B_FALSE; - ret = vdev_to_nvlist_iter(nvroot, search, avail_spare, l2cache, log); - nvlist_free(search); + ret = vdev_to_nvlist_iter(nvroot, search, avail_spare, l2cache, log, + B_FALSE); + fnvlist_free(search); return (ret); } @@ -2793,6 +3141,7 @@ zpool_vdev_is_interior(const char *name) strncmp(name, VDEV_TYPE_SPARE, strlen(VDEV_TYPE_SPARE)) == 0 || strncmp(name, VDEV_TYPE_REPLACING, strlen(VDEV_TYPE_REPLACING)) == 0 || + strncmp(name, VDEV_TYPE_ROOT, strlen(VDEV_TYPE_ROOT)) == 0 || strncmp(name, VDEV_TYPE_MIRROR, strlen(VDEV_TYPE_MIRROR)) == 0) return (B_TRUE); @@ -2803,184 +3152,71 @@ zpool_vdev_is_interior(const char *name) return (B_FALSE); } -nvlist_t * -zpool_find_vdev(zpool_handle_t *zhp, const char *path, boolean_t *avail_spare, - boolean_t *l2cache, boolean_t *log) +/* + * Lookup the nvlist for a given vdev or vdev's parent (depending on + * if 'return_parent' is set). + */ +static nvlist_t * +__zpool_find_vdev(zpool_handle_t *zhp, const char *path, boolean_t *avail_spare, + boolean_t *l2cache, boolean_t *log, boolean_t return_parent) { char *end; nvlist_t *nvroot, *search, *ret; uint64_t guid; + boolean_t __avail_spare, __l2cache, __log; - verify(nvlist_alloc(&search, NV_UNIQUE_NAME, KM_SLEEP) == 0); + search = fnvlist_alloc(); guid = strtoull(path, &end, 0); if (guid != 0 && *end == '\0') { - verify(nvlist_add_uint64(search, ZPOOL_CONFIG_GUID, guid) == 0); + fnvlist_add_uint64(search, ZPOOL_CONFIG_GUID, guid); } else if (zpool_vdev_is_interior(path)) { - verify(nvlist_add_string(search, ZPOOL_CONFIG_TYPE, path) == 0); + fnvlist_add_string(search, ZPOOL_CONFIG_TYPE, path); } else { - verify(nvlist_add_string(search, ZPOOL_CONFIG_PATH, path) == 0); + fnvlist_add_string(search, ZPOOL_CONFIG_PATH, path); } - verify(nvlist_lookup_nvlist(zhp->zpool_config, ZPOOL_CONFIG_VDEV_TREE, - &nvroot) == 0); + nvroot = fnvlist_lookup_nvlist(zhp->zpool_config, + ZPOOL_CONFIG_VDEV_TREE); + + /* + * User can pass NULL for avail_spare, l2cache, and log, but + * we still need to provide variables to vdev_to_nvlist_iter(), so + * just point them to junk variables here. + */ + if (!avail_spare) + avail_spare = &__avail_spare; + if (!l2cache) + l2cache = &__l2cache; + if (!log) + log = &__log; *avail_spare = B_FALSE; *l2cache = B_FALSE; if (log != NULL) *log = B_FALSE; - ret = vdev_to_nvlist_iter(nvroot, search, avail_spare, l2cache, log); - nvlist_free(search); + ret = vdev_to_nvlist_iter(nvroot, search, avail_spare, l2cache, log, + return_parent); + fnvlist_free(search); return (ret); } -static int -vdev_is_online(nvlist_t *nv) -{ - uint64_t ival; - - if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_OFFLINE, &ival) == 0 || - nvlist_lookup_uint64(nv, ZPOOL_CONFIG_FAULTED, &ival) == 0 || - nvlist_lookup_uint64(nv, ZPOOL_CONFIG_REMOVED, &ival) == 0) - return (0); - - return (1); -} - -/* - * Helper function for zpool_get_physpaths(). - */ -static int -vdev_get_one_physpath(nvlist_t *config, char *physpath, size_t physpath_size, - size_t *bytes_written) -{ - size_t bytes_left, pos, rsz; - char *tmppath; - const char *format; - - if (nvlist_lookup_string(config, ZPOOL_CONFIG_PHYS_PATH, - &tmppath) != 0) - return (EZFS_NODEVICE); - - pos = *bytes_written; - bytes_left = physpath_size - pos; - format = (pos == 0) ? "%s" : " %s"; - - rsz = snprintf(physpath + pos, bytes_left, format, tmppath); - *bytes_written += rsz; - - if (rsz >= bytes_left) { - /* if physpath was not copied properly, clear it */ - if (bytes_left != 0) { - physpath[pos] = 0; - } - return (EZFS_NOSPC); - } - return (0); -} - -static int -vdev_get_physpaths(nvlist_t *nv, char *physpath, size_t phypath_size, - size_t *rsz, boolean_t is_spare) +nvlist_t * +zpool_find_vdev(zpool_handle_t *zhp, const char *path, boolean_t *avail_spare, + boolean_t *l2cache, boolean_t *log) { - char *type; - int ret; - - if (nvlist_lookup_string(nv, ZPOOL_CONFIG_TYPE, &type) != 0) - return (EZFS_INVALCONFIG); - - if (strcmp(type, VDEV_TYPE_DISK) == 0) { - /* - * An active spare device has ZPOOL_CONFIG_IS_SPARE set. - * For a spare vdev, we only want to boot from the active - * spare device. - */ - if (is_spare) { - uint64_t spare = 0; - (void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_IS_SPARE, - &spare); - if (!spare) - return (EZFS_INVALCONFIG); - } - - if (vdev_is_online(nv)) { - if ((ret = vdev_get_one_physpath(nv, physpath, - phypath_size, rsz)) != 0) - return (ret); - } - } else if (strcmp(type, VDEV_TYPE_MIRROR) == 0 || - strcmp(type, VDEV_TYPE_RAIDZ) == 0 || - strcmp(type, VDEV_TYPE_REPLACING) == 0 || - (is_spare = (strcmp(type, VDEV_TYPE_SPARE) == 0))) { - nvlist_t **child; - uint_t count; - int i, ret; - - if (nvlist_lookup_nvlist_array(nv, - ZPOOL_CONFIG_CHILDREN, &child, &count) != 0) - return (EZFS_INVALCONFIG); - - for (i = 0; i < count; i++) { - ret = vdev_get_physpaths(child[i], physpath, - phypath_size, rsz, is_spare); - if (ret == EZFS_NOSPC) - return (ret); - } - } - - return (EZFS_POOL_INVALARG); + return (__zpool_find_vdev(zhp, path, avail_spare, l2cache, log, + B_FALSE)); } -/* - * Get phys_path for a root pool config. - * Return 0 on success; non-zero on failure. - */ -static int -zpool_get_config_physpath(nvlist_t *config, char *physpath, size_t phypath_size) -{ - size_t rsz; - nvlist_t *vdev_root; - nvlist_t **child; - uint_t count; - char *type; - - rsz = 0; - - if (nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, - &vdev_root) != 0) - return (EZFS_INVALCONFIG); - - if (nvlist_lookup_string(vdev_root, ZPOOL_CONFIG_TYPE, &type) != 0 || - nvlist_lookup_nvlist_array(vdev_root, ZPOOL_CONFIG_CHILDREN, - &child, &count) != 0) - return (EZFS_INVALCONFIG); - - /* - * root pool can only have a single top-level vdev. - */ - if (strcmp(type, VDEV_TYPE_ROOT) != 0 || count != 1) - return (EZFS_POOL_INVALARG); - - (void) vdev_get_physpaths(child[0], physpath, phypath_size, &rsz, - B_FALSE); - - /* No online devices */ - if (rsz == 0) - return (EZFS_NODEVICE); - - return (0); -} - -/* - * Get phys_path for a root pool - * Return 0 on success; non-zero on failure. - */ -int -zpool_get_physpath(zpool_handle_t *zhp, char *physpath, size_t phypath_size) +/* Given a vdev path, return its parent's nvlist */ +nvlist_t * +zpool_find_parent_vdev(zpool_handle_t *zhp, const char *path, + boolean_t *avail_spare, boolean_t *l2cache, boolean_t *log) { - return (zpool_get_config_physpath(zhp->zpool_config, physpath, - phypath_size)); + return (__zpool_find_vdev(zhp, path, avail_spare, l2cache, log, + B_TRUE)); } /* @@ -2994,7 +3230,6 @@ static uint64_t zpool_vdev_path_to_guid_impl(zpool_handle_t *zhp, const char *path, boolean_t *is_spare, boolean_t *is_l2cache, boolean_t *is_log) { - uint64_t guid; boolean_t spare = B_FALSE, l2cache = B_FALSE, log = B_FALSE; nvlist_t *tgt; @@ -3002,7 +3237,6 @@ zpool_vdev_path_to_guid_impl(zpool_handle_t *zhp, const char *path, &log)) == NULL) return (0); - verify(nvlist_lookup_uint64(tgt, ZPOOL_CONFIG_GUID, &guid) == 0); if (is_spare != NULL) *is_spare = spare; if (is_l2cache != NULL) @@ -3010,7 +3244,7 @@ zpool_vdev_path_to_guid_impl(zpool_handle_t *zhp, const char *path, if (is_log != NULL) *is_log = log; - return (guid); + return (fnvlist_lookup_uint64(tgt, ZPOOL_CONFIG_GUID)); } /* Convert a vdev path to a GUID. Returns GUID or 0 on error. */ @@ -3029,31 +3263,31 @@ zpool_vdev_online(zpool_handle_t *zhp, const char *path, int flags, vdev_state_t *newstate) { zfs_cmd_t zc = {"\0"}; - char msg[1024]; - char *pathname; + char errbuf[ERRBUFLEN]; nvlist_t *tgt; boolean_t avail_spare, l2cache, islog; libzfs_handle_t *hdl = zhp->zpool_hdl; - int error; if (flags & ZFS_ONLINE_EXPAND) { - (void) snprintf(msg, sizeof (msg), + (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot expand %s"), path); } else { - (void) snprintf(msg, sizeof (msg), + (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot online %s"), path); } (void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name)); if ((tgt = zpool_find_vdev(zhp, path, &avail_spare, &l2cache, &islog)) == NULL) - return (zfs_error(hdl, EZFS_NODEVICE, msg)); + return (zfs_error(hdl, EZFS_NODEVICE, errbuf)); - verify(nvlist_lookup_uint64(tgt, ZPOOL_CONFIG_GUID, &zc.zc_guid) == 0); + zc.zc_guid = fnvlist_lookup_uint64(tgt, ZPOOL_CONFIG_GUID); - if (avail_spare) - return (zfs_error(hdl, EZFS_ISSPARE, msg)); + if (!(flags & ZFS_ONLINE_SPARE) && avail_spare) + return (zfs_error(hdl, EZFS_ISSPARE, errbuf)); +#ifndef __FreeBSD__ + const char *pathname; if ((flags & ZFS_ONLINE_EXPAND || zpool_get_prop_int(zhp, ZPOOL_PROP_AUTOEXPAND, NULL)) && nvlist_lookup_string(tgt, ZPOOL_CONFIG_PATH, &pathname) == 0) { @@ -3068,28 +3302,30 @@ zpool_vdev_online(zpool_handle_t *zhp, const char *path, int flags, if (l2cache) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "cannot expand cache devices")); - return (zfs_error(hdl, EZFS_VDEVNOTSUP, msg)); + return (zfs_error(hdl, EZFS_VDEVNOTSUP, errbuf)); } if (wholedisk) { const char *fullpath = path; char buf[MAXPATHLEN]; + int error; if (path[0] != '/') { error = zfs_resolve_shortname(path, buf, sizeof (buf)); if (error != 0) return (zfs_error(hdl, EZFS_NODEVICE, - msg)); + errbuf)); fullpath = buf; } - error = zpool_relabel_disk(hdl, fullpath, msg); + error = zpool_relabel_disk(hdl, fullpath, errbuf); if (error != 0) return (error); } } +#endif zc.zc_cookie = VDEV_STATE_ONLINE; zc.zc_obj = flags; @@ -3099,9 +3335,9 @@ zpool_vdev_online(zpool_handle_t *zhp, const char *path, int flags, zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "was split " "from this pool into a new one. Use '%s' " "instead"), "zpool detach"); - return (zfs_error(hdl, EZFS_POSTSPLIT_ONLINE, msg)); + return (zfs_error(hdl, EZFS_POSTSPLIT_ONLINE, errbuf)); } - return (zpool_standard_error(hdl, errno, msg)); + return (zpool_standard_error(hdl, errno, errbuf)); } *newstate = zc.zc_cookie; @@ -3115,23 +3351,23 @@ int zpool_vdev_offline(zpool_handle_t *zhp, const char *path, boolean_t istmp) { zfs_cmd_t zc = {"\0"}; - char msg[1024]; + char errbuf[ERRBUFLEN]; nvlist_t *tgt; boolean_t avail_spare, l2cache; libzfs_handle_t *hdl = zhp->zpool_hdl; - (void) snprintf(msg, sizeof (msg), + (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot offline %s"), path); (void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name)); if ((tgt = zpool_find_vdev(zhp, path, &avail_spare, &l2cache, NULL)) == NULL) - return (zfs_error(hdl, EZFS_NODEVICE, msg)); + return (zfs_error(hdl, EZFS_NODEVICE, errbuf)); - verify(nvlist_lookup_uint64(tgt, ZPOOL_CONFIG_GUID, &zc.zc_guid) == 0); + zc.zc_guid = fnvlist_lookup_uint64(tgt, ZPOOL_CONFIG_GUID); if (avail_spare) - return (zfs_error(hdl, EZFS_ISSPARE, msg)); + return (zfs_error(hdl, EZFS_ISSPARE, errbuf)); zc.zc_cookie = VDEV_STATE_OFFLINE; zc.zc_obj = istmp ? ZFS_OFFLINE_TEMPORARY : 0; @@ -3145,30 +3381,64 @@ zpool_vdev_offline(zpool_handle_t *zhp, const char *path, boolean_t istmp) /* * There are no other replicas of this device. */ - return (zfs_error(hdl, EZFS_NOREPLICAS, msg)); + return (zfs_error(hdl, EZFS_NOREPLICAS, errbuf)); case EEXIST: /* * The log device has unplayed logs */ - return (zfs_error(hdl, EZFS_UNPLAYED_LOGS, msg)); + return (zfs_error(hdl, EZFS_UNPLAYED_LOGS, errbuf)); default: - return (zpool_standard_error(hdl, errno, msg)); + return (zpool_standard_error(hdl, errno, errbuf)); } } /* + * Remove the specified vdev asynchronously from the configuration, so + * that it may come ONLINE if reinserted. This is called from zed on + * Udev remove event. + * Note: We also have a similar function zpool_vdev_remove() that + * removes the vdev from the pool. + */ +int +zpool_vdev_remove_wanted(zpool_handle_t *zhp, const char *path) +{ + zfs_cmd_t zc = {"\0"}; + char errbuf[ERRBUFLEN]; + nvlist_t *tgt; + boolean_t avail_spare, l2cache; + libzfs_handle_t *hdl = zhp->zpool_hdl; + + (void) snprintf(errbuf, sizeof (errbuf), + dgettext(TEXT_DOMAIN, "cannot remove %s"), path); + + (void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name)); + if ((tgt = zpool_find_vdev(zhp, path, &avail_spare, &l2cache, + NULL)) == NULL) + return (zfs_error(hdl, EZFS_NODEVICE, errbuf)); + + zc.zc_guid = fnvlist_lookup_uint64(tgt, ZPOOL_CONFIG_GUID); + + zc.zc_cookie = VDEV_STATE_REMOVED; + + if (zfs_ioctl(hdl, ZFS_IOC_VDEV_SET_STATE, &zc) == 0) + return (0); + + return (zpool_standard_error(hdl, errno, errbuf)); +} + +/* * Mark the given vdev faulted. */ int zpool_vdev_fault(zpool_handle_t *zhp, uint64_t guid, vdev_aux_t aux) { zfs_cmd_t zc = {"\0"}; - char msg[1024]; + char errbuf[ERRBUFLEN]; libzfs_handle_t *hdl = zhp->zpool_hdl; - (void) snprintf(msg, sizeof (msg), + (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot fault %llu"), (u_longlong_t)guid); (void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name)); @@ -3185,36 +3455,59 @@ zpool_vdev_fault(zpool_handle_t *zhp, uint64_t guid, vdev_aux_t aux) /* * There are no other replicas of this device. */ - return (zfs_error(hdl, EZFS_NOREPLICAS, msg)); + return (zfs_error(hdl, EZFS_NOREPLICAS, errbuf)); default: - return (zpool_standard_error(hdl, errno, msg)); + return (zpool_standard_error(hdl, errno, errbuf)); } } /* - * Mark the given vdev degraded. + * Generic set vdev state function */ -int -zpool_vdev_degrade(zpool_handle_t *zhp, uint64_t guid, vdev_aux_t aux) +static int +zpool_vdev_set_state(zpool_handle_t *zhp, uint64_t guid, vdev_aux_t aux, + vdev_state_t state) { zfs_cmd_t zc = {"\0"}; - char msg[1024]; + char errbuf[ERRBUFLEN]; libzfs_handle_t *hdl = zhp->zpool_hdl; - (void) snprintf(msg, sizeof (msg), - dgettext(TEXT_DOMAIN, "cannot degrade %llu"), (u_longlong_t)guid); + (void) snprintf(errbuf, sizeof (errbuf), + dgettext(TEXT_DOMAIN, "cannot set %s %llu"), + zpool_state_to_name(state, aux), (u_longlong_t)guid); (void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name)); zc.zc_guid = guid; - zc.zc_cookie = VDEV_STATE_DEGRADED; + zc.zc_cookie = state; zc.zc_obj = aux; if (zfs_ioctl(hdl, ZFS_IOC_VDEV_SET_STATE, &zc) == 0) return (0); - return (zpool_standard_error(hdl, errno, msg)); + return (zpool_standard_error(hdl, errno, errbuf)); +} + +/* + * Mark the given vdev degraded. + */ +int +zpool_vdev_degrade(zpool_handle_t *zhp, uint64_t guid, vdev_aux_t aux) +{ + return (zpool_vdev_set_state(zhp, guid, aux, VDEV_STATE_DEGRADED)); +} + +/* + * Mark the given vdev as in a removed state (as if the device does not exist). + * + * This is different than zpool_vdev_remove() which does a removal of a device + * from the pool (but the device does exist). + */ +int +zpool_vdev_set_removed_state(zpool_handle_t *zhp, uint64_t guid, vdev_aux_t aux) +{ + return (zpool_vdev_set_state(zhp, guid, aux, VDEV_STATE_REMOVED)); } /* @@ -3226,13 +3519,11 @@ is_replacing_spare(nvlist_t *search, nvlist_t *tgt, int which) { nvlist_t **child; uint_t c, children; - char *type; if (nvlist_lookup_nvlist_array(search, ZPOOL_CONFIG_CHILDREN, &child, &children) == 0) { - verify(nvlist_lookup_string(search, ZPOOL_CONFIG_TYPE, - &type) == 0); - + const char *type = fnvlist_lookup_string(search, + ZPOOL_CONFIG_TYPE); if ((strcmp(type, VDEV_TYPE_SPARE) == 0 || strcmp(type, VDEV_TYPE_DRAID_SPARE) == 0) && children == 2 && child[which] == tgt) @@ -3255,36 +3546,37 @@ zpool_vdev_attach(zpool_handle_t *zhp, const char *old_disk, const char *new_disk, nvlist_t *nvroot, int replacing, boolean_t rebuild) { zfs_cmd_t zc = {"\0"}; - char msg[1024]; + char errbuf[ERRBUFLEN]; int ret; nvlist_t *tgt; boolean_t avail_spare, l2cache, islog; uint64_t val; char *newname; + const char *type; nvlist_t **child; uint_t children; nvlist_t *config_root; libzfs_handle_t *hdl = zhp->zpool_hdl; if (replacing) - (void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN, + (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot replace %s with %s"), old_disk, new_disk); else - (void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN, + (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot attach %s to %s"), new_disk, old_disk); (void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name)); if ((tgt = zpool_find_vdev(zhp, old_disk, &avail_spare, &l2cache, &islog)) == NULL) - return (zfs_error(hdl, EZFS_NODEVICE, msg)); + return (zfs_error(hdl, EZFS_NODEVICE, errbuf)); if (avail_spare) - return (zfs_error(hdl, EZFS_ISSPARE, msg)); + return (zfs_error(hdl, EZFS_ISSPARE, errbuf)); if (l2cache) - return (zfs_error(hdl, EZFS_ISL2CACHE, msg)); + return (zfs_error(hdl, EZFS_ISL2CACHE, errbuf)); - verify(nvlist_lookup_uint64(tgt, ZPOOL_CONFIG_GUID, &zc.zc_guid) == 0); + zc.zc_guid = fnvlist_lookup_uint64(tgt, ZPOOL_CONFIG_GUID); zc.zc_cookie = replacing; zc.zc_simple = rebuild; @@ -3292,18 +3584,26 @@ zpool_vdev_attach(zpool_handle_t *zhp, const char *old_disk, zfeature_lookup_guid("org.openzfs:device_rebuild", NULL) != 0) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "the loaded zfs module doesn't support device rebuilds")); - return (zfs_error(hdl, EZFS_POOL_NOTSUP, msg)); + return (zfs_error(hdl, EZFS_POOL_NOTSUP, errbuf)); + } + + type = fnvlist_lookup_string(tgt, ZPOOL_CONFIG_TYPE); + if (strcmp(type, VDEV_TYPE_RAIDZ) == 0 && + zfeature_lookup_guid("org.openzfs:raidz_expansion", NULL) != 0) { + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "the loaded zfs module doesn't support raidz expansion")); + return (zfs_error(hdl, EZFS_POOL_NOTSUP, errbuf)); } if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_CHILDREN, &child, &children) != 0 || children != 1) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "new device must be a single disk")); - return (zfs_error(hdl, EZFS_INVALCONFIG, msg)); + return (zfs_error(hdl, EZFS_INVALCONFIG, errbuf)); } - verify(nvlist_lookup_nvlist(zpool_get_config(zhp, NULL), - ZPOOL_CONFIG_VDEV_TREE, &config_root) == 0); + config_root = fnvlist_lookup_nvlist(zpool_get_config(zhp, NULL), + ZPOOL_CONFIG_VDEV_TREE); if ((newname = zpool_vdev_name(NULL, NULL, child[0], 0)) == NULL) return (-1); @@ -3320,13 +3620,12 @@ zpool_vdev_attach(zpool_handle_t *zhp, const char *old_disk, zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "can only be replaced by another hot spare")); free(newname); - return (zfs_error(hdl, EZFS_BADTARGET, msg)); + return (zfs_error(hdl, EZFS_BADTARGET, errbuf)); } free(newname); - if (zcmd_write_conf_nvlist(hdl, &zc, nvroot) != 0) - return (-1); + zcmd_write_conf_nvlist(hdl, &zc, nvroot); ret = zfs_ioctl(hdl, ZFS_IOC_VDEV_ATTACH, &zc); @@ -3363,6 +3662,10 @@ zpool_vdev_attach(zpool_handle_t *zhp, const char *old_disk, zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "cannot replace a replacing device")); } + } else if (strcmp(type, VDEV_TYPE_RAIDZ) == 0) { + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "raidz_expansion feature must be enabled " + "in order to attach a device to raidz")); } else { char status[64] = {0}; zpool_prop_get_feature(zhp, @@ -3379,7 +3682,7 @@ zpool_vdev_attach(zpool_handle_t *zhp, const char *old_disk, "disks")); } } - (void) zfs_error(hdl, EZFS_BADTARGET, msg); + (void) zfs_error(hdl, EZFS_BADTARGET, errbuf); break; case EINVAL: @@ -3388,14 +3691,13 @@ zpool_vdev_attach(zpool_handle_t *zhp, const char *old_disk, */ zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "new device must be a single disk")); - (void) zfs_error(hdl, EZFS_INVALCONFIG, msg); + (void) zfs_error(hdl, EZFS_INVALCONFIG, errbuf); break; case EBUSY: - zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "%s is busy, " - "or device removal is in progress"), + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "%s is busy"), new_disk); - (void) zfs_error(hdl, EZFS_BADDEV, msg); + (void) zfs_error(hdl, EZFS_BADDEV, errbuf); break; case EOVERFLOW: @@ -3404,7 +3706,7 @@ zpool_vdev_attach(zpool_handle_t *zhp, const char *old_disk, */ zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "device is too small")); - (void) zfs_error(hdl, EZFS_BADDEV, msg); + (void) zfs_error(hdl, EZFS_BADDEV, errbuf); break; case EDOM: @@ -3414,18 +3716,53 @@ zpool_vdev_attach(zpool_handle_t *zhp, const char *old_disk, zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "new device has a different optimal sector size; use the " "option '-o ashift=N' to override the optimal size")); - (void) zfs_error(hdl, EZFS_BADDEV, msg); + (void) zfs_error(hdl, EZFS_BADDEV, errbuf); break; case ENAMETOOLONG: /* * The resulting top-level vdev spec won't fit in the label. */ - (void) zfs_error(hdl, EZFS_DEVOVERFLOW, msg); + (void) zfs_error(hdl, EZFS_DEVOVERFLOW, errbuf); break; + case ENXIO: + /* + * The existing raidz vdev has offline children + */ + if (strcmp(type, VDEV_TYPE_RAIDZ) == 0) { + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "raidz vdev has devices that are are offline or " + "being replaced")); + (void) zfs_error(hdl, EZFS_BADDEV, errbuf); + break; + } else { + (void) zpool_standard_error(hdl, errno, errbuf); + } + break; + + case EADDRINUSE: + /* + * The boot reserved area is already being used (FreeBSD) + */ + if (strcmp(type, VDEV_TYPE_RAIDZ) == 0) { + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "the reserved boot area needed for the expansion " + "is already being used by a boot loader")); + (void) zfs_error(hdl, EZFS_BADDEV, errbuf); + } else { + (void) zpool_standard_error(hdl, errno, errbuf); + } + break; + + case ZFS_ERR_ASHIFT_MISMATCH: + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "The new device cannot have a higher alignment requirement " + "than the top-level vdev.")); + (void) zfs_error(hdl, EZFS_BADTARGET, errbuf); + break; default: - (void) zpool_standard_error(hdl, errno, msg); + (void) zpool_standard_error(hdl, errno, errbuf); } return (-1); @@ -3438,26 +3775,26 @@ int zpool_vdev_detach(zpool_handle_t *zhp, const char *path) { zfs_cmd_t zc = {"\0"}; - char msg[1024]; + char errbuf[ERRBUFLEN]; nvlist_t *tgt; boolean_t avail_spare, l2cache; libzfs_handle_t *hdl = zhp->zpool_hdl; - (void) snprintf(msg, sizeof (msg), + (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot detach %s"), path); (void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name)); if ((tgt = zpool_find_vdev(zhp, path, &avail_spare, &l2cache, NULL)) == NULL) - return (zfs_error(hdl, EZFS_NODEVICE, msg)); + return (zfs_error(hdl, EZFS_NODEVICE, errbuf)); if (avail_spare) - return (zfs_error(hdl, EZFS_ISSPARE, msg)); + return (zfs_error(hdl, EZFS_ISSPARE, errbuf)); if (l2cache) - return (zfs_error(hdl, EZFS_ISL2CACHE, msg)); + return (zfs_error(hdl, EZFS_ISL2CACHE, errbuf)); - verify(nvlist_lookup_uint64(tgt, ZPOOL_CONFIG_GUID, &zc.zc_guid) == 0); + zc.zc_guid = fnvlist_lookup_uint64(tgt, ZPOOL_CONFIG_GUID); if (zfs_ioctl(hdl, ZFS_IOC_VDEV_DETACH, &zc) == 0) return (0); @@ -3470,18 +3807,18 @@ zpool_vdev_detach(zpool_handle_t *zhp, const char *path) */ zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "only " "applicable to mirror and replacing vdevs")); - (void) zfs_error(hdl, EZFS_BADTARGET, msg); + (void) zfs_error(hdl, EZFS_BADTARGET, errbuf); break; case EBUSY: /* * There are no other replicas of this device. */ - (void) zfs_error(hdl, EZFS_NOREPLICAS, msg); + (void) zfs_error(hdl, EZFS_NOREPLICAS, errbuf); break; default: - (void) zpool_standard_error(hdl, errno, msg); + (void) zpool_standard_error(hdl, errno, errbuf); } return (-1); @@ -3536,7 +3873,8 @@ zpool_vdev_split(zpool_handle_t *zhp, char *newname, nvlist_t **newroot, nvlist_t *props, splitflags_t flags) { zfs_cmd_t zc = {"\0"}; - char msg[1024], *bias; + char errbuf[ERRBUFLEN]; + const char *bias; nvlist_t *tree, *config, **child, **newchild, *newconfig = NULL; nvlist_t **varray = NULL, *zc_props = NULL; uint_t c, children, newchildren, lastlog = 0, vcount, found = 0; @@ -3545,11 +3883,11 @@ zpool_vdev_split(zpool_handle_t *zhp, char *newname, nvlist_t **newroot, boolean_t freelist = B_FALSE, memory_err = B_TRUE; int retval = 0; - (void) snprintf(msg, sizeof (msg), + (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "Unable to split %s"), zhp->zpool_name); if (!zpool_name_valid(hdl, B_FALSE, newname)) - return (zfs_error(hdl, EZFS_INVALIDNAME, msg)); + return (zfs_error(hdl, EZFS_INVALIDNAME, errbuf)); if ((config = zpool_get_config(zhp, NULL)) == NULL) { (void) fprintf(stderr, gettext("Internal error: unable to " @@ -3557,14 +3895,13 @@ zpool_vdev_split(zpool_handle_t *zhp, char *newname, nvlist_t **newroot, return (-1); } - verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, &tree) - == 0); - verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION, &vers) == 0); + tree = fnvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE); + vers = fnvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION); if (props) { prop_flags_t flags = { .create = B_FALSE, .import = B_TRUE }; if ((zc_props = zpool_valid_proplist(hdl, zhp->zpool_name, - props, vers, flags, msg)) == NULL) + props, vers, flags, errbuf)) == NULL) return (-1); (void) nvlist_lookup_uint64(zc_props, zpool_prop_to_name(ZPOOL_PROP_READONLY), &readonly); @@ -3595,7 +3932,7 @@ zpool_vdev_split(zpool_handle_t *zhp, char *newname, nvlist_t **newroot, for (c = 0; c < children; c++) { uint64_t is_log = B_FALSE, is_hole = B_FALSE; boolean_t is_special = B_FALSE, is_dedup = B_FALSE; - char *type; + const char *type; nvlist_t **mchild, *vdev; uint_t mchildren; int entry; @@ -3626,8 +3963,7 @@ zpool_vdev_split(zpool_handle_t *zhp, char *newname, nvlist_t **newroot, continue; } lastlog = 0; - verify(nvlist_lookup_string(child[c], ZPOOL_CONFIG_TYPE, &type) - == 0); + type = fnvlist_lookup_string(child[c], ZPOOL_CONFIG_TYPE); if (strcmp(type, VDEV_TYPE_INDIRECT) == 0) { vdev = child[c]; @@ -3637,7 +3973,7 @@ zpool_vdev_split(zpool_handle_t *zhp, char *newname, nvlist_t **newroot, } else if (strcmp(type, VDEV_TYPE_MIRROR) != 0) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "Source pool must be composed only of mirrors\n")); - retval = zfs_error(hdl, EZFS_INVALCONFIG, msg); + retval = zfs_error(hdl, EZFS_INVALCONFIG, errbuf); goto out; } @@ -3685,7 +4021,7 @@ zpool_vdev_split(zpool_handle_t *zhp, char *newname, nvlist_t **newroot, if (found != newchildren) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "Device list must " "include at most one disk from each mirror")); - retval = zfs_error(hdl, EZFS_INVALCONFIG, msg); + retval = zfs_error(hdl, EZFS_INVALCONFIG, errbuf); goto out; } @@ -3702,8 +4038,8 @@ zpool_vdev_split(zpool_handle_t *zhp, char *newname, nvlist_t **newroot, } /* Add all the children we found */ - if (nvlist_add_nvlist_array(*newroot, ZPOOL_CONFIG_CHILDREN, varray, - lastlog == 0 ? vcount : lastlog) != 0) + if (nvlist_add_nvlist_array(*newroot, ZPOOL_CONFIG_CHILDREN, + (const nvlist_t **)varray, lastlog == 0 ? vcount : lastlog) != 0) goto out; /* @@ -3734,13 +4070,12 @@ zpool_vdev_split(zpool_handle_t *zhp, char *newname, nvlist_t **newroot, zc.zc_cookie = ZPOOL_EXPORT_AFTER_SPLIT; (void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name)); (void) strlcpy(zc.zc_string, newname, sizeof (zc.zc_string)); - if (zcmd_write_conf_nvlist(hdl, &zc, newconfig) != 0) - goto out; - if (zc_props != NULL && zcmd_write_src_nvlist(hdl, &zc, zc_props) != 0) - goto out; + zcmd_write_conf_nvlist(hdl, &zc, newconfig); + if (zc_props != NULL) + zcmd_write_src_nvlist(hdl, &zc, zc_props); if (zfs_ioctl(hdl, ZFS_IOC_VDEV_SPLIT, &zc) != 0) { - retval = zpool_standard_error(hdl, errno, msg); + retval = zpool_standard_error(hdl, errno, errbuf); goto out; } @@ -3779,31 +4114,31 @@ int zpool_vdev_remove(zpool_handle_t *zhp, const char *path) { zfs_cmd_t zc = {"\0"}; - char msg[1024]; + char errbuf[ERRBUFLEN]; nvlist_t *tgt; boolean_t avail_spare, l2cache, islog; libzfs_handle_t *hdl = zhp->zpool_hdl; uint64_t version; - (void) snprintf(msg, sizeof (msg), + (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot remove %s"), path); if (zpool_is_draid_spare(path)) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "dRAID spares cannot be removed")); - return (zfs_error(hdl, EZFS_NODEVICE, msg)); + return (zfs_error(hdl, EZFS_NODEVICE, errbuf)); } (void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name)); if ((tgt = zpool_find_vdev(zhp, path, &avail_spare, &l2cache, &islog)) == NULL) - return (zfs_error(hdl, EZFS_NODEVICE, msg)); + return (zfs_error(hdl, EZFS_NODEVICE, errbuf)); version = zpool_get_prop_int(zhp, ZPOOL_PROP_VERSION, NULL); if (islog && version < SPA_VERSION_HOLES) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "pool must be upgraded to support log removal")); - return (zfs_error(hdl, EZFS_BADVERSION, msg)); + return (zfs_error(hdl, EZFS_BADVERSION, errbuf)); } zc.zc_guid = fnvlist_lookup_uint64(tgt, ZPOOL_CONFIG_GUID); @@ -3813,11 +4148,17 @@ zpool_vdev_remove(zpool_handle_t *zhp, const char *path) switch (errno) { + case EALREADY: + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "removal for this vdev is already in progress.")); + (void) zfs_error(hdl, EZFS_BUSY, errbuf); + break; + case EINVAL: zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "invalid config; all top-level vdevs must " "have the same sector size and not be raidz.")); - (void) zfs_error(hdl, EZFS_INVALCONFIG, msg); + (void) zfs_error(hdl, EZFS_INVALCONFIG, errbuf); break; case EBUSY: @@ -3828,21 +4169,21 @@ zpool_vdev_remove(zpool_handle_t *zhp, const char *path) zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "Pool busy; removal may already be in progress")); } - (void) zfs_error(hdl, EZFS_BUSY, msg); + (void) zfs_error(hdl, EZFS_BUSY, errbuf); break; case EACCES: if (islog) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "Mount encrypted datasets to replay logs.")); - (void) zfs_error(hdl, EZFS_BUSY, msg); + (void) zfs_error(hdl, EZFS_BUSY, errbuf); } else { - (void) zpool_standard_error(hdl, errno, msg); + (void) zpool_standard_error(hdl, errno, errbuf); } break; default: - (void) zpool_standard_error(hdl, errno, msg); + (void) zpool_standard_error(hdl, errno, errbuf); } return (-1); } @@ -3850,39 +4191,38 @@ zpool_vdev_remove(zpool_handle_t *zhp, const char *path) int zpool_vdev_remove_cancel(zpool_handle_t *zhp) { - zfs_cmd_t zc; - char msg[1024]; + zfs_cmd_t zc = {{0}}; + char errbuf[ERRBUFLEN]; libzfs_handle_t *hdl = zhp->zpool_hdl; - (void) snprintf(msg, sizeof (msg), + (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot cancel removal")); - bzero(&zc, sizeof (zc)); (void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name)); zc.zc_cookie = 1; if (zfs_ioctl(hdl, ZFS_IOC_VDEV_REMOVE, &zc) == 0) return (0); - return (zpool_standard_error(hdl, errno, msg)); + return (zpool_standard_error(hdl, errno, errbuf)); } int zpool_vdev_indirect_size(zpool_handle_t *zhp, const char *path, uint64_t *sizep) { - char msg[1024]; + char errbuf[ERRBUFLEN]; nvlist_t *tgt; boolean_t avail_spare, l2cache, islog; libzfs_handle_t *hdl = zhp->zpool_hdl; - (void) snprintf(msg, sizeof (msg), + (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot determine indirect size of %s"), path); if ((tgt = zpool_find_vdev(zhp, path, &avail_spare, &l2cache, &islog)) == NULL) - return (zfs_error(hdl, EZFS_NODEVICE, msg)); + return (zfs_error(hdl, EZFS_NODEVICE, errbuf)); if (avail_spare || l2cache || islog) { *sizep = 0; @@ -3892,7 +4232,7 @@ zpool_vdev_indirect_size(zpool_handle_t *zhp, const char *path, if (nvlist_lookup_uint64(tgt, ZPOOL_CONFIG_INDIRECT_SIZE, sizep) != 0) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "indirect size not available")); - return (zfs_error(hdl, EINVAL, msg)); + return (zfs_error(hdl, EINVAL, errbuf)); } return (0); } @@ -3904,7 +4244,7 @@ int zpool_clear(zpool_handle_t *zhp, const char *path, nvlist_t *rewindnvl) { zfs_cmd_t zc = {"\0"}; - char msg[1024]; + char errbuf[ERRBUFLEN]; nvlist_t *tgt; zpool_load_policy_t policy; boolean_t avail_spare, l2cache; @@ -3913,11 +4253,11 @@ zpool_clear(zpool_handle_t *zhp, const char *path, nvlist_t *rewindnvl) int error; if (path) - (void) snprintf(msg, sizeof (msg), + (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot clear errors for %s"), path); else - (void) snprintf(msg, sizeof (msg), + (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot clear errors for %s"), zhp->zpool_name); @@ -3925,35 +4265,27 @@ zpool_clear(zpool_handle_t *zhp, const char *path, nvlist_t *rewindnvl) if (path) { if ((tgt = zpool_find_vdev(zhp, path, &avail_spare, &l2cache, NULL)) == NULL) - return (zfs_error(hdl, EZFS_NODEVICE, msg)); + return (zfs_error(hdl, EZFS_NODEVICE, errbuf)); /* * Don't allow error clearing for hot spares. Do allow * error clearing for l2cache devices. */ if (avail_spare) - return (zfs_error(hdl, EZFS_ISSPARE, msg)); + return (zfs_error(hdl, EZFS_ISSPARE, errbuf)); - verify(nvlist_lookup_uint64(tgt, ZPOOL_CONFIG_GUID, - &zc.zc_guid) == 0); + zc.zc_guid = fnvlist_lookup_uint64(tgt, ZPOOL_CONFIG_GUID); } zpool_get_load_policy(rewindnvl, &policy); zc.zc_cookie = policy.zlp_rewind; - if (zcmd_alloc_dst_nvlist(hdl, &zc, zhp->zpool_config_size * 2) != 0) - return (-1); - - if (zcmd_write_src_nvlist(hdl, &zc, rewindnvl) != 0) - return (-1); + zcmd_alloc_dst_nvlist(hdl, &zc, zhp->zpool_config_size * 2); + zcmd_write_src_nvlist(hdl, &zc, rewindnvl); while ((error = zfs_ioctl(hdl, ZFS_IOC_CLEAR, &zc)) != 0 && - errno == ENOMEM) { - if (zcmd_expand_dst_nvlist(hdl, &zc) != 0) { - zcmd_free_nvlists(&zc); - return (-1); - } - } + errno == ENOMEM) + zcmd_expand_dst_nvlist(hdl, &zc); if (!error || ((policy.zlp_rewind & ZPOOL_TRY_REWIND) && errno != EPERM && errno != EACCES)) { @@ -3970,7 +4302,7 @@ zpool_clear(zpool_handle_t *zhp, const char *path, nvlist_t *rewindnvl) } zcmd_free_nvlists(&zc); - return (zpool_standard_error(hdl, errno, msg)); + return (zpool_standard_error(hdl, errno, errbuf)); } /* @@ -3980,10 +4312,10 @@ int zpool_vdev_clear(zpool_handle_t *zhp, uint64_t guid) { zfs_cmd_t zc = {"\0"}; - char msg[1024]; + char errbuf[ERRBUFLEN]; libzfs_handle_t *hdl = zhp->zpool_hdl; - (void) snprintf(msg, sizeof (msg), + (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot clear errors for %llx"), (u_longlong_t)guid); @@ -3994,27 +4326,60 @@ zpool_vdev_clear(zpool_handle_t *zhp, uint64_t guid) if (zfs_ioctl(hdl, ZFS_IOC_CLEAR, &zc) == 0) return (0); - return (zpool_standard_error(hdl, errno, msg)); + return (zpool_standard_error(hdl, errno, errbuf)); } /* * Change the GUID for a pool. + * + * Similar to zpool_reguid(), but may take a GUID. + * + * If the guid argument is NULL, then no GUID is passed in the nvlist to the + * ioctl(). */ int -zpool_reguid(zpool_handle_t *zhp) +zpool_set_guid(zpool_handle_t *zhp, const uint64_t *guid) { - char msg[1024]; + char errbuf[ERRBUFLEN]; libzfs_handle_t *hdl = zhp->zpool_hdl; + nvlist_t *nvl = NULL; zfs_cmd_t zc = {"\0"}; + int error = -1; + + if (guid != NULL) { + if (nvlist_alloc(&nvl, NV_UNIQUE_NAME, 0) != 0) + return (no_memory(hdl)); + + if (nvlist_add_uint64(nvl, ZPOOL_REGUID_GUID, *guid) != 0) { + nvlist_free(nvl); + return (no_memory(hdl)); + } + + zcmd_write_src_nvlist(hdl, &zc, nvl); + } - (void) snprintf(msg, sizeof (msg), + (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot reguid '%s'"), zhp->zpool_name); (void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name)); - if (zfs_ioctl(hdl, ZFS_IOC_POOL_REGUID, &zc) == 0) - return (0); + error = zfs_ioctl(hdl, ZFS_IOC_POOL_REGUID, &zc); + if (error) { + return (zpool_standard_error(hdl, errno, errbuf)); + } + if (guid != NULL) { + zcmd_free_nvlists(&zc); + nvlist_free(nvl); + } + return (0); +} - return (zpool_standard_error(hdl, errno, msg)); +/* + * Change the GUID for a pool. + */ +int +zpool_reguid(zpool_handle_t *zhp) +{ + return (zpool_set_guid(zhp, NULL)); } /* @@ -4079,32 +4444,25 @@ char * zpool_vdev_name(libzfs_handle_t *hdl, zpool_handle_t *zhp, nvlist_t *nv, int name_flags) { - char *path, *type, *env; + const char *type, *tpath; + const char *path; uint64_t value; char buf[PATH_BUF_LEN]; - char tmpbuf[PATH_BUF_LEN]; + char tmpbuf[PATH_BUF_LEN * 2]; /* * vdev_name will be "root"/"root-0" for the root vdev, but it is the * zpool name that will be displayed to the user. */ - verify(nvlist_lookup_string(nv, ZPOOL_CONFIG_TYPE, &type) == 0); + type = fnvlist_lookup_string(nv, ZPOOL_CONFIG_TYPE); if (zhp != NULL && strcmp(type, "root") == 0) return (zfs_strdup(hdl, zpool_get_name(zhp))); - env = getenv("ZPOOL_VDEV_NAME_PATH"); - if (env && (strtoul(env, NULL, 0) > 0 || - !strncasecmp(env, "YES", 3) || !strncasecmp(env, "ON", 2))) + if (libzfs_envvar_is_set("ZPOOL_VDEV_NAME_PATH")) name_flags |= VDEV_NAME_PATH; - - env = getenv("ZPOOL_VDEV_NAME_GUID"); - if (env && (strtoul(env, NULL, 0) > 0 || - !strncasecmp(env, "YES", 3) || !strncasecmp(env, "ON", 2))) + if (libzfs_envvar_is_set("ZPOOL_VDEV_NAME_GUID")) name_flags |= VDEV_NAME_GUID; - - env = getenv("ZPOOL_VDEV_NAME_FOLLOW_LINKS"); - if (env && (strtoul(env, NULL, 0) > 0 || - !strncasecmp(env, "YES", 3) || !strncasecmp(env, "ON", 2))) + if (libzfs_envvar_is_set("ZPOOL_VDEV_NAME_FOLLOW_LINKS")) name_flags |= VDEV_NAME_FOLLOW_LINKS; if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NOT_PRESENT, &value) == 0 || @@ -4112,7 +4470,9 @@ zpool_vdev_name(libzfs_handle_t *hdl, zpool_handle_t *zhp, nvlist_t *nv, (void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID, &value); (void) snprintf(buf, sizeof (buf), "%llu", (u_longlong_t)value); path = buf; - } else if (nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0) { + } else if (nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &tpath) == 0) { + path = tpath; + if (name_flags & VDEV_NAME_FOLLOW_LINKS) { char *rp = realpath(path, NULL); if (rp) { @@ -4145,8 +4505,7 @@ zpool_vdev_name(libzfs_handle_t *hdl, zpool_handle_t *zhp, nvlist_t *nv, * If it's a raidz device, we need to stick in the parity level. */ if (strcmp(path, VDEV_TYPE_RAIDZ) == 0) { - verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NPARITY, - &value) == 0); + value = fnvlist_lookup_uint64(nv, ZPOOL_CONFIG_NPARITY); (void) snprintf(buf, sizeof (buf), "%s%llu", path, (u_longlong_t)value); path = buf; @@ -4162,12 +4521,12 @@ zpool_vdev_name(libzfs_handle_t *hdl, zpool_handle_t *zhp, nvlist_t *nv, verify(nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN, &child, &children) == 0); - verify(nvlist_lookup_uint64(nv, - ZPOOL_CONFIG_NPARITY, &nparity) == 0); - verify(nvlist_lookup_uint64(nv, - ZPOOL_CONFIG_DRAID_NDATA, &ndata) == 0); - verify(nvlist_lookup_uint64(nv, - ZPOOL_CONFIG_DRAID_NSPARES, &nspares) == 0); + nparity = fnvlist_lookup_uint64(nv, + ZPOOL_CONFIG_NPARITY); + ndata = fnvlist_lookup_uint64(nv, + ZPOOL_CONFIG_DRAID_NDATA); + nspares = fnvlist_lookup_uint64(nv, + ZPOOL_CONFIG_DRAID_NSPARES); path = zpool_draid_name(buf, sizeof (buf), ndata, nparity, nspares, children); @@ -4178,9 +4537,8 @@ zpool_vdev_name(libzfs_handle_t *hdl, zpool_handle_t *zhp, nvlist_t *nv, * naming convention. */ if (name_flags & VDEV_NAME_TYPE_ID) { - uint64_t id; - verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_ID, - &id) == 0); + uint64_t id = fnvlist_lookup_uint64(nv, + ZPOOL_CONFIG_ID); (void) snprintf(tmpbuf, sizeof (tmpbuf), "%s-%llu", path, (u_longlong_t)id); path = tmpbuf; @@ -4196,6 +4554,14 @@ zbookmark_mem_compare(const void *a, const void *b) return (memcmp(a, b, sizeof (zbookmark_phys_t))); } +void +zpool_add_propname(zpool_handle_t *zhp, const char *propname) +{ + assert(zhp->zpool_n_propnames < ZHP_MAX_PROPNAMES); + zhp->zpool_propnames[zhp->zpool_n_propnames] = propname; + zhp->zpool_n_propnames++; +} + /* * Retrieve the persistent error log, uniquify the members, and return to the * caller. @@ -4205,34 +4571,28 @@ zpool_get_errlog(zpool_handle_t *zhp, nvlist_t **nverrlistp) { zfs_cmd_t zc = {"\0"}; libzfs_handle_t *hdl = zhp->zpool_hdl; - uint64_t count; - zbookmark_phys_t *zb = NULL; - int i; + zbookmark_phys_t *buf; + uint64_t buflen = 10000; /* approx. 1MB of RAM */ + + if (fnvlist_lookup_uint64(zhp->zpool_config, + ZPOOL_CONFIG_ERRCOUNT) == 0) + return (0); /* - * Retrieve the raw error list from the kernel. If the number of errors - * has increased, allocate more space and continue until we get the - * entire list. + * Retrieve the raw error list from the kernel. If it doesn't fit, + * allocate a larger buffer and retry. */ - verify(nvlist_lookup_uint64(zhp->zpool_config, ZPOOL_CONFIG_ERRCOUNT, - &count) == 0); - if (count == 0) - return (0); - zc.zc_nvlist_dst = (uintptr_t)zfs_alloc(zhp->zpool_hdl, - count * sizeof (zbookmark_phys_t)); - zc.zc_nvlist_dst_size = count; (void) strcpy(zc.zc_name, zhp->zpool_name); for (;;) { + buf = zfs_alloc(zhp->zpool_hdl, + buflen * sizeof (zbookmark_phys_t)); + zc.zc_nvlist_dst = (uintptr_t)buf; + zc.zc_nvlist_dst_size = buflen; if (zfs_ioctl(zhp->zpool_hdl, ZFS_IOC_ERROR_LOG, &zc) != 0) { - free((void *)(uintptr_t)zc.zc_nvlist_dst); + free(buf); if (errno == ENOMEM) { - void *dst; - - count = zc.zc_nvlist_dst_size; - dst = zfs_alloc(zhp->zpool_hdl, count * - sizeof (zbookmark_phys_t)); - zc.zc_nvlist_dst = (uintptr_t)dst; + buflen *= 2; } else { return (zpool_standard_error_fmt(hdl, errno, dgettext(TEXT_DOMAIN, "errors: List of " @@ -4250,18 +4610,17 @@ zpool_get_errlog(zpool_handle_t *zhp, nvlist_t **nverrlistp) * _not_ copied as part of the process. So we point the start of our * array appropriate and decrement the total number of elements. */ - zb = ((zbookmark_phys_t *)(uintptr_t)zc.zc_nvlist_dst) + - zc.zc_nvlist_dst_size; - count -= zc.zc_nvlist_dst_size; + zbookmark_phys_t *zb = buf + zc.zc_nvlist_dst_size; + uint64_t zblen = buflen - zc.zc_nvlist_dst_size; - qsort(zb, count, sizeof (zbookmark_phys_t), zbookmark_mem_compare); + qsort(zb, zblen, sizeof (zbookmark_phys_t), zbookmark_mem_compare); verify(nvlist_alloc(nverrlistp, 0, KM_SLEEP) == 0); /* * Fill in the nverrlistp with nvlist's of dataset and object numbers. */ - for (i = 0; i < count; i++) { + for (uint64_t i = 0; i < zblen; i++) { nvlist_t *nv; /* ignoring zb_blkid and zb_level for now */ @@ -4288,11 +4647,11 @@ zpool_get_errlog(zpool_handle_t *zhp, nvlist_t **nverrlistp) nvlist_free(nv); } - free((void *)(uintptr_t)zc.zc_nvlist_dst); + free(buf); return (0); nomem: - free((void *)(uintptr_t)zc.zc_nvlist_dst); + free(buf); return (no_memory(zhp->zpool_hdl)); } @@ -4332,13 +4691,11 @@ zpool_log_history(libzfs_handle_t *hdl, const char *message) { zfs_cmd_t zc = {"\0"}; nvlist_t *args; - int err; args = fnvlist_alloc(); fnvlist_add_string(args, "message", message); - err = zcmd_write_src_nvlist(hdl, &zc, args); - if (err == 0) - err = zfs_ioctl(hdl, ZFS_IOC_LOG_HISTORY, &zc); + zcmd_write_src_nvlist(hdl, &zc, args); + int err = zfs_ioctl(hdl, ZFS_IOC_LOG_HISTORY, &zc); nvlist_free(args); zcmd_free_nvlists(&zc); return (err); @@ -4400,17 +4757,17 @@ int zpool_get_history(zpool_handle_t *zhp, nvlist_t **nvhisp, uint64_t *off, boolean_t *eof) { + libzfs_handle_t *hdl = zhp->zpool_hdl; char *buf; int buflen = 128 * 1024; nvlist_t **records = NULL; uint_t numrecords = 0; - int err, i; + int err = 0, i; uint64_t start = *off; - buf = malloc(buflen); - if (buf == NULL) - return (ENOMEM); - /* process about 1MB a time */ + buf = zfs_alloc(hdl, buflen); + + /* process about 1MiB a time */ while (*off - start < 1024 * 1024) { uint64_t bytes_read = buflen; uint64_t leftover; @@ -4425,8 +4782,12 @@ zpool_get_history(zpool_handle_t *zhp, nvlist_t **nvhisp, uint64_t *off, } if ((err = zpool_history_unpack(buf, bytes_read, - &leftover, &records, &numrecords)) != 0) + &leftover, &records, &numrecords)) != 0) { + zpool_standard_error_fmt(hdl, err, + dgettext(TEXT_DOMAIN, + "cannot get history for '%s'"), zhp->zpool_name); break; + } *off -= leftover; if (leftover == bytes_read) { /* @@ -4435,18 +4796,16 @@ zpool_get_history(zpool_handle_t *zhp, nvlist_t **nvhisp, uint64_t *off, */ buflen *= 2; free(buf); - buf = malloc(buflen); - if (buf == NULL) - return (ENOMEM); + buf = zfs_alloc(hdl, buflen); } } free(buf); if (!err) { - verify(nvlist_alloc(nvhisp, NV_UNIQUE_NAME, 0) == 0); - verify(nvlist_add_nvlist_array(*nvhisp, ZPOOL_HIST_RECORD, - records, numrecords) == 0); + *nvhisp = fnvlist_alloc(); + fnvlist_add_nvlist_array(*nvhisp, ZPOOL_HIST_RECORD, + (const nvlist_t **)records, numrecords); } for (i = 0; i < numrecords; i++) nvlist_free(records[i]); @@ -4480,8 +4839,7 @@ zpool_events_next(libzfs_handle_t *hdl, nvlist_t **nvp, if (flags & ZEVENT_NONBLOCK) zc.zc_guid = ZEVENT_NONBLOCK; - if (zcmd_alloc_dst_nvlist(hdl, &zc, ZEVENT_SIZE) != 0) - return (-1); + zcmd_alloc_dst_nvlist(hdl, &zc, ZEVENT_SIZE); retry: if (zfs_ioctl(hdl, ZFS_IOC_EVENTS_NEXT, &zc) != 0) { @@ -4498,13 +4856,8 @@ retry: goto out; case ENOMEM: - if (zcmd_expand_dst_nvlist(hdl, &zc) != 0) { - error = zfs_error_fmt(hdl, EZFS_NOMEM, - dgettext(TEXT_DOMAIN, "cannot get event")); - goto out; - } else { - goto retry; - } + zcmd_expand_dst_nvlist(hdl, &zc); + goto retry; default: error = zpool_standard_error_fmt(hdl, errno, dgettext(TEXT_DOMAIN, "cannot get event")); @@ -4799,8 +5152,8 @@ zpool_load_compat(const char *compat, boolean_t *features, char *report, for (uint_t i = 0; i < SPA_FEATURES; i++) features[i] = B_TRUE; - char err_badfile[1024] = ""; - char err_badtoken[1024] = ""; + char err_badfile[ZFS_MAXPROPLEN] = ""; + char err_badtoken[ZFS_MAXPROPLEN] = ""; /* * We ignore errors from the directory open() @@ -4959,3 +5312,390 @@ zpool_load_compat(const char *compat, boolean_t *features, char *report, strlcpy(report, gettext("compatibility set ok"), rlen); return (ZPOOL_COMPATIBILITY_OK); } + +static int +zpool_vdev_guid(zpool_handle_t *zhp, const char *vdevname, uint64_t *vdev_guid) +{ + nvlist_t *tgt; + boolean_t avail_spare, l2cache; + + verify(zhp != NULL); + if (zpool_get_state(zhp) == POOL_STATE_UNAVAIL) { + char errbuf[ERRBUFLEN]; + (void) snprintf(errbuf, sizeof (errbuf), + dgettext(TEXT_DOMAIN, "pool is in an unavailable state")); + return (zfs_error(zhp->zpool_hdl, EZFS_POOLUNAVAIL, errbuf)); + } + + if ((tgt = zpool_find_vdev(zhp, vdevname, &avail_spare, &l2cache, + NULL)) == NULL) { + char errbuf[ERRBUFLEN]; + (void) snprintf(errbuf, sizeof (errbuf), + dgettext(TEXT_DOMAIN, "can not find %s in %s"), + vdevname, zhp->zpool_name); + return (zfs_error(zhp->zpool_hdl, EZFS_NODEVICE, errbuf)); + } + + *vdev_guid = fnvlist_lookup_uint64(tgt, ZPOOL_CONFIG_GUID); + return (0); +} + +/* + * Get a vdev property value for 'prop' and return the value in + * a pre-allocated buffer. + */ +int +zpool_get_vdev_prop_value(nvlist_t *nvprop, vdev_prop_t prop, char *prop_name, + char *buf, size_t len, zprop_source_t *srctype, boolean_t literal) +{ + nvlist_t *nv; + const char *strval; + uint64_t intval; + zprop_source_t src = ZPROP_SRC_NONE; + + if (prop == VDEV_PROP_USERPROP) { + /* user property, prop_name must contain the property name */ + assert(prop_name != NULL); + if (nvlist_lookup_nvlist(nvprop, prop_name, &nv) == 0) { + src = fnvlist_lookup_uint64(nv, ZPROP_SOURCE); + strval = fnvlist_lookup_string(nv, ZPROP_VALUE); + } else { + /* user prop not found */ + src = ZPROP_SRC_DEFAULT; + strval = "-"; + } + (void) strlcpy(buf, strval, len); + if (srctype) + *srctype = src; + return (0); + } + + if (prop_name == NULL) + prop_name = (char *)vdev_prop_to_name(prop); + + switch (vdev_prop_get_type(prop)) { + case PROP_TYPE_STRING: + if (nvlist_lookup_nvlist(nvprop, prop_name, &nv) == 0) { + src = fnvlist_lookup_uint64(nv, ZPROP_SOURCE); + strval = fnvlist_lookup_string(nv, ZPROP_VALUE); + } else { + src = ZPROP_SRC_DEFAULT; + if ((strval = vdev_prop_default_string(prop)) == NULL) + strval = "-"; + } + (void) strlcpy(buf, strval, len); + break; + + case PROP_TYPE_NUMBER: + if (nvlist_lookup_nvlist(nvprop, prop_name, &nv) == 0) { + src = fnvlist_lookup_uint64(nv, ZPROP_SOURCE); + intval = fnvlist_lookup_uint64(nv, ZPROP_VALUE); + } else { + src = ZPROP_SRC_DEFAULT; + intval = vdev_prop_default_numeric(prop); + } + + switch (prop) { + case VDEV_PROP_ASIZE: + case VDEV_PROP_PSIZE: + case VDEV_PROP_SIZE: + case VDEV_PROP_BOOTSIZE: + case VDEV_PROP_ALLOCATED: + case VDEV_PROP_FREE: + case VDEV_PROP_READ_ERRORS: + case VDEV_PROP_WRITE_ERRORS: + case VDEV_PROP_CHECKSUM_ERRORS: + case VDEV_PROP_INITIALIZE_ERRORS: + case VDEV_PROP_TRIM_ERRORS: + case VDEV_PROP_SLOW_IOS: + case VDEV_PROP_OPS_NULL: + case VDEV_PROP_OPS_READ: + case VDEV_PROP_OPS_WRITE: + case VDEV_PROP_OPS_FREE: + case VDEV_PROP_OPS_CLAIM: + case VDEV_PROP_OPS_TRIM: + case VDEV_PROP_BYTES_NULL: + case VDEV_PROP_BYTES_READ: + case VDEV_PROP_BYTES_WRITE: + case VDEV_PROP_BYTES_FREE: + case VDEV_PROP_BYTES_CLAIM: + case VDEV_PROP_BYTES_TRIM: + if (literal) { + (void) snprintf(buf, len, "%llu", + (u_longlong_t)intval); + } else { + (void) zfs_nicenum(intval, buf, len); + } + break; + case VDEV_PROP_EXPANDSZ: + if (intval == 0) { + (void) strlcpy(buf, "-", len); + } else if (literal) { + (void) snprintf(buf, len, "%llu", + (u_longlong_t)intval); + } else { + (void) zfs_nicenum(intval, buf, len); + } + break; + case VDEV_PROP_CAPACITY: + if (literal) { + (void) snprintf(buf, len, "%llu", + (u_longlong_t)intval); + } else { + (void) snprintf(buf, len, "%llu%%", + (u_longlong_t)intval); + } + break; + case VDEV_PROP_CHECKSUM_N: + case VDEV_PROP_CHECKSUM_T: + case VDEV_PROP_IO_N: + case VDEV_PROP_IO_T: + case VDEV_PROP_SLOW_IO_N: + case VDEV_PROP_SLOW_IO_T: + if (intval == UINT64_MAX) { + (void) strlcpy(buf, "-", len); + } else { + (void) snprintf(buf, len, "%llu", + (u_longlong_t)intval); + } + break; + case VDEV_PROP_FRAGMENTATION: + if (intval == UINT64_MAX) { + (void) strlcpy(buf, "-", len); + } else { + (void) snprintf(buf, len, "%llu%%", + (u_longlong_t)intval); + } + break; + case VDEV_PROP_STATE: + if (literal) { + (void) snprintf(buf, len, "%llu", + (u_longlong_t)intval); + } else { + (void) strlcpy(buf, zpool_state_to_name(intval, + VDEV_AUX_NONE), len); + } + break; + default: + (void) snprintf(buf, len, "%llu", + (u_longlong_t)intval); + } + break; + + case PROP_TYPE_INDEX: + if (nvlist_lookup_nvlist(nvprop, prop_name, &nv) == 0) { + src = fnvlist_lookup_uint64(nv, ZPROP_SOURCE); + intval = fnvlist_lookup_uint64(nv, ZPROP_VALUE); + } else { + /* 'trim_support' only valid for leaf vdevs */ + if (prop == VDEV_PROP_TRIM_SUPPORT) { + (void) strlcpy(buf, "-", len); + break; + } + src = ZPROP_SRC_DEFAULT; + intval = vdev_prop_default_numeric(prop); + /* Only use if provided by the RAIDZ VDEV above */ + if (prop == VDEV_PROP_RAIDZ_EXPANDING) + return (ENOENT); + } + if (vdev_prop_index_to_string(prop, intval, + (const char **)&strval) != 0) + return (-1); + (void) strlcpy(buf, strval, len); + break; + + default: + abort(); + } + + if (srctype) + *srctype = src; + + return (0); +} + +/* + * Get a vdev property value for 'prop_name' and return the value in + * a pre-allocated buffer. + */ +int +zpool_get_vdev_prop(zpool_handle_t *zhp, const char *vdevname, vdev_prop_t prop, + char *prop_name, char *buf, size_t len, zprop_source_t *srctype, + boolean_t literal) +{ + nvlist_t *reqnvl, *reqprops; + nvlist_t *retprops = NULL; + uint64_t vdev_guid = 0; + int ret; + + if ((ret = zpool_vdev_guid(zhp, vdevname, &vdev_guid)) != 0) + return (ret); + + if (nvlist_alloc(&reqnvl, NV_UNIQUE_NAME, 0) != 0) + return (no_memory(zhp->zpool_hdl)); + if (nvlist_alloc(&reqprops, NV_UNIQUE_NAME, 0) != 0) + return (no_memory(zhp->zpool_hdl)); + + fnvlist_add_uint64(reqnvl, ZPOOL_VDEV_PROPS_GET_VDEV, vdev_guid); + + if (prop != VDEV_PROP_USERPROP) { + /* prop_name overrides prop value */ + if (prop_name != NULL) + prop = vdev_name_to_prop(prop_name); + else + prop_name = (char *)vdev_prop_to_name(prop); + assert(prop < VDEV_NUM_PROPS); + } + + assert(prop_name != NULL); + if (nvlist_add_uint64(reqprops, prop_name, prop) != 0) { + nvlist_free(reqnvl); + nvlist_free(reqprops); + return (no_memory(zhp->zpool_hdl)); + } + + fnvlist_add_nvlist(reqnvl, ZPOOL_VDEV_PROPS_GET_PROPS, reqprops); + + ret = lzc_get_vdev_prop(zhp->zpool_name, reqnvl, &retprops); + + if (ret == 0) { + ret = zpool_get_vdev_prop_value(retprops, prop, prop_name, buf, + len, srctype, literal); + } else { + char errbuf[ERRBUFLEN]; + (void) snprintf(errbuf, sizeof (errbuf), + dgettext(TEXT_DOMAIN, "cannot get vdev property %s from" + " %s in %s"), prop_name, vdevname, zhp->zpool_name); + (void) zpool_standard_error(zhp->zpool_hdl, ret, errbuf); + } + + nvlist_free(reqnvl); + nvlist_free(reqprops); + nvlist_free(retprops); + + return (ret); +} + +/* + * Get all vdev properties + */ +int +zpool_get_all_vdev_props(zpool_handle_t *zhp, const char *vdevname, + nvlist_t **outnvl) +{ + nvlist_t *nvl = NULL; + uint64_t vdev_guid = 0; + int ret; + + if ((ret = zpool_vdev_guid(zhp, vdevname, &vdev_guid)) != 0) + return (ret); + + if (nvlist_alloc(&nvl, NV_UNIQUE_NAME, 0) != 0) + return (no_memory(zhp->zpool_hdl)); + + fnvlist_add_uint64(nvl, ZPOOL_VDEV_PROPS_GET_VDEV, vdev_guid); + + ret = lzc_get_vdev_prop(zhp->zpool_name, nvl, outnvl); + + nvlist_free(nvl); + + if (ret) { + char errbuf[ERRBUFLEN]; + (void) snprintf(errbuf, sizeof (errbuf), + dgettext(TEXT_DOMAIN, "cannot get vdev properties for" + " %s in %s"), vdevname, zhp->zpool_name); + (void) zpool_standard_error(zhp->zpool_hdl, errno, errbuf); + } + + return (ret); +} + +/* + * Set vdev property + */ +int +zpool_set_vdev_prop(zpool_handle_t *zhp, const char *vdevname, + const char *propname, const char *propval) +{ + int ret; + nvlist_t *nvl = NULL; + nvlist_t *outnvl = NULL; + nvlist_t *props; + nvlist_t *realprops; + prop_flags_t flags = { 0 }; + uint64_t version; + uint64_t vdev_guid; + + if ((ret = zpool_vdev_guid(zhp, vdevname, &vdev_guid)) != 0) + return (ret); + + if (nvlist_alloc(&nvl, NV_UNIQUE_NAME, 0) != 0) + return (no_memory(zhp->zpool_hdl)); + if (nvlist_alloc(&props, NV_UNIQUE_NAME, 0) != 0) + return (no_memory(zhp->zpool_hdl)); + + fnvlist_add_uint64(nvl, ZPOOL_VDEV_PROPS_SET_VDEV, vdev_guid); + + if (nvlist_add_string(props, propname, propval) != 0) { + nvlist_free(props); + return (no_memory(zhp->zpool_hdl)); + } + + char errbuf[ERRBUFLEN]; + (void) snprintf(errbuf, sizeof (errbuf), + dgettext(TEXT_DOMAIN, "cannot set property %s for %s on %s"), + propname, vdevname, zhp->zpool_name); + + flags.vdevprop = 1; + version = zpool_get_prop_int(zhp, ZPOOL_PROP_VERSION, NULL); + if ((realprops = zpool_valid_proplist(zhp->zpool_hdl, + zhp->zpool_name, props, version, flags, errbuf)) == NULL) { + nvlist_free(props); + nvlist_free(nvl); + return (-1); + } + + nvlist_free(props); + props = realprops; + + fnvlist_add_nvlist(nvl, ZPOOL_VDEV_PROPS_SET_PROPS, props); + + ret = lzc_set_vdev_prop(zhp->zpool_name, nvl, &outnvl); + + nvlist_free(props); + nvlist_free(nvl); + nvlist_free(outnvl); + + if (ret) + (void) zpool_standard_error(zhp->zpool_hdl, errno, errbuf); + + return (ret); +} + +/* + * Prune older entries from the DDT to reclaim space under the quota + */ +int +zpool_ddt_prune(zpool_handle_t *zhp, zpool_ddt_prune_unit_t unit, + uint64_t amount) +{ + int error = lzc_ddt_prune(zhp->zpool_name, unit, amount); + if (error != 0) { + libzfs_handle_t *hdl = zhp->zpool_hdl; + char errbuf[ERRBUFLEN]; + + (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, + "cannot prune dedup table on '%s'"), zhp->zpool_name); + + if (error == EALREADY) { + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "a prune operation is already in progress")); + (void) zfs_error(hdl, EZFS_BUSY, errbuf); + } else { + (void) zpool_standard_error(hdl, errno, errbuf); + } + return (-1); + } + + return (0); +} diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs_sendrecv.c b/sys/contrib/openzfs/lib/libzfs/libzfs_sendrecv.c index 7460ffc4133b..1ad10ebb3c15 100644 --- a/sys/contrib/openzfs/lib/libzfs/libzfs_sendrecv.c +++ b/sys/contrib/openzfs/lib/libzfs/libzfs_sendrecv.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -30,6 +31,7 @@ * Copyright 2016 Igor Kozhukhov <ikozhukhov@gmail.com> * Copyright (c) 2018, loli10K <ezomori.nozomu@gmail.com>. All rights reserved. * Copyright (c) 2019 Datto Inc. + * Copyright (c) 2024, Klara, Inc. */ #include <assert.h> @@ -38,7 +40,7 @@ #include <libintl.h> #include <stdio.h> #include <stdlib.h> -#include <strings.h> +#include <string.h> #include <unistd.h> #include <stddef.h> #include <fcntl.h> @@ -83,10 +85,13 @@ typedef struct progress_arg { boolean_t pa_parsable; boolean_t pa_estimate; int pa_verbosity; + boolean_t pa_astitle; + boolean_t pa_progress; + uint64_t pa_size; } progress_arg_t; static int -dump_record(dmu_replay_record_t *drr, void *payload, int payload_len, +dump_record(dmu_replay_record_t *drr, void *payload, size_t payload_len, zio_cksum_t *zc, int outfd) { ASSERT3U(offsetof(dmu_replay_record_t, drr_u.drr_checksum.drr_checksum), @@ -116,7 +121,7 @@ dump_record(dmu_replay_record_t *drr, void *payload, int payload_len, typedef struct fsavl_node { avl_node_t fn_node; nvlist_t *fn_nvfs; - char *fn_snapname; + const char *fn_snapname; uint64_t fn_guid; } fsavl_node_t; @@ -134,7 +139,7 @@ fsavl_compare(const void *arg1, const void *arg2) * (optionally) name. */ static nvlist_t * -fsavl_find(avl_tree_t *avl, uint64_t snapguid, char **snapname) +fsavl_find(avl_tree_t *avl, uint64_t snapguid, const char **snapname) { fsavl_node_t fn_find; fsavl_node_t *fn; @@ -191,23 +196,22 @@ fsavl_create(nvlist_t *fss) while ((snapelem = nvlist_next_nvpair(snaps, snapelem)) != NULL) { fsavl_node_t *fn; - uint64_t guid; - guid = fnvpair_value_uint64(snapelem); if ((fn = malloc(sizeof (fsavl_node_t))) == NULL) { fsavl_destroy(fsavl); return (NULL); } fn->fn_nvfs = nvfs; fn->fn_snapname = nvpair_name(snapelem); - fn->fn_guid = guid; + fn->fn_guid = fnvpair_value_uint64(snapelem); /* * Note: if there are multiple snaps with the * same GUID, we ignore all but one. */ - if (avl_find(fsavl, fn, NULL) == NULL) - avl_add(fsavl, fn); + avl_index_t where = 0; + if (avl_find(fsavl, fn, &where) == NULL) + avl_insert(fsavl, fn, where); else free(fn); } @@ -284,51 +288,56 @@ typedef struct send_data { static void send_iterate_prop(zfs_handle_t *zhp, boolean_t received_only, nvlist_t *nv); +/* + * Collect guid, valid props, optionally holds, etc. of a snapshot. + * This interface is intended for use as a zfs_iter_snapshots_v2_sorted visitor. + */ static int send_iterate_snap(zfs_handle_t *zhp, void *arg) { send_data_t *sd = arg; uint64_t guid = zhp->zfs_dmustats.dds_guid; uint64_t txg = zhp->zfs_dmustats.dds_creation_txg; - char *snapname; - nvlist_t *nv; boolean_t isfromsnap, istosnap, istosnapwithnofrom; + char *snapname; + const char *from = sd->fromsnap; + const char *to = sd->tosnap; + + snapname = strrchr(zhp->zfs_name, '@'); + assert(snapname != NULL); + ++snapname; - snapname = strrchr(zhp->zfs_name, '@')+1; - isfromsnap = (sd->fromsnap != NULL && - strcmp(sd->fromsnap, snapname) == 0); - istosnap = (sd->tosnap != NULL && (strcmp(sd->tosnap, snapname) == 0)); - istosnapwithnofrom = (istosnap && sd->fromsnap == NULL); + isfromsnap = (from != NULL && strcmp(from, snapname) == 0); + istosnap = (to != NULL && strcmp(to, snapname) == 0); + istosnapwithnofrom = (istosnap && from == NULL); if (sd->tosnap_txg != 0 && txg > sd->tosnap_txg) { if (sd->verbose) { (void) fprintf(stderr, dgettext(TEXT_DOMAIN, "skipping snapshot %s because it was created " "after the destination snapshot (%s)\n"), - zhp->zfs_name, sd->tosnap); + zhp->zfs_name, to); } zfs_close(zhp); return (0); } fnvlist_add_uint64(sd->parent_snaps, snapname, guid); + /* * NB: if there is no fromsnap here (it's a newly created fs in * an incremental replication), we will substitute the tosnap. */ - if (isfromsnap || (sd->parent_fromsnap_guid == 0 && istosnap)) { + if (isfromsnap || (sd->parent_fromsnap_guid == 0 && istosnap)) sd->parent_fromsnap_guid = guid; - } if (!sd->recursive) { - /* * To allow a doall stream to work properly * with a NULL fromsnap */ - if (sd->doall && sd->fromsnap == NULL && !sd->seenfrom) { + if (sd->doall && from == NULL && !sd->seenfrom) sd->seenfrom = B_TRUE; - } if (!sd->seenfrom && isfromsnap) { sd->seenfrom = B_TRUE; @@ -345,38 +354,40 @@ send_iterate_snap(zfs_handle_t *zhp, void *arg) sd->seento = B_TRUE; } - nv = fnvlist_alloc(); + nvlist_t *nv = fnvlist_alloc(); send_iterate_prop(zhp, sd->backup, nv); fnvlist_add_nvlist(sd->snapprops, snapname, nv); fnvlist_free(nv); + if (sd->holds) { - nvlist_t *holds = fnvlist_alloc(); - int err = lzc_get_holds(zhp->zfs_name, &holds); - if (err == 0) { + nvlist_t *holds; + if (lzc_get_holds(zhp->zfs_name, &holds) == 0) { fnvlist_add_nvlist(sd->snapholds, snapname, holds); + fnvlist_free(holds); } - fnvlist_free(holds); } zfs_close(zhp); return (0); } +/* + * Collect all valid props from the handle snap into an nvlist. + */ static void send_iterate_prop(zfs_handle_t *zhp, boolean_t received_only, nvlist_t *nv) { - nvlist_t *props = NULL; - nvpair_t *elem = NULL; + nvlist_t *props; if (received_only) props = zfs_get_recvd_props(zhp); else props = zhp->zfs_props; + nvpair_t *elem = NULL; while ((elem = nvlist_next_nvpair(props, elem)) != NULL) { - char *propname = nvpair_name(elem); + const char *propname = nvpair_name(elem); zfs_prop_t prop = zfs_name_to_prop(propname); - nvlist_t *propnv; if (!zfs_prop_user(propname)) { /* @@ -394,40 +405,32 @@ send_iterate_prop(zfs_handle_t *zhp, boolean_t received_only, nvlist_t *nv) continue; } - verify(nvpair_value_nvlist(elem, &propnv) == 0); - if (prop == ZFS_PROP_QUOTA || prop == ZFS_PROP_RESERVATION || + nvlist_t *propnv = fnvpair_value_nvlist(elem); + + boolean_t isspacelimit = (prop == ZFS_PROP_QUOTA || + prop == ZFS_PROP_RESERVATION || prop == ZFS_PROP_REFQUOTA || - prop == ZFS_PROP_REFRESERVATION) { - char *source; - uint64_t value; - verify(nvlist_lookup_uint64(propnv, - ZPROP_VALUE, &value) == 0); - if (zhp->zfs_type == ZFS_TYPE_SNAPSHOT) + prop == ZFS_PROP_REFRESERVATION); + if (isspacelimit && zhp->zfs_type == ZFS_TYPE_SNAPSHOT) + continue; + + const char *source; + if (nvlist_lookup_string(propnv, ZPROP_SOURCE, &source) == 0) { + if (strcmp(source, zhp->zfs_name) != 0 && + strcmp(source, ZPROP_SOURCE_VAL_RECVD) != 0) continue; + } else { /* * May have no source before SPA_VERSION_RECVD_PROPS, * but is still modifiable. */ - if (nvlist_lookup_string(propnv, - ZPROP_SOURCE, &source) == 0) { - if ((strcmp(source, zhp->zfs_name) != 0) && - (strcmp(source, - ZPROP_SOURCE_VAL_RECVD) != 0)) - continue; - } - } else { - char *source; - if (nvlist_lookup_string(propnv, - ZPROP_SOURCE, &source) != 0) - continue; - if ((strcmp(source, zhp->zfs_name) != 0) && - (strcmp(source, ZPROP_SOURCE_VAL_RECVD) != 0)) + if (!isspacelimit) continue; } if (zfs_prop_user(propname) || zfs_prop_get_type(prop) == PROP_TYPE_STRING) { - char *value; + const char *value; value = fnvlist_lookup_string(propnv, ZPROP_VALUE); fnvlist_add_string(nv, propname, value); } else { @@ -439,6 +442,29 @@ send_iterate_prop(zfs_handle_t *zhp, boolean_t received_only, nvlist_t *nv) } /* + * returns snapshot guid + * and returns 0 if the snapshot does not exist + */ +static uint64_t +get_snap_guid(libzfs_handle_t *hdl, const char *fs, const char *snap) +{ + char name[MAXPATHLEN + 1]; + uint64_t guid = 0; + + if (fs == NULL || fs[0] == '\0' || snap == NULL || snap[0] == '\0') + return (guid); + + (void) snprintf(name, sizeof (name), "%s@%s", fs, snap); + zfs_handle_t *zhp = zfs_open(hdl, name, ZFS_TYPE_SNAPSHOT); + if (zhp != NULL) { + guid = zfs_prop_get_int(zhp, ZFS_PROP_GUID); + zfs_close(zhp); + } + + return (guid); +} + +/* * returns snapshot creation txg * and returns 0 if the snapshot does not exist */ @@ -464,7 +490,7 @@ get_snap_txg(libzfs_handle_t *hdl, const char *fs, const char *snap) } /* - * recursively generate nvlists describing datasets. See comment + * Recursively generate nvlists describing datasets. See comment * for the data structure send_data_t above for description of contents * of the nvlist. */ @@ -475,14 +501,16 @@ send_iterate_fs(zfs_handle_t *zhp, void *arg) nvlist_t *nvfs = NULL, *nv = NULL; int rv = 0; uint64_t min_txg = 0, max_txg = 0; - uint64_t parent_fromsnap_guid_save = sd->parent_fromsnap_guid; - uint64_t fromsnap_txg_save = sd->fromsnap_txg; - uint64_t tosnap_txg_save = sd->tosnap_txg; uint64_t txg = zhp->zfs_dmustats.dds_creation_txg; uint64_t guid = zhp->zfs_dmustats.dds_guid; uint64_t fromsnap_txg, tosnap_txg; char guidstring[64]; + /* These fields are restored on return from a recursive call. */ + uint64_t parent_fromsnap_guid_save = sd->parent_fromsnap_guid; + uint64_t fromsnap_txg_save = sd->fromsnap_txg; + uint64_t tosnap_txg_save = sd->tosnap_txg; + fromsnap_txg = get_snap_txg(zhp->zfs_hdl, zhp->zfs_name, sd->fromsnap); if (fromsnap_txg != 0) sd->fromsnap_txg = fromsnap_txg; @@ -492,14 +520,14 @@ send_iterate_fs(zfs_handle_t *zhp, void *arg) sd->tosnap_txg = tosnap_txg; /* - * on the send side, if the current dataset does not have tosnap, + * On the send side, if the current dataset does not have tosnap, * perform two additional checks: * - * - skip sending the current dataset if it was created later than - * the parent tosnap - * - return error if the current dataset was created earlier than + * - Skip sending the current dataset if it was created later than + * the parent tosnap. + * - Return error if the current dataset was created earlier than * the parent tosnap, unless --skip-missing specified. Then - * just print a warning + * just print a warning. */ if (sd->tosnap != NULL && tosnap_txg == 0) { if (sd->tosnap_txg != 0 && txg > sd->tosnap_txg) { @@ -526,10 +554,9 @@ send_iterate_fs(zfs_handle_t *zhp, void *arg) nvfs = fnvlist_alloc(); fnvlist_add_string(nvfs, "name", zhp->zfs_name); - fnvlist_add_uint64(nvfs, "parentfromsnap", - sd->parent_fromsnap_guid); + fnvlist_add_uint64(nvfs, "parentfromsnap", sd->parent_fromsnap_guid); - if (zhp->zfs_dmustats.dds_origin[0]) { + if (zhp->zfs_dmustats.dds_origin[0] != '\0') { zfs_handle_t *origin = zfs_open(zhp->zfs_hdl, zhp->zfs_dmustats.dds_origin, ZFS_TYPE_SNAPSHOT); if (origin == NULL) { @@ -538,19 +565,19 @@ send_iterate_fs(zfs_handle_t *zhp, void *arg) } fnvlist_add_uint64(nvfs, "origin", origin->zfs_dmustats.dds_guid); - zfs_close(origin); } - /* iterate over props */ + /* Iterate over props. */ if (sd->props || sd->backup || sd->recursive) { nv = fnvlist_alloc(); send_iterate_prop(zhp, sd->backup, nv); + fnvlist_add_nvlist(nvfs, "props", nv); } if (zfs_prop_get_int(zhp, ZFS_PROP_ENCRYPTION) != ZIO_CRYPT_OFF) { boolean_t encroot; - /* determine if this dataset is an encryption root */ + /* Determine if this dataset is an encryption root. */ if (zfs_crypto_get_encryption_root(zhp, &encroot, NULL) != 0) { rv = -1; goto out; @@ -576,29 +603,26 @@ send_iterate_fs(zfs_handle_t *zhp, void *arg) } - if (nv != NULL) - fnvlist_add_nvlist(nvfs, "props", nv); - - /* iterate over snaps, and set sd->parent_fromsnap_guid */ - sd->parent_fromsnap_guid = 0; - sd->parent_snaps = fnvlist_alloc(); - sd->snapprops = fnvlist_alloc(); - if (sd->holds) - sd->snapholds = fnvlist_alloc(); - /* + * Iterate over snaps, and set sd->parent_fromsnap_guid. + * * If this is a "doall" send, a replicate send or we're just trying * to gather a list of previous snapshots, iterate through all the * snaps in the txg range. Otherwise just look at the one we're * interested in. */ + sd->parent_fromsnap_guid = 0; + sd->parent_snaps = fnvlist_alloc(); + sd->snapprops = fnvlist_alloc(); + if (sd->holds) + sd->snapholds = fnvlist_alloc(); if (sd->doall || sd->replicate || sd->tosnap == NULL) { if (!sd->replicate && fromsnap_txg != 0) min_txg = fromsnap_txg; if (!sd->replicate && tosnap_txg != 0) max_txg = tosnap_txg; - (void) zfs_iter_snapshots_sorted(zhp, send_iterate_snap, sd, - min_txg, max_txg); + (void) zfs_iter_snapshots_sorted_v2(zhp, 0, send_iterate_snap, + sd, min_txg, max_txg); } else { char snapname[MAXPATHLEN] = { 0 }; zfs_handle_t *snap; @@ -607,19 +631,19 @@ send_iterate_fs(zfs_handle_t *zhp, void *arg) zhp->zfs_name, sd->tosnap); if (sd->fromsnap != NULL) sd->seenfrom = B_TRUE; - snap = zfs_open(zhp->zfs_hdl, snapname, - ZFS_TYPE_SNAPSHOT); + snap = zfs_open(zhp->zfs_hdl, snapname, ZFS_TYPE_SNAPSHOT); if (snap != NULL) (void) send_iterate_snap(snap, sd); } fnvlist_add_nvlist(nvfs, "snaps", sd->parent_snaps); - fnvlist_add_nvlist(nvfs, "snapprops", sd->snapprops); - if (sd->holds) - fnvlist_add_nvlist(nvfs, "snapholds", sd->snapholds); fnvlist_free(sd->parent_snaps); + fnvlist_add_nvlist(nvfs, "snapprops", sd->snapprops); fnvlist_free(sd->snapprops); - fnvlist_free(sd->snapholds); + if (sd->holds) { + fnvlist_add_nvlist(nvfs, "snapholds", sd->snapholds); + fnvlist_free(sd->snapholds); + } /* Do not allow the size of the properties list to exceed the limit */ if ((fnvlist_size(nvfs) + fnvlist_size(sd->fss)) > @@ -633,19 +657,21 @@ send_iterate_fs(zfs_handle_t *zhp, void *arg) rv = EZFS_NOSPC; goto out; } - /* add this fs to nvlist */ + /* Add this fs to nvlist. */ (void) snprintf(guidstring, sizeof (guidstring), "0x%llx", (longlong_t)guid); fnvlist_add_nvlist(sd->fss, guidstring, nvfs); - /* iterate over children */ + /* Iterate over children. */ if (sd->recursive) - rv = zfs_iter_filesystems(zhp, send_iterate_fs, sd); + rv = zfs_iter_filesystems_v2(zhp, 0, send_iterate_fs, sd); out: + /* Restore saved fields. */ sd->parent_fromsnap_guid = parent_fromsnap_guid_save; sd->fromsnap_txg = fromsnap_txg_save; sd->tosnap_txg = tosnap_txg_save; + fnvlist_free(nv); fnvlist_free(nvfs); @@ -712,6 +738,7 @@ typedef struct send_dump_data { boolean_t seenfrom, seento, replicate, doall, fromorigin; boolean_t dryrun, parsable, progress, embed_data, std_out; boolean_t large_block, compress, raw, holds; + boolean_t progressastitle; int outfd; boolean_t err; nvlist_t *fss; @@ -730,53 +757,50 @@ static int zfs_send_space(zfs_handle_t *zhp, const char *snapname, const char *from, enum lzc_send_flags flags, uint64_t *spacep) { - libzfs_handle_t *hdl = zhp->zfs_hdl; - int error; - assert(snapname != NULL); - error = lzc_send_space(snapname, from, flags, spacep); - if (error != 0) { - char errbuf[1024]; - (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, - "warning: cannot estimate space for '%s'"), snapname); - - switch (error) { - case EXDEV: - zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, - "not an earlier snapshot from the same fs")); - return (zfs_error(hdl, EZFS_CROSSTARGET, errbuf)); + int error = lzc_send_space(snapname, from, flags, spacep); + if (error == 0) + return (0); - case ENOENT: - if (zfs_dataset_exists(hdl, snapname, - ZFS_TYPE_SNAPSHOT)) { - zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, - "incremental source (%s) does not exist"), - snapname); - } - return (zfs_error(hdl, EZFS_NOENT, errbuf)); + char errbuf[ERRBUFLEN]; + (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, + "warning: cannot estimate space for '%s'"), snapname); - case EDQUOT: - case EFBIG: - case EIO: - case ENOLINK: - case ENOSPC: - case ENOSTR: - case ENXIO: - case EPIPE: - case ERANGE: - case EFAULT: - case EROFS: - case EINVAL: - zfs_error_aux(hdl, "%s", strerror(error)); - return (zfs_error(hdl, EZFS_BADBACKUP, errbuf)); + libzfs_handle_t *hdl = zhp->zfs_hdl; + switch (error) { + case EXDEV: + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "not an earlier snapshot from the same fs")); + return (zfs_error(hdl, EZFS_CROSSTARGET, errbuf)); - default: - return (zfs_standard_error(hdl, error, errbuf)); + case ENOENT: + if (zfs_dataset_exists(hdl, snapname, + ZFS_TYPE_SNAPSHOT)) { + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "incremental source (%s) does not exist"), + snapname); } - } + return (zfs_error(hdl, EZFS_NOENT, errbuf)); - return (0); + case EDQUOT: + case EFBIG: + case EIO: + case ENOLINK: + case ENOSPC: + case ENOSTR: + case ENXIO: + case EPIPE: + case ERANGE: + case EFAULT: + case EROFS: + case EINVAL: + zfs_error_aux(hdl, "%s", zfs_strerror(error)); + return (zfs_error(hdl, EZFS_BADBACKUP, errbuf)); + + default: + return (zfs_standard_error(hdl, error, errbuf)); + } } /* @@ -802,23 +826,27 @@ dump_ioctl(zfs_handle_t *zhp, const char *fromsnap, uint64_t fromsnap_obj, zc.zc_fromobj = fromsnap_obj; zc.zc_flags = flags; - thisdbg = fnvlist_alloc(); - if (fromsnap && fromsnap[0] != '\0') { - fnvlist_add_string(thisdbg, "fromsnap", fromsnap); + if (debugnv != NULL) { + thisdbg = fnvlist_alloc(); + if (fromsnap != NULL && fromsnap[0] != '\0') + fnvlist_add_string(thisdbg, "fromsnap", fromsnap); } if (zfs_ioctl(zhp->zfs_hdl, ZFS_IOC_SEND, &zc) != 0) { - char errbuf[1024]; - (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, - "warning: cannot send '%s'"), zhp->zfs_name); + char errbuf[ERRBUFLEN]; + int error = errno; + + (void) snprintf(errbuf, sizeof (errbuf), "%s '%s'", + dgettext(TEXT_DOMAIN, "warning: cannot send"), + zhp->zfs_name); - fnvlist_add_uint64(thisdbg, "error", errno); - if (debugnv) { + if (debugnv != NULL) { + fnvlist_add_uint64(thisdbg, "error", error); fnvlist_add_nvlist(debugnv, zhp->zfs_name, thisdbg); + fnvlist_free(thisdbg); } - fnvlist_free(thisdbg); - switch (errno) { + switch (error) { case EXDEV: zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "not an earlier snapshot from the same fs")); @@ -850,7 +878,7 @@ dump_ioctl(zfs_handle_t *zhp, const char *fromsnap, uint64_t fromsnap_obj, case EFAULT: case EROFS: case EINVAL: - zfs_error_aux(hdl, "%s", strerror(errno)); + zfs_error_aux(hdl, "%s", zfs_strerror(errno)); return (zfs_error(hdl, EZFS_BADBACKUP, errbuf)); default: @@ -858,9 +886,10 @@ dump_ioctl(zfs_handle_t *zhp, const char *fromsnap, uint64_t fromsnap_obj, } } - if (debugnv) + if (debugnv != NULL) { fnvlist_add_nvlist(debugnv, zhp->zfs_name, thisdbg); - fnvlist_free(thisdbg); + fnvlist_free(thisdbg); + } return (0); } @@ -886,6 +915,10 @@ zfs_send_progress(zfs_handle_t *zhp, int fd, uint64_t *bytes_written, { zfs_cmd_t zc = {"\0"}; + if (bytes_written != NULL) + *bytes_written = 0; + if (blocks_visited != NULL) + *blocks_visited = 0; (void) strlcpy(zc.zc_name, zhp->zfs_name, sizeof (zc.zc_name)); zc.zc_cookie = fd; if (zfs_ioctl(zhp->zfs_hdl, ZFS_IOC_SEND_PROGRESS, &zc) != 0) @@ -897,6 +930,39 @@ zfs_send_progress(zfs_handle_t *zhp, int fd, uint64_t *bytes_written, return (0); } +static volatile boolean_t send_progress_thread_signal_duetotimer; +static void +send_progress_thread_act(int sig, siginfo_t *info, void *ucontext) +{ + (void) sig, (void) ucontext; + send_progress_thread_signal_duetotimer = info->si_code == SI_TIMER; +} + +struct timer_desirability { + timer_t timer; + boolean_t desired; +}; +static void +timer_delete_cleanup(void *timer) +{ + struct timer_desirability *td = timer; + if (td->desired) + timer_delete(td->timer); +} + +#ifdef SIGINFO +#define SEND_PROGRESS_THREAD_PARENT_BLOCK_SIGINFO sigaddset(&new, SIGINFO) +#else +#define SEND_PROGRESS_THREAD_PARENT_BLOCK_SIGINFO +#endif +#define SEND_PROGRESS_THREAD_PARENT_BLOCK(old) { \ + sigset_t new; \ + sigemptyset(&new); \ + sigaddset(&new, SIGUSR1); \ + SEND_PROGRESS_THREAD_PARENT_BLOCK_SIGINFO; \ + pthread_sigmask(SIG_BLOCK, &new, old); \ +} + static void * send_progress_thread(void *arg) { @@ -904,59 +970,108 @@ send_progress_thread(void *arg) zfs_handle_t *zhp = pa->pa_zhp; uint64_t bytes; uint64_t blocks; + uint64_t total = pa->pa_size / 100; char buf[16]; time_t t; - struct tm *tm; - boolean_t firstloop = B_TRUE; + struct tm tm; + int err; + + const struct sigaction signal_action = + {.sa_sigaction = send_progress_thread_act, .sa_flags = SA_SIGINFO}; + struct sigevent timer_cfg = + {.sigev_notify = SIGEV_SIGNAL, .sigev_signo = SIGUSR1}; + const struct itimerspec timer_time = + {.it_value = {.tv_sec = 1}, .it_interval = {.tv_sec = 1}}; + struct timer_desirability timer = {}; + + sigaction(SIGUSR1, &signal_action, NULL); +#ifdef SIGINFO + sigaction(SIGINFO, &signal_action, NULL); +#endif + + if ((timer.desired = pa->pa_progress || pa->pa_astitle)) { + if (timer_create(CLOCK_MONOTONIC, &timer_cfg, &timer.timer)) + return ((void *)(uintptr_t)errno); + (void) timer_settime(timer.timer, 0, &timer_time, NULL); + } + pthread_cleanup_push(timer_delete_cleanup, &timer); + + if (!pa->pa_parsable && pa->pa_progress) { + (void) fprintf(stderr, + "TIME %s %sSNAPSHOT %s\n", + pa->pa_estimate ? "BYTES" : " SENT", + pa->pa_verbosity >= 2 ? " BLOCKS " : "", + zhp->zfs_name); + } /* * Print the progress from ZFS_IOC_SEND_PROGRESS every second. */ for (;;) { - int err; - (void) sleep(1); + pause(); if ((err = zfs_send_progress(zhp, pa->pa_fd, &bytes, &blocks)) != 0) { if (err == EINTR || err == ENOENT) - return ((void *)0); - return ((void *)(uintptr_t)err); - } - - if (firstloop && !pa->pa_parsable) { - (void) fprintf(stderr, - "TIME %s %sSNAPSHOT %s\n", - pa->pa_estimate ? "BYTES" : " SENT", - pa->pa_verbosity >= 2 ? " BLOCKS " : "", - zhp->zfs_name); - firstloop = B_FALSE; + err = 0; + pthread_exit(((void *)(uintptr_t)err)); } (void) time(&t); - tm = localtime(&t); + localtime_r(&t, &tm); + + if (pa->pa_astitle) { + char buf_bytes[16]; + char buf_size[16]; + int pct; + zfs_nicenum(bytes, buf_bytes, sizeof (buf_bytes)); + zfs_nicenum(pa->pa_size, buf_size, sizeof (buf_size)); + pct = (total > 0) ? bytes / total : 100; + zfs_setproctitle("sending %s (%d%%: %s/%s)", + zhp->zfs_name, MIN(pct, 100), buf_bytes, buf_size); + } if (pa->pa_verbosity >= 2 && pa->pa_parsable) { (void) fprintf(stderr, "%02d:%02d:%02d\t%llu\t%llu\t%s\n", - tm->tm_hour, tm->tm_min, tm->tm_sec, + tm.tm_hour, tm.tm_min, tm.tm_sec, (u_longlong_t)bytes, (u_longlong_t)blocks, zhp->zfs_name); } else if (pa->pa_verbosity >= 2) { zfs_nicenum(bytes, buf, sizeof (buf)); (void) fprintf(stderr, "%02d:%02d:%02d %5s %8llu %s\n", - tm->tm_hour, tm->tm_min, tm->tm_sec, + tm.tm_hour, tm.tm_min, tm.tm_sec, buf, (u_longlong_t)blocks, zhp->zfs_name); } else if (pa->pa_parsable) { (void) fprintf(stderr, "%02d:%02d:%02d\t%llu\t%s\n", - tm->tm_hour, tm->tm_min, tm->tm_sec, + tm.tm_hour, tm.tm_min, tm.tm_sec, (u_longlong_t)bytes, zhp->zfs_name); - } else { + } else if (pa->pa_progress || + !send_progress_thread_signal_duetotimer) { zfs_nicebytes(bytes, buf, sizeof (buf)); (void) fprintf(stderr, "%02d:%02d:%02d %5s %s\n", - tm->tm_hour, tm->tm_min, tm->tm_sec, + tm.tm_hour, tm.tm_min, tm.tm_sec, buf, zhp->zfs_name); } } + pthread_cleanup_pop(B_TRUE); + return (NULL); +} + +static boolean_t +send_progress_thread_exit( + libzfs_handle_t *hdl, pthread_t ptid, sigset_t *oldmask) +{ + void *status = NULL; + (void) pthread_cancel(ptid); + (void) pthread_join(ptid, &status); + pthread_sigmask(SIG_SETMASK, oldmask, NULL); + int error = (int)(uintptr_t)status; + if (error != 0 && status != PTHREAD_CANCELED) + return (zfs_standard_error(hdl, error, + dgettext(TEXT_DOMAIN, "progress thread exited nonzero"))); + else + return (B_FALSE); } static void @@ -965,43 +1080,71 @@ send_print_verbose(FILE *fout, const char *tosnap, const char *fromsnap, { if (parsable) { if (fromsnap != NULL) { - (void) fprintf(fout, "incremental\t%s\t%s", - fromsnap, tosnap); + (void) fprintf(fout, dgettext(TEXT_DOMAIN, + "incremental\t%s\t%s"), fromsnap, tosnap); } else { - (void) fprintf(fout, "full\t%s", - tosnap); +/* + * Workaround for GCC 12+ with UBSan enabled deficencies. + * + * GCC 12+ invoked with -fsanitize=undefined incorrectly reports the code + * below as violating -Wformat-overflow. + */ +#if defined(__GNUC__) && !defined(__clang__) && \ + defined(ZFS_UBSAN_ENABLED) && defined(HAVE_FORMAT_OVERFLOW) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wformat-overflow" +#endif + (void) fprintf(fout, dgettext(TEXT_DOMAIN, + "full\t%s"), tosnap); +#if defined(__GNUC__) && !defined(__clang__) && \ + defined(ZFS_UBSAN_ENABLED) && defined(HAVE_FORMAT_OVERFLOW) +#pragma GCC diagnostic pop +#endif } + (void) fprintf(fout, "\t%llu", (longlong_t)size); } else { if (fromsnap != NULL) { if (strchr(fromsnap, '@') == NULL && strchr(fromsnap, '#') == NULL) { (void) fprintf(fout, dgettext(TEXT_DOMAIN, - "send from @%s to %s"), - fromsnap, tosnap); + "send from @%s to %s"), fromsnap, tosnap); } else { (void) fprintf(fout, dgettext(TEXT_DOMAIN, - "send from %s to %s"), - fromsnap, tosnap); + "send from %s to %s"), fromsnap, tosnap); } } else { (void) fprintf(fout, dgettext(TEXT_DOMAIN, - "full send of %s"), - tosnap); + "full send of %s"), tosnap); + } + if (size != 0) { + char buf[16]; + zfs_nicebytes(size, buf, sizeof (buf)); +/* + * Workaround for GCC 12+ with UBSan enabled deficencies. + * + * GCC 12+ invoked with -fsanitize=undefined incorrectly reports the code + * below as violating -Wformat-overflow. + */ +#if defined(__GNUC__) && !defined(__clang__) && \ + defined(ZFS_UBSAN_ENABLED) && defined(HAVE_FORMAT_OVERFLOW) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wformat-overflow" +#endif + (void) fprintf(fout, dgettext(TEXT_DOMAIN, + " estimated size is %s"), buf); +#if defined(__GNUC__) && !defined(__clang__) && \ + defined(ZFS_UBSAN_ENABLED) && defined(HAVE_FORMAT_OVERFLOW) +#pragma GCC diagnostic pop +#endif } - } - - if (parsable) { - (void) fprintf(fout, "\t%llu", - (longlong_t)size); - } else if (size != 0) { - char buf[16]; - zfs_nicebytes(size, buf, sizeof (buf)); - (void) fprintf(fout, dgettext(TEXT_DOMAIN, - " estimated size is %s"), buf); } (void) fprintf(fout, "\n"); } +/* + * Send a single filesystem snapshot, updating the send dump data. + * This interface is intended for use as a zfs_iter_snapshots_v2_sorted visitor. + */ static int dump_snapshot(zfs_handle_t *zhp, void *arg) { @@ -1023,8 +1166,7 @@ dump_snapshot(zfs_handle_t *zhp, void *arg) if (!sdd->seenfrom && isfromsnap) { gather_holds(zhp, sdd); sdd->seenfrom = B_TRUE; - (void) strlcpy(sdd->prevsnap, thissnap, - sizeof (sdd->prevsnap)); + (void) strlcpy(sdd->prevsnap, thissnap, sizeof (sdd->prevsnap)); sdd->prevsnap_obj = zfs_prop_get_int(zhp, ZFS_PROP_OBJSETID); zfs_close(zhp); return (0); @@ -1050,7 +1192,7 @@ dump_snapshot(zfs_handle_t *zhp, void *arg) if (!sdd->doall && !isfromsnap && !istosnap) { if (sdd->replicate) { - char *snapname; + const char *snapname; nvlist_t *snapprops; /* * Filter out all intermediate snapshots except origin @@ -1104,14 +1246,12 @@ dump_snapshot(zfs_handle_t *zhp, void *arg) (void) strlcat(fromds, sdd->prevsnap, sizeof (fromds)); } if (zfs_send_space(zhp, zhp->zfs_name, - sdd->prevsnap[0] ? fromds : NULL, flags, &size) != 0) { - size = 0; /* cannot estimate send space */ - } else { + sdd->prevsnap[0] ? fromds : NULL, flags, &size) == 0) { send_print_verbose(fout, zhp->zfs_name, sdd->prevsnap[0] ? sdd->prevsnap : NULL, size, sdd->parsable); + sdd->size += size; } - sdd->size += size; } if (!sdd->dryrun) { @@ -1119,54 +1259,52 @@ dump_snapshot(zfs_handle_t *zhp, void *arg) * If progress reporting is requested, spawn a new thread to * poll ZFS_IOC_SEND_PROGRESS at a regular interval. */ - if (sdd->progress) { + sigset_t oldmask; + { pa.pa_zhp = zhp; pa.pa_fd = sdd->outfd; pa.pa_parsable = sdd->parsable; pa.pa_estimate = B_FALSE; pa.pa_verbosity = sdd->verbosity; + pa.pa_size = sdd->size; + pa.pa_astitle = sdd->progressastitle; + pa.pa_progress = sdd->progress; if ((err = pthread_create(&tid, NULL, send_progress_thread, &pa)) != 0) { zfs_close(zhp); return (err); } + SEND_PROGRESS_THREAD_PARENT_BLOCK(&oldmask); } err = dump_ioctl(zhp, sdd->prevsnap, sdd->prevsnap_obj, fromorigin, sdd->outfd, flags, sdd->debugnv); - if (sdd->progress) { - void *status = NULL; - (void) pthread_cancel(tid); - (void) pthread_join(tid, &status); - int error = (int)(uintptr_t)status; - if (error != 0 && status != PTHREAD_CANCELED) { - char errbuf[1024]; - (void) snprintf(errbuf, sizeof (errbuf), - dgettext(TEXT_DOMAIN, - "progress thread exited nonzero")); - return (zfs_standard_error(zhp->zfs_hdl, error, - errbuf)); - } - } + if (send_progress_thread_exit(zhp->zfs_hdl, tid, &oldmask)) + return (-1); } - (void) strcpy(sdd->prevsnap, thissnap); + (void) strlcpy(sdd->prevsnap, thissnap, sizeof (sdd->prevsnap)); sdd->prevsnap_obj = zfs_prop_get_int(zhp, ZFS_PROP_OBJSETID); zfs_close(zhp); return (err); } +/* + * Send all snapshots for a filesystem, updating the send dump data. + */ static int -dump_filesystem(zfs_handle_t *zhp, void *arg) +dump_filesystem(zfs_handle_t *zhp, send_dump_data_t *sdd) { int rv = 0; - send_dump_data_t *sdd = arg; boolean_t missingfrom = B_FALSE; zfs_cmd_t zc = {"\0"}; uint64_t min_txg = 0, max_txg = 0; + /* + * Make sure the tosnap exists. + */ (void) snprintf(zc.zc_name, sizeof (zc.zc_name), "%s@%s", zhp->zfs_name, sdd->tosnap); if (zfs_ioctl(zhp->zfs_hdl, ZFS_IOC_OBJSET_STATS, &zc) != 0) { @@ -1177,47 +1315,52 @@ dump_filesystem(zfs_handle_t *zhp, void *arg) return (0); } + /* + * If this fs does not have fromsnap, and we're doing + * recursive, we need to send a full stream from the + * beginning (or an incremental from the origin if this + * is a clone). If we're doing non-recursive, then let + * them get the error. + */ if (sdd->replicate && sdd->fromsnap) { /* - * If this fs does not have fromsnap, and we're doing - * recursive, we need to send a full stream from the - * beginning (or an incremental from the origin if this - * is a clone). If we're doing non-recursive, then let - * them get the error. + * Make sure the fromsnap exists. */ (void) snprintf(zc.zc_name, sizeof (zc.zc_name), "%s@%s", zhp->zfs_name, sdd->fromsnap); - if (zfs_ioctl(zhp->zfs_hdl, - ZFS_IOC_OBJSET_STATS, &zc) != 0) { + if (zfs_ioctl(zhp->zfs_hdl, ZFS_IOC_OBJSET_STATS, &zc) != 0) missingfrom = B_TRUE; - } } - sdd->seenfrom = sdd->seento = sdd->prevsnap[0] = 0; + sdd->seenfrom = sdd->seento = B_FALSE; + sdd->prevsnap[0] = '\0'; sdd->prevsnap_obj = 0; if (sdd->fromsnap == NULL || missingfrom) sdd->seenfrom = B_TRUE; - - /* * Iterate through all snapshots and process the ones we will be * sending. If we only have a "from" and "to" snapshot to deal * with, we can avoid iterating through all the other snapshots. */ if (sdd->doall || sdd->replicate || sdd->tosnap == NULL) { - if (!sdd->replicate && sdd->fromsnap != NULL) - min_txg = get_snap_txg(zhp->zfs_hdl, zhp->zfs_name, - sdd->fromsnap); - if (!sdd->replicate && sdd->tosnap != NULL) - max_txg = get_snap_txg(zhp->zfs_hdl, zhp->zfs_name, - sdd->tosnap); - rv = zfs_iter_snapshots_sorted(zhp, dump_snapshot, arg, + if (!sdd->replicate) { + if (sdd->fromsnap != NULL) { + min_txg = get_snap_txg(zhp->zfs_hdl, + zhp->zfs_name, sdd->fromsnap); + } + if (sdd->tosnap != NULL) { + max_txg = get_snap_txg(zhp->zfs_hdl, + zhp->zfs_name, sdd->tosnap); + } + } + rv = zfs_iter_snapshots_sorted_v2(zhp, 0, dump_snapshot, sdd, min_txg, max_txg); } else { char snapname[MAXPATHLEN] = { 0 }; zfs_handle_t *snap; + /* Dump fromsnap. */ if (!sdd->seenfrom) { (void) snprintf(snapname, sizeof (snapname), "%s@%s", zhp->zfs_name, sdd->fromsnap); @@ -1226,9 +1369,10 @@ dump_filesystem(zfs_handle_t *zhp, void *arg) if (snap != NULL) rv = dump_snapshot(snap, sdd); else - rv = -1; + rv = errno; } + /* Dump tosnap. */ if (rv == 0) { (void) snprintf(snapname, sizeof (snapname), "%s@%s", zhp->zfs_name, sdd->tosnap); @@ -1237,7 +1381,7 @@ dump_filesystem(zfs_handle_t *zhp, void *arg) if (snap != NULL) rv = dump_snapshot(snap, sdd); else - rv = -1; + rv = errno; } } @@ -1268,10 +1412,12 @@ dump_filesystem(zfs_handle_t *zhp, void *arg) return (rv); } +/* + * Send all snapshots for all filesystems in sdd. + */ static int -dump_filesystems(zfs_handle_t *rzhp, void *arg) +dump_filesystems(zfs_handle_t *rzhp, send_dump_data_t *sdd) { - send_dump_data_t *sdd = arg; nvpair_t *fspair; boolean_t needagain, progress; @@ -1287,7 +1433,7 @@ dump_filesystems(zfs_handle_t *rzhp, void *arg) nvfs = fnvpair_value_nvlist(fspair); (void) nvlist_lookup_uint64(nvfs, "origin", &origin_guid); if (origin_guid != 0) { - char *snapname; + const char *snapname; nvlist_t *origin_nv = fsavl_find(sdd->fsavl, origin_guid, &snapname); if (origin_nv != NULL) { @@ -1306,7 +1452,7 @@ again: for (fspair = nvlist_next_nvpair(sdd->fss, NULL); fspair; fspair = nvlist_next_nvpair(sdd->fss, fspair)) { nvlist_t *fslist, *parent_nv; - char *fsname; + const char *fsname; zfs_handle_t *zhp; int err; uint64_t origin_guid = 0; @@ -1324,7 +1470,7 @@ again: if (parent_guid != 0) { parent_nv = fsavl_find(sdd->fsavl, parent_guid, NULL); if (!nvlist_exists(parent_nv, "sent")) { - /* parent has not been sent; skip this one */ + /* Parent has not been sent; skip this one. */ needagain = B_TRUE; continue; } @@ -1336,7 +1482,7 @@ again: if (origin_nv != NULL && !nvlist_exists(origin_nv, "sent")) { /* - * origin has not been sent yet; + * Origin has not been sent yet; * skip this clone. */ needagain = B_TRUE; @@ -1359,7 +1505,7 @@ again: goto again; } - /* clean out the sent flags in case we reuse this fss */ + /* Clean out the sent flags in case we reuse this fss. */ for (fspair = nvlist_next_nvpair(sdd->fss, NULL); fspair; fspair = nvlist_next_nvpair(sdd->fss, fspair)) { nvlist_t *fslist; @@ -1398,7 +1544,7 @@ zfs_send_resume_token_to_nvlist(libzfs_handle_t *hdl, const char *token) return (NULL); } - /* convert hexadecimal representation to binary */ + /* Convert hexadecimal representation to binary. */ token = strrchr(token, '-') + 1; int len = strlen(token) / 2; unsigned char *compressed = zfs_alloc(hdl, len); @@ -1413,7 +1559,7 @@ zfs_send_resume_token_to_nvlist(libzfs_handle_t *hdl, const char *token) } } - /* verify checksum */ + /* Verify checksum. */ zio_cksum_t cksum; fletcher_4_native_varsize(compressed, len, &cksum); if (cksum.zc_word[0] != checksum) { @@ -1423,7 +1569,7 @@ zfs_send_resume_token_to_nvlist(libzfs_handle_t *hdl, const char *token) return (NULL); } - /* uncompress */ + /* Uncompress. */ void *packed = zfs_alloc(hdl, packed_len); uLongf packed_len_long = packed_len; if (uncompress(packed, &packed_len_long, compressed, len) != Z_OK || @@ -1435,7 +1581,7 @@ zfs_send_resume_token_to_nvlist(libzfs_handle_t *hdl, const char *token) return (NULL); } - /* unpack nvlist */ + /* Unpack nvlist. */ nvlist_t *nv; int error = nvlist_unpack(packed, packed_len, &nv, KM_SLEEP); free(packed); @@ -1447,10 +1593,12 @@ zfs_send_resume_token_to_nvlist(libzfs_handle_t *hdl, const char *token) } return (nv); } + static enum lzc_send_flags lzc_flags_from_sendflags(const sendflags_t *flags) { enum lzc_send_flags lzc_flags = 0; + if (flags->largeblock) lzc_flags |= LZC_SEND_FLAG_LARGE_BLOCK; if (flags->embed_data) @@ -1461,21 +1609,23 @@ lzc_flags_from_sendflags(const sendflags_t *flags) lzc_flags |= LZC_SEND_FLAG_RAW; if (flags->saved) lzc_flags |= LZC_SEND_FLAG_SAVED; + return (lzc_flags); } static int estimate_size(zfs_handle_t *zhp, const char *from, int fd, sendflags_t *flags, uint64_t resumeobj, uint64_t resumeoff, uint64_t bytes, - const char *redactbook, char *errbuf) + const char *redactbook, char *errbuf, uint64_t *sizep) { uint64_t size; FILE *fout = flags->dryrun ? stdout : stderr; progress_arg_t pa = { 0 }; int err = 0; pthread_t ptid; + sigset_t oldmask; - if (flags->progress) { + { pa.pa_zhp = zhp; pa.pa_fd = fd; pa.pa_parsable = flags->parsable; @@ -1485,33 +1635,26 @@ estimate_size(zfs_handle_t *zhp, const char *from, int fd, sendflags_t *flags, err = pthread_create(&ptid, NULL, send_progress_thread, &pa); if (err != 0) { - zfs_error_aux(zhp->zfs_hdl, "%s", strerror(errno)); + zfs_error_aux(zhp->zfs_hdl, "%s", zfs_strerror(errno)); return (zfs_error(zhp->zfs_hdl, EZFS_THREADCREATEFAILED, errbuf)); } + SEND_PROGRESS_THREAD_PARENT_BLOCK(&oldmask); } err = lzc_send_space_resume_redacted(zhp->zfs_name, from, lzc_flags_from_sendflags(flags), resumeobj, resumeoff, bytes, redactbook, fd, &size); + *sizep = size; - if (flags->progress) { - void *status = NULL; - (void) pthread_cancel(ptid); - (void) pthread_join(ptid, &status); - int error = (int)(uintptr_t)status; - if (error != 0 && status != PTHREAD_CANCELED) { - char errbuf[1024]; - (void) snprintf(errbuf, sizeof (errbuf), - dgettext(TEXT_DOMAIN, "progress thread exited " - "nonzero")); - return (zfs_standard_error(zhp->zfs_hdl, error, - errbuf)); - } - } + if (send_progress_thread_exit(zhp->zfs_hdl, ptid, &oldmask)) + return (-1); + + if (!flags->progress && !flags->parsable) + return (err); if (err != 0) { - zfs_error_aux(zhp->zfs_hdl, "%s", strerror(err)); + zfs_error_aux(zhp->zfs_hdl, "%s", zfs_strerror(err)); return (zfs_error(zhp->zfs_hdl, EZFS_BADBACKUP, errbuf)); } @@ -1552,6 +1695,53 @@ redact_snaps_equal(const uint64_t *snaps1, uint64_t num_snaps1, return (B_TRUE); } +static int +get_bookmarks(const char *path, nvlist_t **bmarksp) +{ + nvlist_t *props = fnvlist_alloc(); + int error; + + fnvlist_add_boolean(props, "redact_complete"); + fnvlist_add_boolean(props, zfs_prop_to_name(ZFS_PROP_REDACT_SNAPS)); + error = lzc_get_bookmarks(path, props, bmarksp); + fnvlist_free(props); + return (error); +} + +static nvpair_t * +find_redact_pair(nvlist_t *bmarks, const uint64_t *redact_snap_guids, + int num_redact_snaps) +{ + nvpair_t *pair; + + for (pair = nvlist_next_nvpair(bmarks, NULL); pair; + pair = nvlist_next_nvpair(bmarks, pair)) { + + nvlist_t *bmark = fnvpair_value_nvlist(pair); + nvlist_t *vallist = fnvlist_lookup_nvlist(bmark, + zfs_prop_to_name(ZFS_PROP_REDACT_SNAPS)); + uint_t len = 0; + uint64_t *bmarksnaps = fnvlist_lookup_uint64_array(vallist, + ZPROP_VALUE, &len); + if (redact_snaps_equal(redact_snap_guids, + num_redact_snaps, bmarksnaps, len)) { + break; + } + } + return (pair); +} + +static boolean_t +get_redact_complete(nvpair_t *pair) +{ + nvlist_t *bmark = fnvpair_value_nvlist(pair); + nvlist_t *vallist = fnvlist_lookup_nvlist(bmark, "redact_complete"); + boolean_t complete = fnvlist_lookup_boolean_value(vallist, + ZPROP_VALUE); + + return (complete); +} + /* * Check that the list of redaction snapshots in the bookmark matches the send * we're resuming, and return whether or not it's complete. @@ -1564,18 +1754,13 @@ find_redact_book(libzfs_handle_t *hdl, const char *path, const uint64_t *redact_snap_guids, int num_redact_snaps, char **bookname) { - char errbuf[1024]; - int error = 0; - nvlist_t *props = fnvlist_alloc(); + char errbuf[ERRBUFLEN]; nvlist_t *bmarks; (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot resume send")); - fnvlist_add_boolean(props, "redact_complete"); - fnvlist_add_boolean(props, zfs_prop_to_name(ZFS_PROP_REDACT_SNAPS)); - error = lzc_get_bookmarks(path, props, &bmarks); - fnvlist_free(props); + int error = get_bookmarks(path, &bmarks); if (error != 0) { if (error == ESRCH) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, @@ -1585,64 +1770,66 @@ find_redact_book(libzfs_handle_t *hdl, const char *path, "dataset to be sent no longer exists")); } else { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, - "unknown error: %s"), strerror(error)); + "unknown error: %s"), zfs_strerror(error)); } return (zfs_error(hdl, EZFS_BADPROP, errbuf)); } - nvpair_t *pair; - for (pair = nvlist_next_nvpair(bmarks, NULL); pair; - pair = nvlist_next_nvpair(bmarks, pair)) { - - nvlist_t *bmark = fnvpair_value_nvlist(pair); - nvlist_t *vallist = fnvlist_lookup_nvlist(bmark, - zfs_prop_to_name(ZFS_PROP_REDACT_SNAPS)); - uint_t len = 0; - uint64_t *bmarksnaps = fnvlist_lookup_uint64_array(vallist, - ZPROP_VALUE, &len); - if (redact_snaps_equal(redact_snap_guids, - num_redact_snaps, bmarksnaps, len)) { - break; - } - } + nvpair_t *pair = find_redact_pair(bmarks, redact_snap_guids, + num_redact_snaps); if (pair == NULL) { fnvlist_free(bmarks); zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "no appropriate redaction bookmark exists")); return (zfs_error(hdl, EZFS_BADPROP, errbuf)); } - char *name = nvpair_name(pair); - nvlist_t *bmark = fnvpair_value_nvlist(pair); - nvlist_t *vallist = fnvlist_lookup_nvlist(bmark, "redact_complete"); - boolean_t complete = fnvlist_lookup_boolean_value(vallist, - ZPROP_VALUE); + boolean_t complete = get_redact_complete(pair); if (!complete) { fnvlist_free(bmarks); zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "incomplete redaction bookmark provided")); return (zfs_error(hdl, EZFS_BADPROP, errbuf)); } - *bookname = strndup(name, ZFS_MAX_DATASET_NAME_LEN); + *bookname = strndup(nvpair_name(pair), ZFS_MAX_DATASET_NAME_LEN); ASSERT3P(*bookname, !=, NULL); fnvlist_free(bmarks); return (0); } +static enum lzc_send_flags +lzc_flags_from_resume_nvl(nvlist_t *resume_nvl) +{ + enum lzc_send_flags lzc_flags = 0; + + if (nvlist_exists(resume_nvl, "largeblockok")) + lzc_flags |= LZC_SEND_FLAG_LARGE_BLOCK; + if (nvlist_exists(resume_nvl, "embedok")) + lzc_flags |= LZC_SEND_FLAG_EMBED_DATA; + if (nvlist_exists(resume_nvl, "compressok")) + lzc_flags |= LZC_SEND_FLAG_COMPRESS; + if (nvlist_exists(resume_nvl, "rawok")) + lzc_flags |= LZC_SEND_FLAG_RAW; + if (nvlist_exists(resume_nvl, "savedok")) + lzc_flags |= LZC_SEND_FLAG_SAVED; + + return (lzc_flags); +} + static int -zfs_send_resume_impl(libzfs_handle_t *hdl, sendflags_t *flags, int outfd, - nvlist_t *resume_nvl) +zfs_send_resume_impl_cb_impl(libzfs_handle_t *hdl, sendflags_t *flags, + int outfd, nvlist_t *resume_nvl) { - char errbuf[1024]; - char *toname; - char *fromname = NULL; + char errbuf[ERRBUFLEN]; + const char *toname; + const char *fromname = NULL; uint64_t resumeobj, resumeoff, toguid, fromguid, bytes; zfs_handle_t *zhp; int error = 0; char name[ZFS_MAX_DATASET_NAME_LEN]; - enum lzc_send_flags lzc_flags = 0; FILE *fout = (flags->verbosity > 0 && flags->dryrun) ? stdout : stderr; uint64_t *redact_snap_guids = NULL; int num_redact_snaps = 0; char *redact_book = NULL; + uint64_t size = 0; (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot resume send")); @@ -1665,19 +1852,8 @@ zfs_send_resume_impl(libzfs_handle_t *hdl, sendflags_t *flags, int outfd, fromguid = 0; (void) nvlist_lookup_uint64(resume_nvl, "fromguid", &fromguid); - if (flags->largeblock || nvlist_exists(resume_nvl, "largeblockok")) - lzc_flags |= LZC_SEND_FLAG_LARGE_BLOCK; - if (flags->embed_data || nvlist_exists(resume_nvl, "embedok")) - lzc_flags |= LZC_SEND_FLAG_EMBED_DATA; - if (flags->compress || nvlist_exists(resume_nvl, "compressok")) - lzc_flags |= LZC_SEND_FLAG_COMPRESS; - if (flags->raw || nvlist_exists(resume_nvl, "rawok")) - lzc_flags |= LZC_SEND_FLAG_RAW; - if (flags->saved || nvlist_exists(resume_nvl, "savedok")) - lzc_flags |= LZC_SEND_FLAG_SAVED; - if (flags->saved) { - (void) strcpy(name, toname); + (void) strlcpy(name, toname, sizeof (name)); } else { error = guid_to_name(hdl, toname, toguid, B_FALSE, name); if (error != 0) { @@ -1736,7 +1912,10 @@ zfs_send_resume_impl(libzfs_handle_t *hdl, sendflags_t *flags, int outfd, } } - if (flags->verbosity != 0) { + enum lzc_send_flags lzc_flags = lzc_flags_from_sendflags(flags) | + lzc_flags_from_resume_nvl(resume_nvl); + + if (flags->verbosity != 0 || flags->progressastitle) { /* * Some of these may have come from the resume token, set them * here for size estimate purposes. @@ -1753,22 +1932,26 @@ zfs_send_resume_impl(libzfs_handle_t *hdl, sendflags_t *flags, int outfd, if (lzc_flags & LZC_SEND_FLAG_SAVED) tmpflags.saved = B_TRUE; error = estimate_size(zhp, fromname, outfd, &tmpflags, - resumeobj, resumeoff, bytes, redact_book, errbuf); + resumeobj, resumeoff, bytes, redact_book, errbuf, &size); } if (!flags->dryrun) { progress_arg_t pa = { 0 }; pthread_t tid; + sigset_t oldmask; /* * If progress reporting is requested, spawn a new thread to * poll ZFS_IOC_SEND_PROGRESS at a regular interval. */ - if (flags->progress) { + { pa.pa_zhp = zhp; pa.pa_fd = outfd; pa.pa_parsable = flags->parsable; pa.pa_estimate = B_FALSE; pa.pa_verbosity = flags->verbosity; + pa.pa_size = size; + pa.pa_astitle = flags->progressastitle; + pa.pa_progress = flags->progress; error = pthread_create(&tid, NULL, send_progress_thread, &pa); @@ -1778,6 +1961,7 @@ zfs_send_resume_impl(libzfs_handle_t *hdl, sendflags_t *flags, int outfd, zfs_close(zhp); return (error); } + SEND_PROGRESS_THREAD_PARENT_BLOCK(&oldmask); } error = lzc_send_resume_redacted(zhp->zfs_name, fromname, outfd, @@ -1785,21 +1969,12 @@ zfs_send_resume_impl(libzfs_handle_t *hdl, sendflags_t *flags, int outfd, if (redact_book != NULL) free(redact_book); - if (flags->progress) { - void *status = NULL; - (void) pthread_cancel(tid); - (void) pthread_join(tid, &status); - int error = (int)(uintptr_t)status; - if (error != 0 && status != PTHREAD_CANCELED) { - char errbuf[1024]; - (void) snprintf(errbuf, sizeof (errbuf), - dgettext(TEXT_DOMAIN, - "progress thread exited nonzero")); - return (zfs_standard_error(hdl, error, errbuf)); - } + if (send_progress_thread_exit(hdl, tid, &oldmask)) { + zfs_close(zhp); + return (-1); } - char errbuf[1024]; + char errbuf[ERRBUFLEN]; (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "warning: cannot send '%s'"), zhp->zfs_name); @@ -1832,7 +2007,7 @@ zfs_send_resume_impl(libzfs_handle_t *hdl, sendflags_t *flags, int outfd, case ERANGE: case EFAULT: case EROFS: - zfs_error_aux(hdl, "%s", strerror(errno)); + zfs_error_aux(hdl, "%s", zfs_strerror(errno)); return (zfs_error(hdl, EZFS_BADBACKUP, errbuf)); default: @@ -1848,12 +2023,38 @@ zfs_send_resume_impl(libzfs_handle_t *hdl, sendflags_t *flags, int outfd, return (error); } +struct zfs_send_resume_impl { + libzfs_handle_t *hdl; + sendflags_t *flags; + nvlist_t *resume_nvl; +}; + +static int +zfs_send_resume_impl_cb(int outfd, void *arg) +{ + struct zfs_send_resume_impl *zsri = arg; + return (zfs_send_resume_impl_cb_impl(zsri->hdl, zsri->flags, outfd, + zsri->resume_nvl)); +} + +static int +zfs_send_resume_impl(libzfs_handle_t *hdl, sendflags_t *flags, int outfd, + nvlist_t *resume_nvl) +{ + struct zfs_send_resume_impl zsri = { + .hdl = hdl, + .flags = flags, + .resume_nvl = resume_nvl, + }; + return (lzc_send_wrapper(zfs_send_resume_impl_cb, outfd, &zsri)); +} + int zfs_send_resume(libzfs_handle_t *hdl, sendflags_t *flags, int outfd, const char *resume_token) { int ret; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; nvlist_t *resume_nvl; (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, @@ -1884,7 +2085,7 @@ zfs_send_saved(zfs_handle_t *zhp, sendflags_t *flags, int outfd, uint64_t saved_guid = 0, resume_guid = 0; uint64_t obj = 0, off = 0, bytes = 0; char token_buf[ZFS_MAXPROPLEN]; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "saved send failed")); @@ -1971,7 +2172,8 @@ out: static int send_conclusion_record(int fd, zio_cksum_t *zc) { - dmu_replay_record_t drr = { 0 }; + dmu_replay_record_t drr; + memset(&drr, 0, sizeof (dmu_replay_record_t)); drr.drr_type = DRR_END; if (zc != NULL) drr.drr_u.drr_end.drr_checksum = *zc; @@ -2006,9 +2208,9 @@ send_prelim_records(zfs_handle_t *zhp, const char *from, int fd, /* name of filesystem/volume that contains snapshot we are sending */ char tofs[ZFS_MAX_DATASET_NAME_LEN]; /* short name of snap we are sending */ - char *tosnap = ""; + const char *tosnap = ""; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "warning: cannot send '%s'"), zhp->zfs_name); if (zhp->zfs_type == ZFS_TYPE_FILESYSTEM && zfs_prop_get_int(zhp, @@ -2040,9 +2242,9 @@ send_prelim_records(zfs_handle_t *zhp, const char *from, int fd, fnvlist_add_boolean(hdrnv, "raw"); } - if ((err = gather_nvlist(zhp->zfs_hdl, tofs, + if (gather_nvlist(zhp->zfs_hdl, tofs, from, tosnap, recursive, raw, doall, replicate, skipmissing, - verbose, backup, holds, props, &fss, fsavlp)) != 0) { + verbose, backup, holds, props, &fss, fsavlp) != 0) { return (zfs_error(zhp->zfs_hdl, EZFS_BADBACKUP, errbuf)); } @@ -2073,7 +2275,8 @@ send_prelim_records(zfs_handle_t *zhp, const char *from, int fd, } if (!dryrun) { - dmu_replay_record_t drr = { 0 }; + dmu_replay_record_t drr; + memset(&drr, 0, sizeof (dmu_replay_record_t)); /* write first begin record */ drr.drr_type = DRR_BEGIN; drr.drr_u.drr_begin.drr_magic = DMU_BACKUP_MAGIC; @@ -2092,13 +2295,13 @@ send_prelim_records(zfs_handle_t *zhp, const char *from, int fd, err = dump_record(&drr, packbuf, buflen, &zc, fd); free(packbuf); if (err != 0) { - zfs_error_aux(zhp->zfs_hdl, "%s", strerror(err)); + zfs_error_aux(zhp->zfs_hdl, "%s", zfs_strerror(err)); return (zfs_error(zhp->zfs_hdl, EZFS_BADBACKUP, errbuf)); } err = send_conclusion_record(fd, &zc); if (err != 0) { - zfs_error_aux(zhp->zfs_hdl, "%s", strerror(err)); + zfs_error_aux(zhp->zfs_hdl, "%s", zfs_strerror(err)); return (zfs_error(zhp->zfs_hdl, EZFS_BADBACKUP, errbuf)); } @@ -2125,13 +2328,15 @@ send_prelim_records(zfs_handle_t *zhp, const char *from, int fd, * if "replicate" is set. If "doall" is set, dump all the intermediate * snapshots. The DMU_COMPOUNDSTREAM header is used in the "doall" * case too. If "props" is set, send properties. + * + * Pre-wrapped (cf. lzc_send_wrapper()). */ -int -zfs_send(zfs_handle_t *zhp, const char *fromsnap, const char *tosnap, +static int +zfs_send_cb_impl(zfs_handle_t *zhp, const char *fromsnap, const char *tosnap, sendflags_t *flags, int outfd, snapfilter_cb_t filter_func, void *cb_arg, nvlist_t **debugnvp) { - char errbuf[1024]; + char errbuf[ERRBUFLEN]; send_dump_data_t sdd = { 0 }; int err = 0; nvlist_t *fss = NULL; @@ -2204,6 +2409,7 @@ zfs_send(zfs_handle_t *zhp, const char *fromsnap, const char *tosnap, sdd.verbosity = flags->verbosity; sdd.parsable = flags->parsable; sdd.progress = flags->progress; + sdd.progressastitle = flags->progressastitle; sdd.dryrun = flags->dryrun; sdd.large_block = flags->largeblock; sdd.embed_data = flags->embed_data; @@ -2310,9 +2516,9 @@ zfs_send(zfs_handle_t *zhp, const char *fromsnap, const char *tosnap, * there was some error, because it might not be totally * failed. */ - err = send_conclusion_record(outfd, NULL); - if (err != 0) - return (zfs_standard_error(zhp->zfs_hdl, err, errbuf)); + int err2 = send_conclusion_record(outfd, NULL); + if (err2 != 0) + return (zfs_standard_error(zhp->zfs_hdl, err2, errbuf)); } return (err || sdd.err); @@ -2329,6 +2535,42 @@ err_out: return (err); } +struct zfs_send { + zfs_handle_t *zhp; + const char *fromsnap; + const char *tosnap; + sendflags_t *flags; + snapfilter_cb_t *filter_func; + void *cb_arg; + nvlist_t **debugnvp; +}; + +static int +zfs_send_cb(int outfd, void *arg) +{ + struct zfs_send *zs = arg; + return (zfs_send_cb_impl(zs->zhp, zs->fromsnap, zs->tosnap, zs->flags, + outfd, zs->filter_func, zs->cb_arg, zs->debugnvp)); +} + +int +zfs_send(zfs_handle_t *zhp, const char *fromsnap, const char *tosnap, + sendflags_t *flags, int outfd, snapfilter_cb_t filter_func, + void *cb_arg, nvlist_t **debugnvp) +{ + struct zfs_send arg = { + .zhp = zhp, + .fromsnap = fromsnap, + .tosnap = tosnap, + .flags = flags, + .filter_func = filter_func, + .cb_arg = cb_arg, + .debugnvp = debugnvp, + }; + return (lzc_send_wrapper(zfs_send_cb, outfd, &arg)); +} + + static zfs_handle_t * name_to_dir_handle(libzfs_handle_t *hdl, const char *snapname) { @@ -2405,18 +2647,21 @@ snapshot_is_before(zfs_handle_t *earlier, zfs_handle_t *later) * The "zhp" argument is the handle of the dataset to send (typically a * snapshot). The "from" argument is the full name of the snapshot or * bookmark that is the incremental source. + * + * Pre-wrapped (cf. lzc_send_wrapper()). */ -int -zfs_send_one(zfs_handle_t *zhp, const char *from, int fd, sendflags_t *flags, - const char *redactbook) +static int +zfs_send_one_cb_impl(zfs_handle_t *zhp, const char *from, int fd, + sendflags_t *flags, const char *redactbook) { int err; libzfs_handle_t *hdl = zhp->zfs_hdl; char *name = zhp->zfs_name; pthread_t ptid; progress_arg_t pa = { 0 }; + uint64_t size = 0; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "warning: cannot send '%s'"), name); @@ -2497,9 +2742,9 @@ zfs_send_one(zfs_handle_t *zhp, const char *from, int fd, sendflags_t *flags, /* * Perform size estimate if verbose was specified. */ - if (flags->verbosity != 0) { + if (flags->verbosity != 0 || flags->progressastitle) { err = estimate_size(zhp, from, fd, flags, 0, 0, 0, redactbook, - errbuf); + errbuf, &size); if (err != 0) return (err); } @@ -2511,38 +2756,34 @@ zfs_send_one(zfs_handle_t *zhp, const char *from, int fd, sendflags_t *flags, * If progress reporting is requested, spawn a new thread to poll * ZFS_IOC_SEND_PROGRESS at a regular interval. */ - if (flags->progress) { + sigset_t oldmask; + { pa.pa_zhp = zhp; pa.pa_fd = fd; pa.pa_parsable = flags->parsable; pa.pa_estimate = B_FALSE; pa.pa_verbosity = flags->verbosity; + pa.pa_size = size; + pa.pa_astitle = flags->progressastitle; + pa.pa_progress = flags->progress; err = pthread_create(&ptid, NULL, send_progress_thread, &pa); if (err != 0) { - zfs_error_aux(zhp->zfs_hdl, "%s", strerror(errno)); + zfs_error_aux(zhp->zfs_hdl, "%s", zfs_strerror(errno)); return (zfs_error(zhp->zfs_hdl, EZFS_THREADCREATEFAILED, errbuf)); } + SEND_PROGRESS_THREAD_PARENT_BLOCK(&oldmask); } err = lzc_send_redacted(name, from, fd, lzc_flags_from_sendflags(flags), redactbook); - if (flags->progress) { - void *status = NULL; - if (err != 0) - (void) pthread_cancel(ptid); - (void) pthread_join(ptid, &status); - int error = (int)(uintptr_t)status; - if (error != 0 && status != PTHREAD_CANCELED) - return (zfs_standard_error_fmt(hdl, error, - dgettext(TEXT_DOMAIN, - "progress thread exited nonzero"))); - } + if (send_progress_thread_exit(hdl, ptid, &oldmask)) + return (-1); - if (flags->props || flags->holds || flags->backup) { + if (err == 0 && (flags->props || flags->holds || flags->backup)) { /* Write the final end record. */ err = send_conclusion_record(fd, NULL); if (err != 0) @@ -2587,9 +2828,14 @@ zfs_send_one(zfs_handle_t *zhp, const char *from, int fd, sendflags_t *flags, case EPIPE: case ERANGE: case EROFS: - zfs_error_aux(hdl, "%s", strerror(errno)); + zfs_error_aux(hdl, "%s", zfs_strerror(errno)); + return (zfs_error(hdl, EZFS_BADBACKUP, errbuf)); + case ZFS_ERR_STREAM_LARGE_MICROZAP: + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "source snapshot contains large microzaps, " + "need -L (--large-block) or -w (--raw) to " + "generate stream")); return (zfs_error(hdl, EZFS_BADBACKUP, errbuf)); - default: return (zfs_standard_error(hdl, errno, errbuf)); } @@ -2597,6 +2843,34 @@ zfs_send_one(zfs_handle_t *zhp, const char *from, int fd, sendflags_t *flags, return (err != 0); } +struct zfs_send_one { + zfs_handle_t *zhp; + const char *from; + sendflags_t *flags; + const char *redactbook; +}; + +static int +zfs_send_one_cb(int fd, void *arg) +{ + struct zfs_send_one *zso = arg; + return (zfs_send_one_cb_impl(zso->zhp, zso->from, fd, zso->flags, + zso->redactbook)); +} + +int +zfs_send_one(zfs_handle_t *zhp, const char *from, int fd, sendflags_t *flags, + const char *redactbook) +{ + struct zfs_send_one zso = { + .zhp = zhp, + .from = from, + .flags = flags, + .redactbook = redactbook, + }; + return (lzc_send_wrapper(zfs_send_one_cb, fd, &zso)); +} + /* * Routines specific to "zfs recv" */ @@ -2639,8 +2913,6 @@ recv_read_nvlist(libzfs_handle_t *hdl, int fd, int len, nvlist_t **nvp, int err; buf = zfs_alloc(hdl, len); - if (buf == NULL) - return (ENOMEM); if (len > hdl->libzfs_max_nvlist) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "nvlist too large")); @@ -2746,7 +3018,7 @@ recv_rename(libzfs_handle_t *hdl, const char *name, const char *tryname, goto out; if (tryname) { - (void) strcpy(newname, tryname); + (void) strlcpy(newname, tryname, ZFS_MAX_DATASET_NAME_LEN); if (flags->verbose) { (void) printf("attempting rename %s to %s\n", name, newname); @@ -2857,22 +3129,24 @@ recv_destroy(libzfs_handle_t *hdl, const char *name, int baselen, zhp = zfs_open(hdl, name, ZFS_TYPE_DATASET); if (zhp == NULL) return (-1); - clp = changelist_gather(zhp, ZFS_PROP_NAME, 0, - flags->force ? MS_FORCE : 0); - if (zfs_get_type(zhp) == ZFS_TYPE_SNAPSHOT && + zfs_type_t type = zfs_get_type(zhp); + if (type == ZFS_TYPE_SNAPSHOT && zfs_spa_version(zhp, &spa_version) == 0 && spa_version >= SPA_VERSION_USERREFS) defer = B_TRUE; + clp = changelist_gather(zhp, ZFS_PROP_NAME, 0, + flags->force ? MS_FORCE : 0); zfs_close(zhp); if (clp == NULL) return (-1); + err = changelist_prefix(clp); if (err) return (err); if (flags->verbose) (void) printf("attempting destroy %s\n", name); - if (zhp->zfs_type == ZFS_TYPE_SNAPSHOT) { + if (type == ZFS_TYPE_SNAPSHOT) { nvlist_t *nv = fnvlist_alloc(); fnvlist_add_boolean(nv, name); err = lzc_destroy_snaps(nv, defer, NULL); @@ -2959,9 +3233,9 @@ guid_to_name_cb(zfs_handle_t *zhp, void *arg) return (EEXIST); } - err = zfs_iter_children(zhp, guid_to_name_cb, gtnd); + err = zfs_iter_children_v2(zhp, 0, guid_to_name_cb, gtnd); if (err != EEXIST && gtnd->bookmark_ok) - err = zfs_iter_bookmarks(zhp, guid_to_name_cb, gtnd); + err = zfs_iter_bookmarks_v2(zhp, 0, guid_to_name_cb, gtnd); zfs_close(zhp); return (err); } @@ -3015,9 +3289,11 @@ guid_to_name_redact_snaps(libzfs_handle_t *hdl, const char *parent, continue; int err = guid_to_name_cb(zfs_handle_dup(zhp), >nd); if (err != EEXIST) - err = zfs_iter_children(zhp, guid_to_name_cb, >nd); + err = zfs_iter_children_v2(zhp, 0, guid_to_name_cb, + >nd); if (err != EEXIST && bookmark_ok) - err = zfs_iter_bookmarks(zhp, guid_to_name_cb, >nd); + err = zfs_iter_bookmarks_v2(zhp, 0, guid_to_name_cb, + >nd); zfs_close(zhp); if (err == EEXIST) return (0); @@ -3050,7 +3326,7 @@ created_before(libzfs_handle_t *hdl, avl_tree_t *avl, uint64_t guid1, uint64_t guid2) { nvlist_t *nvfs; - char *fsname = NULL, *snapname = NULL; + const char *fsname = NULL, *snapname = NULL; char buf[ZFS_MAX_DATASET_NAME_LEN]; int rv; zfs_handle_t *guid1hdl, *guid2hdl; @@ -3105,62 +3381,74 @@ recv_fix_encryption_hierarchy(libzfs_handle_t *hdl, const char *top_zfs, { int err; nvpair_t *fselem = NULL; - nvlist_t *stream_fss; + nvlist_t *local_nv; + avl_tree_t *local_avl; + boolean_t recursive; + + recursive = (nvlist_lookup_boolean(stream_nv, "not_recursive") == + ENOENT); - stream_fss = fnvlist_lookup_nvlist(stream_nv, "fss"); + /* Using top_zfs, gather the nvlists for all local filesystems. */ + if ((err = gather_nvlist(hdl, top_zfs, NULL, NULL, + recursive, B_TRUE, B_FALSE, recursive, B_FALSE, B_FALSE, B_FALSE, + B_FALSE, B_TRUE, &local_nv, &local_avl)) != 0) + return (err); - while ((fselem = nvlist_next_nvpair(stream_fss, fselem)) != NULL) { + /* + * Go through the nvlists of the local filesystems and check for + * encryption roots. + */ + while ((fselem = nvlist_next_nvpair(local_nv, fselem)) != NULL) { zfs_handle_t *zhp = NULL; uint64_t crypt; - nvlist_t *snaps, *props, *stream_nvfs = NULL; - nvpair_t *snapel = NULL; + nvlist_t *stream_props, *snaps, *stream_nvfs = NULL, + *nvfs = NULL; boolean_t is_encroot, is_clone, stream_encroot; - char *cp; - char *stream_keylocation = NULL; + const char *stream_keylocation = NULL, *fsname; char keylocation[MAXNAMELEN]; - char fsname[ZFS_MAX_DATASET_NAME_LEN]; - - keylocation[0] = '\0'; - stream_nvfs = fnvpair_value_nvlist(fselem); - snaps = fnvlist_lookup_nvlist(stream_nvfs, "snaps"); - props = fnvlist_lookup_nvlist(stream_nvfs, "props"); - stream_encroot = nvlist_exists(stream_nvfs, "is_encroot"); - - /* find a snapshot from the stream that exists locally */ - err = ENOENT; - while ((snapel = nvlist_next_nvpair(snaps, snapel)) != NULL) { - uint64_t guid; - - guid = fnvpair_value_uint64(snapel); - err = guid_to_name(hdl, top_zfs, guid, B_FALSE, - fsname); - if (err == 0) - break; - } - - if (err != 0) - continue; - - cp = strchr(fsname, '@'); - if (cp != NULL) - *cp = '\0'; + nvpair_t *snapelem; + nvfs = fnvpair_value_nvlist(fselem); + snaps = fnvlist_lookup_nvlist(nvfs, "snaps"); + fsname = fnvlist_lookup_string(nvfs, "name"); zhp = zfs_open(hdl, fsname, ZFS_TYPE_DATASET); if (zhp == NULL) { err = ENOENT; goto error; } - crypt = zfs_prop_get_int(zhp, ZFS_PROP_ENCRYPTION); - is_clone = zhp->zfs_dmustats.dds_origin[0] != '\0'; - (void) zfs_crypto_get_encryption_root(zhp, &is_encroot, NULL); - /* we don't need to do anything for unencrypted datasets */ + crypt = zfs_prop_get_int(zhp, ZFS_PROP_ENCRYPTION); if (crypt == ZIO_CRYPT_OFF) { zfs_close(zhp); continue; } + is_clone = zhp->zfs_dmustats.dds_origin[0] != '\0'; + (void) zfs_crypto_get_encryption_root(zhp, &is_encroot, NULL); + keylocation[0] = '\0'; + + /* + * Go through the snapshots of the local filesystem and find + * the stream's filesystem. + */ + for (snapelem = nvlist_next_nvpair(snaps, NULL); + snapelem; snapelem = nvlist_next_nvpair(snaps, snapelem)) { + uint64_t thisguid; + + thisguid = fnvpair_value_uint64(snapelem); + stream_nvfs = fsavl_find(stream_avl, thisguid, NULL); + + if (stream_nvfs != NULL) + break; + } + + if (stream_nvfs == NULL) + continue; + + stream_props = fnvlist_lookup_nvlist(stream_nvfs, "props"); + stream_encroot = nvlist_exists(stream_nvfs, "is_encroot"); + /* * If the dataset is flagged as an encryption root, was not * received as a clone and is not currently an encryption root, @@ -3176,7 +3464,7 @@ recv_fix_encryption_hierarchy(libzfs_handle_t *hdl, const char *top_zfs, } } - stream_keylocation = fnvlist_lookup_string(props, + stream_keylocation = fnvlist_lookup_string(stream_props, zfs_prop_to_name(ZFS_PROP_KEYLOCATION)); /* @@ -3236,21 +3524,21 @@ recv_incremental_replication(libzfs_handle_t *hdl, const char *tofs, nvlist_t *local_nv, *deleted = NULL; avl_tree_t *local_avl; nvpair_t *fselem, *nextfselem; - char *fromsnap; + const char *fromsnap; char newname[ZFS_MAX_DATASET_NAME_LEN]; char guidname[32]; int error; boolean_t needagain, progress, recursive; - char *s1, *s2; + const char *s1, *s2; + + if (flags->dryrun) + return (0); fromsnap = fnvlist_lookup_string(stream_nv, "fromsnap"); recursive = (nvlist_lookup_boolean(stream_nv, "not_recursive") == ENOENT); - if (flags->dryrun) - return (0); - again: needagain = progress = B_FALSE; @@ -3273,7 +3561,7 @@ again: uint64_t originguid = 0; uint64_t stream_originguid = 0; uint64_t parent_fromsnap_guid, stream_parent_fromsnap_guid; - char *fsname, *stream_fsname; + const char *fsname, *stream_fsname; nextfselem = nvlist_next_nvpair(local_nv, fselem); @@ -3308,7 +3596,7 @@ again: case 1: { /* promote it! */ nvlist_t *origin_nvfs; - char *origin_fsname; + const char *origin_fsname; origin_nvfs = fsavl_find(local_avl, originguid, NULL); @@ -3339,7 +3627,7 @@ again: for (snapelem = nvlist_next_nvpair(snaps, NULL); snapelem; snapelem = nextsnapelem) { uint64_t thisguid; - char *stream_snapname; + const char *stream_snapname; nvlist_t *found, *props; nextsnapelem = nvlist_next_nvpair(snaps, snapelem); @@ -3380,12 +3668,10 @@ again: zc.zc_cookie = B_TRUE; /* received */ (void) snprintf(zc.zc_name, sizeof (zc.zc_name), "%s@%s", fsname, nvpair_name(snapelem)); - if (zcmd_write_src_nvlist(hdl, &zc, - props) == 0) { - (void) zfs_ioctl(hdl, - ZFS_IOC_SET_PROP, &zc); - zcmd_free_nvlists(&zc); - } + zcmd_write_src_nvlist(hdl, &zc, props); + (void) zfs_ioctl(hdl, + ZFS_IOC_SET_PROP, &zc); + zcmd_free_nvlists(&zc); } /* check for different snapname */ @@ -3487,7 +3773,7 @@ again: * new fs. */ if (parent != NULL) { - char *pname; + const char *pname; pname = fnvlist_lookup_string(parent, "name"); (void) snprintf(tryname, sizeof (tryname), @@ -3538,12 +3824,12 @@ zfs_receive_package(libzfs_handle_t *hdl, int fd, const char *destname, { nvlist_t *stream_nv = NULL; avl_tree_t *stream_avl = NULL; - char *fromsnap = NULL; - char *sendsnap = NULL; + const char *fromsnap = NULL; + const char *sendsnap = NULL; char *cp; char tofs[ZFS_MAX_DATASET_NAME_LEN]; char sendfs[ZFS_MAX_DATASET_NAME_LEN]; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; dmu_replay_record_t drre; int error; boolean_t anyerr = B_FALSE; @@ -3726,7 +4012,7 @@ zfs_receive_package(libzfs_handle_t *hdl, int fd, const char *destname, stream_nv, stream_avl, NULL); } - if (raw && softerr == 0 && *top_zfs != NULL) { + if (raw && *top_zfs != NULL && !flags->dryrun) { softerr = recv_fix_encryption_hierarchy(hdl, *top_zfs, stream_nv, stream_avl); } @@ -3760,7 +4046,7 @@ recv_skip(libzfs_handle_t *hdl, int fd, boolean_t byteswap) dmu_replay_record_t *drr; void *buf = zfs_alloc(hdl, SPA_MAXBLOCKSIZE); uint64_t payload_size; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot receive")); @@ -3985,6 +4271,15 @@ zfs_setup_cmdline_props(libzfs_handle_t *hdl, zfs_type_t type, goto error; } + /* + * For plain replicated send, we can ignore encryption + * properties other than first stream + */ + if ((zfs_prop_encryption_key_param(prop) || prop == + ZFS_PROP_ENCRYPTION) && !newfs && recursive && !raw) { + continue; + } + /* incremental streams can only exclude encryption properties */ if ((zfs_prop_encryption_key_param(prop) || prop == ZFS_PROP_ENCRYPTION) && !newfs && @@ -4019,7 +4314,7 @@ zfs_setup_cmdline_props(libzfs_handle_t *hdl, zfs_type_t type, */ if (nvlist_exists(origprops, newname)) { nvlist_t *attrs; - char *source = NULL; + const char *source = NULL; attrs = fnvlist_lookup_nvlist(origprops, newname); @@ -4033,8 +4328,8 @@ zfs_setup_cmdline_props(libzfs_handle_t *hdl, zfs_type_t type, * properties: if we're asked to exclude this kind of * values we remove them from "recvprops" input nvlist. */ - if (!zfs_prop_inheritable(prop) && - !zfs_prop_user(name) && /* can be inherited too */ + if (!zfs_prop_user(name) && /* can be inherited too */ + !zfs_prop_inheritable(prop) && nvlist_exists(recvprops, newname)) fnvlist_remove(recvprops, newname); else @@ -4086,7 +4381,8 @@ zfs_setup_cmdline_props(libzfs_handle_t *hdl, zfs_type_t type, if (cp != NULL) *cp = '\0'; - if (!raw && zfs_crypto_create(hdl, namebuf, voprops, NULL, + if (!raw && !(!newfs && recursive) && + zfs_crypto_create(hdl, namebuf, voprops, NULL, B_FALSE, wkeydata_out, wkeylen_out) != 0) { fnvlist_free(voprops); ret = zfs_error(hdl, EZFS_CRYPTOFAILED, errbuf); @@ -4124,11 +4420,11 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap, avl_tree_t *stream_avl, char **top_zfs, const char *finalsnap, nvlist_t *cmdprops) { - time_t begin_time; + struct timespec begin_time; int ioctl_err, ioctl_errno, err; char *cp; struct drr_begin *drrb = &drr->drr_u.drr_begin; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; const char *chopprefix; boolean_t newfs = B_FALSE; boolean_t stream_wantsnewfs, stream_resumingnewfs; @@ -4142,15 +4438,15 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap, zprop_errflags_t prop_errflags; nvlist_t *prop_errors = NULL; boolean_t recursive; - char *snapname = NULL; + const char *snapname = NULL; char destsnap[MAXPATHLEN * 2]; - char origin[MAXNAMELEN]; + char origin[MAXNAMELEN] = {0}; char name[MAXPATHLEN]; - char tmp_keylocation[MAXNAMELEN]; + char tmp_keylocation[MAXNAMELEN] = {0}; nvlist_t *rcvprops = NULL; /* props received from the send stream */ nvlist_t *oxprops = NULL; /* override (-o) and exclude (-x) props */ nvlist_t *origprops = NULL; /* original props (if destination exists) */ - zfs_type_t type; + zfs_type_t type = ZFS_TYPE_INVALID; boolean_t toplevel = B_FALSE; boolean_t zoned = B_FALSE; boolean_t hastoken = B_FALSE; @@ -4158,9 +4454,10 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap, uint8_t *wkeydata = NULL; uint_t wkeylen = 0; - begin_time = time(NULL); - bzero(origin, MAXNAMELEN); - bzero(tmp_keylocation, MAXNAMELEN); +#ifndef CLOCK_MONOTONIC_RAW +#define CLOCK_MONOTONIC_RAW CLOCK_MONOTONIC +#endif + clock_gettime(CLOCK_MONOTONIC_RAW, &begin_time); (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot receive")); @@ -4172,7 +4469,7 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap, boolean_t holds = flags->holds && !flags->skipholds; if (stream_avl != NULL) { - char *keylocation = NULL; + const char *keylocation = NULL; nvlist_t *lookup = NULL; nvlist_t *fs = fsavl_find(stream_avl, drrb->drr_toguid, &snapname); @@ -4196,7 +4493,7 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap, err = nvlist_lookup_string(rcvprops, zfs_prop_to_name(ZFS_PROP_KEYLOCATION), &keylocation); if (err == 0) { - strcpy(tmp_keylocation, keylocation); + strlcpy(tmp_keylocation, keylocation, MAXNAMELEN); (void) nvlist_remove_all(rcvprops, zfs_prop_to_name(ZFS_PROP_KEYLOCATION)); } @@ -4252,7 +4549,7 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap, * prepend a path separator. */ int len = strlen(drrb->drr_toname); - cp = malloc(len + 2); + cp = umem_alloc(len + 2, UMEM_NOFAIL); cp[0] = '/'; (void) strcpy(&cp[1], drrb->drr_toname); chopprefix = cp; @@ -4305,7 +4602,8 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap, */ (void) strlcpy(destsnap, tosnap, sizeof (destsnap)); (void) strlcat(destsnap, chopprefix, sizeof (destsnap)); - free(cp); + if (cp != NULL) + umem_free(cp, strlen(cp) + 1); if (!zfs_name_valid(destsnap, ZFS_TYPE_SNAPSHOT)) { err = zfs_error(hdl, EZFS_INVALIDNAME, errbuf); goto out; @@ -4363,18 +4661,20 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap, (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot receive new filesystem stream")); - (void) strcpy(name, destsnap); + (void) strlcpy(name, destsnap, sizeof (name)); cp = strrchr(name, '/'); if (cp) *cp = '\0'; if (cp && !zfs_dataset_exists(hdl, name, ZFS_TYPE_DATASET)) { char suffix[ZFS_MAX_DATASET_NAME_LEN]; - (void) strcpy(suffix, strrchr(destsnap, '/')); + (void) strlcpy(suffix, strrchr(destsnap, '/'), + sizeof (suffix)); if (guid_to_name(hdl, name, parent_snapguid, B_FALSE, destsnap) == 0) { *strchr(destsnap, '@') = '\0'; - (void) strcat(destsnap, suffix); + (void) strlcat(destsnap, suffix, + sizeof (destsnap)); } } } else { @@ -4392,7 +4692,7 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap, "cannot receive incremental stream")); } - (void) strcpy(name, destsnap); + (void) strlcpy(name, destsnap, sizeof (name)); *strchr(name, '@') = '\0'; /* @@ -4404,24 +4704,51 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap, strlen(sendfs)) != '\0' && *chopprefix != '@')) && !zfs_dataset_exists(hdl, name, ZFS_TYPE_DATASET)) { char snap[ZFS_MAX_DATASET_NAME_LEN]; - (void) strcpy(snap, strchr(destsnap, '@')); + (void) strlcpy(snap, strchr(destsnap, '@'), + sizeof (snap)); if (guid_to_name(hdl, name, drrb->drr_fromguid, B_FALSE, destsnap) == 0) { *strchr(destsnap, '@') = '\0'; - (void) strcat(destsnap, snap); + (void) strlcat(destsnap, snap, + sizeof (destsnap)); } } } - (void) strcpy(name, destsnap); + (void) strlcpy(name, destsnap, sizeof (name)); *strchr(name, '@') = '\0'; redacted = DMU_GET_FEATUREFLAGS(drrb->drr_versioninfo) & DMU_BACKUP_FEATURE_REDACTED; - if (zfs_dataset_exists(hdl, name, ZFS_TYPE_DATASET)) { + if (flags->heal) { + if (flags->isprefix || flags->istail || flags->force || + flags->canmountoff || flags->resumable || flags->nomount || + flags->skipholds) { + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "corrective recv can not be used when combined with" + " this flag")); + err = zfs_error(hdl, EZFS_INVALIDNAME, errbuf); + goto out; + } + uint64_t guid = + get_snap_guid(hdl, name, strchr(destsnap, '@') + 1); + if (guid == 0) { + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "corrective recv must specify an existing snapshot" + " to heal")); + err = zfs_error(hdl, EZFS_INVALIDNAME, errbuf); + goto out; + } else if (guid != drrb->drr_toguid) { + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "local snapshot doesn't match the snapshot" + " in the provided stream")); + err = zfs_error(hdl, EZFS_WRONG_PARENT, errbuf); + goto out; + } + } else if (zfs_dataset_exists(hdl, name, ZFS_TYPE_DATASET)) { zfs_cmd_t zc = {"\0"}; - zfs_handle_t *zhp; + zfs_handle_t *zhp = NULL; boolean_t encrypted; (void) strcpy(zc.zc_name, name); @@ -4478,6 +4805,33 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap, goto out; } + /* + * When receiving full/newfs on existing dataset, then it + * should be done with "-F" flag. Its enforced for initial + * receive in previous checks in this function. + * Similarly, on resuming full/newfs recv on existing dataset, + * it should be done with "-F" flag. + * + * When dataset doesn't exist, then full/newfs recv is done on + * newly created dataset and it's marked INCONSISTENT. But + * When receiving on existing dataset, recv is first done on + * %recv and its marked INCONSISTENT. Existing dataset is not + * marked INCONSISTENT. + * Resume of full/newfs receive with dataset not INCONSISTENT + * indicates that its resuming newfs on existing dataset. So, + * enforce "-F" flag in this case. + */ + if (stream_resumingnewfs && + !zfs_prop_get_int(zhp, ZFS_PROP_INCONSISTENT) && + !flags->force) { + zfs_close(zhp); + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "Resuming recv on existing destination '%s'\n" + "must specify -F to overwrite it"), name); + err = zfs_error(hdl, EZFS_RESUME_EXISTS, errbuf); + goto out; + } + if (stream_wantsnewfs && zhp->zfs_dmustats.dds_origin[0]) { zfs_close(zhp); @@ -4615,8 +4969,9 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap, } if (flags->verbose) { - (void) printf("%s %s stream of %s into %s\n", + (void) printf("%s %s%s stream of %s into %s\n", flags->dryrun ? "would receive" : "receiving", + flags->heal ? "corrective " : "", drrb->drr_fromguid ? "incremental" : "full", drrb->drr_toname, destsnap); (void) fflush(stdout); @@ -4686,10 +5041,17 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap, goto out; } - err = ioctl_err = lzc_receive_with_cmdprops(destsnap, rcvprops, - oxprops, wkeydata, wkeylen, origin, flags->force, flags->resumable, - raw, infd, drr_noswap, -1, &read_bytes, &errflags, - NULL, &prop_errors); + if (flags->heal) { + err = ioctl_err = lzc_receive_with_heal(destsnap, rcvprops, + oxprops, wkeydata, wkeylen, origin, flags->force, + flags->heal, flags->resumable, raw, infd, drr_noswap, -1, + &read_bytes, &errflags, NULL, &prop_errors); + } else { + err = ioctl_err = lzc_receive_with_cmdprops(destsnap, rcvprops, + oxprops, wkeydata, wkeylen, origin, flags->force, + flags->resumable, raw, infd, drr_noswap, -1, &read_bytes, + &errflags, NULL, &prop_errors); + } ioctl_errno = ioctl_err; prop_errflags = errflags; @@ -4735,12 +5097,11 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap, if (err == 0 && snapprops_nvlist) { zfs_cmd_t zc = {"\0"}; - (void) strcpy(zc.zc_name, destsnap); + (void) strlcpy(zc.zc_name, destsnap, sizeof (zc.zc_name)); zc.zc_cookie = B_TRUE; /* received */ - if (zcmd_write_src_nvlist(hdl, &zc, snapprops_nvlist) == 0) { - (void) zfs_ioctl(hdl, ZFS_IOC_SET_PROP, &zc); - zcmd_free_nvlists(&zc); - } + zcmd_write_src_nvlist(hdl, &zc, snapprops_nvlist); + (void) zfs_ioctl(hdl, ZFS_IOC_SET_PROP, &zc); + zcmd_free_nvlists(&zc); } if (err == 0 && snapholds_nvlist) { nvpair_t *pair; @@ -4812,7 +5173,12 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap, (void) zfs_error(hdl, EZFS_BADRESTORE, errbuf); break; case EACCES: - if (raw && stream_wantsnewfs) { + if (flags->heal) { + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "key must be loaded to do a non-raw " + "corrective recv on an encrypted " + "dataset.")); + } else if (raw && stream_wantsnewfs) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "failed to create encryption key")); } else if (raw && !stream_wantsnewfs) { @@ -4839,21 +5205,27 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap, *cp = '@'; break; case EINVAL: - if (flags->resumable) { - zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, - "kernel modules must be upgraded to " - "receive this stream.")); - } else if (embedded && !raw) { + if (embedded && !raw) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "incompatible embedded data stream " "feature with encrypted receive.")); + } else if (flags->resumable) { + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "kernel modules must be upgraded to " + "receive this stream.")); } (void) zfs_error(hdl, EZFS_BADSTREAM, errbuf); break; case ECKSUM: case ZFS_ERR_STREAM_TRUNCATED: - recv_ecksum_set_aux(hdl, destsnap, flags->resumable, - ioctl_err == ECKSUM); + if (flags->heal) + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "corrective receive was not able to " + "reconstruct the data needed for " + "healing.")); + else + recv_ecksum_set_aux(hdl, destsnap, + flags->resumable, ioctl_err == ECKSUM); (void) zfs_error(hdl, EZFS_BADSTREAM, errbuf); break; case ZFS_ERR_STREAM_LARGE_BLOCK_MISMATCH: @@ -4863,10 +5235,22 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap, (void) zfs_error(hdl, EZFS_BADSTREAM, errbuf); break; case ENOTSUP: - zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, - "pool must be upgraded to receive this stream.")); + if (flags->heal) + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "stream is not compatible with the " + "data in the pool.")); + else + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "pool must be upgraded to receive this " + "stream.")); (void) zfs_error(hdl, EZFS_BADVERSION, errbuf); break; + case ZFS_ERR_CRYPTO_NOTSUP: + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "stream uses crypto parameters not compatible with " + "this pool")); + (void) zfs_error(hdl, EZFS_BADSTREAM, errbuf); + break; case EDQUOT: zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "destination %s space quota exceeded."), name); @@ -4894,6 +5278,27 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap, "be updated.")); (void) zfs_error(hdl, EZFS_BADSTREAM, errbuf); break; + case ZFS_ERR_RESUME_EXISTS: + cp = strchr(destsnap, '@'); + if (newfs) { + /* it's the containing fs that exists */ + *cp = '\0'; + } + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "Resuming recv on existing dataset without force")); + (void) zfs_error_fmt(hdl, EZFS_RESUME_EXISTS, + dgettext(TEXT_DOMAIN, "cannot resume recv %s"), + destsnap); + *cp = '@'; + break; + case E2BIG: + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "zfs receive required kernel memory allocation " + "larger than the system can support. Please file " + "an issue at the OpenZFS issue tracker:\n" + "https://github.com/openzfs/zfs/issues/new")); + (void) zfs_error(hdl, EZFS_BADSTREAM, errbuf); + break; case EBUSY: if (hastoken) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, @@ -4903,7 +5308,7 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap, (void) zfs_error(hdl, EZFS_BUSY, errbuf); break; } - fallthrough; + zfs_fallthrough; default: (void) zfs_standard_error(hdl, ioctl_errno, errbuf); } @@ -4943,14 +5348,23 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap, char buf1[64]; char buf2[64]; uint64_t bytes = read_bytes; - time_t delta = time(NULL) - begin_time; - if (delta == 0) - delta = 1; + struct timespec delta; + clock_gettime(CLOCK_MONOTONIC_RAW, &delta); + if (begin_time.tv_nsec > delta.tv_nsec) { + delta.tv_nsec = + 1000000000 + delta.tv_nsec - begin_time.tv_nsec; + delta.tv_sec -= 1; + } else + delta.tv_nsec -= begin_time.tv_nsec; + delta.tv_sec -= begin_time.tv_sec; + if (delta.tv_sec == 0 && delta.tv_nsec == 0) + delta.tv_nsec = 1; + double delta_f = delta.tv_sec + (delta.tv_nsec / 1e9); zfs_nicebytes(bytes, buf1, sizeof (buf1)); - zfs_nicebytes(bytes/delta, buf2, sizeof (buf1)); + zfs_nicebytes(bytes / delta_f, buf2, sizeof (buf2)); - (void) printf("received %s stream in %lld seconds (%s/sec)\n", - buf1, (longlong_t)delta, buf2); + (void) printf("received %s stream in %.2f seconds (%s/sec)\n", + buf1, delta_f, buf2); } err = 0; @@ -4979,19 +5393,18 @@ static boolean_t zfs_receive_checkprops(libzfs_handle_t *hdl, nvlist_t *props, const char *errbuf) { - nvpair_t *nvp; + nvpair_t *nvp = NULL; zfs_prop_t prop; const char *name; - nvp = NULL; while ((nvp = nvlist_next_nvpair(props, nvp)) != NULL) { name = nvpair_name(nvp); prop = zfs_name_to_prop(name); - if (prop == ZPROP_INVAL) { + if (prop == ZPROP_USERPROP) { if (!zfs_prop_user(name)) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, - "invalid property '%s'"), name); + "%s: invalid property '%s'"), errbuf, name); return (B_FALSE); } continue; @@ -5015,7 +5428,7 @@ zfs_receive_checkprops(libzfs_handle_t *hdl, nvlist_t *props, if (zfs_prop_readonly(prop) || prop == ZFS_PROP_VERSION || prop == ZFS_PROP_VOLSIZE) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, - "invalid property '%s'"), name); + "%s: invalid property '%s'"), errbuf, name); return (B_FALSE); } } @@ -5032,7 +5445,7 @@ zfs_receive_impl(libzfs_handle_t *hdl, const char *tosnap, int err; dmu_replay_record_t drr, drr_noswap; struct drr_begin *drrb = &drr.drr_u.drr_begin; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; zio_cksum_t zcksum = { { 0 } }; uint64_t featureflags; int hdrtype; @@ -5041,9 +5454,8 @@ zfs_receive_impl(libzfs_handle_t *hdl, const char *tosnap, "cannot receive")); /* check cmdline props, raise an error if they cannot be received */ - if (!zfs_receive_checkprops(hdl, cmdprops, errbuf)) { + if (!zfs_receive_checkprops(hdl, cmdprops, errbuf)) return (zfs_error(hdl, EZFS_BADPROP, errbuf)); - } if (flags->isprefix && !zfs_dataset_exists(hdl, tosnap, ZFS_TYPE_DATASET)) { @@ -5077,7 +5489,7 @@ zfs_receive_impl(libzfs_handle_t *hdl, const char *tosnap, * We computed the checksum in the wrong byteorder in * recv_read() above; do it again correctly. */ - bzero(&zcksum, sizeof (zio_cksum_t)); + memset(&zcksum, 0, sizeof (zio_cksum_t)); fletcher_4_incremental_byteswap(&drr, sizeof (drr), &zcksum); flags->byteswap = B_TRUE; @@ -5175,7 +5587,7 @@ zfs_receive(libzfs_handle_t *hdl, const char *tosnap, nvlist_t *props, char *top_zfs = NULL; int err; struct stat sb; - char *originsnap = NULL; + const char *originsnap = NULL; /* * The only way fstat can fail is if we do not have a valid file @@ -5186,13 +5598,6 @@ zfs_receive(libzfs_handle_t *hdl, const char *tosnap, nvlist_t *props, return (-2); } - /* - * It is not uncommon for gigabytes to be processed in zfs receive. - * Speculatively increase the buffer size if supported by the platform. - */ - if (S_ISFIFO(sb.st_mode)) - libzfs_set_pipe_max(infd); - if (props) { err = nvlist_lookup_string(props, "origin", &originsnap); if (err && err != ENOENT) diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs_status.c b/sys/contrib/openzfs/lib/libzfs/libzfs_status.c index 33d6e1bfdf80..1ee703968237 100644 --- a/sys/contrib/openzfs/lib/libzfs/libzfs_status.c +++ b/sys/contrib/openzfs/lib/libzfs/libzfs_status.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -56,7 +57,7 @@ * in include/libzfs.h. Note that there are some status results which go past * the end of this table, and hence have no associated message ID. */ -static char *zfs_msgid_table[] = { +static const char *const zfs_msgid_table[] = { "ZFS-8000-14", /* ZPOOL_STATUS_CORRUPT_CACHE */ "ZFS-8000-2Q", /* ZPOOL_STATUS_MISSING_DEV_R */ "ZFS-8000-3C", /* ZPOOL_STATUS_MISSING_DEV_NR */ @@ -96,48 +97,48 @@ static char *zfs_msgid_table[] = { #define NMSGID (sizeof (zfs_msgid_table) / sizeof (zfs_msgid_table[0])) -/* ARGSUSED */ static int vdev_missing(vdev_stat_t *vs, uint_t vsc) { + (void) vsc; return (vs->vs_state == VDEV_STATE_CANT_OPEN && vs->vs_aux == VDEV_AUX_OPEN_FAILED); } -/* ARGSUSED */ static int vdev_faulted(vdev_stat_t *vs, uint_t vsc) { + (void) vsc; return (vs->vs_state == VDEV_STATE_FAULTED); } -/* ARGSUSED */ static int vdev_errors(vdev_stat_t *vs, uint_t vsc) { + (void) vsc; return (vs->vs_state == VDEV_STATE_DEGRADED || vs->vs_read_errors != 0 || vs->vs_write_errors != 0 || vs->vs_checksum_errors != 0); } -/* ARGSUSED */ static int vdev_broken(vdev_stat_t *vs, uint_t vsc) { + (void) vsc; return (vs->vs_state == VDEV_STATE_CANT_OPEN); } -/* ARGSUSED */ static int vdev_offlined(vdev_stat_t *vs, uint_t vsc) { + (void) vsc; return (vs->vs_state == VDEV_STATE_OFFLINE); } -/* ARGSUSED */ static int vdev_removed(vdev_stat_t *vs, uint_t vsc) { + (void) vsc; return (vs->vs_state == VDEV_STATE_REMOVED); } @@ -159,8 +160,7 @@ find_vdev_problem(nvlist_t *vdev, int (*func)(vdev_stat_t *, uint_t), boolean_t ignore_replacing) { nvlist_t **child; - vdev_stat_t *vs; - uint_t c, vsc, children; + uint_t c, children; /* * Ignore problems within a 'replacing' vdev, since we're presumably in @@ -169,10 +169,8 @@ find_vdev_problem(nvlist_t *vdev, int (*func)(vdev_stat_t *, uint_t), * later. */ if (ignore_replacing == B_TRUE) { - char *type; - - verify(nvlist_lookup_string(vdev, ZPOOL_CONFIG_TYPE, - &type) == 0); + const char *type = fnvlist_lookup_string(vdev, + ZPOOL_CONFIG_TYPE); if (strcmp(type, VDEV_TYPE_REPLACING) == 0) return (B_FALSE); } @@ -183,9 +181,9 @@ find_vdev_problem(nvlist_t *vdev, int (*func)(vdev_stat_t *, uint_t), if (find_vdev_problem(child[c], func, ignore_replacing)) return (B_TRUE); } else { - verify(nvlist_lookup_uint64_array(vdev, ZPOOL_CONFIG_VDEV_STATS, - (uint64_t **)&vs, &vsc) == 0); - + 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) return (B_TRUE); } @@ -224,26 +222,20 @@ static zpool_status_t check_status(nvlist_t *config, boolean_t isimport, zpool_errata_t *erratap, const char *compat) { - nvlist_t *nvroot; - vdev_stat_t *vs; pool_scan_stat_t *ps = NULL; uint_t vsc, psc; - uint64_t nerr; - uint64_t version; - uint64_t stateval; uint64_t suspended; uint64_t hostid = 0; uint64_t errata = 0; unsigned long system_hostid = get_system_hostid(); - verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION, - &version) == 0); - verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, - &nvroot) == 0); - verify(nvlist_lookup_uint64_array(nvroot, ZPOOL_CONFIG_VDEV_STATS, - (uint64_t **)&vs, &vsc) == 0); - verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_STATE, - &stateval) == 0); + uint64_t version = fnvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION); + nvlist_t *nvroot = fnvlist_lookup_nvlist(config, + ZPOOL_CONFIG_VDEV_TREE); + vdev_stat_t *vs = (vdev_stat_t *)fnvlist_lookup_uint64_array(nvroot, + ZPOOL_CONFIG_VDEV_STATS, &vsc); + uint64_t stateval = fnvlist_lookup_uint64(config, + ZPOOL_CONFIG_POOL_STATE); /* * Currently resilvering a vdev @@ -337,10 +329,8 @@ check_status(nvlist_t *config, boolean_t isimport, */ if (vs->vs_state == VDEV_STATE_CANT_OPEN && vs->vs_aux == VDEV_AUX_UNSUP_FEAT) { - nvlist_t *nvinfo; - - verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_LOAD_INFO, - &nvinfo) == 0); + nvlist_t *nvinfo = fnvlist_lookup_nvlist(config, + ZPOOL_CONFIG_LOAD_INFO); if (nvlist_exists(nvinfo, ZPOOL_CONFIG_CAN_RDONLY)) return (ZPOOL_STATUS_UNSUP_FEAT_WRITE); return (ZPOOL_STATUS_UNSUP_FEAT_READ); @@ -403,6 +393,7 @@ check_status(nvlist_t *config, boolean_t isimport, * Persistent data errors. */ if (!isimport) { + uint64_t nerr; if (nvlist_lookup_uint64(config, ZPOOL_CONFIG_ERRCOUNT, &nerr) == 0 && nerr != 0) return (ZPOOL_STATUS_CORRUPT_DATA); @@ -506,7 +497,8 @@ check_status(nvlist_t *config, boolean_t isimport, } zpool_status_t -zpool_get_status(zpool_handle_t *zhp, char **msgid, zpool_errata_t *errata) +zpool_get_status(zpool_handle_t *zhp, const char **msgid, + zpool_errata_t *errata) { /* * pass in the desired feature set, as @@ -530,7 +522,8 @@ zpool_get_status(zpool_handle_t *zhp, char **msgid, zpool_errata_t *errata) } zpool_status_t -zpool_import_status(nvlist_t *config, char **msgid, zpool_errata_t *errata) +zpool_import_status(nvlist_t *config, const char **msgid, + zpool_errata_t *errata) { zpool_status_t ret = check_status(config, B_TRUE, errata, NULL); diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs_util.c b/sys/contrib/openzfs/lib/libzfs/libzfs_util.c index c3c009ae3a10..4edddc2a759b 100644 --- a/sys/contrib/openzfs/lib/libzfs/libzfs_util.c +++ b/sys/contrib/openzfs/lib/libzfs/libzfs_util.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -22,7 +23,7 @@ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright 2020 Joyent, Inc. All rights reserved. - * Copyright (c) 2011, 2020 by Delphix. All rights reserved. + * Copyright (c) 2011, 2024 by Delphix. All rights reserved. * Copyright 2016 Igor Kozhukhov <ikozhukhov@gmail.com> * Copyright (c) 2017 Datto Inc. * Copyright (c) 2020 The FreeBSD Foundation @@ -68,6 +69,7 @@ * as necessary. */ #define URI_REGEX "^\\([A-Za-z][A-Za-z0-9+.\\-]*\\):" +#define STR_NUMS "0123456789" int libzfs_errno(libzfs_handle_t *hdl) @@ -170,6 +172,8 @@ libzfs_error_description(libzfs_handle_t *hdl) return (dgettext(TEXT_DOMAIN, "I/O error")); case EZFS_INTR: return (dgettext(TEXT_DOMAIN, "signal received")); + case EZFS_CKSUM: + return (dgettext(TEXT_DOMAIN, "insufficient replicas")); case EZFS_ISSPARE: return (dgettext(TEXT_DOMAIN, "device is reserved as a hot " "spare")); @@ -241,10 +245,20 @@ libzfs_error_description(libzfs_handle_t *hdl) "into a new one")); case EZFS_SCRUB_PAUSED: return (dgettext(TEXT_DOMAIN, "scrub is paused; " - "use 'zpool scrub' to resume")); + "use 'zpool scrub' to resume scrub")); + case EZFS_SCRUB_PAUSED_TO_CANCEL: + return (dgettext(TEXT_DOMAIN, "scrub is paused; " + "use 'zpool scrub' to resume or 'zpool scrub -s' to " + "cancel scrub")); case EZFS_SCRUBBING: return (dgettext(TEXT_DOMAIN, "currently scrubbing; " - "use 'zpool scrub -s' to cancel current scrub")); + "use 'zpool scrub -s' to cancel scrub")); + case EZFS_ERRORSCRUBBING: + return (dgettext(TEXT_DOMAIN, "currently error scrubbing; " + "use 'zpool scrub -s' to cancel error scrub")); + case EZFS_ERRORSCRUB_PAUSED: + return (dgettext(TEXT_DOMAIN, "error scrub is paused; " + "use 'zpool scrub -e' to resume error scrub")); case EZFS_NO_SCRUB: return (dgettext(TEXT_DOMAIN, "there is no active scrub")); case EZFS_DIFF: @@ -296,6 +310,20 @@ libzfs_error_description(libzfs_handle_t *hdl) case EZFS_REBUILDING: return (dgettext(TEXT_DOMAIN, "currently sequentially " "resilvering")); + case EZFS_VDEV_NOTSUP: + return (dgettext(TEXT_DOMAIN, "operation not supported " + "on this type of vdev")); + case EZFS_NOT_USER_NAMESPACE: + return (dgettext(TEXT_DOMAIN, "the provided file " + "was not a user namespace file")); + case EZFS_RESUME_EXISTS: + return (dgettext(TEXT_DOMAIN, "Resuming recv on existing " + "dataset without force")); + case EZFS_RAIDZ_EXPAND_IN_PROGRESS: + return (dgettext(TEXT_DOMAIN, "raidz expansion in progress")); + case EZFS_ASHIFT_MISMATCH: + return (dgettext(TEXT_DOMAIN, "adding devices with " + "different physical sector sizes is not allowed")); case EZFS_UNKNOWN: return (dgettext(TEXT_DOMAIN, "unknown error")); default: @@ -390,6 +418,10 @@ zfs_common_error(libzfs_handle_t *hdl, int error, const char *fmt, case EINTR: zfs_verror(hdl, EZFS_INTR, fmt, ap); return (-1); + + case ECKSUM: + zfs_verror(hdl, EZFS_CKSUM, fmt, ap); + return (-1); } return (0); @@ -482,8 +514,11 @@ zfs_standard_error_fmt(libzfs_handle_t *hdl, int error, const char *fmt, ...) case ZFS_ERR_BADPROP: zfs_verror(hdl, EZFS_BADPROP, fmt, ap); break; + case ZFS_ERR_NOT_USER_NAMESPACE: + zfs_verror(hdl, EZFS_NOT_USER_NAMESPACE, fmt, ap); + break; default: - zfs_error_aux(hdl, "%s", strerror(error)); + zfs_error_aux(hdl, "%s", zfs_strerror(error)); zfs_verror(hdl, EZFS_UNKNOWN, fmt, ap); break; } @@ -597,8 +632,8 @@ zfs_setprop_error(libzfs_handle_t *hdl, zfs_prop_t prop, int err, (void) zfs_error(hdl, EZFS_VOLTOOBIG, errbuf); break; } + zfs_fallthrough; #endif - fallthrough; default: (void) zfs_standard_error(hdl, err, errbuf); } @@ -670,7 +705,7 @@ zpool_standard_error_fmt(libzfs_handle_t *hdl, int error, const char *fmt, ...) case ENOSPC: case EDQUOT: zfs_verror(hdl, EZFS_NOSPC, fmt, ap); - return (-1); + break; case EAGAIN: zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, @@ -716,6 +751,9 @@ zpool_standard_error_fmt(libzfs_handle_t *hdl, int error, const char *fmt, ...) case ZFS_ERR_BADPROP: zfs_verror(hdl, EZFS_BADPROP, fmt, ap); break; + case ZFS_ERR_VDEV_NOTSUP: + zfs_verror(hdl, EZFS_VDEV_NOTSUP, fmt, ap); + break; case ZFS_ERR_IOC_CMD_UNAVAIL: zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "the loaded zfs " "module does not support this operation. A reboot may " @@ -732,8 +770,14 @@ zpool_standard_error_fmt(libzfs_handle_t *hdl, int error, const char *fmt, ...) case ZFS_ERR_IOC_ARG_BADTYPE: zfs_verror(hdl, EZFS_IOC_NOTSUPPORTED, fmt, ap); break; + case ZFS_ERR_RAIDZ_EXPAND_IN_PROGRESS: + zfs_verror(hdl, EZFS_RAIDZ_EXPAND_IN_PROGRESS, fmt, ap); + break; + case ZFS_ERR_ASHIFT_MISMATCH: + zfs_verror(hdl, EZFS_ASHIFT_MISMATCH, fmt, ap); + break; default: - zfs_error_aux(hdl, "%s", strerror(error)); + zfs_error_aux(hdl, "%s", zfs_strerror(error)); zfs_verror(hdl, EZFS_UNKNOWN, fmt, ap); } @@ -741,6 +785,12 @@ zpool_standard_error_fmt(libzfs_handle_t *hdl, int error, const char *fmt, ...) return (-1); } +int +zfs_ioctl(libzfs_handle_t *hdl, int request, zfs_cmd_t *zc) +{ + return (lzc_ioctl_fd(hdl->libzfs_fd, request, zc)); +} + /* * Display an out of memory error message and abort the current program. */ @@ -801,7 +851,7 @@ zfs_realloc(libzfs_handle_t *hdl, void *ptr, size_t oldsize, size_t newsize) return (NULL); } - bzero((char *)ret + oldsize, (newsize - oldsize)); + memset((char *)ret + oldsize, 0, newsize - oldsize); return (ret); } @@ -889,6 +939,7 @@ libzfs_run_process_impl(const char *path, char *argv[], char *env[], int flags, pid = fork(); if (pid == 0) { /* Child process */ + setpgid(0, 0); devnull_fd = open("/dev/null", O_WRONLY | O_CLOEXEC); if (devnull_fd < 0) @@ -987,16 +1038,13 @@ libzfs_free_str_array(char **strs, int count) * * Returns 0 otherwise. */ -int -libzfs_envvar_is_set(char *envvar) +boolean_t +libzfs_envvar_is_set(const char *envvar) { char *env = getenv(envvar); - if (env && (strtoul(env, NULL, 0) > 0 || + return (env && (strtoul(env, NULL, 0) > 0 || (!strncasecmp(env, "YES", 3) && strnlen(env, 4) == 3) || - (!strncasecmp(env, "ON", 2) && strnlen(env, 3) == 2))) - return (1); - - return (0); + (!strncasecmp(env, "ON", 2) && strnlen(env, 3) == 2))); } libzfs_handle_t * @@ -1034,6 +1082,7 @@ libzfs_init(void) zfs_prop_init(); zpool_prop_init(); zpool_feature_init(); + vdev_prop_init(); libzfs_mnttab_init(hdl); fletcher_4_init(); @@ -1142,7 +1191,7 @@ zfs_path_to_zhandle(libzfs_handle_t *hdl, const char *path, zfs_type_t argtype) * Initialize the zc_nvlist_dst member to prepare for receiving an nvlist from * an ioctl(). */ -int +void zcmd_alloc_dst_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc, size_t len) { if (len == 0) @@ -1150,10 +1199,6 @@ zcmd_alloc_dst_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc, size_t len) zc->zc_nvlist_dst_size = len; zc->zc_nvlist_dst = (uint64_t)(uintptr_t)zfs_alloc(hdl, zc->zc_nvlist_dst_size); - if (zc->zc_nvlist_dst == 0) - return (-1); - - return (0); } /* @@ -1161,16 +1206,12 @@ zcmd_alloc_dst_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc, size_t len) * expand the nvlist to the size specified in 'zc_nvlist_dst_size', which was * filled in by the kernel to indicate the actual required size. */ -int +void zcmd_expand_dst_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc) { free((void *)(uintptr_t)zc->zc_nvlist_dst); zc->zc_nvlist_dst = (uint64_t)(uintptr_t)zfs_alloc(hdl, zc->zc_nvlist_dst_size); - if (zc->zc_nvlist_dst == 0) - return (-1); - - return (0); } /* @@ -1187,38 +1228,33 @@ zcmd_free_nvlists(zfs_cmd_t *zc) zc->zc_nvlist_dst = 0; } -static int +static void zcmd_write_nvlist_com(libzfs_handle_t *hdl, uint64_t *outnv, uint64_t *outlen, nvlist_t *nvl) { char *packed; - size_t len; - verify(nvlist_size(nvl, &len, NV_ENCODE_NATIVE) == 0); - - if ((packed = zfs_alloc(hdl, len)) == NULL) - return (-1); + size_t len = fnvlist_size(nvl); + packed = zfs_alloc(hdl, len); verify(nvlist_pack(nvl, &packed, &len, NV_ENCODE_NATIVE, 0) == 0); *outnv = (uint64_t)(uintptr_t)packed; *outlen = len; - - return (0); } -int +void zcmd_write_conf_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc, nvlist_t *nvl) { - return (zcmd_write_nvlist_com(hdl, &zc->zc_nvlist_conf, - &zc->zc_nvlist_conf_size, nvl)); + zcmd_write_nvlist_com(hdl, &zc->zc_nvlist_conf, + &zc->zc_nvlist_conf_size, nvl); } -int +void zcmd_write_src_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc, nvlist_t *nvl) { - return (zcmd_write_nvlist_com(hdl, &zc->zc_nvlist_src, - &zc->zc_nvlist_src_size, nvl)); + zcmd_write_nvlist_com(hdl, &zc->zc_nvlist_src, + &zc->zc_nvlist_src_size, nvl); } /* @@ -1240,10 +1276,18 @@ zcmd_read_dst_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc, nvlist_t **nvlp) * ================================================================ */ +void +zcmd_print_json(nvlist_t *nvl) +{ + nvlist_print_json(stdout, nvl); + (void) putchar('\n'); + nvlist_free(nvl); +} + static void zprop_print_headers(zprop_get_cbdata_t *cbp, zfs_type_t type) { - zprop_list_t *pl = cbp->cb_proplist; + zprop_list_t *pl; int i; char *title; size_t len; @@ -1267,7 +1311,8 @@ zprop_print_headers(zprop_get_cbdata_t *cbp, zfs_type_t type) /* first property is always NAME */ assert(cbp->cb_proplist->pl_prop == - ((type == ZFS_TYPE_POOL) ? ZPOOL_PROP_NAME : ZFS_PROP_NAME)); + ((type == ZFS_TYPE_POOL) ? ZPOOL_PROP_NAME : + ((type == ZFS_TYPE_VDEV) ? VDEV_PROP_NAME : ZFS_PROP_NAME))); /* * Go through and calculate the widths for each column. For the @@ -1281,15 +1326,19 @@ zprop_print_headers(zprop_get_cbdata_t *cbp, zfs_type_t type) /* * 'PROPERTY' column */ - if (pl->pl_prop != ZPROP_INVAL) { + if (pl->pl_prop != ZPROP_USERPROP) { const char *propname = (type == ZFS_TYPE_POOL) ? zpool_prop_to_name(pl->pl_prop) : - zfs_prop_to_name(pl->pl_prop); + ((type == ZFS_TYPE_VDEV) ? + vdev_prop_to_name(pl->pl_prop) : + zfs_prop_to_name(pl->pl_prop)); + assert(propname != NULL); len = strlen(propname); if (len > cbp->cb_colwidths[GET_COL_PROPERTY]) cbp->cb_colwidths[GET_COL_PROPERTY] = len; } else { + assert(pl->pl_user_prop != NULL); len = strlen(pl->pl_user_prop); if (len > cbp->cb_colwidths[GET_COL_PROPERTY]) cbp->cb_colwidths[GET_COL_PROPERTY] = len; @@ -1314,9 +1363,10 @@ zprop_print_headers(zprop_get_cbdata_t *cbp, zfs_type_t type) /* * 'NAME' and 'SOURCE' columns */ - if (pl->pl_prop == (type == ZFS_TYPE_POOL ? ZPOOL_PROP_NAME : - ZFS_PROP_NAME) && - pl->pl_width > cbp->cb_colwidths[GET_COL_NAME]) { + if (pl->pl_prop == ((type == ZFS_TYPE_POOL) ? ZPOOL_PROP_NAME : + ((type == ZFS_TYPE_VDEV) ? VDEV_PROP_NAME : + ZFS_PROP_NAME)) && pl->pl_width > + cbp->cb_colwidths[GET_COL_NAME]) { cbp->cb_colwidths[GET_COL_NAME] = pl->pl_width; cbp->cb_colwidths[GET_COL_SOURCE] = pl->pl_width + strlen(dgettext(TEXT_DOMAIN, "inherited from")); @@ -1361,6 +1411,103 @@ zprop_print_headers(zprop_get_cbdata_t *cbp, zfs_type_t type) } /* + * Add property value and source to provided nvlist, according to + * settings in cb structure. Later to be printed in JSON format. + */ +int +zprop_nvlist_one_property(const char *propname, + const char *value, zprop_source_t sourcetype, const char *source, + const char *recvd_value, nvlist_t *nvl, boolean_t as_int) +{ + int ret = 0; + nvlist_t *src_nv, *prop; + boolean_t all_numeric = strspn(value, STR_NUMS) == strlen(value); + src_nv = prop = NULL; + + if ((nvlist_alloc(&prop, NV_UNIQUE_NAME, 0) != 0) || + (nvlist_alloc(&src_nv, NV_UNIQUE_NAME, 0) != 0)) { + ret = -1; + goto err; + } + + if (as_int && all_numeric) { + uint64_t val; + sscanf(value, "%lld", (u_longlong_t *)&val); + if (nvlist_add_uint64(prop, "value", val) != 0) { + ret = -1; + goto err; + } + } else { + if (nvlist_add_string(prop, "value", value) != 0) { + ret = -1; + goto err; + } + } + + switch (sourcetype) { + case ZPROP_SRC_NONE: + if (nvlist_add_string(src_nv, "type", "NONE") != 0 || + (nvlist_add_string(src_nv, "data", "-") != 0)) { + ret = -1; + goto err; + } + break; + case ZPROP_SRC_DEFAULT: + if (nvlist_add_string(src_nv, "type", "DEFAULT") != 0 || + (nvlist_add_string(src_nv, "data", "-") != 0)) { + ret = -1; + goto err; + } + break; + case ZPROP_SRC_LOCAL: + if (nvlist_add_string(src_nv, "type", "LOCAL") != 0 || + (nvlist_add_string(src_nv, "data", "-") != 0)) { + ret = -1; + goto err; + } + break; + case ZPROP_SRC_TEMPORARY: + if (nvlist_add_string(src_nv, "type", "TEMPORARY") != 0 || + (nvlist_add_string(src_nv, "data", "-") != 0)) { + ret = -1; + goto err; + } + break; + case ZPROP_SRC_INHERITED: + if (nvlist_add_string(src_nv, "type", "INHERITED") != 0 || + (nvlist_add_string(src_nv, "data", source) != 0)) { + ret = -1; + goto err; + } + break; + case ZPROP_SRC_RECEIVED: + if (nvlist_add_string(src_nv, "type", "RECEIVED") != 0 || + (nvlist_add_string(src_nv, "data", + (recvd_value == NULL ? "-" : recvd_value)) != 0)) { + ret = -1; + goto err; + } + break; + default: + assert(!"unhandled zprop_source_t"); + if (nvlist_add_string(src_nv, "type", + "unhandled zprop_source_t") != 0) { + ret = -1; + goto err; + } + } + if ((nvlist_add_nvlist(prop, "source", src_nv) != 0) || + (nvlist_add_nvlist(nvl, propname, prop)) != 0) { + ret = -1; + goto err; + } +err: + nvlist_free(src_nv); + nvlist_free(prop); + return (ret); +} + +/* * Display a single line of output, according to the settings in the callback * structure. */ @@ -1451,6 +1598,26 @@ zprop_print_one_property(const char *name, zprop_get_cbdata_t *cbp, (void) printf("\n"); } +int +zprop_collect_property(const char *name, zprop_get_cbdata_t *cbp, + const char *propname, const char *value, zprop_source_t sourcetype, + const char *source, const char *recvd_value, nvlist_t *nvl) +{ + if (cbp->cb_json) { + if ((sourcetype & cbp->cb_sources) == 0) + return (0); + else { + return (zprop_nvlist_one_property(propname, value, + sourcetype, source, recvd_value, nvl, + cbp->cb_json_as_int)); + } + } else { + zprop_print_one_property(name, cbp, + propname, value, sourcetype, source, recvd_value); + return (0); + } +} + /* * Given a numeric suffix, convert the value into a number of bits that the * resulting value must be shifted. @@ -1459,15 +1626,17 @@ static int str2shift(libzfs_handle_t *hdl, const char *buf) { const char *ends = "BKMGTPEZ"; - int i; + int i, len; if (buf[0] == '\0') return (0); - for (i = 0; i < strlen(ends); i++) { + + len = strlen(ends); + for (i = 0; i < len; i++) { if (toupper(buf[0]) == ends[i]) break; } - if (i == strlen(ends)) { + if (i == len) { if (hdl) zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "invalid numeric suffix '%s'"), buf); @@ -1583,13 +1752,13 @@ zfs_nicestrtonum(libzfs_handle_t *hdl, const char *value, uint64_t *num) */ int zprop_parse_value(libzfs_handle_t *hdl, nvpair_t *elem, int prop, - zfs_type_t type, nvlist_t *ret, char **svalp, uint64_t *ivalp, + zfs_type_t type, nvlist_t *ret, const char **svalp, uint64_t *ivalp, const char *errbuf) { data_type_t datatype = nvpair_type(elem); zprop_type_t proptype; const char *propname; - char *value; + const char *value; boolean_t isnone = B_FALSE; boolean_t isauto = B_FALSE; int err = 0; @@ -1597,6 +1766,9 @@ zprop_parse_value(libzfs_handle_t *hdl, nvpair_t *elem, int prop, if (type == ZFS_TYPE_POOL) { proptype = zpool_prop_get_type(prop); propname = zpool_prop_to_name(prop); + } else if (type == ZFS_TYPE_VDEV) { + proptype = vdev_prop_get_type(prop); + propname = vdev_prop_to_name(prop); } else { proptype = zfs_prop_get_type(prop); propname = zfs_prop_to_name(prop); @@ -1655,6 +1827,16 @@ zprop_parse_value(libzfs_handle_t *hdl, nvpair_t *elem, int prop, "use 'none' to disable quota/refquota")); goto error; } + /* + * Pool dedup table quota; force use of 'none' instead of 0 + */ + if ((type & ZFS_TYPE_POOL) && *ivalp == 0 && + (!isnone && !isauto) && + prop == ZPOOL_PROP_DEDUP_TABLE_QUOTA) { + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "use 'none' to disable ddt table quota")); + goto error; + } /* * Special handling for "*_limit=none". In this case it's not @@ -1667,6 +1849,20 @@ zprop_parse_value(libzfs_handle_t *hdl, nvpair_t *elem, int prop, } /* + * Special handling for "checksum_*=none". In this case it's not + * 0 but UINT64_MAX. + */ + if ((type & ZFS_TYPE_VDEV) && isnone && + (prop == VDEV_PROP_CHECKSUM_N || + prop == VDEV_PROP_CHECKSUM_T || + prop == VDEV_PROP_IO_N || + prop == VDEV_PROP_IO_T || + prop == VDEV_PROP_SLOW_IO_N || + prop == VDEV_PROP_SLOW_IO_T)) { + *ivalp = UINT64_MAX; + } + + /* * Special handling for setting 'refreservation' to 'auto'. Use * UINT64_MAX to tell the caller to use zfs_fix_auto_resv(). * 'auto' is only allowed on volumes. @@ -1682,6 +1878,10 @@ zprop_parse_value(libzfs_handle_t *hdl, nvpair_t *elem, int prop, } *ivalp = UINT64_MAX; break; + case ZPOOL_PROP_DEDUP_TABLE_QUOTA: + ASSERT(type & ZFS_TYPE_POOL); + *ivalp = UINT64_MAX; + break; default: zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "'auto' is invalid value for '%s'"), @@ -1735,43 +1935,35 @@ error: } static int -addlist(libzfs_handle_t *hdl, char *propname, zprop_list_t **listp, +addlist(libzfs_handle_t *hdl, const char *propname, zprop_list_t **listp, zfs_type_t type) { - int prop; - zprop_list_t *entry; - - prop = zprop_name_to_prop(propname, type); - + int prop = zprop_name_to_prop(propname, type); if (prop != ZPROP_INVAL && !zprop_valid_for_type(prop, type, B_FALSE)) prop = ZPROP_INVAL; /* - * When no property table entry can be found, return failure if - * this is a pool property or if this isn't a user-defined - * dataset property, + * Return failure if no property table entry was found and this isn't + * a user-defined property. */ - if (prop == ZPROP_INVAL && ((type == ZFS_TYPE_POOL && + if (prop == ZPROP_USERPROP && ((type == ZFS_TYPE_POOL && + !zfs_prop_user(propname) && !zpool_prop_feature(propname) && !zpool_prop_unsupported(propname)) || - (type == ZFS_TYPE_DATASET && !zfs_prop_user(propname) && - !zfs_prop_userquota(propname) && !zfs_prop_written(propname)))) { + ((type == ZFS_TYPE_DATASET) && !zfs_prop_user(propname) && + !zfs_prop_userquota(propname) && !zfs_prop_written(propname)) || + ((type == ZFS_TYPE_VDEV) && !vdev_prop_user(propname)))) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "invalid property '%s'"), propname); return (zfs_error(hdl, EZFS_BADPROP, dgettext(TEXT_DOMAIN, "bad property list"))); } - if ((entry = zfs_alloc(hdl, sizeof (zprop_list_t))) == NULL) - return (-1); + zprop_list_t *entry = zfs_alloc(hdl, sizeof (*entry)); entry->pl_prop = prop; - if (prop == ZPROP_INVAL) { - if ((entry->pl_user_prop = zfs_strdup(hdl, propname)) == - NULL) { - free(entry); - return (-1); - } + if (prop == ZPROP_USERPROP) { + entry->pl_user_prop = zfs_strdup(hdl, propname); entry->pl_width = strlen(propname); } else { entry->pl_width = zprop_width(prop, &entry->pl_fixed, @@ -1811,62 +2003,25 @@ zprop_get_list(libzfs_handle_t *hdl, char *props, zprop_list_t **listp, "bad property list"))); } - /* - * It would be nice to use getsubopt() here, but the inclusion of column - * aliases makes this more effort than it's worth. - */ - while (*props != '\0') { - size_t len; - char *p; - char c; - - if ((p = strchr(props, ',')) == NULL) { - len = strlen(props); - p = props + len; - } else { - len = p - props; - } - - /* - * Check for empty options. - */ - if (len == 0) { - zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, - "empty property name")); - return (zfs_error(hdl, EZFS_BADPROP, - dgettext(TEXT_DOMAIN, "bad property list"))); - } - - /* - * Check all regular property names. - */ - c = props[len]; - props[len] = '\0'; - - if (strcmp(props, "space") == 0) { - static char *spaceprops[] = { + for (char *p; (p = strsep(&props, ",")); ) + if (strcmp(p, "space") == 0) { + static const char *const spaceprops[] = { "name", "avail", "used", "usedbysnapshots", "usedbydataset", "usedbyrefreservation", - "usedbychildren", NULL + "usedbychildren" }; - int i; - for (i = 0; spaceprops[i]; i++) { + for (int i = 0; i < ARRAY_SIZE(spaceprops); i++) { if (addlist(hdl, spaceprops[i], listp, type)) return (-1); listp = &(*listp)->pl_next; } } else { - if (addlist(hdl, props, listp, type)) + if (addlist(hdl, p, listp, type)) return (-1); listp = &(*listp)->pl_next; } - props = p; - if (c == ',') - props++; - } - return (0); } @@ -1895,8 +2050,7 @@ zprop_expand_list_cb(int prop, void *cb) zprop_list_t *entry; expand_data_t *edp = cb; - if ((entry = zfs_alloc(edp->hdl, sizeof (zprop_list_t))) == NULL) - return (ZPROP_INVAL); + entry = zfs_alloc(edp->hdl, sizeof (zprop_list_t)); entry->pl_prop = prop; entry->pl_width = zprop_width(prop, &entry->pl_fixed, edp->type); @@ -1935,11 +2089,9 @@ zprop_expand_list(libzfs_handle_t *hdl, zprop_list_t **plp, zfs_type_t type) * Add 'name' to the beginning of the list, which is handled * specially. */ - if ((entry = zfs_alloc(hdl, sizeof (zprop_list_t))) == NULL) - return (-1); - - entry->pl_prop = (type == ZFS_TYPE_POOL) ? ZPOOL_PROP_NAME : - ZFS_PROP_NAME; + entry = zfs_alloc(hdl, sizeof (zprop_list_t)); + entry->pl_prop = ((type == ZFS_TYPE_POOL) ? ZPOOL_PROP_NAME : + ((type == ZFS_TYPE_VDEV) ? VDEV_PROP_NAME : ZFS_PROP_NAME)); entry->pl_width = zprop_width(entry->pl_prop, &entry->pl_fixed, type); entry->pl_all = B_TRUE; @@ -1956,45 +2108,66 @@ zprop_iter(zprop_func func, void *cb, boolean_t show_all, boolean_t ordered, return (zprop_iter_common(func, cb, show_all, ordered, type)); } -/* - * Fill given version buffer with zfs userland version - */ -void -zfs_version_userland(char *version, int len) +const char * +zfs_version_userland(void) { - (void) strlcpy(version, ZFS_META_ALIAS, len); + return (ZFS_META_ALIAS); } /* * Prints both zfs userland and kernel versions - * Returns 0 on success, and -1 on error (with errno set) + * Returns 0 on success, and -1 on error */ int zfs_version_print(void) { - char zver_userland[128]; - char zver_kernel[128]; - - zfs_version_userland(zver_userland, sizeof (zver_userland)); - - (void) printf("%s\n", zver_userland); + (void) puts(ZFS_META_ALIAS); - if (zfs_version_kernel(zver_kernel, sizeof (zver_kernel)) == -1) { + char *kver = zfs_version_kernel(); + if (kver == NULL) { fprintf(stderr, "zfs_version_kernel() failed: %s\n", - strerror(errno)); + zfs_strerror(errno)); return (-1); } - (void) printf("zfs-kmod-%s\n", zver_kernel); - + (void) printf("zfs-kmod-%s\n", kver); + free(kver); return (0); } /* + * Returns an nvlist with both zfs userland and kernel versions. + * Returns NULL on error. + */ +nvlist_t * +zfs_version_nvlist(void) +{ + nvlist_t *nvl; + char kmod_ver[64]; + if (nvlist_alloc(&nvl, NV_UNIQUE_NAME, 0) != 0) + return (NULL); + if (nvlist_add_string(nvl, "userland", ZFS_META_ALIAS) != 0) + goto err; + char *kver = zfs_version_kernel(); + if (kver == NULL) { + fprintf(stderr, "zfs_version_kernel() failed: %s\n", + zfs_strerror(errno)); + goto err; + } + (void) snprintf(kmod_ver, 64, "zfs-kmod-%s", kver); + if (nvlist_add_string(nvl, "kernel", kmod_ver) != 0) + goto err; + return (nvl); +err: + nvlist_free(nvl); + return (NULL); +} + +/* * Return 1 if the user requested ANSI color output, and our terminal supports * it. Return 0 for no color. */ -static int +int use_color(void) { static int use_color = -1; @@ -2040,31 +2213,39 @@ use_color(void) } /* - * color_start() and color_end() are used for when you want to colorize a block - * of text. For example: + * The functions color_start() and color_end() are used for when you want + * to colorize a block of text. * - * color_start(ANSI_RED_FG) + * For example: + * color_start(ANSI_RED) * printf("hello"); * printf("world"); * color_end(); */ void -color_start(char *color) +color_start(const char *color) { - if (use_color()) - printf("%s", color); + if (color && use_color()) { + fputs(color, stdout); + fflush(stdout); + } } void color_end(void) { - if (use_color()) - printf(ANSI_RESET); + if (use_color()) { + fputs(ANSI_RESET, stdout); + fflush(stdout); + } + } -/* printf() with a color. If color is NULL, then do a normal printf. */ +/* + * printf() with a color. If color is NULL, then do a normal printf. + */ int -printf_color(char *color, char *format, ...) +printf_color(const char *color, const char *format, ...) { va_list aptr; int rc; @@ -2081,3 +2262,196 @@ printf_color(char *color, char *format, ...) return (rc); } + +/* PATH + 5 env vars + a NULL entry = 7 */ +#define ZPOOL_VDEV_SCRIPT_ENV_COUNT 7 + +/* + * There's a few places where ZFS will call external scripts (like the script + * in zpool.d/ and `zfs_prepare_disk`). These scripts are called with a + * reduced $PATH, and some vdev specific environment vars set. This function + * will allocate an populate the environment variable array that is passed to + * these scripts. The user must free the arrays with zpool_vdev_free_env() when + * they are done. + * + * The following env vars will be set (but value could be blank): + * + * POOL_NAME + * VDEV_PATH + * VDEV_UPATH + * VDEV_ENC_SYSFS_PATH + * + * In addition, you can set an optional environment variable named 'opt_key' + * to 'opt_val' if you want. + * + * Returns allocated env[] array on success, NULL otherwise. + */ +char ** +zpool_vdev_script_alloc_env(const char *pool_name, + const char *vdev_path, const char *vdev_upath, + const char *vdev_enc_sysfs_path, const char *opt_key, const char *opt_val) +{ + char **env = NULL; + int rc; + + env = calloc(ZPOOL_VDEV_SCRIPT_ENV_COUNT, sizeof (*env)); + if (!env) + return (NULL); + + env[0] = strdup("PATH=/bin:/sbin:/usr/bin:/usr/sbin"); + if (!env[0]) + goto error; + + /* Setup our custom environment variables */ + rc = asprintf(&env[1], "POOL_NAME=%s", pool_name ? pool_name : ""); + if (rc == -1) { + env[1] = NULL; + goto error; + } + + rc = asprintf(&env[2], "VDEV_PATH=%s", vdev_path ? vdev_path : ""); + if (rc == -1) { + env[2] = NULL; + goto error; + } + + rc = asprintf(&env[3], "VDEV_UPATH=%s", vdev_upath ? vdev_upath : ""); + if (rc == -1) { + env[3] = NULL; + goto error; + } + + rc = asprintf(&env[4], "VDEV_ENC_SYSFS_PATH=%s", + vdev_enc_sysfs_path ? vdev_enc_sysfs_path : ""); + if (rc == -1) { + env[4] = NULL; + goto error; + } + + if (opt_key != NULL) { + rc = asprintf(&env[5], "%s=%s", opt_key, + opt_val ? opt_val : ""); + if (rc == -1) { + env[5] = NULL; + goto error; + } + } + + return (env); + +error: + for (int i = 0; i < ZPOOL_VDEV_SCRIPT_ENV_COUNT; i++) + free(env[i]); + + free(env); + + return (NULL); +} + +/* + * Free the env[] array that was allocated by zpool_vdev_script_alloc_env(). + */ +void +zpool_vdev_script_free_env(char **env) +{ + for (int i = 0; i < ZPOOL_VDEV_SCRIPT_ENV_COUNT; i++) + free(env[i]); + + free(env); +} + +/* + * Prepare a disk by (optionally) running a program before labeling the disk. + * This can be useful for installing disk firmware or doing some pre-flight + * checks on the disk before it becomes part of the pool. The program run is + * located at ZFSEXECDIR/zfs_prepare_disk + * (E.x: /usr/local/libexec/zfs/zfs_prepare_disk). + * + * Return 0 on success, non-zero on failure. + */ +int +zpool_prepare_disk(zpool_handle_t *zhp, nvlist_t *vdev_nv, + const char *prepare_str, char **lines[], int *lines_cnt) +{ + const char *script_path = ZFSEXECDIR "/zfs_prepare_disk"; + const char *pool_name; + int rc = 0; + + /* Path to script and a NULL entry */ + char *argv[2] = {(char *)script_path}; + char **env = NULL; + const char *path = NULL, *enc_sysfs_path = NULL; + char *upath; + *lines_cnt = 0; + + if (access(script_path, X_OK) != 0) { + /* No script, nothing to do */ + return (0); + } + + (void) nvlist_lookup_string(vdev_nv, ZPOOL_CONFIG_PATH, &path); + (void) nvlist_lookup_string(vdev_nv, ZPOOL_CONFIG_VDEV_ENC_SYSFS_PATH, + &enc_sysfs_path); + + upath = zfs_get_underlying_path(path); + pool_name = zhp ? zpool_get_name(zhp) : NULL; + + env = zpool_vdev_script_alloc_env(pool_name, path, upath, + enc_sysfs_path, "VDEV_PREPARE", prepare_str); + + free(upath); + + if (env == NULL) { + return (ENOMEM); + } + + rc = libzfs_run_process_get_stdout(script_path, argv, env, lines, + lines_cnt); + + zpool_vdev_script_free_env(env); + + return (rc); +} + +/* + * Optionally run a script and then label a disk. The script can be used to + * prepare a disk for inclusion into the pool. For example, it might update + * the disk's firmware or check its health. + * + * The 'name' provided is the short name, stripped of any leading + * /dev path, and is passed to zpool_label_disk. vdev_nv is the nvlist for + * the vdev. prepare_str is a string that gets passed as the VDEV_PREPARE + * env variable to the script. + * + * The following env vars are passed to the script: + * + * POOL_NAME: The pool name (blank during zpool create) + * VDEV_PREPARE: Reason why the disk is being prepared for inclusion: + * "create", "add", "replace", or "autoreplace" + * VDEV_PATH: Path to the disk + * VDEV_UPATH: One of the 'underlying paths' to the disk. This is + * useful for DM devices. + * VDEV_ENC_SYSFS_PATH: Path to the disk's enclosure sysfs path, if available. + * + * Note, some of these values can be blank. + * + * Return 0 on success, non-zero otherwise. + */ +int +zpool_prepare_and_label_disk(libzfs_handle_t *hdl, zpool_handle_t *zhp, + const char *name, nvlist_t *vdev_nv, const char *prepare_str, + char **lines[], int *lines_cnt) +{ + int rc; + char vdev_path[MAXPATHLEN]; + (void) snprintf(vdev_path, sizeof (vdev_path), "%s/%s", DISK_ROOT, + name); + + /* zhp will be NULL when creating a pool */ + rc = zpool_prepare_disk(zhp, vdev_nv, prepare_str, lines, lines_cnt); + if (rc != 0) + return (rc); + + rc = zpool_label_disk(hdl, zhp, name); + return (rc); +} diff --git a/sys/contrib/openzfs/lib/libzfs/os/freebsd/libzfs_compat.c b/sys/contrib/openzfs/lib/libzfs/os/freebsd/libzfs_compat.c index f143f9cb63b3..e772e3e12262 100644 --- a/sys/contrib/openzfs/lib/libzfs/os/freebsd/libzfs_compat.c +++ b/sys/contrib/openzfs/lib/libzfs/os/freebsd/libzfs_compat.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -38,12 +39,8 @@ #define ZFS_KMOD "openzfs" #endif -void -libzfs_set_pipe_max(int infd) -{ - /* FreeBSD automatically resizes */ -} - +#ifndef HAVE_EXECVPE +/* FreeBSD prior to 15 lacks execvpe */ static int execvPe(const char *name, const char *path, char * const *argv, char * const *envp) @@ -108,9 +105,9 @@ execvPe(const char *name, const char *path, char * const *argv, 16); continue; } - bcopy(p, buf, lp); + memcpy(buf, p, lp); buf[lp] = '/'; - bcopy(name, buf + lp + 1, ln); + memcpy(buf + lp + 1, name, ln); buf[lp + ln + 1] = '\0'; retry: (void) execve(bp, argv, envp); @@ -140,7 +137,7 @@ retry: (void) execve(bp, argv, envp); if (cnt > 0) { memp[0] = argv[0]; memp[1] = bp; - bcopy(argv + 1, memp + 2, + memcpy(memp + 2, argv + 1, cnt * sizeof (char *)); } else { memp[0] = "sh"; @@ -197,8 +194,7 @@ execvpe(const char *name, char * const argv[], char * const envp[]) return (execvPe(name, path, argv, envp)); } - -#define ERRBUFLEN 256 +#endif /* !HAVE_EXECVPE */ static __thread char errbuf[ERRBUFLEN]; @@ -206,26 +202,22 @@ const char * libzfs_error_init(int error) { char *msg = errbuf; - size_t len, msglen = ERRBUFLEN; + size_t msglen = sizeof (errbuf); if (modfind("zfs") < 0) { - len = snprintf(msg, msglen, dgettext(TEXT_DOMAIN, + size_t len = snprintf(msg, msglen, dgettext(TEXT_DOMAIN, "Failed to load %s module: "), ZFS_KMOD); + if (len >= msglen) + len = msglen - 1; msg += len; msglen -= len; } - (void) snprintf(msg, msglen, "%s", strerror(error)); + (void) snprintf(msg, msglen, "%s", zfs_strerror(error)); return (errbuf); } -int -zfs_ioctl(libzfs_handle_t *hdl, int request, zfs_cmd_t *zc) -{ - return (lzc_ioctl_fd(hdl->libzfs_fd, request, zc)); -} - /* * Verify the required ZFS_DEV device is available and optionally attempt * to load the ZFS modules. Under normal circumstances the modules @@ -251,24 +243,28 @@ libzfs_load_module(void) int zpool_relabel_disk(libzfs_handle_t *hdl, const char *path, const char *msg) { + (void) hdl, (void) path, (void) msg; return (0); } int zpool_label_disk(libzfs_handle_t *hdl, zpool_handle_t *zhp, const char *name) { + (void) hdl, (void) zhp, (void) name; return (0); } int find_shares_object(differ_info_t *di) { + (void) di; return (0); } int zfs_destroy_snaps_nvl_os(libzfs_handle_t *hdl, nvlist_t *snaps) { + (void) hdl, (void) snaps; return (0); } @@ -280,7 +276,6 @@ zfs_jail(zfs_handle_t *zhp, int jailid, int attach) { libzfs_handle_t *hdl = zhp->zfs_hdl; zfs_cmd_t zc = {"\0"}; - char errbuf[1024]; unsigned long cmd; int ret; @@ -305,6 +300,14 @@ zfs_jail(zfs_handle_t *zhp, int jailid, int attach) zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "bookmarks can not be jailed")); return (zfs_error(hdl, EZFS_BADTYPE, errbuf)); + case ZFS_TYPE_VDEV: + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "vdevs can not be jailed")); + return (zfs_error(hdl, EZFS_BADTYPE, errbuf)); + case ZFS_TYPE_INVALID: + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "invalid zfs_type_t: ZFS_TYPE_INVALID")); + return (zfs_error(hdl, EZFS_BADTYPE, errbuf)); case ZFS_TYPE_POOL: case ZFS_TYPE_FILESYSTEM: /* OK */ @@ -332,29 +335,35 @@ zpool_nextboot(libzfs_handle_t *hdl, uint64_t pool_guid, uint64_t dev_guid, { zfs_cmd_t zc = {"\0"}; nvlist_t *args; - int error; args = fnvlist_alloc(); fnvlist_add_uint64(args, ZPOOL_CONFIG_POOL_GUID, pool_guid); fnvlist_add_uint64(args, ZPOOL_CONFIG_GUID, dev_guid); fnvlist_add_string(args, "command", command); - error = zcmd_write_src_nvlist(hdl, &zc, args); - if (error == 0) - error = zfs_ioctl(hdl, ZFS_IOC_NEXTBOOT, &zc); + zcmd_write_src_nvlist(hdl, &zc, args); + int error = zfs_ioctl(hdl, ZFS_IOC_NEXTBOOT, &zc); zcmd_free_nvlists(&zc); nvlist_free(args); return (error); } /* - * Fill given version buffer with zfs kernel version. - * Returns 0 on success, and -1 on error (with errno set) + * Return allocated loaded module version, or NULL on error (with errno set) */ -int -zfs_version_kernel(char *version, int len) +char * +zfs_version_kernel(void) { - size_t l = len; - - return (sysctlbyname("vfs.zfs.version.module", - version, &l, NULL, 0)); + size_t l; + if (sysctlbyname("vfs.zfs.version.module", + NULL, &l, NULL, 0) == -1) + return (NULL); + char *version = malloc(l); + if (version == NULL) + return (NULL); + if (sysctlbyname("vfs.zfs.version.module", + version, &l, NULL, 0) == -1) { + free(version); + return (NULL); + } + return (version); } diff --git a/sys/contrib/openzfs/lib/libzfs/os/freebsd/libzfs_zmount.c b/sys/contrib/openzfs/lib/libzfs/os/freebsd/libzfs_zmount.c index 12317fdde38e..bc7d68b17eb1 100644 --- a/sys/contrib/openzfs/lib/libzfs/os/freebsd/libzfs_zmount.c +++ b/sys/contrib/openzfs/lib/libzfs/os/freebsd/libzfs_zmount.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: BSD-2-Clause /* * Copyright (c) 2006 Pawel Jakub Dawidek <pjd@FreeBSD.org> * All rights reserved. @@ -28,9 +29,6 @@ * This file implements Solaris compatible zmount() function. */ -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - #include <sys/param.h> #include <sys/mount.h> #include <sys/uio.h> @@ -73,34 +71,30 @@ build_iovec(struct iovec **iov, int *iovlen, const char *name, void *val, *iovlen = ++i; } -static int -do_mount_(const char *spec, const char *dir, int mflag, char *fstype, - char *dataptr, int datalen, char *optptr, int optlen) +int +do_mount(zfs_handle_t *zhp, const char *mntpt, const char *opts, int flags) { struct iovec *iov; char *optstr, *p, *tofree; int iovlen, rv; + const char *spec = zfs_get_name(zhp); assert(spec != NULL); - assert(dir != NULL); - assert(fstype != NULL); - assert(strcmp(fstype, MNTTYPE_ZFS) == 0); - assert(dataptr == NULL); - assert(datalen == 0); - assert(optptr != NULL); - assert(optlen > 0); + assert(mntpt != NULL); + assert(opts != NULL); - tofree = optstr = strdup(optptr); + tofree = optstr = strdup(opts); assert(optstr != NULL); iov = NULL; iovlen = 0; if (strstr(optstr, MNTOPT_REMOUNT) != NULL) build_iovec(&iov, &iovlen, "update", NULL, 0); - if (mflag & MS_RDONLY) + if (flags & MS_RDONLY) build_iovec(&iov, &iovlen, "ro", NULL, 0); - build_iovec(&iov, &iovlen, "fstype", fstype, (size_t)-1); - build_iovec(&iov, &iovlen, "fspath", __DECONST(char *, dir), + build_iovec(&iov, &iovlen, "fstype", __DECONST(char *, MNTTYPE_ZFS), + (size_t)-1); + build_iovec(&iov, &iovlen, "fspath", __DECONST(char *, mntpt), (size_t)-1); build_iovec(&iov, &iovlen, "from", __DECONST(char *, spec), (size_t)-1); while ((p = strsep(&optstr, ",/")) != NULL) @@ -110,19 +104,13 @@ do_mount_(const char *spec, const char *dir, int mflag, char *fstype, if (rv < 0) return (errno); return (rv); -} - -int -do_mount(zfs_handle_t *zhp, const char *mntpt, char *opts, int flags) -{ - return (do_mount_(zfs_get_name(zhp), mntpt, flags, MNTTYPE_ZFS, NULL, 0, - opts, sizeof (mntpt))); } int do_unmount(zfs_handle_t *zhp, const char *mntpt, int flags) { + (void) zhp; if (unmount(mntpt, flags) < 0) return (errno); return (0); @@ -138,10 +126,12 @@ zfs_mount_delegation_check(void) void zpool_disable_datasets_os(zpool_handle_t *zhp, boolean_t force) { + (void) zhp, (void) force; } /* Called from the tail end of zfs_unmount() */ void zpool_disable_volume_os(const char *name) { + (void) name; } diff --git a/sys/contrib/openzfs/lib/libzfs/os/linux/libzfs_mount_os.c b/sys/contrib/openzfs/lib/libzfs/os/linux/libzfs_mount_os.c index 29fea736b605..585d22d9e5b3 100644 --- a/sys/contrib/openzfs/lib/libzfs/os/linux/libzfs_mount_os.c +++ b/sys/contrib/openzfs/lib/libzfs/os/linux/libzfs_mount_os.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -37,7 +38,7 @@ #include <libintl.h> #include <stdio.h> #include <stdlib.h> -#include <strings.h> +#include <string.h> #include <unistd.h> #include <zone.h> #include <sys/mntent.h> @@ -84,6 +85,13 @@ static const option_map_t option_map[] = { { MNTOPT_ACL, MS_POSIXACL, ZS_COMMENT }, { MNTOPT_NOACL, MS_COMMENT, ZS_COMMENT }, { MNTOPT_POSIXACL, MS_POSIXACL, ZS_COMMENT }, + /* + * Case sensitive options are just listed here to silently + * ignore the error if passed with zfs mount command. + */ + { MNTOPT_CASESENSITIVE, MS_COMMENT, ZS_COMMENT }, + { MNTOPT_CASEINSENSITIVE, MS_COMMENT, ZS_COMMENT }, + { MNTOPT_CASEMIXED, MS_COMMENT, ZS_COMMENT }, #ifdef MS_NOATIME { MNTOPT_NOATIME, MS_NOATIME, ZS_COMMENT }, { MNTOPT_ATIME, MS_COMMENT, ZS_COMMENT }, @@ -180,7 +188,7 @@ out: * otherwise they are considered fatal are copied in to badopt. */ int -zfs_parse_mount_options(char *mntopts, unsigned long *mntflags, +zfs_parse_mount_options(const char *mntopts, unsigned long *mntflags, unsigned long *zfsflags, int sloppy, char *badopt, char *mtabopt) { int error = 0, quote = 0, flag = 0, count = 0; @@ -320,14 +328,14 @@ zfs_adjust_mount_options(zfs_handle_t *zhp, const char *mntpoint, * make due with return value from the mount process. */ int -do_mount(zfs_handle_t *zhp, const char *mntpt, char *opts, int flags) +do_mount(zfs_handle_t *zhp, const char *mntpt, const char *opts, int flags) { const char *src = zfs_get_name(zhp); int error = 0; if (!libzfs_envvar_is_set("ZFS_MOUNT_HELPER")) { char badopt[MNT_LINE_MAX] = {0}; - unsigned long mntflags = flags, zfsflags; + unsigned long mntflags = flags, zfsflags = 0; char myopts[MNT_LINE_MAX] = {0}; if (zfs_parse_mount_options(opts, &mntflags, @@ -341,10 +349,10 @@ do_mount(zfs_handle_t *zhp, const char *mntpt, char *opts, int flags) } } else { char *argv[9] = { - "/bin/mount", - "--no-canonicalize", - "-t", MNTTYPE_ZFS, - "-o", opts, + (char *)"/bin/mount", + (char *)"--no-canonicalize", + (char *)"-t", (char *)MNTTYPE_ZFS, + (char *)"-o", (char *)opts, (char *)src, (char *)mntpt, (char *)NULL }; @@ -376,29 +384,25 @@ do_mount(zfs_handle_t *zhp, const char *mntpt, char *opts, int flags) int do_unmount(zfs_handle_t *zhp, const char *mntpt, int flags) { + (void) zhp; + if (!libzfs_envvar_is_set("ZFS_MOUNT_HELPER")) { int rv = umount2(mntpt, flags); return (rv < 0 ? errno : 0); } - char force_opt[] = "-f"; - char lazy_opt[] = "-l"; char *argv[7] = { - "/bin/umount", - "-t", MNTTYPE_ZFS, + (char *)"/bin/umount", + (char *)"-t", (char *)MNTTYPE_ZFS, NULL, NULL, NULL, NULL }; int rc, count = 3; - if (flags & MS_FORCE) { - argv[count] = force_opt; - count++; - } + if (flags & MS_FORCE) + argv[count++] = (char *)"-f"; - if (flags & MS_DETACH) { - argv[count] = lazy_opt; - count++; - } + if (flags & MS_DETACH) + argv[count++] = (char *)"-l"; argv[count] = (char *)mntpt; rc = libzfs_run_process(argv[0], argv, STDOUT_VERBOSE|STDERR_VERBOSE); @@ -416,10 +420,12 @@ zfs_mount_delegation_check(void) void zpool_disable_datasets_os(zpool_handle_t *zhp, boolean_t force) { + (void) zhp, (void) force; } /* Called from the tail end of zfs_unmount() */ void zpool_disable_volume_os(const char *name) { + (void) name; } diff --git a/sys/contrib/openzfs/lib/libzfs/os/linux/libzfs_pool_os.c b/sys/contrib/openzfs/lib/libzfs/os/linux/libzfs_pool_os.c index 90eb8db50790..aef169a3f880 100644 --- a/sys/contrib/openzfs/lib/libzfs/os/linux/libzfs_pool_os.c +++ b/sys/contrib/openzfs/lib/libzfs/os/linux/libzfs_pool_os.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -34,14 +35,13 @@ #include <libintl.h> #include <stdio.h> #include <stdlib.h> -#include <strings.h> +#include <string.h> #include <unistd.h> #include <libgen.h> #include <zone.h> #include <sys/stat.h> #include <sys/efi_partition.h> #include <sys/systeminfo.h> -#include <sys/vtoc.h> #include <sys/zfs_ioctl.h> #include <sys/vdev_disk.h> #include <dlfcn.h> @@ -97,7 +97,7 @@ zpool_relabel_disk(libzfs_handle_t *hdl, const char *path, const char *msg) static int read_efi_label(nvlist_t *config, diskaddr_t *sb) { - char *path; + const char *path; int fd; char diskname[MAXPATHLEN]; int err = -1; @@ -217,17 +217,15 @@ zpool_label_disk(libzfs_handle_t *hdl, zpool_handle_t *zhp, const char *name) size_t resv = EFI_MIN_RESV_SIZE; uint64_t slice_size; diskaddr_t start_block; - char errbuf[1024]; + char errbuf[ERRBUFLEN]; /* prepare an error message just in case */ (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot label '%s'"), name); if (zhp) { - nvlist_t *nvroot; - - verify(nvlist_lookup_nvlist(zhp->zpool_config, - ZPOOL_CONFIG_VDEV_TREE, &nvroot) == 0); + nvlist_t *nvroot = fnvlist_lookup_nvlist(zhp->zpool_config, + ZPOOL_CONFIG_VDEV_TREE); if (zhp->zpool_start_block == 0) start_block = find_start_block(nvroot); @@ -271,17 +269,29 @@ zpool_label_disk(libzfs_handle_t *hdl, zpool_handle_t *zhp, const char *name) if (start_block == MAXOFFSET_T) start_block = NEW_START_BLOCK; slice_size -= start_block; - slice_size = P2ALIGN(slice_size, PARTITION_END_ALIGNMENT); + slice_size = P2ALIGN_TYPED(slice_size, PARTITION_END_ALIGNMENT, + uint64_t); vtoc->efi_parts[0].p_start = start_block; vtoc->efi_parts[0].p_size = slice_size; + if (vtoc->efi_parts[0].p_size * vtoc->efi_lbasize < SPA_MINDEVSIZE) { + (void) close(fd); + efi_free(vtoc); + + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "cannot " + "label '%s': partition would be less than the minimum " + "device size (64M)"), path); + return (zfs_error(hdl, EZFS_LABELFAILED, errbuf)); + } + /* * Why we use V_USR: V_BACKUP confuses users, and is considered * disposable by some EFI utilities (since EFI doesn't have a backup * slice). V_UNASSIGNED is supposed to be used only for zero size - * partitions, and efi_write() will fail if we use it. V_ROOT, V_BOOT, - * etc. were all pretty specific. V_USR is as close to reality as we + * partitions, and efi_write() will fail if we use it. + * Other available types were all pretty specific. + * V_USR is as close to reality as we * can get, in the absence of V_OTHER. */ vtoc->efi_parts[0].p_tag = V_USR; diff --git a/sys/contrib/openzfs/lib/libzfs/os/linux/libzfs_util_os.c b/sys/contrib/openzfs/lib/libzfs/os/linux/libzfs_util_os.c index 2ac31f1077ca..55dfdf3723bd 100644 --- a/sys/contrib/openzfs/lib/libzfs/os/linux/libzfs_util_os.c +++ b/sys/contrib/openzfs/lib/libzfs/os/linux/libzfs_util_os.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -19,21 +20,28 @@ * CDDL HEADER END */ +/* + * Copyright (c) 2021 Klara, Inc. + */ +#include <alloca.h> #include <errno.h> #include <fcntl.h> #include <libintl.h> +#include <math.h> +#include <poll.h> #include <stdarg.h> #include <stdio.h> #include <stdlib.h> #include <strings.h> -#include <unistd.h> -#include <math.h> -#include <sys/stat.h> -#include <sys/mnttab.h> +#include <sys/inotify.h> #include <sys/mntent.h> +#include <sys/mnttab.h> +#include <sys/stat.h> +#include <sys/timerfd.h> #include <sys/types.h> #include <sys/wait.h> +#include <unistd.h> #include <libzfs.h> #include <libzfs_core.h> @@ -45,19 +53,13 @@ #define ZDIFF_SHARESDIR "/.zfs/shares/" -int -zfs_ioctl(libzfs_handle_t *hdl, int request, zfs_cmd_t *zc) -{ - return (ioctl(hdl->libzfs_fd, request, zc)); -} - const char * libzfs_error_init(int error) { switch (error) { case ENXIO: return (dgettext(TEXT_DOMAIN, "The ZFS modules are not " - "loaded.\nTry running '/sbin/modprobe zfs' as root " + "loaded.\nTry running 'modprobe zfs' as root " "to load them.")); case ENOENT: return (dgettext(TEXT_DOMAIN, "/dev/zfs and /proc/self/mounts " @@ -65,7 +67,7 @@ libzfs_error_init(int error) "-t proc proc /proc' as root.")); case ENOEXEC: return (dgettext(TEXT_DOMAIN, "The ZFS modules cannot be " - "auto-loaded.\nTry running '/sbin/modprobe zfs' as " + "auto-loaded.\nTry running 'modprobe zfs' as " "root to manually load them.")); case EACCES: return (dgettext(TEXT_DOMAIN, "Permission denied the " @@ -76,93 +78,80 @@ libzfs_error_init(int error) } } -static int -libzfs_module_loaded(const char *module) -{ - const char path_prefix[] = "/sys/module/"; - char path[256]; - - memcpy(path, path_prefix, sizeof (path_prefix) - 1); - strcpy(path + sizeof (path_prefix) - 1, module); - - return (access(path, F_OK) == 0); -} - /* - * Verify the required ZFS_DEV device is available and optionally attempt - * to load the ZFS modules. Under normal circumstances the modules - * should already have been loaded by some external mechanism. + * zfs(4) is loaded by udev if there's a fstype=zfs device present, + * but if there isn't, load them automatically; + * always wait for ZFS_DEV to appear via udev. * * Environment variables: - * - ZFS_MODULE_LOADING="YES|yes|ON|on" - Attempt to load modules. - * - ZFS_MODULE_TIMEOUT="<seconds>" - Seconds to wait for ZFS_DEV + * - ZFS_MODULE_TIMEOUT="<seconds>" - Seconds to wait for ZFS_DEV, + * defaults to 10, max. 10 min. */ -static int -libzfs_load_module_impl(const char *module) +int +libzfs_load_module(void) { - char *argv[4] = {"/sbin/modprobe", "-q", (char *)module, (char *)0}; - char *load_str, *timeout_str; - long timeout = 10; /* seconds */ - long busy_timeout = 10; /* milliseconds */ - int load = 0, fd; - hrtime_t start; - - /* Optionally request module loading */ - if (!libzfs_module_loaded(module)) { - load_str = getenv("ZFS_MODULE_LOADING"); - if (load_str) { - if (!strncasecmp(load_str, "YES", strlen("YES")) || - !strncasecmp(load_str, "ON", strlen("ON"))) - load = 1; - else - load = 0; - } + if (access(ZFS_DEV, F_OK) == 0) + return (0); - if (load) { - if (libzfs_run_process("/sbin/modprobe", argv, 0)) - return (ENOEXEC); - } + if (access(ZFS_SYSFS_DIR, F_OK) != 0) { + char *argv[] = {(char *)"modprobe", (char *)"zfs", NULL}; + if (libzfs_run_process("modprobe", argv, 0)) + return (ENOEXEC); - if (!libzfs_module_loaded(module)) + if (access(ZFS_SYSFS_DIR, F_OK) != 0) return (ENXIO); } - /* - * Device creation by udev is asynchronous and waiting may be - * required. Busy wait for 10ms and then fall back to polling every - * 10ms for the allowed timeout (default 10s, max 10m). This is - * done to optimize for the common case where the device is - * immediately available and to avoid penalizing the possible - * case where udev is slow or unable to create the device. - */ - timeout_str = getenv("ZFS_MODULE_TIMEOUT"); - if (timeout_str) { - timeout = strtol(timeout_str, NULL, 0); - timeout = MAX(MIN(timeout, (10 * 60)), 0); /* 0 <= N <= 600 */ + const char *timeout_str = getenv("ZFS_MODULE_TIMEOUT"); + int seconds = 10; + if (timeout_str) + seconds = MIN(strtol(timeout_str, NULL, 0), 600); + struct itimerspec timeout = {.it_value.tv_sec = MAX(seconds, 0)}; + + int ino = inotify_init1(IN_CLOEXEC); + if (ino == -1) + return (ENOENT); + inotify_add_watch(ino, ZFS_DEVDIR, IN_CREATE); + + if (access(ZFS_DEV, F_OK) == 0) { + close(ino); + return (0); + } else if (seconds == 0) { + close(ino); + return (ENOENT); } - start = gethrtime(); - do { - fd = open(ZFS_DEV, O_RDWR | O_CLOEXEC); - if (fd >= 0) { - (void) close(fd); - return (0); - } else if (errno != ENOENT) { - return (errno); - } else if (NSEC2MSEC(gethrtime() - start) < busy_timeout) { - sched_yield(); - } else { - usleep(10 * MILLISEC); - } - } while (NSEC2MSEC(gethrtime() - start) < (timeout * MILLISEC)); + size_t evsz = sizeof (struct inotify_event) + NAME_MAX + 1; + struct inotify_event *ev = alloca(evsz); - return (ENOENT); -} + int tout = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC); + if (tout == -1) { + close(ino); + return (ENOENT); + } + timerfd_settime(tout, 0, &timeout, NULL); -int -libzfs_load_module(void) -{ - return (libzfs_load_module_impl(ZFS_DRIVER)); + int ret = ENOENT; + struct pollfd pfds[] = { + {.fd = ino, .events = POLLIN}, + {.fd = tout, .events = POLLIN}, + }; + while (poll(pfds, ARRAY_SIZE(pfds), -1) != -1) { + if (pfds[0].revents & POLLIN) { + verify(read(ino, ev, evsz) > + sizeof (struct inotify_event)); + if (strncmp(ev->name, &ZFS_DEV[sizeof (ZFS_DEVDIR)], + ev->len) == 0) { + ret = 0; + break; + } + } + if (pfds[1].revents & POLLIN) + break; + } + close(tout); + close(ino); + return (ret); } int @@ -187,35 +176,100 @@ find_shares_object(differ_info_t *di) int zfs_destroy_snaps_nvl_os(libzfs_handle_t *hdl, nvlist_t *snaps) { + (void) hdl, (void) snaps; return (0); } /* - * Fill given version buffer with zfs kernel version read from ZFS_SYSFS_DIR - * Returns 0 on success, and -1 on error (with errno set) + * Return allocated loaded module version, or NULL on error (with errno set) + */ +char * +zfs_version_kernel(void) +{ + FILE *f = fopen(ZFS_SYSFS_DIR "/version", "re"); + if (f == NULL) + return (NULL); + + char *ret = NULL; + size_t l; + ssize_t read; + if ((read = getline(&ret, &l, f)) == -1) { + int err = errno; + fclose(f); + errno = err; + return (NULL); + } + + fclose(f); + if (ret[read - 1] == '\n') + ret[read - 1] = '\0'; + return (ret); +} + +/* + * Add or delete the given filesystem to/from the given user namespace. */ int -zfs_version_kernel(char *version, int len) +zfs_userns(zfs_handle_t *zhp, const char *nspath, int attach) { - int _errno; - int fd; - int rlen; - - if ((fd = open(ZFS_SYSFS_DIR "/version", O_RDONLY | O_CLOEXEC)) == -1) - return (-1); - - if ((rlen = read(fd, version, len)) == -1) { - version[0] = '\0'; - _errno = errno; - (void) close(fd); - errno = _errno; - return (-1); + libzfs_handle_t *hdl = zhp->zfs_hdl; + zfs_cmd_t zc = {"\0"}; + char errbuf[1024]; + unsigned long cmd; + int ret; + + if (attach) { + (void) snprintf(errbuf, sizeof (errbuf), + dgettext(TEXT_DOMAIN, "cannot add '%s' to namespace"), + zhp->zfs_name); + } else { + (void) snprintf(errbuf, sizeof (errbuf), + dgettext(TEXT_DOMAIN, "cannot remove '%s' from namespace"), + zhp->zfs_name); } - version[rlen-1] = '\0'; /* discard '\n' */ + switch (zhp->zfs_type) { + case ZFS_TYPE_VOLUME: + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "volumes can not be namespaced")); + return (zfs_error(hdl, EZFS_BADTYPE, errbuf)); + case ZFS_TYPE_SNAPSHOT: + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "snapshots can not be namespaced")); + return (zfs_error(hdl, EZFS_BADTYPE, errbuf)); + case ZFS_TYPE_BOOKMARK: + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "bookmarks can not be namespaced")); + return (zfs_error(hdl, EZFS_BADTYPE, errbuf)); + case ZFS_TYPE_VDEV: + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "vdevs can not be namespaced")); + return (zfs_error(hdl, EZFS_BADTYPE, errbuf)); + case ZFS_TYPE_INVALID: + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "invalid zfs_type_t: ZFS_TYPE_INVALID")); + return (zfs_error(hdl, EZFS_BADTYPE, errbuf)); + case ZFS_TYPE_POOL: + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "pools can not be namespaced")); + return (zfs_error(hdl, EZFS_BADTYPE, errbuf)); + case ZFS_TYPE_FILESYSTEM: + break; + } + assert(zhp->zfs_type == ZFS_TYPE_FILESYSTEM); - if (close(fd) == -1) - return (-1); + (void) strlcpy(zc.zc_name, zhp->zfs_name, sizeof (zc.zc_name)); + zc.zc_objset_type = DMU_OST_ZFS; + zc.zc_cleanup_fd = open(nspath, O_RDONLY); + if (zc.zc_cleanup_fd < 0) { + return (zfs_error(hdl, EZFS_NOT_USER_NAMESPACE, errbuf)); + } - return (0); + cmd = attach ? ZFS_IOC_USERNS_ATTACH : ZFS_IOC_USERNS_DETACH; + if ((ret = zfs_ioctl(hdl, cmd, &zc)) != 0) + zfs_standard_error(hdl, errno, errbuf); + + (void) close(zc.zc_cleanup_fd); + + return (ret); } diff --git a/sys/contrib/openzfs/lib/libzfs_core/Makefile.am b/sys/contrib/openzfs/lib/libzfs_core/Makefile.am index 64cb76f1995b..42ac6081cc99 100644 --- a/sys/contrib/openzfs/lib/libzfs_core/Makefile.am +++ b/sys/contrib/openzfs/lib/libzfs_core/Makefile.am @@ -1,37 +1,34 @@ -include $(top_srcdir)/config/Rules.am +libzfs_core_la_CFLAGS = $(AM_CFLAGS) $(LIBRARY_CFLAGS) +libzfs_core_la_CFLAGS += -fvisibility=hidden -pkgconfig_DATA = libzfs_core.pc +libzfs_core_la_CPPFLAGS = $(AM_CPPFLAGS) +libzfs_core_la_CPPFLAGS += -I$(srcdir)/%D% -AM_CFLAGS += -fvisibility=hidden +lib_LTLIBRARIES += libzfs_core.la +CPPCHECKTARGETS += libzfs_core.la -lib_LTLIBRARIES = libzfs_core.la - -include $(top_srcdir)/config/Abigail.am - -USER_C = \ - libzfs_core.c +libzfs_core_la_SOURCES = \ + %D%/libzfs_core.c \ + %D%/libzfs_core_impl.h if BUILD_LINUX -USER_C += \ - os/linux/libzfs_core_ioctl.c +libzfs_core_la_SOURCES += \ + %D%/os/linux/libzfs_core_ioctl.c endif if BUILD_FREEBSD -DEFAULT_INCLUDES += -I$(top_srcdir)/include/os/freebsd/zfs +libzfs_core_la_CPPFLAGS += -Iinclude/os/freebsd/zfs -USER_C += \ - os/freebsd/libzfs_core_ioctl.c +libzfs_core_la_SOURCES += \ + %D%/os/freebsd/libzfs_core_ioctl.c -VPATH += $(top_srcdir)/module/os/freebsd/zfs - -nodist_libzfs_core_la_SOURCES = zfs_ioctl_compat.c +nodist_libzfs_core_la_SOURCES = \ + module/os/freebsd/zfs/zfs_ioctl_compat.c endif -libzfs_core_la_SOURCES = $(USER_C) - libzfs_core_la_LIBADD = \ - $(abs_top_builddir)/lib/libnvpair/libnvpair.la \ - $(abs_top_builddir)/lib/libspl/libspl.la + libnvpair.la \ + libspl.la libzfs_core_la_LIBADD += $(LTLIBINTL) @@ -47,7 +44,6 @@ endif libzfs_core_la_LDFLAGS += -version-info 3:0:0 -include $(top_srcdir)/config/CppCheck.am +pkgconfig_DATA += %D%/libzfs_core.pc -# Library ABI -EXTRA_DIST = libzfs_core.abi libzfs_core.suppr +dist_noinst_DATA += %D%/libzfs_core.abi %D%/libzfs_core.suppr diff --git a/sys/contrib/openzfs/lib/libzfs_core/libzfs_core.abi b/sys/contrib/openzfs/lib/libzfs_core/libzfs_core.abi index 5bed6c8e0f4f..63904f447e85 100644 --- a/sys/contrib/openzfs/lib/libzfs_core/libzfs_core.abi +++ b/sys/contrib/openzfs/lib/libzfs_core/libzfs_core.abi @@ -1,7 +1,7 @@ <abi-corpus version='2.0' architecture='elf-amd-x86_64' soname='libzfs_core.so.3'> <elf-needed> <dependency name='libnvpair.so.3'/> - <dependency name='libpthread.so.0'/> + <dependency name='libunwind.so.8'/> <dependency name='libc.so.6'/> <dependency name='ld-linux-x86-64.so.2'/> </elf-needed> @@ -127,12 +127,16 @@ <elf-symbol name='atomic_swap_uint' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='atomic_swap_ulong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='atomic_swap_ushort' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='format_timestamp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='get_system_hostid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='get_timestamp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='getexecname' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='getextmntent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='getmntany' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='getzoneid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='libspl_assertf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='libspl_backtrace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='libspl_set_assert_ok' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='libzfs_core_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='libzfs_core_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='list_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> @@ -159,6 +163,7 @@ <elf-symbol name='lzc_channel_program_nosync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_clone' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='lzc_ddt_prune' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_destroy_bookmarks' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_destroy_snaps' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> @@ -167,31 +172,38 @@ <elf-symbol name='lzc_get_bookmarks' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_get_bootenv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_get_holds' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='lzc_get_props' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='lzc_get_vdev_prop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_hold' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_initialize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_ioctl_fd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_load_key' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_pool_checkpoint' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_pool_checkpoint_discard' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='lzc_pool_prefetch' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_promote' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_receive' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_receive_one' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_receive_resumable' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_receive_with_cmdprops' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_receive_with_header' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='lzc_receive_with_heal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_redact' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_release' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_rename' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_reopen' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_rollback' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_rollback_to' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='lzc_scrub' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_send' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_send_redacted' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_send_resume' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_send_resume_redacted' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_send_space' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_send_space_resume_redacted' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='lzc_send_wrapper' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_set_bootenv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='lzc_set_vdev_prop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_snaprange_space' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_snapshot' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzc_sync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> @@ -204,42 +216,66 @@ <elf-symbol name='membar_enter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='membar_exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='membar_producer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='membar_sync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='mkdirp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='print_timestamp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='spl_pagesize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='strlcat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='strlcpy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> </elf-function-symbols> - <elf-variable-symbols> - <elf-symbol name='libspl_assert_ok' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - </elf-variable-symbols> - <abi-instr address-size='64' path='assert.c' language='LANG_C99'> - <type-decl name='variadic parameter type' id='2c1145c5'/> - <var-decl name='libspl_assert_ok' type-id='95e97e5e' mangled-name='libspl_assert_ok' visibility='default' elf-symbol-id='libspl_assert_ok'/> - <function-decl name='libspl_assertf' mangled-name='libspl_assertf' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libspl_assertf'> - <parameter type-id='80f4b756' name='file'/> - <parameter type-id='80f4b756' name='func'/> - <parameter type-id='95e97e5e' name='line'/> - <parameter type-id='80f4b756' name='format'/> + <abi-instr address-size='64' path='lib/libspl/assert.c' language='LANG_C99'> + <class-decl name='__va_list_tag' size-in-bits='192' is-struct='yes' visibility='default' id='d5027220'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='gp_offset' type-id='f0981eeb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='fp_offset' type-id='f0981eeb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='overflow_arg_area' type-id='eaa32e2f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='reg_save_area' type-id='eaa32e2f' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='__pid_t' type-id='95e97e5e' id='3629bad8'/> + <pointer-type-def type-id='d5027220' size-in-bits='64' id='b7f2d5e6'/> + <function-decl name='libspl_backtrace' mangled-name='libspl_backtrace' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libspl_backtrace'> + <parameter type-id='95e97e5e'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='abort' visibility='default' binding='global' size-in-bits='64'> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='getpid' visibility='default' binding='global' size-in-bits='64'> + <return type-id='3629bad8'/> + </function-decl> + <function-decl name='__vfprintf_chk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='e75a27e9'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='9d26089a'/> + <parameter type-id='b7f2d5e6'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='gettid' visibility='default' binding='global' size-in-bits='64'> + <return type-id='3629bad8'/> + </function-decl> + <function-decl name='prctl' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> <parameter is-variadic='yes'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='libspl_set_assert_ok' mangled-name='libspl_set_assert_ok' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libspl_set_assert_ok'> + <parameter type-id='c19b74c3' name='val'/> <return type-id='48b5725f'/> </function-decl> </abi-instr> - <abi-instr address-size='64' path='atomic.c' language='LANG_C99'> - <type-decl name='long int' size-in-bits='64' id='bd54fe1a'/> - <type-decl name='short int' size-in-bits='16' id='a2185560'/> - <type-decl name='signed char' size-in-bits='8' id='28577a57'/> - <type-decl name='unsigned short int' size-in-bits='16' id='8efea9e5'/> + <abi-instr address-size='64' path='lib/libspl/atomic.c' language='LANG_C99'> <typedef-decl name='ulong_t' type-id='7359adad' id='ee1f298e'/> <typedef-decl name='int8_t' type-id='2171a512' id='ee31ee44'/> - <typedef-decl name='int16_t' type-id='03896e23' id='23bd8cb5'/> <typedef-decl name='uint16_t' type-id='253c2d2a' id='149c6638'/> <typedef-decl name='__int8_t' type-id='28577a57' id='2171a512'/> - <typedef-decl name='__int16_t' type-id='a2185560' id='03896e23'/> <typedef-decl name='__uint16_t' type-id='8efea9e5' id='253c2d2a'/> - <typedef-decl name='__ssize_t' type-id='bd54fe1a' id='41060289'/> - <typedef-decl name='ssize_t' type-id='41060289' id='79a0948f'/> - <pointer-type-def type-id='48b5725f' size-in-bits='64' id='eaa32e2f'/> <qualified-type-def type-id='149c6638' volatile='yes' id='5120c5f7'/> <pointer-type-def type-id='5120c5f7' size-in-bits='64' id='93977ae7'/> <qualified-type-def type-id='8f92235e' volatile='yes' id='430e0681'/> @@ -282,6 +318,11 @@ <parameter type-id='64698d33' name='target'/> <return type-id='48b5725f'/> </function-decl> + <function-decl name='atomic_add_ptr' mangled-name='atomic_add_ptr' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_add_ptr'> + <parameter type-id='fe09dd29' name='target'/> + <parameter type-id='79a0948f' name='bits'/> + <return type-id='48b5725f'/> + </function-decl> <function-decl name='atomic_add_8' mangled-name='atomic_add_8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_add_8'> <parameter type-id='aa323ea4' name='target'/> <parameter type-id='ee31ee44' name='bits'/> @@ -297,12 +338,7 @@ <parameter type-id='3ff5601b' name='bits'/> <return type-id='48b5725f'/> </function-decl> - <function-decl name='atomic_add_long' mangled-name='atomic_add_long' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_add_long'> - <parameter type-id='64698d33' name='target'/> - <parameter type-id='bd54fe1a' name='bits'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='atomic_add_ptr' mangled-name='atomic_add_ptr' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_add_ptr'> + <function-decl name='atomic_sub_ptr' mangled-name='atomic_sub_ptr' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_sub_ptr'> <parameter type-id='fe09dd29' name='target'/> <parameter type-id='79a0948f' name='bits'/> <return type-id='48b5725f'/> @@ -322,16 +358,6 @@ <parameter type-id='3ff5601b' name='bits'/> <return type-id='48b5725f'/> </function-decl> - <function-decl name='atomic_sub_long' mangled-name='atomic_sub_long' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_sub_long'> - <parameter type-id='64698d33' name='target'/> - <parameter type-id='bd54fe1a' name='bits'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='atomic_sub_ptr' mangled-name='atomic_sub_ptr' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_sub_ptr'> - <parameter type-id='fe09dd29' name='target'/> - <parameter type-id='79a0948f' name='bits'/> - <return type-id='48b5725f'/> - </function-decl> <function-decl name='atomic_or_8' mangled-name='atomic_or_8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_or_8'> <parameter type-id='aa323ea4' name='target'/> <parameter type-id='b96825af' name='bits'/> @@ -404,6 +430,11 @@ <parameter type-id='64698d33' name='target'/> <return type-id='ee1f298e'/> </function-decl> + <function-decl name='atomic_add_ptr_nv' mangled-name='atomic_add_ptr_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_add_ptr_nv'> + <parameter type-id='fe09dd29' name='target'/> + <parameter type-id='79a0948f' name='bits'/> + <return type-id='eaa32e2f'/> + </function-decl> <function-decl name='atomic_add_8_nv' mangled-name='atomic_add_8_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_add_8_nv'> <parameter type-id='aa323ea4' name='target'/> <parameter type-id='ee31ee44' name='bits'/> @@ -424,7 +455,7 @@ <parameter type-id='bd54fe1a' name='bits'/> <return type-id='ee1f298e'/> </function-decl> - <function-decl name='atomic_add_ptr_nv' mangled-name='atomic_add_ptr_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_add_ptr_nv'> + <function-decl name='atomic_sub_ptr_nv' mangled-name='atomic_sub_ptr_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_sub_ptr_nv'> <parameter type-id='fe09dd29' name='target'/> <parameter type-id='79a0948f' name='bits'/> <return type-id='eaa32e2f'/> @@ -449,11 +480,6 @@ <parameter type-id='bd54fe1a' name='bits'/> <return type-id='ee1f298e'/> </function-decl> - <function-decl name='atomic_sub_ptr_nv' mangled-name='atomic_sub_ptr_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_sub_ptr_nv'> - <parameter type-id='fe09dd29' name='target'/> - <parameter type-id='79a0948f' name='bits'/> - <return type-id='eaa32e2f'/> - </function-decl> <function-decl name='atomic_or_8_nv' mangled-name='atomic_or_8_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_or_8_nv'> <parameter type-id='aa323ea4' name='target'/> <parameter type-id='b96825af' name='bits'/> @@ -494,6 +520,12 @@ <parameter type-id='ee1f298e' name='bits'/> <return type-id='ee1f298e'/> </function-decl> + <function-decl name='atomic_cas_ptr' mangled-name='atomic_cas_ptr' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_cas_ptr'> + <parameter type-id='fe09dd29' name='target'/> + <parameter type-id='eaa32e2f' name='exp'/> + <parameter type-id='eaa32e2f' name='des'/> + <return type-id='eaa32e2f'/> + </function-decl> <function-decl name='atomic_cas_8' mangled-name='atomic_cas_8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_cas_8'> <parameter type-id='aa323ea4' name='target'/> <parameter type-id='b96825af' name='exp'/> @@ -518,12 +550,6 @@ <parameter type-id='ee1f298e' name='des'/> <return type-id='ee1f298e'/> </function-decl> - <function-decl name='atomic_cas_ptr' mangled-name='atomic_cas_ptr' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_cas_ptr'> - <parameter type-id='fe09dd29' name='target'/> - <parameter type-id='eaa32e2f' name='exp'/> - <parameter type-id='eaa32e2f' name='des'/> - <return type-id='eaa32e2f'/> - </function-decl> <function-decl name='atomic_swap_8' mangled-name='atomic_swap_8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_swap_8'> <parameter type-id='aa323ea4' name='target'/> <parameter type-id='b96825af' name='bits'/> @@ -569,13 +595,215 @@ <return type-id='48b5725f'/> </function-decl> <type-decl name='unsigned long int' size-in-bits='64' id='7359adad'/> + <type-decl name='unsigned short int' size-in-bits='16' id='8efea9e5'/> </abi-instr> - <abi-instr address-size='64' path='getexecname.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libspl/backtrace.c' language='LANG_C99'> + <array-type-def dimensions='1' type-id='62f1140c' size-in-bits='768' id='b80f3d9b'> + <subrange length='24' type-id='7359adad' id='fdd3342b'/> + </array-type-def> + <array-type-def dimensions='1' type-id='62f1140c' size-in-bits='128' id='bc19e735'> + <subrange length='4' type-id='7359adad' id='16fe7105'/> + </array-type-def> + <array-type-def dimensions='1' type-id='22c546af' size-in-bits='1024' id='498c040b'> + <subrange length='8' type-id='7359adad' id='56e0c0b1'/> + </array-type-def> + <array-type-def dimensions='1' type-id='4ea07cdb' size-in-bits='2048' id='4811c35e'> + <subrange length='16' type-id='7359adad' id='848d0938'/> + </array-type-def> + <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> + <array-type-def dimensions='1' type-id='3a47d82b' size-in-bits='512' id='a13e797f'> + <subrange length='8' type-id='7359adad' id='56e0c0b1'/> + </array-type-def> + <array-type-def dimensions='1' type-id='7359adad' size-in-bits='1024' id='d2baa450'> + <subrange length='16' type-id='7359adad' id='848d0938'/> + </array-type-def> + <array-type-def dimensions='1' type-id='8efea9e5' size-in-bits='48' id='ff2536e2'> + <subrange length='3' type-id='7359adad' id='56f209d2'/> + </array-type-def> + <array-type-def dimensions='1' type-id='8efea9e5' size-in-bits='64' id='3f30d495'> + <subrange length='4' type-id='7359adad' id='16fe7105'/> + </array-type-def> + <array-type-def dimensions='1' type-id='73d941c6' size-in-bits='8128' id='dc70ec0b'> + <subrange length='127' type-id='7359adad' id='5ed08de5'/> + </array-type-def> + <class-decl name='__sigset_t' size-in-bits='1024' is-struct='yes' naming-typedef-id='b9c97942' visibility='default' id='2616147f'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='__val' type-id='d2baa450' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='__sigset_t' type-id='2616147f' id='b9c97942'/> + <typedef-decl name='sigset_t' type-id='b9c97942' id='daf33c64'/> + <class-decl name='stack_t' size-in-bits='192' is-struct='yes' naming-typedef-id='ac5e685f' visibility='default' id='380f9954'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ss_sp' type-id='eaa32e2f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='ss_flags' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='ss_size' type-id='b59d7dce' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='stack_t' type-id='380f9954' id='ac5e685f'/> + <typedef-decl name='unw_regnum_t' type-id='95e97e5e' id='c53620f0'/> + <class-decl name='unw_cursor' size-in-bits='8128' is-struct='yes' visibility='default' id='384a1f22'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='opaque' type-id='dc70ec0b' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='unw_cursor_t' type-id='384a1f22' id='1203d35c'/> + <typedef-decl name='unw_context_t' type-id='190d09ef' id='8f527367'/> + <typedef-decl name='unw_word_t' type-id='9c313c2d' id='73d941c6'/> + <typedef-decl name='unw_tdep_context_t' type-id='c4daa689' id='190d09ef'/> + <typedef-decl name='greg_t' type-id='1eb56b1e' id='de572c22'/> + <typedef-decl name='gregset_t' type-id='6d3c2f42' id='a66f139c'/> + <class-decl name='_libc_fpxreg' size-in-bits='128' is-struct='yes' visibility='default' id='22c546af'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='significand' type-id='3f30d495' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='exponent' type-id='8efea9e5' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='80'> + <var-decl name='__glibc_reserved1' type-id='ff2536e2' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='_libc_xmmreg' size-in-bits='128' is-struct='yes' visibility='default' id='4ea07cdb'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='element' type-id='bc19e735' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='_libc_fpstate' size-in-bits='4096' is-struct='yes' visibility='default' id='81cbe5ca'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='cwd' type-id='253c2d2a' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='16'> + <var-decl name='swd' type-id='253c2d2a' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='ftw' type-id='253c2d2a' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='48'> + <var-decl name='fop' type-id='253c2d2a' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='rip' type-id='8910171f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='rdp' type-id='8910171f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='mxcsr' type-id='62f1140c' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='224'> + <var-decl name='mxcr_mask' type-id='62f1140c' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='_st' type-id='498c040b' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1280'> + <var-decl name='_xmm' type-id='4811c35e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3328'> + <var-decl name='__glibc_reserved1' type-id='b80f3d9b' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='fpregset_t' type-id='5b1ab9a8' id='6e5851bb'/> + <class-decl name='mcontext_t' size-in-bits='2048' is-struct='yes' naming-typedef-id='bacab071' visibility='default' id='76fab990'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='gregs' type-id='a66f139c' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1472'> + <var-decl name='fpregs' type-id='6e5851bb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1536'> + <var-decl name='__reserved1' type-id='a13e797f' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='mcontext_t' type-id='76fab990' id='bacab071'/> + <class-decl name='ucontext_t' size-in-bits='7744' is-struct='yes' visibility='default' id='1ba65dc8'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='uc_flags' type-id='7359adad' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='uc_link' type-id='4ed508de' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='uc_stack' type-id='ac5e685f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='uc_mcontext' type-id='bacab071' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2368'> + <var-decl name='uc_sigmask' type-id='daf33c64' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3392'> + <var-decl name='__fpregs_mem' type-id='81cbe5ca' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7488'> + <var-decl name='__ssp' type-id='a133ec23' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='ucontext_t' type-id='1ba65dc8' id='c4daa689'/> + <pointer-type-def type-id='81cbe5ca' size-in-bits='64' id='5b1ab9a8'/> + <pointer-type-def type-id='1ba65dc8' size-in-bits='64' id='4ed508de'/> + <pointer-type-def type-id='8f527367' size-in-bits='64' id='2e408b96'/> + <pointer-type-def type-id='1203d35c' size-in-bits='64' id='3946e4d1'/> + <pointer-type-def type-id='190d09ef' size-in-bits='64' id='3e0601f0'/> + <pointer-type-def type-id='73d941c6' size-in-bits='64' id='42f5faab'/> + <function-decl name='write' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter type-id='eaa32e2f'/> + <parameter type-id='b59d7dce'/> + <return type-id='79a0948f'/> + </function-decl> + <function-decl name='_Ux86_64_regname' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='c53620f0'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='_ULx86_64_init_local' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='3946e4d1'/> + <parameter type-id='2e408b96'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='_ULx86_64_step' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='3946e4d1'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='_ULx86_64_get_reg' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='3946e4d1'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='42f5faab'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='_ULx86_64_get_proc_name' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='3946e4d1'/> + <parameter type-id='26a90f95'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='42f5faab'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='_Ux86_64_getcontext' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='3e0601f0'/> + <return type-id='95e97e5e'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='lib/libspl/getexecname.c' language='LANG_C99'> <function-decl name='getexecname' mangled-name='getexecname' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='getexecname'> <return type-id='80f4b756'/> </function-decl> + <function-decl name='getexecname_impl' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='26a90f95'/> + <return type-id='79a0948f'/> + </function-decl> </abi-instr> - <abi-instr address-size='64' path='list.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libspl/list.c' language='LANG_C99'> <typedef-decl name='list_node_t' type-id='b0b5e45e' id='b21843b2'/> <typedef-decl name='list_t' type-id='e824dae9' id='0899125f'/> <class-decl name='list_node' size-in-bits='128' is-struct='yes' visibility='default' id='b0b5e45e'> @@ -586,18 +814,14 @@ <var-decl name='prev' type-id='b03eadb4' visibility='default'/> </data-member> </class-decl> - <class-decl name='list' size-in-bits='256' is-struct='yes' visibility='default' id='e824dae9'> + <class-decl name='list' size-in-bits='192' is-struct='yes' visibility='default' id='e824dae9'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='list_size' type-id='b59d7dce' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> <var-decl name='list_offset' type-id='b59d7dce' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='128'> + <data-member access='public' layout-offset-in-bits='64'> <var-decl name='list_head' type-id='b0b5e45e' visibility='default'/> </data-member> </class-decl> - <typedef-decl name='size_t' type-id='7359adad' id='b59d7dce'/> <pointer-type-def type-id='b0b5e45e' size-in-bits='64' id='b03eadb4'/> <pointer-type-def type-id='b21843b2' size-in-bits='64' id='ccc38265'/> <pointer-type-def type-id='0899125f' size-in-bits='64' id='352ec160'/> @@ -687,33 +911,82 @@ <return type-id='95e97e5e'/> </function-decl> </abi-instr> - <abi-instr address-size='64' path='mkdirp.c' language='LANG_C99'> - <typedef-decl name='__mode_t' type-id='f0981eeb' id='e1c52942'/> + <abi-instr address-size='64' path='lib/libspl/mkdirp.c' language='LANG_C99'> <typedef-decl name='mode_t' type-id='e1c52942' id='d50d396c'/> + <typedef-decl name='wchar_t' type-id='95e97e5e' id='928221d2'/> + <qualified-type-def type-id='26a90f95' restrict='yes' id='266fe297'/> + <qualified-type-def type-id='928221d2' const='yes' id='effb3702'/> + <pointer-type-def type-id='effb3702' size-in-bits='64' id='f077d3f8'/> + <qualified-type-def type-id='f077d3f8' restrict='yes' id='598aab80'/> + <pointer-type-def type-id='928221d2' size-in-bits='64' id='323d93c1'/> + <qualified-type-def type-id='323d93c1' restrict='yes' id='f1358bc3'/> + <function-decl name='calloc' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b59d7dce'/> + <parameter type-id='b59d7dce'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='strdup' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='strlen' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='access' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='__mbstowcs_chk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='f1358bc3'/> + <parameter type-id='9d26089a'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='b59d7dce'/> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='__wcstombs_chk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='266fe297'/> + <parameter type-id='598aab80'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='b59d7dce'/> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='mkdir' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='e1c52942'/> + <return type-id='95e97e5e'/> + </function-decl> <function-decl name='mkdirp' mangled-name='mkdirp' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mkdirp'> <parameter type-id='80f4b756' name='d'/> <parameter type-id='d50d396c' name='mode'/> <return type-id='95e97e5e'/> </function-decl> </abi-instr> - <abi-instr address-size='64' path='os/linux/gethostid.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libspl/os/linux/getexecname.c' language='LANG_C99'> + <function-decl name='__readlink_chk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='9d26089a'/> + <parameter type-id='266fe297'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='b59d7dce'/> + <return type-id='79a0948f'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='lib/libspl/os/linux/gethostid.c' language='LANG_C99'> + <type-decl name='long long unsigned int' size-in-bits='64' id='3a47d82b'/> + <pointer-type-def type-id='26a90f95' size-in-bits='64' id='9b23c9ad'/> + <qualified-type-def type-id='9b23c9ad' restrict='yes' id='8c85230f'/> + <function-decl name='strtoull' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='9d26089a'/> + <parameter type-id='8c85230f'/> + <parameter type-id='95e97e5e'/> + <return type-id='3a47d82b'/> + </function-decl> <function-decl name='get_system_hostid' mangled-name='get_system_hostid' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_system_hostid'> <return type-id='7359adad'/> </function-decl> </abi-instr> - <abi-instr address-size='64' path='os/linux/getmntany.c' language='LANG_C99'> - <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='a84c031d' size-in-bits='8' id='89feb1ec'> - <subrange length='1' type-id='7359adad' id='52f813b4'/> - </array-type-def> - <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='160' id='664ac0b7'> - <subrange length='20' type-id='7359adad' id='fdca39cf'/> - </array-type-def> - <class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='a4036571'/> - <class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='010ae0b9'/> - <class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='79bd3751'/> + <abi-instr address-size='64' path='lib/libspl/os/linux/getmntany.c' language='LANG_C99'> <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'/> @@ -748,6 +1021,26 @@ <var-decl name='mnt_minor' type-id='3502e3ff' 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'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='mnt_dir' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='mnt_type' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='mnt_opts' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='mnt_freq' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='288'> + <var-decl name='mnt_passno' type-id='95e97e5e' visibility='default'/> + </data-member> + </class-decl> <class-decl name='stat64' size-in-bits='1152' is-struct='yes' visibility='default' id='0bbec9cd'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='st_dev' type-id='35ed8932' visibility='default'/> @@ -795,128 +1088,39 @@ <var-decl name='__glibc_reserved' type-id='083f8d58' visibility='default'/> </data-member> </class-decl> - <typedef-decl name='__dev_t' type-id='7359adad' id='35ed8932'/> - <typedef-decl name='__uid_t' type-id='f0981eeb' id='cc5fcceb'/> - <typedef-decl name='__gid_t' type-id='f0981eeb' id='d94ec6d9'/> <typedef-decl name='__ino64_t' type-id='7359adad' id='71288a47'/> - <typedef-decl name='__nlink_t' type-id='7359adad' id='80f0b9df'/> - <typedef-decl name='__off_t' type-id='bd54fe1a' id='79989e9c'/> - <typedef-decl name='__off64_t' type-id='bd54fe1a' id='724e4de6'/> - <typedef-decl name='__time_t' type-id='bd54fe1a' id='65eda9c0'/> - <typedef-decl name='__blksize_t' type-id='bd54fe1a' id='d3f10a7f'/> <typedef-decl name='__blkcnt64_t' type-id='bd54fe1a' id='4e711bf1'/> - <typedef-decl name='__syscall_slong_t' type-id='bd54fe1a' id='03085adc'/> - <typedef-decl name='FILE' type-id='ec1ed955' id='aa12d1ba'/> - <typedef-decl name='_IO_lock_t' type-id='48b5725f' id='bb4788fa'/> - <class-decl name='_IO_FILE' size-in-bits='1728' is-struct='yes' visibility='default' id='ec1ed955'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_flags' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='_IO_read_ptr' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='_IO_read_end' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='_IO_read_base' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='_IO_write_base' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_IO_write_ptr' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='_IO_write_end' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='_IO_buf_base' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='_IO_buf_end' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='_IO_save_base' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='_IO_backup_base' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='_IO_save_end' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='_markers' type-id='e4c6fa61' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='_chain' type-id='dca988a5' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='_fileno' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='928'> - <var-decl name='_flags2' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='960'> - <var-decl name='_old_offset' type-id='79989e9c' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1024'> - <var-decl name='_cur_column' type-id='8efea9e5' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1040'> - <var-decl name='_vtable_offset' type-id='28577a57' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1048'> - <var-decl name='_shortbuf' type-id='89feb1ec' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1088'> - <var-decl name='_lock' type-id='cecf4ea7' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1152'> - <var-decl name='_offset' type-id='724e4de6' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1216'> - <var-decl name='_codecvt' type-id='570f8c59' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1280'> - <var-decl name='_wide_data' type-id='c65a1f29' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1344'> - <var-decl name='_freeres_list' type-id='dca988a5' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1408'> - <var-decl name='_freeres_buf' type-id='eaa32e2f' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1472'> - <var-decl name='__pad5' type-id='b59d7dce' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1536'> - <var-decl name='_mode' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1568'> - <var-decl name='_unused2' type-id='664ac0b7' visibility='default'/> - </data-member> - </class-decl> - <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' id='a9c79a1f'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='tv_sec' type-id='65eda9c0' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='tv_nsec' type-id='03085adc' visibility='default'/> - </data-member> - </class-decl> - <pointer-type-def type-id='aa12d1ba' size-in-bits='64' id='822cd80b'/> - <pointer-type-def type-id='ec1ed955' size-in-bits='64' id='dca988a5'/> - <pointer-type-def type-id='a4036571' size-in-bits='64' id='570f8c59'/> - <pointer-type-def type-id='bb4788fa' size-in-bits='64' id='cecf4ea7'/> - <pointer-type-def type-id='010ae0b9' size-in-bits='64' id='e4c6fa61'/> - <pointer-type-def type-id='79bd3751' size-in-bits='64' id='c65a1f29'/> <pointer-type-def type-id='0c544dc0' size-in-bits='64' id='394fc496'/> + <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='1b055409' size-in-bits='64' id='9d424d31'/> <pointer-type-def type-id='0bbec9cd' size-in-bits='64' id='62f7a03d'/> - <class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='a4036571'/> - <class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='010ae0b9'/> - <class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='79bd3751'/> + <qualified-type-def type-id='62f7a03d' restrict='yes' id='f1cadedf'/> + <function-decl name='getmntent_r' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='e75a27e9'/> + <parameter type-id='3cad23cd'/> + <parameter type-id='266fe297'/> + <parameter type-id='95e97e5e'/> + <return type-id='b6b61d2f'/> + </function-decl> + <function-decl name='feof' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='822cd80b'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='strcmp' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='strerror' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='stat64' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='9d26089a'/> + <parameter type-id='f1cadedf'/> + <return type-id='95e97e5e'/> + </function-decl> <function-decl name='getmntany' mangled-name='getmntany' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='getmntany'> <parameter type-id='822cd80b' name='fp'/> <parameter type-id='9d424d31' name='mgetp'/> @@ -935,18 +1139,28 @@ <return type-id='95e97e5e'/> </function-decl> </abi-instr> - <abi-instr address-size='64' path='os/linux/zone.c' language='LANG_C99'> - <typedef-decl name='zoneid_t' type-id='95e97e5e' id='4da03624'/> + <abi-instr address-size='64' path='lib/libspl/os/linux/zone.c' language='LANG_C99'> + <typedef-decl name='zoneid_t' type-id='3502e3ff' id='4da03624'/> + <function-decl name='strtoul' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='9d26089a'/> + <parameter type-id='8c85230f'/> + <parameter type-id='95e97e5e'/> + <return type-id='7359adad'/> + </function-decl> <function-decl name='getzoneid' mangled-name='getzoneid' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='getzoneid'> <return type-id='4da03624'/> </function-decl> </abi-instr> - <abi-instr address-size='64' path='page.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libspl/page.c' language='LANG_C99'> + <function-decl name='sysconf' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <return type-id='bd54fe1a'/> + </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> </abi-instr> - <abi-instr address-size='64' path='strlcat.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libspl/strlcat.c' language='LANG_C99'> <function-decl name='strlcat' mangled-name='strlcat' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='strlcat'> <parameter type-id='26a90f95' name='dst'/> <parameter type-id='80f4b756' name='src'/> @@ -954,26 +1168,138 @@ <return type-id='b59d7dce'/> </function-decl> </abi-instr> - <abi-instr address-size='64' path='strlcpy.c' language='LANG_C99'> - <function-decl name='strlcpy' mangled-name='strlcpy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='strlcpy'> - <parameter type-id='26a90f95' name='dst'/> - <parameter type-id='80f4b756' name='src'/> - <parameter type-id='b59d7dce' name='len'/> + <abi-instr address-size='64' path='lib/libspl/timestamp.c' language='LANG_C99'> + <typedef-decl name='nl_item' type-id='95e97e5e' id='03b79a94'/> + <class-decl name='tm' size-in-bits='448' is-struct='yes' visibility='default' id='dddf6ca2'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='tm_sec' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='tm_min' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='tm_hour' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='tm_mday' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='tm_mon' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160'> + <var-decl name='tm_year' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='tm_wday' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='224'> + <var-decl name='tm_yday' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='tm_isdst' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='tm_gmtoff' type-id='bd54fe1a' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='tm_zone' type-id='80f4b756' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='time_t' type-id='65eda9c0' id='c9d12d66'/> + <qualified-type-def type-id='c9d12d66' const='yes' id='588b3216'/> + <pointer-type-def type-id='588b3216' size-in-bits='64' id='9f201474'/> + <qualified-type-def type-id='9f201474' restrict='yes' id='d6e2847c'/> + <qualified-type-def type-id='dddf6ca2' const='yes' id='e824a34f'/> + <pointer-type-def type-id='e824a34f' size-in-bits='64' id='d6ad37ff'/> + <qualified-type-def type-id='d6ad37ff' restrict='yes' id='f8c6051d'/> + <pointer-type-def type-id='c9d12d66' size-in-bits='64' id='b2eb2c3f'/> + <pointer-type-def type-id='dddf6ca2' size-in-bits='64' id='d915a820'/> + <qualified-type-def type-id='d915a820' restrict='yes' id='f099ad08'/> + <function-decl name='nl_langinfo' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='03b79a94'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='time' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b2eb2c3f'/> + <return type-id='c9d12d66'/> + </function-decl> + <function-decl name='strftime' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='266fe297'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='9d26089a'/> + <parameter type-id='f8c6051d'/> <return type-id='b59d7dce'/> </function-decl> - </abi-instr> - <abi-instr address-size='64' path='timestamp.c' language='LANG_C99'> + <function-decl name='localtime_r' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='d6e2847c'/> + <parameter type-id='f099ad08'/> + <return type-id='d915a820'/> + </function-decl> + <function-decl name='__printf_chk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter type-id='80f4b756'/> + <parameter is-variadic='yes'/> + <return type-id='95e97e5e'/> + </function-decl> <function-decl name='print_timestamp' mangled-name='print_timestamp' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='print_timestamp'> <parameter type-id='3502e3ff' name='timestamp_fmt'/> <return type-id='48b5725f'/> </function-decl> + <function-decl name='get_timestamp' mangled-name='get_timestamp' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_timestamp'> + <parameter type-id='3502e3ff' name='timestamp_fmt'/> + <parameter type-id='26a90f95' name='buf'/> + <parameter type-id='95e97e5e' name='len'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='format_timestamp' mangled-name='format_timestamp' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='format_timestamp'> + <parameter type-id='c9d12d66' name='t'/> + <parameter type-id='26a90f95' name='buf'/> + <parameter type-id='95e97e5e' name='len'/> + <return type-id='48b5725f'/> + </function-decl> </abi-instr> - <abi-instr address-size='64' path='libzfs_core.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libzfs_core/libzfs_core.c' language='LANG_C99'> + <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> <type-decl name='char' size-in-bits='8' id='a84c031d'/> + <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='8' id='89feb1ec'> + <subrange length='1' type-id='7359adad' id='52f813b4'/> + </array-type-def> + <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='160' id='664ac0b7'> + <subrange length='20' type-id='7359adad' id='fdca39cf'/> + </array-type-def> <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='2048' id='d1617432'> <subrange length='256' type-id='7359adad' id='36e5b9fa'/> </array-type-def> + <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='2816' id='514368c7'> + <subrange length='352' type-id='7359adad' id='b715cd6f'/> + </array-type-def> + <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='32768' id='d16c6df4'> + <subrange length='4096' type-id='7359adad' id='bc1b5ddc'/> + </array-type-def> + <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='320' id='36c46961'> + <subrange length='40' type-id='7359adad' id='8f80b239'/> + </array-type-def> + <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='448' id='6093ff7c'> + <subrange length='56' type-id='7359adad' id='f8137894'/> + </array-type-def> + <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='65536' id='163f6aa5'> + <subrange length='8192' type-id='7359adad' id='c88f397d'/> + </array-type-def> + <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='infinite' id='e84913bd'> + <subrange length='infinite' type-id='7359adad' id='031f2035'/> + </array-type-def> + <class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='a4036571'/> + <class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='010ae0b9'/> + <class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='79bd3751'/> <type-decl name='int' size-in-bits='32' id='95e97e5e'/> + <type-decl name='long int' size-in-bits='64' id='bd54fe1a'/> + <type-decl name='short int' size-in-bits='16' id='a2185560'/> + <type-decl name='signed char' size-in-bits='8' id='28577a57'/> + <array-type-def dimensions='1' type-id='9c313c2d' size-in-bits='128' id='c1c22e6c'> + <subrange length='2' type-id='7359adad' id='52efc4ef'/> + </array-type-def> <array-type-def dimensions='1' type-id='9c313c2d' size-in-bits='2176' id='8c2bcad1'> <subrange length='34' type-id='7359adad' id='6a6a7e00'/> </array-type-def> @@ -1002,6 +1328,8 @@ <type-decl name='unsigned char' size-in-bits='8' id='002ac4a6'/> <type-decl name='unsigned int' size-in-bits='32' id='f0981eeb'/> <type-decl name='unsigned long int' size-in-bits='64' id='7359adad'/> + <type-decl name='unsigned short int' size-in-bits='16' id='8efea9e5'/> + <type-decl name='variadic parameter type' id='2c1145c5'/> <type-decl name='void' id='48b5725f'/> <enum-decl name='lzc_dataset_type' id='bc9887f1'> <underlying-type type-id='9cac1fee'/> @@ -1016,7 +1344,7 @@ <enumerator name='LZC_SEND_FLAG_RAW' value='8'/> <enumerator name='LZC_SEND_FLAG_SAVED' value='16'/> </enum-decl> - <class-decl name='ddt_key' size-in-bits='320' is-struct='yes' visibility='default' id='e0a4a1cb'> + <class-decl name='ddt_key_t' size-in-bits='320' is-struct='yes' naming-typedef-id='67f6d2cf' visibility='default' id='5fae1718'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='ddk_cksum' type-id='39730d0b' visibility='default'/> </data-member> @@ -1024,7 +1352,7 @@ <var-decl name='ddk_prop' type-id='9c313c2d' visibility='default'/> </data-member> </class-decl> - <typedef-decl name='ddt_key_t' type-id='e0a4a1cb' id='67f6d2cf'/> + <typedef-decl name='ddt_key_t' type-id='5fae1718' id='67f6d2cf'/> <enum-decl name='dmu_object_type' id='04b3b0b9'> <underlying-type type-id='9cac1fee'/> <enumerator name='DMU_OT_NONE' value='0'/> @@ -1104,6 +1432,36 @@ <enumerator name='DMU_OTN_ZAP_ENC_METADATA' value='228'/> </enum-decl> <typedef-decl name='dmu_object_type_t' type-id='04b3b0b9' id='5c9d8906'/> + <class-decl name='dmu_objset_stats' size-in-bits='2304' is-struct='yes' visibility='default' id='098f0221'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='dds_num_clones' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='dds_creation_txg' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='dds_guid' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='dds_type' type-id='230f1e16' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='224'> + <var-decl name='dds_is_snapshot' type-id='b96825af' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='232'> + <var-decl name='dds_inconsistent' type-id='b96825af' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='240'> + <var-decl name='dds_redacted' type-id='b96825af' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='248'> + <var-decl name='dds_origin' type-id='d1617432' visibility='default'/> + </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> + <typedef-decl name='dmu_objset_stats_t' type-id='098f0221' id='b2c14f17'/> <enum-decl name='dmu_objset_type' id='6b1b19f9'> <underlying-type type-id='9cac1fee'/> <enumerator name='DMU_OST_NONE' value='0'/> @@ -1120,7 +1478,8 @@ <enumerator name='POOL_INITIALIZE_START' value='0'/> <enumerator name='POOL_INITIALIZE_CANCEL' value='1'/> <enumerator name='POOL_INITIALIZE_SUSPEND' value='2'/> - <enumerator name='POOL_INITIALIZE_FUNCS' value='3'/> + <enumerator name='POOL_INITIALIZE_UNINIT' value='3'/> + <enumerator name='POOL_INITIALIZE_FUNCS' value='4'/> </enum-decl> <typedef-decl name='pool_initialize_func_t' type-id='5c246ad4' id='7063e1ab'/> <enum-decl name='pool_trim_func' id='54ed608a'> @@ -1131,6 +1490,114 @@ <enumerator name='POOL_TRIM_FUNCS' value='3'/> </enum-decl> <typedef-decl name='pool_trim_func_t' type-id='54ed608a' id='b1146b8d'/> + <enum-decl name='zfs_ioc' id='12033f13'> + <underlying-type type-id='9cac1fee'/> + <enumerator name='ZFS_IOC_FIRST' value='23040'/> + <enumerator name='ZFS_IOC' value='23040'/> + <enumerator name='ZFS_IOC_POOL_CREATE' value='23040'/> + <enumerator name='ZFS_IOC_POOL_DESTROY' value='23041'/> + <enumerator name='ZFS_IOC_POOL_IMPORT' value='23042'/> + <enumerator name='ZFS_IOC_POOL_EXPORT' value='23043'/> + <enumerator name='ZFS_IOC_POOL_CONFIGS' value='23044'/> + <enumerator name='ZFS_IOC_POOL_STATS' value='23045'/> + <enumerator name='ZFS_IOC_POOL_TRYIMPORT' value='23046'/> + <enumerator name='ZFS_IOC_POOL_SCAN' value='23047'/> + <enumerator name='ZFS_IOC_POOL_FREEZE' value='23048'/> + <enumerator name='ZFS_IOC_POOL_UPGRADE' value='23049'/> + <enumerator name='ZFS_IOC_POOL_GET_HISTORY' value='23050'/> + <enumerator name='ZFS_IOC_VDEV_ADD' value='23051'/> + <enumerator name='ZFS_IOC_VDEV_REMOVE' value='23052'/> + <enumerator name='ZFS_IOC_VDEV_SET_STATE' value='23053'/> + <enumerator name='ZFS_IOC_VDEV_ATTACH' value='23054'/> + <enumerator name='ZFS_IOC_VDEV_DETACH' value='23055'/> + <enumerator name='ZFS_IOC_VDEV_SETPATH' value='23056'/> + <enumerator name='ZFS_IOC_VDEV_SETFRU' value='23057'/> + <enumerator name='ZFS_IOC_OBJSET_STATS' value='23058'/> + <enumerator name='ZFS_IOC_OBJSET_ZPLPROPS' value='23059'/> + <enumerator name='ZFS_IOC_DATASET_LIST_NEXT' value='23060'/> + <enumerator name='ZFS_IOC_SNAPSHOT_LIST_NEXT' value='23061'/> + <enumerator name='ZFS_IOC_SET_PROP' value='23062'/> + <enumerator name='ZFS_IOC_CREATE' value='23063'/> + <enumerator name='ZFS_IOC_DESTROY' value='23064'/> + <enumerator name='ZFS_IOC_ROLLBACK' value='23065'/> + <enumerator name='ZFS_IOC_RENAME' value='23066'/> + <enumerator name='ZFS_IOC_RECV' value='23067'/> + <enumerator name='ZFS_IOC_SEND' value='23068'/> + <enumerator name='ZFS_IOC_INJECT_FAULT' value='23069'/> + <enumerator name='ZFS_IOC_CLEAR_FAULT' value='23070'/> + <enumerator name='ZFS_IOC_INJECT_LIST_NEXT' value='23071'/> + <enumerator name='ZFS_IOC_ERROR_LOG' value='23072'/> + <enumerator name='ZFS_IOC_CLEAR' value='23073'/> + <enumerator name='ZFS_IOC_PROMOTE' value='23074'/> + <enumerator name='ZFS_IOC_SNAPSHOT' value='23075'/> + <enumerator name='ZFS_IOC_DSOBJ_TO_DSNAME' value='23076'/> + <enumerator name='ZFS_IOC_OBJ_TO_PATH' value='23077'/> + <enumerator name='ZFS_IOC_POOL_SET_PROPS' value='23078'/> + <enumerator name='ZFS_IOC_POOL_GET_PROPS' value='23079'/> + <enumerator name='ZFS_IOC_SET_FSACL' value='23080'/> + <enumerator name='ZFS_IOC_GET_FSACL' value='23081'/> + <enumerator name='ZFS_IOC_SHARE' value='23082'/> + <enumerator name='ZFS_IOC_INHERIT_PROP' value='23083'/> + <enumerator name='ZFS_IOC_SMB_ACL' value='23084'/> + <enumerator name='ZFS_IOC_USERSPACE_ONE' value='23085'/> + <enumerator name='ZFS_IOC_USERSPACE_MANY' value='23086'/> + <enumerator name='ZFS_IOC_USERSPACE_UPGRADE' value='23087'/> + <enumerator name='ZFS_IOC_HOLD' value='23088'/> + <enumerator name='ZFS_IOC_RELEASE' value='23089'/> + <enumerator name='ZFS_IOC_GET_HOLDS' value='23090'/> + <enumerator name='ZFS_IOC_OBJSET_RECVD_PROPS' value='23091'/> + <enumerator name='ZFS_IOC_VDEV_SPLIT' value='23092'/> + <enumerator name='ZFS_IOC_NEXT_OBJ' value='23093'/> + <enumerator name='ZFS_IOC_DIFF' value='23094'/> + <enumerator name='ZFS_IOC_TMP_SNAPSHOT' value='23095'/> + <enumerator name='ZFS_IOC_OBJ_TO_STATS' value='23096'/> + <enumerator name='ZFS_IOC_SPACE_WRITTEN' value='23097'/> + <enumerator name='ZFS_IOC_SPACE_SNAPS' value='23098'/> + <enumerator name='ZFS_IOC_DESTROY_SNAPS' value='23099'/> + <enumerator name='ZFS_IOC_POOL_REGUID' value='23100'/> + <enumerator name='ZFS_IOC_POOL_REOPEN' value='23101'/> + <enumerator name='ZFS_IOC_SEND_PROGRESS' value='23102'/> + <enumerator name='ZFS_IOC_LOG_HISTORY' value='23103'/> + <enumerator name='ZFS_IOC_SEND_NEW' value='23104'/> + <enumerator name='ZFS_IOC_SEND_SPACE' value='23105'/> + <enumerator name='ZFS_IOC_CLONE' value='23106'/> + <enumerator name='ZFS_IOC_BOOKMARK' value='23107'/> + <enumerator name='ZFS_IOC_GET_BOOKMARKS' value='23108'/> + <enumerator name='ZFS_IOC_DESTROY_BOOKMARKS' value='23109'/> + <enumerator name='ZFS_IOC_RECV_NEW' value='23110'/> + <enumerator name='ZFS_IOC_POOL_SYNC' value='23111'/> + <enumerator name='ZFS_IOC_CHANNEL_PROGRAM' value='23112'/> + <enumerator name='ZFS_IOC_LOAD_KEY' value='23113'/> + <enumerator name='ZFS_IOC_UNLOAD_KEY' value='23114'/> + <enumerator name='ZFS_IOC_CHANGE_KEY' value='23115'/> + <enumerator name='ZFS_IOC_REMAP' value='23116'/> + <enumerator name='ZFS_IOC_POOL_CHECKPOINT' value='23117'/> + <enumerator name='ZFS_IOC_POOL_DISCARD_CHECKPOINT' value='23118'/> + <enumerator name='ZFS_IOC_POOL_INITIALIZE' value='23119'/> + <enumerator name='ZFS_IOC_POOL_TRIM' value='23120'/> + <enumerator name='ZFS_IOC_REDACT' value='23121'/> + <enumerator name='ZFS_IOC_GET_BOOKMARK_PROPS' value='23122'/> + <enumerator name='ZFS_IOC_WAIT' value='23123'/> + <enumerator name='ZFS_IOC_WAIT_FS' value='23124'/> + <enumerator name='ZFS_IOC_VDEV_GET_PROPS' value='23125'/> + <enumerator name='ZFS_IOC_VDEV_SET_PROPS' value='23126'/> + <enumerator name='ZFS_IOC_POOL_SCRUB' value='23127'/> + <enumerator name='ZFS_IOC_POOL_PREFETCH' value='23128'/> + <enumerator name='ZFS_IOC_DDT_PRUNE' value='23129'/> + <enumerator name='ZFS_IOC_PLATFORM' value='23168'/> + <enumerator name='ZFS_IOC_EVENTS_NEXT' value='23169'/> + <enumerator name='ZFS_IOC_EVENTS_CLEAR' value='23170'/> + <enumerator name='ZFS_IOC_EVENTS_SEEK' value='23171'/> + <enumerator name='ZFS_IOC_NEXTBOOT' value='23172'/> + <enumerator name='ZFS_IOC_JAIL' value='23173'/> + <enumerator name='ZFS_IOC_USERNS_ATTACH' value='23173'/> + <enumerator name='ZFS_IOC_UNJAIL' value='23174'/> + <enumerator name='ZFS_IOC_USERNS_DETACH' value='23174'/> + <enumerator name='ZFS_IOC_SET_BOOTENV' value='23175'/> + <enumerator name='ZFS_IOC_GET_BOOTENV' value='23176'/> + <enumerator name='ZFS_IOC_LAST' value='23177'/> + </enum-decl> + <typedef-decl name='zfs_ioc_t' type-id='12033f13' id='5b35941c'/> <enum-decl name='zpool_wait_activity_t' naming-typedef-id='73446457' id='849338e3'> <underlying-type type-id='9cac1fee'/> <enumerator name='ZPOOL_WAIT_CKPT_DISCARD' value='0'/> @@ -1141,7 +1608,8 @@ <enumerator name='ZPOOL_WAIT_RESILVER' value='5'/> <enumerator name='ZPOOL_WAIT_SCRUB' value='6'/> <enumerator name='ZPOOL_WAIT_TRIM' value='7'/> - <enumerator name='ZPOOL_WAIT_NUM_ACTIVITIES' value='8'/> + <enumerator name='ZPOOL_WAIT_RAIDZ_EXPAND' value='8'/> + <enumerator name='ZPOOL_WAIT_NUM_ACTIVITIES' value='9'/> </enum-decl> <typedef-decl name='zpool_wait_activity_t' type-id='849338e3' id='73446457'/> <enum-decl name='zfs_wait_activity_t' naming-typedef-id='3024501a' id='527d5dc6'> @@ -1150,6 +1618,73 @@ <enumerator name='ZFS_WAIT_NUM_ACTIVITIES' value='1'/> </enum-decl> <typedef-decl name='zfs_wait_activity_t' type-id='527d5dc6' id='3024501a'/> + <enum-decl name='zpool_prefetch_type_t' naming-typedef-id='e55ff6bc' id='0299ab50'> + <underlying-type type-id='9cac1fee'/> + <enumerator name='ZPOOL_PREFETCH_NONE' value='0'/> + <enumerator name='ZPOOL_PREFETCH_DDT' value='1'/> + </enum-decl> + <typedef-decl name='zpool_prefetch_type_t' type-id='0299ab50' id='e55ff6bc'/> + <enum-decl name='zpool_ddt_prune_unit_t' naming-typedef-id='02e25ab0' id='509ae11c'> + <underlying-type type-id='9cac1fee'/> + <enumerator name='ZPOOL_DDT_PRUNE_NONE' value='0'/> + <enumerator name='ZPOOL_DDT_PRUNE_AGE' value='1'/> + <enumerator name='ZPOOL_DDT_PRUNE_PERCENTAGE' value='2'/> + </enum-decl> + <typedef-decl name='zpool_ddt_prune_unit_t' type-id='509ae11c' id='02e25ab0'/> + <enum-decl name='data_type_t' naming-typedef-id='8d0687d2' id='aeeae136'> + <underlying-type type-id='9cac1fee'/> + <enumerator name='DATA_TYPE_DONTCARE' value='-1'/> + <enumerator name='DATA_TYPE_UNKNOWN' value='0'/> + <enumerator name='DATA_TYPE_BOOLEAN' value='1'/> + <enumerator name='DATA_TYPE_BYTE' value='2'/> + <enumerator name='DATA_TYPE_INT16' value='3'/> + <enumerator name='DATA_TYPE_UINT16' value='4'/> + <enumerator name='DATA_TYPE_INT32' value='5'/> + <enumerator name='DATA_TYPE_UINT32' value='6'/> + <enumerator name='DATA_TYPE_INT64' value='7'/> + <enumerator name='DATA_TYPE_UINT64' value='8'/> + <enumerator name='DATA_TYPE_STRING' value='9'/> + <enumerator name='DATA_TYPE_BYTE_ARRAY' value='10'/> + <enumerator name='DATA_TYPE_INT16_ARRAY' value='11'/> + <enumerator name='DATA_TYPE_UINT16_ARRAY' value='12'/> + <enumerator name='DATA_TYPE_INT32_ARRAY' value='13'/> + <enumerator name='DATA_TYPE_UINT32_ARRAY' value='14'/> + <enumerator name='DATA_TYPE_INT64_ARRAY' value='15'/> + <enumerator name='DATA_TYPE_UINT64_ARRAY' value='16'/> + <enumerator name='DATA_TYPE_STRING_ARRAY' value='17'/> + <enumerator name='DATA_TYPE_HRTIME' value='18'/> + <enumerator name='DATA_TYPE_NVLIST' value='19'/> + <enumerator name='DATA_TYPE_NVLIST_ARRAY' value='20'/> + <enumerator name='DATA_TYPE_BOOLEAN_VALUE' value='21'/> + <enumerator name='DATA_TYPE_INT8' value='22'/> + <enumerator name='DATA_TYPE_UINT8' value='23'/> + <enumerator name='DATA_TYPE_BOOLEAN_ARRAY' value='24'/> + <enumerator name='DATA_TYPE_INT8_ARRAY' value='25'/> + <enumerator name='DATA_TYPE_UINT8_ARRAY' value='26'/> + <enumerator name='DATA_TYPE_DOUBLE' value='27'/> + </enum-decl> + <typedef-decl name='data_type_t' type-id='aeeae136' id='8d0687d2'/> + <class-decl name='nvpair' size-in-bits='128' is-struct='yes' visibility='default' id='1c34e459'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='nvp_size' type-id='3ff5601b' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='nvp_name_sz' type-id='23bd8cb5' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='48'> + <var-decl name='nvp_reserve' type-id='23bd8cb5' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='nvp_value_elem' type-id='3ff5601b' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='nvp_type' type-id='8d0687d2' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='nvp_name' type-id='e84913bd' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='nvpair_t' type-id='1c34e459' id='57928edf'/> <class-decl name='nvlist' size-in-bits='192' is-struct='yes' visibility='default' id='ac266fd9'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='nvl_version' type-id='3ff5601b' visibility='default'/> @@ -1226,7 +1761,7 @@ <enumerator name='DRR_REDACT' value='10'/> <enumerator name='DRR_NUMTYPES' value='11'/> </enum-decl> - <union-decl name='__anonymous_union__' size-in-bits='2432' is-anonymous='yes' visibility='default' id='ac5ab595'> + <union-decl name='__anonymous_union__1' size-in-bits='2432' is-anonymous='yes' visibility='default' id='ac5ab595'> <data-member access='public'> <var-decl name='drr_begin' type-id='09fcdc01' visibility='default'/> </data-member> @@ -1542,39 +2077,753 @@ </data-member> </class-decl> <typedef-decl name='dmu_replay_record_t' type-id='781a52d7' id='8b8fc893'/> + <class-decl name='zinject_record' size-in-bits='2944' is-struct='yes' visibility='default' id='3216f820'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='zi_objset' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='zi_object' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='zi_start' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='zi_end' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='zi_guid' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='zi_level' type-id='8f92235e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='352'> + <var-decl name='zi_error' type-id='8f92235e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='zi_type' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='zi_freq' type-id='8f92235e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='480'> + <var-decl name='zi_failfast' type-id='8f92235e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='zi_func' type-id='d1617432' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2560'> + <var-decl name='zi_iotype' type-id='8f92235e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2592'> + <var-decl name='zi_duration' type-id='3ff5601b' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2624'> + <var-decl name='zi_timer' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2688'> + <var-decl name='zi_nlanes' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2752'> + <var-decl name='zi_cmd' type-id='8f92235e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2784'> + <var-decl name='zi_dvas' type-id='8f92235e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2816'> + <var-decl name='zi_match_count' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2880'> + <var-decl name='zi_inject_count' type-id='9c313c2d' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='zinject_record_t' type-id='3216f820' id='a4301ca6'/> + <class-decl name='zfs_share' size-in-bits='256' is-struct='yes' visibility='default' id='feb6f2da'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='z_exportdata' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='z_sharedata' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='z_sharetype' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='z_sharemax' type-id='9c313c2d' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='zfs_share_t' type-id='feb6f2da' id='ee5cec36'/> + <class-decl name='zfs_cmd' size-in-bits='109952' is-struct='yes' visibility='default' id='3522cd69'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='zc_name' type-id='d16c6df4' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32768'> + <var-decl name='zc_nvlist_src' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32832'> + <var-decl name='zc_nvlist_src_size' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32896'> + <var-decl name='zc_nvlist_dst' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32960'> + <var-decl name='zc_nvlist_dst_size' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='33024'> + <var-decl name='zc_nvlist_dst_filled' type-id='c19b74c3' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='33056'> + <var-decl name='zc_pad2' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='33088'> + <var-decl name='zc_history' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='33152'> + <var-decl name='zc_value' type-id='163f6aa5' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='98688'> + <var-decl name='zc_string' type-id='d1617432' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='100736'> + <var-decl name='zc_guid' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='100800'> + <var-decl name='zc_nvlist_conf' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='100864'> + <var-decl name='zc_nvlist_conf_size' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='100928'> + <var-decl name='zc_cookie' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='100992'> + <var-decl name='zc_objset_type' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='101056'> + <var-decl name='zc_perm_action' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='101120'> + <var-decl name='zc_history_len' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='101184'> + <var-decl name='zc_history_offset' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='101248'> + <var-decl name='zc_obj' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='101312'> + <var-decl name='zc_iflags' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='101376'> + <var-decl name='zc_share' type-id='ee5cec36' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='101632'> + <var-decl name='zc_objset_stats' type-id='b2c14f17' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='103936'> + <var-decl name='zc_begin_record' type-id='09fcdc01' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='106368'> + <var-decl name='' type-id='ac5ab596' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='109312'> + <var-decl name='zc_cleanup_fd' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='109344'> + <var-decl name='zc_simple' type-id='b96825af' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='109352'> + <var-decl name='zc_pad' type-id='d3490169' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='109376'> + <var-decl name='zc_sendobj' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='109440'> + <var-decl name='zc_fromobj' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='109504'> + <var-decl name='zc_createtxg' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='109568'> + <var-decl name='zc_stat' type-id='0371a9c7' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='109888'> + <var-decl name='zc_zoneid' type-id='9c313c2d' visibility='default'/> + </data-member> + </class-decl> + <union-decl name='__anonymous_union__' size-in-bits='2944' is-anonymous='yes' visibility='default' id='ac5ab596'> + <data-member access='public'> + <var-decl name='zc_inject_record' type-id='a4301ca6' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='' type-id='e7f43f72' visibility='default'/> + </data-member> + </union-decl> + <class-decl name='__anonymous_struct__' size-in-bits='2944' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f72'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='zc_pad1' type-id='514368c7' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2816'> + <var-decl name='zc_defer_destroy' type-id='8f92235e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2848'> + <var-decl name='zc_flags' type-id='8f92235e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2880'> + <var-decl name='zc_action_handle' type-id='9c313c2d' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='zfs_cmd_t' type-id='3522cd69' id='a5559cdd'/> + <class-decl name='zfs_stat' size-in-bits='320' is-struct='yes' visibility='default' id='6417f0b9'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='zs_gen' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='zs_mode' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='zs_links' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='zs_ctime' type-id='c1c22e6c' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='zfs_stat_t' type-id='6417f0b9' id='0371a9c7'/> <enum-decl name='boolean_t' naming-typedef-id='c19b74c3' id='f58c8277'> <underlying-type type-id='9cac1fee'/> <enumerator name='B_FALSE' value='0'/> <enumerator name='B_TRUE' value='1'/> </enum-decl> <typedef-decl name='boolean_t' type-id='f58c8277' id='c19b74c3'/> + <typedef-decl name='uchar_t' type-id='002ac4a6' id='d8bf0010'/> <typedef-decl name='uint_t' type-id='f0981eeb' id='3502e3ff'/> + <typedef-decl name='pthread_t' type-id='7359adad' id='4051f5e7'/> + <union-decl name='pthread_attr_t' size-in-bits='448' visibility='default' id='b63afacd'> + <data-member access='public'> + <var-decl name='__size' type-id='6093ff7c' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='__align' type-id='bd54fe1a' visibility='default'/> + </data-member> + </union-decl> + <typedef-decl name='pthread_attr_t' type-id='b63afacd' id='7d8569fd'/> + <union-decl name='pthread_mutex_t' size-in-bits='320' naming-typedef-id='7a6844eb' visibility='default' id='70681f9b'> + <data-member access='public'> + <var-decl name='__data' type-id='4c734837' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='__size' type-id='36c46961' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='__align' type-id='bd54fe1a' visibility='default'/> + </data-member> + </union-decl> + <typedef-decl name='pthread_mutex_t' type-id='70681f9b' id='7a6844eb'/> + <typedef-decl name='int16_t' type-id='03896e23' id='23bd8cb5'/> <typedef-decl name='int32_t' type-id='33f57a65' id='3ff5601b'/> <typedef-decl name='uint8_t' type-id='c51d6389' id='b96825af'/> <typedef-decl name='uint32_t' type-id='62f1140c' id='8f92235e'/> <typedef-decl name='uint64_t' type-id='8910171f' id='9c313c2d'/> + <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' id='4c734837'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='__lock' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='__count' type-id='f0981eeb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='__owner' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='__nusers' type-id='f0981eeb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='__kind' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160'> + <var-decl name='__spins' type-id='a2185560' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='176'> + <var-decl name='__elision' type-id='a2185560' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='__list' type-id='518fb49c' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='stat' size-in-bits='1152' is-struct='yes' visibility='default' id='aafc373f'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='st_dev' type-id='35ed8932' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='st_ino' type-id='e43e523d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='st_nlink' type-id='80f0b9df' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='st_mode' type-id='e1c52942' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='224'> + <var-decl name='st_uid' type-id='cc5fcceb' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='st_gid' type-id='d94ec6d9' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='288'> + <var-decl name='__pad0' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='st_rdev' type-id='35ed8932' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='st_size' type-id='79989e9c' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='st_blksize' type-id='d3f10a7f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='st_blocks' type-id='dbc43803' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='st_atim' type-id='a9c79a1f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='st_mtim' type-id='a9c79a1f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='832'> + <var-decl name='st_ctim' type-id='a9c79a1f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='960'> + <var-decl name='__glibc_reserved' type-id='083f8d58' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' id='0e01899c'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='__prev' type-id='4d98cd5a' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='__next' type-id='4d98cd5a' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='__pthread_list_t' type-id='0e01899c' id='518fb49c'/> <typedef-decl name='__uint8_t' type-id='002ac4a6' id='c51d6389'/> + <typedef-decl name='__int16_t' type-id='a2185560' id='03896e23'/> <typedef-decl name='__int32_t' type-id='95e97e5e' id='33f57a65'/> <typedef-decl name='__uint32_t' type-id='f0981eeb' id='62f1140c'/> <typedef-decl name='__uint64_t' type-id='7359adad' id='8910171f'/> + <typedef-decl name='__dev_t' type-id='7359adad' id='35ed8932'/> + <typedef-decl name='__uid_t' type-id='f0981eeb' id='cc5fcceb'/> + <typedef-decl name='__gid_t' type-id='f0981eeb' id='d94ec6d9'/> + <typedef-decl name='__ino_t' type-id='7359adad' id='e43e523d'/> + <typedef-decl name='__mode_t' type-id='f0981eeb' id='e1c52942'/> + <typedef-decl name='__nlink_t' type-id='7359adad' id='80f0b9df'/> + <typedef-decl name='__off_t' type-id='bd54fe1a' id='79989e9c'/> + <typedef-decl name='__off64_t' type-id='bd54fe1a' id='724e4de6'/> + <typedef-decl name='__time_t' type-id='bd54fe1a' id='65eda9c0'/> + <typedef-decl name='__blksize_t' type-id='bd54fe1a' id='d3f10a7f'/> + <typedef-decl name='__blkcnt_t' type-id='bd54fe1a' id='dbc43803'/> + <typedef-decl name='__ssize_t' type-id='bd54fe1a' id='41060289'/> + <typedef-decl name='__syscall_slong_t' type-id='bd54fe1a' id='03085adc'/> + <typedef-decl name='FILE' type-id='ec1ed955' id='aa12d1ba'/> + <typedef-decl name='_IO_lock_t' type-id='48b5725f' id='bb4788fa'/> + <class-decl name='_IO_FILE' size-in-bits='1728' is-struct='yes' visibility='default' id='ec1ed955'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_flags' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='_IO_read_ptr' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='_IO_read_end' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='_IO_read_base' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='_IO_write_base' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_IO_write_ptr' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='_IO_write_end' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='_IO_buf_base' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='_IO_buf_end' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='_IO_save_base' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='640'> + <var-decl name='_IO_backup_base' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='_IO_save_end' type-id='26a90f95' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='768'> + <var-decl name='_markers' type-id='e4c6fa61' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='832'> + <var-decl name='_chain' type-id='dca988a5' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='896'> + <var-decl name='_fileno' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='928'> + <var-decl name='_flags2' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='960'> + <var-decl name='_old_offset' type-id='79989e9c' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1024'> + <var-decl name='_cur_column' type-id='8efea9e5' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1040'> + <var-decl name='_vtable_offset' type-id='28577a57' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1048'> + <var-decl name='_shortbuf' type-id='89feb1ec' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1088'> + <var-decl name='_lock' type-id='cecf4ea7' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1152'> + <var-decl name='_offset' type-id='724e4de6' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1216'> + <var-decl name='_codecvt' type-id='570f8c59' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1280'> + <var-decl name='_wide_data' type-id='c65a1f29' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1344'> + <var-decl name='_freeres_list' type-id='dca988a5' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1408'> + <var-decl name='_freeres_buf' type-id='eaa32e2f' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1472'> + <var-decl name='__pad5' type-id='b59d7dce' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1536'> + <var-decl name='_mode' type-id='95e97e5e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1568'> + <var-decl name='_unused2' type-id='664ac0b7' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' id='a9c79a1f'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='tv_sec' type-id='65eda9c0' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='tv_nsec' type-id='03085adc' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='ssize_t' type-id='41060289' id='79a0948f'/> + <typedef-decl name='size_t' type-id='7359adad' id='b59d7dce'/> + <pointer-type-def type-id='aa12d1ba' size-in-bits='64' id='822cd80b'/> + <qualified-type-def type-id='822cd80b' restrict='yes' id='e75a27e9'/> + <pointer-type-def type-id='ec1ed955' size-in-bits='64' id='dca988a5'/> + <pointer-type-def type-id='a4036571' size-in-bits='64' id='570f8c59'/> + <pointer-type-def type-id='bb4788fa' size-in-bits='64' id='cecf4ea7'/> + <pointer-type-def type-id='010ae0b9' size-in-bits='64' id='e4c6fa61'/> + <pointer-type-def type-id='79bd3751' size-in-bits='64' id='c65a1f29'/> + <pointer-type-def type-id='724e4de6' size-in-bits='64' id='ecf845f9'/> + <pointer-type-def type-id='0e01899c' size-in-bits='64' id='4d98cd5a'/> <pointer-type-def type-id='c19b74c3' size-in-bits='64' id='37e3bd22'/> <pointer-type-def type-id='a84c031d' size-in-bits='64' id='26a90f95'/> <qualified-type-def type-id='a84c031d' const='yes' id='9b45d938'/> <pointer-type-def type-id='9b45d938' size-in-bits='64' id='80f4b756'/> + <qualified-type-def type-id='80f4b756' restrict='yes' id='9d26089a'/> <qualified-type-def type-id='8b8fc893' const='yes' id='9623bc03'/> <pointer-type-def type-id='9623bc03' size-in-bits='64' id='8341348b'/> <qualified-type-def type-id='8e8d4be3' const='yes' id='693c3853'/> <pointer-type-def type-id='693c3853' size-in-bits='64' id='22cce67b'/> + <qualified-type-def type-id='57928edf' const='yes' id='642ee20f'/> + <pointer-type-def type-id='642ee20f' size-in-bits='64' id='dace003f'/> + <qualified-type-def type-id='7d8569fd' const='yes' id='e06dee2d'/> + <pointer-type-def type-id='e06dee2d' size-in-bits='64' id='540db505'/> + <qualified-type-def type-id='540db505' restrict='yes' id='e1815e87'/> + <qualified-type-def type-id='d8bf0010' const='yes' id='a9125480'/> + <pointer-type-def type-id='a9125480' size-in-bits='64' id='d1db479e'/> + <qualified-type-def type-id='b96825af' const='yes' id='2b61797f'/> + <pointer-type-def type-id='2b61797f' size-in-bits='64' id='9f7200cf'/> + <pointer-type-def type-id='c70fa2e8' size-in-bits='64' id='2e711a2a'/> + <pointer-type-def type-id='95e97e5e' size-in-bits='64' id='7292109c'/> <pointer-type-def type-id='8e8d4be3' size-in-bits='64' id='5ce45b60'/> <pointer-type-def type-id='5ce45b60' size-in-bits='64' id='857bb57e'/> + <pointer-type-def type-id='57928edf' size-in-bits='64' id='3fa542f0'/> + <pointer-type-def type-id='7a6844eb' size-in-bits='64' id='18c91f9e'/> + <pointer-type-def type-id='4051f5e7' size-in-bits='64' id='e01b5462'/> + <qualified-type-def type-id='e01b5462' restrict='yes' id='cc338b26'/> + <pointer-type-def type-id='b59d7dce' size-in-bits='64' id='78c01427'/> + <pointer-type-def type-id='aafc373f' size-in-bits='64' id='4330df87'/> <pointer-type-def type-id='9c313c2d' size-in-bits='64' id='5d6479ae'/> <pointer-type-def type-id='b96825af' size-in-bits='64' id='ae3e8ca6'/> + <pointer-type-def type-id='48b5725f' size-in-bits='64' id='eaa32e2f'/> + <pointer-type-def type-id='cd5d79f4' size-in-bits='64' id='5ad9edb6'/> + <qualified-type-def type-id='eaa32e2f' restrict='yes' id='1b7446cd'/> + <pointer-type-def type-id='eaa32e2f' size-in-bits='64' id='63e171df'/> + <pointer-type-def type-id='3522cd69' size-in-bits='64' id='b65f7fd1'/> + <pointer-type-def type-id='a5559cdd' size-in-bits='64' id='e4ec4540'/> + <class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='a4036571'/> + <class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='010ae0b9'/> + <class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='79bd3751'/> + <function-decl name='nvlist_print' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='822cd80b'/> + <parameter type-id='5ce45b60'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='nvlist_free' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='nvlist_unpack' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='26a90f95'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='857bb57e'/> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_uint64' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='22cce67b'/> + <parameter type-id='80f4b756'/> + <parameter type-id='5d6479ae'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_nvlist' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='857bb57e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_next_nvpair' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='dace003f'/> + <return type-id='3fa542f0'/> + </function-decl> + <function-decl name='nvpair_name' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='dace003f'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='fnvlist_alloc' visibility='default' binding='global' size-in-bits='64'> + <return type-id='5ce45b60'/> + </function-decl> + <function-decl name='fnvlist_free' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_pack' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='78c01427'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='fnvlist_pack_free' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='26a90f95'/> + <parameter type-id='b59d7dce'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_unpack' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='26a90f95'/> + <parameter type-id='b59d7dce'/> + <return type-id='5ce45b60'/> + </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='fnvlist_add_boolean' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_boolean_value' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='c19b74c3'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_int32' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='3ff5601b'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_uint64' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='9c313c2d'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_string' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_nvlist' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='5ce45b60'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_byte_array' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='d1db479e'/> + <parameter type-id='3502e3ff'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_uint8_array' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='9f7200cf'/> + <parameter type-id='3502e3ff'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_lookup_boolean_value' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='22cce67b'/> + <parameter type-id='80f4b756'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='fnvlist_lookup_uint64' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='22cce67b'/> + <parameter type-id='80f4b756'/> + <return type-id='9c313c2d'/> + </function-decl> + <function-decl name='fnvlist_lookup_string' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='22cce67b'/> + <parameter type-id='80f4b756'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='libspl_assertf' mangled-name='libspl_assertf' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libspl_assertf'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='80f4b756'/> + <parameter is-variadic='yes'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='strlcpy' mangled-name='strlcpy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='strlcpy'> + <parameter type-id='26a90f95'/> + <parameter type-id='80f4b756'/> + <parameter type-id='b59d7dce'/> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='__errno_location' visibility='default' binding='global' size-in-bits='64'> + <return type-id='7292109c'/> + </function-decl> + <function-decl name='pthread_create' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='cc338b26'/> + <parameter type-id='e1815e87'/> + <parameter type-id='5ad9edb6'/> + <parameter type-id='1b7446cd'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='pthread_join' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='4051f5e7'/> + <parameter type-id='63e171df'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='pthread_mutex_lock' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='18c91f9e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='pthread_mutex_unlock' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='18c91f9e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='fclose' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='822cd80b'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='malloc' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b59d7dce'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='free' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='eaa32e2f'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='getenv' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='strchr' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='95e97e5e'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='strrchr' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='95e97e5e'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='strcspn' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='close' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='pipe2' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='7292109c'/> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='splice' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter type-id='ecf845f9'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='ecf845f9'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='f0981eeb'/> + <return type-id='41060289'/> + </function-decl> + <function-decl name='__open_too_many_args' visibility='default' binding='global' size-in-bits='64'> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='__open_missing_mode' visibility='default' binding='global' size-in-bits='64'> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='__fprintf_chk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='e75a27e9'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='9d26089a'/> + <parameter is-variadic='yes'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='__read_chk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter type-id='eaa32e2f'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='b59d7dce'/> + <return type-id='79a0948f'/> + </function-decl> <function-decl name='libzfs_core_init' mangled-name='libzfs_core_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libzfs_core_init'> <return type-id='95e97e5e'/> </function-decl> <function-decl name='libzfs_core_fini' mangled-name='libzfs_core_fini' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libzfs_core_fini'> <return type-id='48b5725f'/> </function-decl> + <function-decl name='lzc_ioctl_fd' mangled-name='lzc_ioctl_fd' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzc_ioctl_fd'> + <parameter type-id='95e97e5e' name='fd'/> + <parameter type-id='7359adad' name='ioc'/> + <parameter type-id='e4ec4540' name='zc'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_scrub' mangled-name='lzc_scrub' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzc_scrub'> + <parameter type-id='5b35941c' name='ioc'/> + <parameter type-id='80f4b756' name='name'/> + <parameter type-id='5ce45b60' name='source'/> + <parameter type-id='857bb57e' name='resultp'/> + <return type-id='95e97e5e'/> + </function-decl> <function-decl name='lzc_create' mangled-name='lzc_create' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzc_create'> <parameter type-id='80f4b756' name='fsname'/> <parameter type-id='bc9887f1' name='type'/> @@ -1648,6 +2897,17 @@ <parameter type-id='857bb57e' name='holdsp'/> <return type-id='95e97e5e'/> </function-decl> + <function-decl name='lzc_get_props' mangled-name='lzc_get_props' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzc_get_props'> + <parameter type-id='80f4b756' name='poolname'/> + <parameter type-id='857bb57e' name='props'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_send_wrapper' mangled-name='lzc_send_wrapper' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzc_send_wrapper'> + <parameter type-id='2e711a2a' name='func'/> + <parameter type-id='95e97e5e' name='orig_fd'/> + <parameter type-id='eaa32e2f' name='data'/> + <return type-id='95e97e5e'/> + </function-decl> <function-decl name='lzc_send' mangled-name='lzc_send' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzc_send'> <parameter type-id='80f4b756' name='snapname'/> <parameter type-id='80f4b756' name='from'/> @@ -1765,6 +3025,26 @@ <parameter type-id='857bb57e' name='errors'/> <return type-id='95e97e5e'/> </function-decl> + <function-decl name='lzc_receive_with_heal' mangled-name='lzc_receive_with_heal' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzc_receive_with_heal'> + <parameter type-id='80f4b756' name='snapname'/> + <parameter type-id='5ce45b60' name='props'/> + <parameter type-id='5ce45b60' name='cmdprops'/> + <parameter type-id='ae3e8ca6' name='wkeydata'/> + <parameter type-id='3502e3ff' name='wkeylen'/> + <parameter type-id='80f4b756' name='origin'/> + <parameter type-id='c19b74c3' name='force'/> + <parameter type-id='c19b74c3' name='heal'/> + <parameter type-id='c19b74c3' name='resumable'/> + <parameter type-id='c19b74c3' name='raw'/> + <parameter type-id='95e97e5e' name='input_fd'/> + <parameter type-id='8341348b' name='begin_record'/> + <parameter type-id='95e97e5e' name='cleanup_fd'/> + <parameter type-id='5d6479ae' name='read_bytes'/> + <parameter type-id='5d6479ae' name='errflags'/> + <parameter type-id='5d6479ae' name='action_handle'/> + <parameter type-id='857bb57e' name='errors'/> + <return type-id='95e97e5e'/> + </function-decl> <function-decl name='lzc_rollback' mangled-name='lzc_rollback' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzc_rollback'> <parameter type-id='80f4b756' name='fsname'/> <parameter type-id='26a90f95' name='snapnamebuf'/> @@ -1814,6 +3094,11 @@ <parameter type-id='80f4b756' name='pool'/> <return type-id='95e97e5e'/> </function-decl> + <function-decl name='lzc_pool_prefetch' mangled-name='lzc_pool_prefetch' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzc_pool_prefetch'> + <parameter type-id='80f4b756' name='pool'/> + <parameter type-id='e55ff6bc' name='type'/> + <return type-id='95e97e5e'/> + </function-decl> <function-decl name='lzc_channel_program_nosync' mangled-name='lzc_channel_program_nosync' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzc_channel_program_nosync'> <parameter type-id='80f4b756' name='pool'/> <parameter type-id='80f4b756' name='program'/> @@ -1823,6 +3108,18 @@ <parameter type-id='857bb57e' name='outnvl'/> <return type-id='95e97e5e'/> </function-decl> + <function-decl name='lzc_get_vdev_prop' mangled-name='lzc_get_vdev_prop' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzc_get_vdev_prop'> + <parameter type-id='80f4b756' name='poolname'/> + <parameter type-id='5ce45b60' name='innvl'/> + <parameter type-id='857bb57e' name='outnvl'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_set_vdev_prop' mangled-name='lzc_set_vdev_prop' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzc_set_vdev_prop'> + <parameter type-id='80f4b756' name='poolname'/> + <parameter type-id='5ce45b60' name='innvl'/> + <parameter type-id='857bb57e' name='outnvl'/> + <return type-id='95e97e5e'/> + </function-decl> <function-decl name='lzc_load_key' mangled-name='lzc_load_key' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzc_load_key'> <parameter type-id='80f4b756' name='fsname'/> <parameter type-id='c19b74c3' name='noop'/> @@ -1898,241 +3195,33 @@ <parameter type-id='857bb57e' name='outnvl'/> <return type-id='95e97e5e'/> </function-decl> + <function-decl name='lzc_ddt_prune' mangled-name='lzc_ddt_prune' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzc_ddt_prune'> + <parameter type-id='80f4b756' name='pool'/> + <parameter type-id='02e25ab0' name='unit'/> + <parameter type-id='9c313c2d' name='amount'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzc_ioctl_fd_os' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter type-id='7359adad'/> + <parameter type-id='b65f7fd1'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-type size-in-bits='64' id='c70fa2e8'> + <parameter type-id='95e97e5e'/> + <parameter type-id='eaa32e2f'/> + <return type-id='95e97e5e'/> + </function-type> + <function-type size-in-bits='64' id='cd5d79f4'> + <parameter type-id='eaa32e2f'/> + <return type-id='eaa32e2f'/> + </function-type> </abi-instr> - <abi-instr address-size='64' path='os/linux/libzfs_core_ioctl.c' language='LANG_C99'> - <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='32768' id='d16c6df4'> - <subrange length='4096' type-id='7359adad' id='bc1b5ddc'/> - </array-type-def> - <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='65536' id='163f6aa5'> - <subrange length='8192' type-id='7359adad' id='c88f397d'/> - </array-type-def> - <array-type-def dimensions='1' type-id='9c313c2d' size-in-bits='128' id='c1c22e6c'> - <subrange length='2' type-id='7359adad' id='52efc4ef'/> - </array-type-def> - <class-decl name='dmu_objset_stats' size-in-bits='2304' is-struct='yes' visibility='default' id='098f0221'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='dds_num_clones' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='dds_creation_txg' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='dds_guid' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='dds_type' type-id='230f1e16' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='224'> - <var-decl name='dds_is_snapshot' type-id='b96825af' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='232'> - <var-decl name='dds_inconsistent' type-id='b96825af' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='240'> - <var-decl name='dds_redacted' type-id='b96825af' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='248'> - <var-decl name='dds_origin' type-id='d1617432' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='dmu_objset_stats_t' type-id='098f0221' id='b2c14f17'/> - <class-decl name='zinject_record' size-in-bits='2816' is-struct='yes' visibility='default' id='3216f820'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='zi_objset' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='zi_object' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='zi_start' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='zi_end' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='zi_guid' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='zi_level' type-id='8f92235e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='352'> - <var-decl name='zi_error' type-id='8f92235e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='zi_type' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='zi_freq' type-id='8f92235e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='480'> - <var-decl name='zi_failfast' type-id='8f92235e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='zi_func' type-id='d1617432' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2560'> - <var-decl name='zi_iotype' type-id='8f92235e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2592'> - <var-decl name='zi_duration' type-id='3ff5601b' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2624'> - <var-decl name='zi_timer' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2688'> - <var-decl name='zi_nlanes' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2752'> - <var-decl name='zi_cmd' type-id='8f92235e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2784'> - <var-decl name='zi_dvas' type-id='8f92235e' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='zinject_record_t' type-id='3216f820' id='a4301ca6'/> - <class-decl name='zfs_share' size-in-bits='256' is-struct='yes' visibility='default' id='feb6f2da'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='z_exportdata' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='z_sharedata' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='z_sharetype' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='z_sharemax' type-id='9c313c2d' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='zfs_share_t' type-id='feb6f2da' id='ee5cec36'/> - <class-decl name='zfs_cmd' size-in-bits='109952' is-struct='yes' visibility='default' id='3522cd69'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='zc_name' type-id='d16c6df4' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32768'> - <var-decl name='zc_nvlist_src' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32832'> - <var-decl name='zc_nvlist_src_size' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32896'> - <var-decl name='zc_nvlist_dst' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32960'> - <var-decl name='zc_nvlist_dst_size' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='33024'> - <var-decl name='zc_nvlist_dst_filled' type-id='c19b74c3' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='33056'> - <var-decl name='zc_pad2' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='33088'> - <var-decl name='zc_history' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='33152'> - <var-decl name='zc_value' type-id='163f6aa5' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='98688'> - <var-decl name='zc_string' type-id='d1617432' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='100736'> - <var-decl name='zc_guid' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='100800'> - <var-decl name='zc_nvlist_conf' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='100864'> - <var-decl name='zc_nvlist_conf_size' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='100928'> - <var-decl name='zc_cookie' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='100992'> - <var-decl name='zc_objset_type' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='101056'> - <var-decl name='zc_perm_action' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='101120'> - <var-decl name='zc_history_len' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='101184'> - <var-decl name='zc_history_offset' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='101248'> - <var-decl name='zc_obj' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='101312'> - <var-decl name='zc_iflags' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='101376'> - <var-decl name='zc_share' type-id='ee5cec36' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='101632'> - <var-decl name='zc_objset_stats' type-id='b2c14f17' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='103936'> - <var-decl name='zc_begin_record' type-id='09fcdc01' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='106368'> - <var-decl name='zc_inject_record' type-id='a4301ca6' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='109184'> - <var-decl name='zc_defer_destroy' type-id='8f92235e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='109216'> - <var-decl name='zc_flags' type-id='8f92235e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='109248'> - <var-decl name='zc_action_handle' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='109312'> - <var-decl name='zc_cleanup_fd' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='109344'> - <var-decl name='zc_simple' type-id='b96825af' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='109352'> - <var-decl name='zc_pad' type-id='d3490169' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='109376'> - <var-decl name='zc_sendobj' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='109440'> - <var-decl name='zc_fromobj' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='109504'> - <var-decl name='zc_createtxg' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='109568'> - <var-decl name='zc_stat' type-id='0371a9c7' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='109888'> - <var-decl name='zc_zoneid' type-id='9c313c2d' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='zfs_cmd_t' type-id='3522cd69' id='a5559cdd'/> - <class-decl name='zfs_stat' size-in-bits='320' is-struct='yes' visibility='default' id='6417f0b9'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='zs_gen' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='zs_mode' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='zs_links' type-id='9c313c2d' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='zs_ctime' type-id='c1c22e6c' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='zfs_stat_t' type-id='6417f0b9' id='0371a9c7'/> - <pointer-type-def type-id='a5559cdd' size-in-bits='64' id='e4ec4540'/> - <function-decl name='lzc_ioctl_fd' mangled-name='lzc_ioctl_fd' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzc_ioctl_fd'> - <parameter type-id='95e97e5e' name='fd'/> - <parameter type-id='7359adad' name='request'/> - <parameter type-id='e4ec4540' name='zc'/> + <abi-instr address-size='64' path='lib/libzfs_core/os/linux/libzfs_core_ioctl.c' language='LANG_C99'> + <function-decl name='ioctl' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <parameter type-id='7359adad'/> + <parameter is-variadic='yes'/> <return type-id='95e97e5e'/> </function-decl> </abi-instr> diff --git a/sys/contrib/openzfs/lib/libzfs_core/libzfs_core.c b/sys/contrib/openzfs/lib/libzfs_core/libzfs_core.c index cbe486d08ba1..9347aa7c6a28 100644 --- a/sys/contrib/openzfs/lib/libzfs_core/libzfs_core.c +++ b/sys/contrib/openzfs/lib/libzfs_core/libzfs_core.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -22,10 +23,10 @@ /* * Copyright (c) 2012, 2020 by Delphix. All rights reserved. * Copyright (c) 2013 Steven Hartland. All rights reserved. - * Copyright (c) 2017 Datto Inc. * Copyright 2017 RackTop Systems. * Copyright (c) 2017 Open-E, Inc. All Rights Reserved. * Copyright (c) 2019, 2020 by Christian Schwarz. All rights reserved. + * Copyright (c) 2019 Datto Inc. */ /* @@ -91,11 +92,18 @@ #include <sys/types.h> #include <sys/stat.h> #include <sys/zfs_ioctl.h> +#if __FreeBSD__ +#define BIG_PIPE_SIZE (64 * 1024) /* From sys/pipe.h */ +#endif + +#include "libzfs_core_impl.h" static int g_fd = -1; static pthread_mutex_t g_lock = PTHREAD_MUTEX_INITIALIZER; static int g_refcount; +static int g_ioc_trace = 0; + #ifdef ZFS_DEBUG static zfs_ioc_t fail_ioc_cmd = ZFS_IOC_LAST; static zfs_errno_t fail_ioc_err; @@ -148,6 +156,10 @@ libzfs_core_init(void) #ifdef ZFS_DEBUG libzfs_core_debug_ioc(); #endif + + if (getenv("ZFS_IOC_TRACE")) + g_ioc_trace = 1; + (void) pthread_mutex_unlock(&g_lock); return (0); } @@ -167,6 +179,42 @@ libzfs_core_fini(void) (void) pthread_mutex_unlock(&g_lock); } +int +lzc_ioctl_fd(int fd, unsigned long ioc, zfs_cmd_t *zc) +{ + if (!g_ioc_trace) + return (lzc_ioctl_fd_os(fd, ioc, zc)); + + nvlist_t *nvl; + + fprintf(stderr, "=== lzc_ioctl: call: ioc=0x%lx name=%s\n", + ioc, zc->zc_name[0] ? zc->zc_name : "[none]"); + if (zc->zc_nvlist_src) { + nvl = fnvlist_unpack( + (void *)(uintptr_t)zc->zc_nvlist_src, + zc->zc_nvlist_src_size); + nvlist_print(stderr, nvl); + fnvlist_free(nvl); + } + + int rc = lzc_ioctl_fd_os(fd, ioc, zc); + int err = errno; + + fprintf(stderr, "=== lzc_ioctl: result: ioc=0x%lx name=%s " + "rc=%d errno=%d\n", ioc, zc->zc_name[0] ? zc->zc_name : "[none]", + rc, (rc < 0 ? err : 0)); + if (rc >= 0 && zc->zc_nvlist_dst) { + nvl = fnvlist_unpack( + (void *)(uintptr_t)zc->zc_nvlist_dst, + zc->zc_nvlist_dst_size); + nvlist_print(stderr, nvl); + fnvlist_free(nvl); + } + + errno = err; + return (rc); +} + static int lzc_ioctl(zfs_ioc_t ioc, const char *name, nvlist_t *source, nvlist_t **resultp) @@ -232,7 +280,7 @@ lzc_ioctl(zfs_ioc_t ioc, const char *name, break; } } - if (zc.zc_nvlist_dst_filled) { + if (zc.zc_nvlist_dst_filled && resultp != NULL) { *resultp = fnvlist_unpack((void *)(uintptr_t)zc.zc_nvlist_dst, zc.zc_nvlist_dst_size); } @@ -245,6 +293,13 @@ out: } int +lzc_scrub(zfs_ioc_t ioc, const char *name, + nvlist_t *source, nvlist_t **resultp) +{ + return (lzc_ioctl(ioc, name, source, resultp)); +} + +int lzc_create(const char *fsname, enum lzc_dataset_type type, nvlist_t *props, uint8_t *wkeydata, uint_t wkeylen) { @@ -476,10 +531,10 @@ lzc_exists(const char *dataset) * It was added to preserve the function signature in case it is * needed in the future. */ -/*ARGSUSED*/ int lzc_sync(const char *pool_name, nvlist_t *innvl, nvlist_t **outnvl) { + (void) outnvl; return (lzc_ioctl(ZFS_IOC_POOL_SYNC, pool_name, innvl, NULL)); } @@ -586,6 +641,137 @@ lzc_get_holds(const char *snapname, nvlist_t **holdsp) return (lzc_ioctl(ZFS_IOC_GET_HOLDS, snapname, NULL, holdsp)); } +int +lzc_get_props(const char *poolname, nvlist_t **props) +{ + return (lzc_ioctl(ZFS_IOC_POOL_GET_PROPS, poolname, NULL, props)); +} + +static unsigned int +max_pipe_buffer(int infd) +{ +#if __linux__ + static unsigned int max; + if (max == 0) { + max = 1048576; /* fs/pipe.c default */ + + FILE *procf = fopen("/proc/sys/fs/pipe-max-size", "re"); + if (procf != NULL) { + if (fscanf(procf, "%u", &max) <= 0) { + /* ignore error: max untouched if parse fails */ + } + fclose(procf); + } + } + + unsigned int cur = fcntl(infd, F_GETPIPE_SZ); + /* + * Sadly, Linux has an unfixed deadlock if you do SETPIPE_SZ on a pipe + * with data in it. + * cf. #13232, https://bugzilla.kernel.org/show_bug.cgi?id=212295 + * + * And since the problem is in waking up the writer, there's nothing + * we can do about it from here. + * + * So if people want to, they can set this, but they + * may regret it... + */ + if (getenv("ZFS_SET_PIPE_MAX") == NULL) + return (cur); + if (cur < max && fcntl(infd, F_SETPIPE_SZ, max) != -1) + cur = max; + return (cur); +#else + /* FreeBSD automatically resizes */ + (void) infd; + return (BIG_PIPE_SIZE); +#endif +} + +#if __linux__ +struct send_worker_ctx { + int from; /* read end of pipe, with send data; closed on exit */ + int to; /* original arbitrary output fd; mustn't be a pipe */ +}; + +static void * +send_worker(void *arg) +{ + struct send_worker_ctx *ctx = arg; + unsigned int bufsiz = max_pipe_buffer(ctx->from); + ssize_t rd; + + for (;;) { + rd = splice(ctx->from, NULL, ctx->to, NULL, bufsiz, + SPLICE_F_MOVE | SPLICE_F_MORE); + if ((rd == -1 && errno != EINTR) || rd == 0) + break; + } + int err = (rd == -1) ? errno : 0; + close(ctx->from); + return ((void *)(uintptr_t)err); +} +#endif + +/* + * Since Linux 5.10, 4d03e3cc59828c82ee89ea6e27a2f3cdf95aaadf + * ("fs: don't allow kernel reads and writes without iter ops"), + * ZFS_IOC_SEND* will EINVAL when writing to /dev/null, /dev/zero, &c. + * + * This wrapper transparently executes func() with a pipe + * by spawning a thread to copy from that pipe to the original output + * in the background. + * + * Returns the error from func(), if nonzero, + * otherwise the error from the thread. + * + * No-op if orig_fd is -1, already a pipe (but the buffer size is bumped), + * and on not-Linux; as such, it is safe to wrap/call wrapped functions + * in a wrapped context. + */ +int +lzc_send_wrapper(int (*func)(int, void *), int orig_fd, void *data) +{ +#if __linux__ + struct stat sb; + if (orig_fd != -1 && fstat(orig_fd, &sb) == -1) + return (errno); + if (orig_fd == -1 || S_ISFIFO(sb.st_mode)) { + if (orig_fd != -1) + (void) max_pipe_buffer(orig_fd); + return (func(orig_fd, data)); + } + if ((fcntl(orig_fd, F_GETFL) & O_ACCMODE) == O_RDONLY) + return (errno = EBADF); + + int rw[2]; + if (pipe2(rw, O_CLOEXEC) == -1) + return (errno); + + int err; + pthread_t send_thread; + struct send_worker_ctx ctx = {.from = rw[0], .to = orig_fd}; + if ((err = pthread_create(&send_thread, NULL, send_worker, &ctx)) + != 0) { + close(rw[0]); + close(rw[1]); + return (errno = err); + } + + err = func(rw[1], data); + + void *send_err; + close(rw[1]); + pthread_join(send_thread, &send_err); + if (err == 0 && send_err != 0) + errno = err = (uintptr_t)send_err; + + return (err); +#else + return (func(orig_fd, data)); +#endif +} + /* * Generate a zfs send stream for the specified snapshot and write it to * the specified file descriptor. @@ -656,9 +842,11 @@ lzc_send_resume(const char *snapname, const char *from, int fd, * redactnv: nvlist of string -> boolean(ignored) containing the names of all * the snapshots that we should redact with respect to. * redactbook: Name of the redaction bookmark to create. + * + * Pre-wrapped. */ -int -lzc_send_resume_redacted(const char *snapname, const char *from, int fd, +static int +lzc_send_resume_redacted_cb_impl(const char *snapname, const char *from, int fd, enum lzc_send_flags flags, uint64_t resumeobj, uint64_t resumeoff, const char *redactbook) { @@ -691,6 +879,40 @@ lzc_send_resume_redacted(const char *snapname, const char *from, int fd, return (err); } +struct lzc_send_resume_redacted { + const char *snapname; + const char *from; + enum lzc_send_flags flags; + uint64_t resumeobj; + uint64_t resumeoff; + const char *redactbook; +}; + +static int +lzc_send_resume_redacted_cb(int fd, void *arg) +{ + struct lzc_send_resume_redacted *zsrr = arg; + return (lzc_send_resume_redacted_cb_impl(zsrr->snapname, zsrr->from, + fd, zsrr->flags, zsrr->resumeobj, zsrr->resumeoff, + zsrr->redactbook)); +} + +int +lzc_send_resume_redacted(const char *snapname, const char *from, int fd, + enum lzc_send_flags flags, uint64_t resumeobj, uint64_t resumeoff, + const char *redactbook) +{ + struct lzc_send_resume_redacted zsrr = { + .snapname = snapname, + .from = from, + .flags = flags, + .resumeobj = resumeobj, + .resumeoff = resumeoff, + .redactbook = redactbook, + }; + return (lzc_send_wrapper(lzc_send_resume_redacted_cb, fd, &zsrr)); +} + /* * "from" can be NULL, a snapshot, or a bookmark. * @@ -706,9 +928,11 @@ lzc_send_resume_redacted(const char *snapname, const char *from, int fd, * significantly more I/O and be less efficient than a send space estimation on * an equivalent snapshot. This process is also used if redact_snaps is * non-null. + * + * Pre-wrapped. */ -int -lzc_send_space_resume_redacted(const char *snapname, const char *from, +static int +lzc_send_space_resume_redacted_cb_impl(const char *snapname, const char *from, enum lzc_send_flags flags, uint64_t resumeobj, uint64_t resumeoff, uint64_t resume_bytes, const char *redactbook, int fd, uint64_t *spacep) { @@ -745,6 +969,45 @@ lzc_send_space_resume_redacted(const char *snapname, const char *from, return (err); } +struct lzc_send_space_resume_redacted { + const char *snapname; + const char *from; + enum lzc_send_flags flags; + uint64_t resumeobj; + uint64_t resumeoff; + uint64_t resume_bytes; + const char *redactbook; + uint64_t *spacep; +}; + +static int +lzc_send_space_resume_redacted_cb(int fd, void *arg) +{ + struct lzc_send_space_resume_redacted *zssrr = arg; + return (lzc_send_space_resume_redacted_cb_impl(zssrr->snapname, + zssrr->from, zssrr->flags, zssrr->resumeobj, zssrr->resumeoff, + zssrr->resume_bytes, zssrr->redactbook, fd, zssrr->spacep)); +} + +int +lzc_send_space_resume_redacted(const char *snapname, const char *from, + enum lzc_send_flags flags, uint64_t resumeobj, uint64_t resumeoff, + uint64_t resume_bytes, const char *redactbook, int fd, uint64_t *spacep) +{ + struct lzc_send_space_resume_redacted zssrr = { + .snapname = snapname, + .from = from, + .flags = flags, + .resumeobj = resumeobj, + .resumeoff = resumeoff, + .resume_bytes = resume_bytes, + .redactbook = redactbook, + .spacep = spacep, + }; + return (lzc_send_wrapper(lzc_send_space_resume_redacted_cb, + fd, &zssrr)); +} + int lzc_send_space(const char *snapname, const char *from, enum lzc_send_flags flags, uint64_t *spacep) @@ -783,7 +1046,7 @@ recv_read(int fd, void *buf, int ilen) static int recv_impl(const char *snapname, nvlist_t *recvdprops, nvlist_t *localprops, uint8_t *wkeydata, uint_t wkeylen, const char *origin, boolean_t force, - boolean_t resumable, boolean_t raw, int input_fd, + boolean_t heal, boolean_t resumable, boolean_t raw, int input_fd, const dmu_replay_record_t *begin_record, uint64_t *read_bytes, uint64_t *errflags, nvlist_t **errors) { @@ -812,6 +1075,16 @@ recv_impl(const char *snapname, nvlist_t *recvdprops, nvlist_t *localprops, } /* + * It is not uncommon for gigabytes to be processed by zfs receive. + * Speculatively increase the buffer size if supported by the platform. + */ + struct stat sb; + if (fstat(input_fd, &sb) == -1) + return (errno); + if (S_ISFIFO(sb.st_mode)) + (void) max_pipe_buffer(input_fd); + + /* * The begin_record is normally a non-byteswapped BEGIN record. * For resumable streams it may be set to any non-byteswapped * dmu_replay_record_t. @@ -828,7 +1101,7 @@ recv_impl(const char *snapname, nvlist_t *recvdprops, nvlist_t *localprops, /* * All receives with a payload should use the new interface. */ - if (resumable || raw || wkeydata != NULL || payload) { + if (resumable || heal || raw || wkeydata != NULL || payload) { nvlist_t *outnvl = NULL; nvlist_t *innvl = fnvlist_alloc(); @@ -868,6 +1141,8 @@ recv_impl(const char *snapname, nvlist_t *recvdprops, nvlist_t *localprops, if (resumable) fnvlist_add_boolean(innvl, "resumable"); + if (heal) + fnvlist_add_boolean(innvl, "heal"); error = lzc_ioctl(ZFS_IOC_RECV_NEW, fsname, innvl, &outnvl); @@ -890,7 +1165,8 @@ recv_impl(const char *snapname, nvlist_t *recvdprops, nvlist_t *localprops, fnvlist_free(outnvl); } else { zfs_cmd_t zc = {"\0"}; - char *packed = NULL; + char *rp_packed = NULL; + char *lp_packed = NULL; size_t size; ASSERT3S(g_refcount, >, 0); @@ -899,14 +1175,14 @@ recv_impl(const char *snapname, nvlist_t *recvdprops, nvlist_t *localprops, (void) strlcpy(zc.zc_value, snapname, sizeof (zc.zc_value)); if (recvdprops != NULL) { - packed = fnvlist_pack(recvdprops, &size); - zc.zc_nvlist_src = (uint64_t)(uintptr_t)packed; + rp_packed = fnvlist_pack(recvdprops, &size); + zc.zc_nvlist_src = (uint64_t)(uintptr_t)rp_packed; zc.zc_nvlist_src_size = size; } if (localprops != NULL) { - packed = fnvlist_pack(localprops, &size); - zc.zc_nvlist_conf = (uint64_t)(uintptr_t)packed; + lp_packed = fnvlist_pack(localprops, &size); + zc.zc_nvlist_conf = (uint64_t)(uintptr_t)lp_packed; zc.zc_nvlist_conf_size = size; } @@ -941,8 +1217,10 @@ recv_impl(const char *snapname, nvlist_t *recvdprops, nvlist_t *localprops, zc.zc_nvlist_dst_size, errors, KM_SLEEP)); } - if (packed != NULL) - fnvlist_pack_free(packed, size); + if (rp_packed != NULL) + fnvlist_pack_free(rp_packed, size); + if (lp_packed != NULL) + fnvlist_pack_free(lp_packed, size); free((void *)(uintptr_t)zc.zc_nvlist_dst); } @@ -967,7 +1245,7 @@ lzc_receive(const char *snapname, nvlist_t *props, const char *origin, boolean_t force, boolean_t raw, int fd) { return (recv_impl(snapname, props, NULL, NULL, 0, origin, force, - B_FALSE, raw, fd, NULL, NULL, NULL, NULL)); + B_FALSE, B_FALSE, raw, fd, NULL, NULL, NULL, NULL)); } /* @@ -981,7 +1259,7 @@ lzc_receive_resumable(const char *snapname, nvlist_t *props, const char *origin, boolean_t force, boolean_t raw, int fd) { return (recv_impl(snapname, props, NULL, NULL, 0, origin, force, - B_TRUE, raw, fd, NULL, NULL, NULL, NULL)); + B_FALSE, B_TRUE, raw, fd, NULL, NULL, NULL, NULL)); } /* @@ -1004,7 +1282,7 @@ lzc_receive_with_header(const char *snapname, nvlist_t *props, return (EINVAL); return (recv_impl(snapname, props, NULL, NULL, 0, origin, force, - resumable, raw, fd, begin_record, NULL, NULL, NULL)); + B_FALSE, resumable, raw, fd, begin_record, NULL, NULL, NULL)); } /* @@ -1032,8 +1310,9 @@ lzc_receive_one(const char *snapname, nvlist_t *props, uint64_t *read_bytes, uint64_t *errflags, uint64_t *action_handle, nvlist_t **errors) { + (void) action_handle, (void) cleanup_fd; return (recv_impl(snapname, props, NULL, NULL, 0, origin, force, - resumable, raw, input_fd, begin_record, + B_FALSE, resumable, raw, input_fd, begin_record, read_bytes, errflags, errors)); } @@ -1053,8 +1332,29 @@ lzc_receive_with_cmdprops(const char *snapname, nvlist_t *props, uint64_t *read_bytes, uint64_t *errflags, uint64_t *action_handle, nvlist_t **errors) { + (void) action_handle, (void) cleanup_fd; + return (recv_impl(snapname, props, cmdprops, wkeydata, wkeylen, origin, + force, B_FALSE, resumable, raw, input_fd, begin_record, + read_bytes, errflags, errors)); +} + +/* + * Like lzc_receive_with_cmdprops, but allows the caller to pass an additional + * 'heal' argument. + * + * The heal arguments tells us to heal the provided snapshot using the provided + * send stream + */ +int lzc_receive_with_heal(const char *snapname, nvlist_t *props, + nvlist_t *cmdprops, uint8_t *wkeydata, uint_t wkeylen, const char *origin, + boolean_t force, boolean_t heal, boolean_t resumable, boolean_t raw, + int input_fd, const dmu_replay_record_t *begin_record, int cleanup_fd, + uint64_t *read_bytes, uint64_t *errflags, uint64_t *action_handle, + nvlist_t **errors) +{ + (void) action_handle, (void) cleanup_fd; return (recv_impl(snapname, props, cmdprops, wkeydata, wkeylen, origin, - force, resumable, raw, input_fd, begin_record, + force, heal, resumable, raw, input_fd, begin_record, read_bytes, errflags, errors)); } @@ -1375,6 +1675,26 @@ lzc_pool_checkpoint_discard(const char *pool) } /* + * Load the requested data type for the specified pool. + */ +int +lzc_pool_prefetch(const char *pool, zpool_prefetch_type_t type) +{ + int error; + nvlist_t *result = NULL; + nvlist_t *args = fnvlist_alloc(); + + fnvlist_add_int32(args, ZPOOL_PREFETCH_TYPE, type); + + error = lzc_ioctl(ZFS_IOC_POOL_PREFETCH, pool, args, &result); + + fnvlist_free(args); + fnvlist_free(result); + + return (error); +} + +/* * Executes a read-only channel program. * * A read-only channel program works programmatically the same way as a @@ -1394,6 +1714,18 @@ lzc_channel_program_nosync(const char *pool, const char *program, memlimit, argnvl, outnvl)); } +int +lzc_get_vdev_prop(const char *poolname, nvlist_t *innvl, nvlist_t **outnvl) +{ + return (lzc_ioctl(ZFS_IOC_VDEV_GET_PROPS, poolname, innvl, outnvl)); +} + +int +lzc_set_vdev_prop(const char *poolname, nvlist_t *innvl, nvlist_t **outnvl) +{ + return (lzc_ioctl(ZFS_IOC_VDEV_SET_PROPS, poolname, innvl, outnvl)); +} + /* * Performs key management functions * @@ -1640,3 +1972,25 @@ lzc_get_bootenv(const char *pool, nvlist_t **outnvl) { return (lzc_ioctl(ZFS_IOC_GET_BOOTENV, pool, NULL, outnvl)); } + +/* + * Prune the specified amount from the pool's dedup table. + */ +int +lzc_ddt_prune(const char *pool, zpool_ddt_prune_unit_t unit, uint64_t amount) +{ + int error; + + nvlist_t *result = NULL; + nvlist_t *args = fnvlist_alloc(); + + fnvlist_add_int32(args, DDT_PRUNE_UNIT, unit); + fnvlist_add_uint64(args, DDT_PRUNE_AMOUNT, amount); + + error = lzc_ioctl(ZFS_IOC_DDT_PRUNE, pool, args, &result); + + fnvlist_free(args); + fnvlist_free(result); + + return (error); +} diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/stropts.h b/sys/contrib/openzfs/lib/libzfs_core/libzfs_core_impl.h index 08c2e79bc53c..baf9a7a95834 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/stropts.h +++ b/sys/contrib/openzfs/lib/libzfs_core/libzfs_core_impl.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -18,12 +19,18 @@ * * CDDL HEADER END */ + /* - * Copyright 2010 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. + * Copyright (c) 2012, 2020 by Delphix. All rights reserved. + * Copyright 2017 RackTop Systems. + * Copyright (c) 2017 Open-E, Inc. All Rights Reserved. + * Copyright (c) 2019 Datto Inc. */ -#ifndef _LIBSPL_SYS_STROPTS_H -#define _LIBSPL_SYS_STROPTS_H +#ifndef _LIBZFS_CORE_IMPL_H +#define _LIBZFS_CORE_IMPL_H + +struct zfs_cmd; +int lzc_ioctl_fd_os(int, unsigned long, struct zfs_cmd *); -#endif /* _LIBSPL_SYS_STROPTS_H */ +#endif /* _LIBZFS_CORE_IMPL_H */ diff --git a/sys/contrib/openzfs/lib/libzfs_core/os/freebsd/libzfs_core_ioctl.c b/sys/contrib/openzfs/lib/libzfs_core/os/freebsd/libzfs_core_ioctl.c index b8394886d034..39e217a9349e 100644 --- a/sys/contrib/openzfs/lib/libzfs_core/os/freebsd/libzfs_core_ioctl.c +++ b/sys/contrib/openzfs/lib/libzfs_core/os/freebsd/libzfs_core_ioctl.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -25,6 +26,7 @@ #include <os/freebsd/zfs/sys/zfs_ioctl_compat.h> #include <err.h> #include <libzfs_core.h> +#include "libzfs_core_impl.h" int zfs_ioctl_version = ZFS_IOCVER_UNDEF; @@ -38,7 +40,7 @@ get_zfs_ioctl_version(void) int ver = ZFS_IOCVER_NONE; ver_size = sizeof (ver); - sysctlbyname("vfs.zfs.version.ioctl", &ver, &ver_size, NULL, 0); + (void) sysctlbyname("vfs.zfs.version.ioctl", &ver, &ver_size, NULL, 0); return (ver); } @@ -46,8 +48,11 @@ get_zfs_ioctl_version(void) static int zcmd_ioctl_compat(int fd, int request, zfs_cmd_t *zc, const int cflag) { - int newrequest, ret; + int ret; +#ifdef ZFS_LEGACY_SUPPORT + int newrequest; void *zc_c = NULL; +#endif unsigned long ncmd; zfs_iocparm_t zp; @@ -58,6 +63,7 @@ zcmd_ioctl_compat(int fd, int request, zfs_cmd_t *zc, const int cflag) zp.zfs_cmd_size = sizeof (zfs_cmd_t); zp.zfs_ioctl_version = ZFS_IOCVER_OZFS; break; +#ifdef ZFS_LEGACY_SUPPORT case ZFS_CMD_COMPAT_LEGACY: newrequest = zfs_ioctl_ozfs_to_legacy(request); ncmd = _IOWR('Z', newrequest, zfs_iocparm_t); @@ -67,6 +73,7 @@ zcmd_ioctl_compat(int fd, int request, zfs_cmd_t *zc, const int cflag) zp.zfs_cmd_size = sizeof (zfs_cmd_legacy_t); zp.zfs_ioctl_version = ZFS_IOCVER_LEGACY; break; +#endif default: abort(); return (EINVAL); @@ -74,14 +81,18 @@ zcmd_ioctl_compat(int fd, int request, zfs_cmd_t *zc, const int cflag) ret = ioctl(fd, ncmd, &zp); if (ret) { +#ifdef ZFS_LEGACY_SUPPORT if (zc_c) free(zc_c); +#endif return (ret); } +#ifdef ZFS_LEGACY_SUPPORT if (zc_c) { zfs_cmd_legacy_to_ozfs(zc_c, zc); free(zc_c); } +#endif return (ret); } @@ -91,7 +102,7 @@ zcmd_ioctl_compat(int fd, int request, zfs_cmd_t *zc, const int cflag) * error is returned zc_nvlist_dst_size won't be updated. */ int -lzc_ioctl_fd(int fd, unsigned long request, zfs_cmd_t *zc) +lzc_ioctl_fd_os(int fd, unsigned long request, zfs_cmd_t *zc) { size_t oldsize; int ret, cflag = ZFS_CMD_COMPAT_NONE; @@ -100,9 +111,11 @@ lzc_ioctl_fd(int fd, unsigned long request, zfs_cmd_t *zc) zfs_ioctl_version = get_zfs_ioctl_version(); switch (zfs_ioctl_version) { +#ifdef ZFS_LEGACY_SUPPORT case ZFS_IOCVER_LEGACY: cflag = ZFS_CMD_COMPAT_LEGACY; break; +#endif case ZFS_IOCVER_OZFS: cflag = ZFS_CMD_COMPAT_NONE; break; diff --git a/sys/contrib/openzfs/lib/libzfs_core/os/linux/libzfs_core_ioctl.c b/sys/contrib/openzfs/lib/libzfs_core/os/linux/libzfs_core_ioctl.c index 9b44a4e3be0d..6823588e23e2 100644 --- a/sys/contrib/openzfs/lib/libzfs_core/os/linux/libzfs_core_ioctl.c +++ b/sys/contrib/openzfs/lib/libzfs_core/os/linux/libzfs_core_ioctl.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -22,9 +23,10 @@ #include <sys/param.h> #include <sys/zfs_ioctl.h> #include <libzfs_core.h> +#include "libzfs_core_impl.h" int -lzc_ioctl_fd(int fd, unsigned long request, zfs_cmd_t *zc) +lzc_ioctl_fd_os(int fd, unsigned long request, zfs_cmd_t *zc) { return (ioctl(fd, request, zc)); } diff --git a/sys/contrib/openzfs/lib/libzfsbootenv/Makefile.am b/sys/contrib/openzfs/lib/libzfsbootenv/Makefile.am index 0c454a5e031b..118f154821fc 100644 --- a/sys/contrib/openzfs/lib/libzfsbootenv/Makefile.am +++ b/sys/contrib/openzfs/lib/libzfsbootenv/Makefile.am @@ -1,31 +1,20 @@ -include $(top_srcdir)/config/Rules.am +libzfsbootenv_la_CFLAGS = $(AM_CFLAGS) $(LIBRARY_CFLAGS) +libzfsbootenv_la_CFLAGS += -fvisibility=hidden -pkgconfig_DATA = libzfsbootenv.pc +lib_LTLIBRARIES += libzfsbootenv.la +CPPCHECKTARGETS += libzfsbootenv.la -AM_CFLAGS += -fvisibility=hidden - -lib_LTLIBRARIES = libzfsbootenv.la - -include $(top_srcdir)/config/Abigail.am - -if BUILD_FREEBSD -DEFAULT_INCLUDES += -I$(top_srcdir)/include/os/freebsd/zfs -endif -if BUILD_LINUX -DEFAULT_INCLUDES += -I$(top_srcdir)/include/os/linux/zfs -endif - -USER_C = \ - lzbe_device.c \ - lzbe_pair.c \ - lzbe_util.c +libzfsbootenv_la_CPPFLAGS = $(AM_CPPFLAGS) +libzfsbootenv_la_CPPFLAGS += -I$(srcdir)/include/os/@ac_system_l@/zfs dist_libzfsbootenv_la_SOURCES = \ - $(USER_C) + %D%/lzbe_device.c \ + %D%/lzbe_pair.c \ + %D%/lzbe_util.c libzfsbootenv_la_LIBADD = \ - $(abs_top_builddir)/lib/libzfs/libzfs.la \ - $(abs_top_builddir)/lib/libnvpair/libnvpair.la + libzfs.la \ + libnvpair.la libzfsbootenv_la_LDFLAGS = @@ -35,7 +24,6 @@ endif libzfsbootenv_la_LDFLAGS += -version-info 1:0:0 -include $(top_srcdir)/config/CppCheck.am +pkgconfig_DATA += %D%/libzfsbootenv.pc -# Library ABI -EXTRA_DIST = libzfsbootenv.abi libzfsbootenv.suppr +dist_noinst_DATA += %D%/libzfsbootenv.abi %D%/libzfsbootenv.suppr diff --git a/sys/contrib/openzfs/lib/libzfsbootenv/libzfsbootenv.abi b/sys/contrib/openzfs/lib/libzfsbootenv/libzfsbootenv.abi index 86ec25cf8470..bf866b0fa61b 100644 --- a/sys/contrib/openzfs/lib/libzfsbootenv/libzfsbootenv.abi +++ b/sys/contrib/openzfs/lib/libzfsbootenv/libzfsbootenv.abi @@ -1,6 +1,6 @@ <abi-corpus version='2.0' architecture='elf-amd-x86_64' soname='libzfsbootenv.so.1'> <elf-needed> - <dependency name='libzfs.so.4'/> + <dependency name='libzfs.so.6'/> <dependency name='libnvpair.so.3'/> <dependency name='libc.so.6'/> </elf-needed> @@ -14,69 +14,8 @@ <elf-symbol name='lzbe_remove_pair' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='lzbe_set_boot_device' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> </elf-function-symbols> - <abi-instr address-size='64' path='lzbe_device.c' language='LANG_C99'> + <abi-instr address-size='64' path='lib/libzfsbootenv/lzbe_device.c' language='LANG_C99'> <type-decl name='char' size-in-bits='8' id='a84c031d'/> - <type-decl name='int' size-in-bits='32' id='95e97e5e'/> - <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='9cac1fee'/> - <type-decl name='void' id='48b5725f'/> - <enum-decl name='lzbe_flags' id='2b77720b'> - <underlying-type type-id='9cac1fee'/> - <enumerator name='lzbe_add' value='0'/> - <enumerator name='lzbe_replace' value='1'/> - </enum-decl> - <typedef-decl name='lzbe_flags_t' type-id='2b77720b' id='a1936f04'/> - <pointer-type-def type-id='a84c031d' size-in-bits='64' id='26a90f95'/> - <pointer-type-def type-id='26a90f95' size-in-bits='64' id='9b23c9ad'/> - <qualified-type-def type-id='a84c031d' const='yes' id='9b45d938'/> - <pointer-type-def type-id='9b45d938' size-in-bits='64' id='80f4b756'/> - <function-decl name='lzbe_set_boot_device' mangled-name='lzbe_set_boot_device' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_set_boot_device'> - <parameter type-id='80f4b756' name='pool'/> - <parameter type-id='a1936f04' name='flag'/> - <parameter type-id='80f4b756' name='device'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='lzbe_get_boot_device' mangled-name='lzbe_get_boot_device' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_get_boot_device'> - <parameter type-id='80f4b756' name='pool'/> - <parameter type-id='9b23c9ad' name='device'/> - <return type-id='95e97e5e'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='lzbe_pair.c' language='LANG_C99'> - <type-decl name='unsigned long int' size-in-bits='64' id='7359adad'/> - <typedef-decl name='size_t' type-id='7359adad' id='b59d7dce'/> - <pointer-type-def type-id='48b5725f' size-in-bits='64' id='eaa32e2f'/> - <pointer-type-def type-id='eaa32e2f' size-in-bits='64' id='63e171df'/> - <function-decl name='lzbe_nvlist_get' mangled-name='lzbe_nvlist_get' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_nvlist_get'> - <parameter type-id='80f4b756' name='pool'/> - <parameter type-id='80f4b756' name='key'/> - <parameter type-id='63e171df' name='ptr'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='lzbe_nvlist_set' mangled-name='lzbe_nvlist_set' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_nvlist_set'> - <parameter type-id='80f4b756' name='pool'/> - <parameter type-id='80f4b756' name='key'/> - <parameter type-id='eaa32e2f' name='ptr'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='lzbe_nvlist_free' mangled-name='lzbe_nvlist_free' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_nvlist_free'> - <parameter type-id='eaa32e2f' name='ptr'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='lzbe_add_pair' mangled-name='lzbe_add_pair' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_add_pair'> - <parameter type-id='eaa32e2f' name='ptr'/> - <parameter type-id='80f4b756' name='key'/> - <parameter type-id='80f4b756' name='type'/> - <parameter type-id='eaa32e2f' name='value'/> - <parameter type-id='b59d7dce' name='size'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='lzbe_remove_pair' mangled-name='lzbe_remove_pair' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_remove_pair'> - <parameter type-id='eaa32e2f' name='ptr'/> - <parameter type-id='80f4b756' name='key'/> - <return type-id='95e97e5e'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='lzbe_util.c' language='LANG_C99'> <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='8' id='89feb1ec'> <subrange length='1' type-id='7359adad' id='52f813b4'/> </array-type-def> @@ -86,9 +25,55 @@ <class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='a4036571'/> <class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='010ae0b9'/> <class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='79bd3751'/> + <class-decl name='libzfs_handle' is-struct='yes' visibility='default' is-declaration-only='yes' id='c8a9d9d8'/> + <class-decl name='zpool_handle' is-struct='yes' visibility='default' is-declaration-only='yes' id='67002a8a'/> + <type-decl name='int' size-in-bits='32' id='95e97e5e'/> <type-decl name='long int' size-in-bits='64' id='bd54fe1a'/> <type-decl name='signed char' size-in-bits='8' id='28577a57'/> + <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='9cac1fee'/> + <type-decl name='unsigned int' size-in-bits='32' id='f0981eeb'/> + <type-decl name='unsigned long int' size-in-bits='64' id='7359adad'/> <type-decl name='unsigned short int' size-in-bits='16' id='8efea9e5'/> + <type-decl name='variadic parameter type' id='2c1145c5'/> + <type-decl name='void' id='48b5725f'/> + <typedef-decl name='zpool_handle_t' type-id='67002a8a' id='b1efc708'/> + <typedef-decl name='libzfs_handle_t' type-id='c8a9d9d8' id='95942d0c'/> + <enum-decl name='lzbe_flags' id='2b77720b'> + <underlying-type type-id='9cac1fee'/> + <enumerator name='lzbe_add' value='0'/> + <enumerator name='lzbe_replace' value='1'/> + </enum-decl> + <typedef-decl name='lzbe_flags_t' type-id='2b77720b' id='a1936f04'/> + <class-decl name='nvlist' size-in-bits='192' is-struct='yes' visibility='default' id='ac266fd9'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='nvl_version' type-id='3ff5601b' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='nvl_nvflag' type-id='8f92235e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='nvl_priv' type-id='9c313c2d' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='nvl_flag' type-id='8f92235e' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160'> + <var-decl name='nvl_pad' type-id='3ff5601b' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='nvlist_t' type-id='ac266fd9' id='8e8d4be3'/> + <enum-decl name='boolean_t' naming-typedef-id='c19b74c3' id='f58c8277'> + <underlying-type type-id='9cac1fee'/> + <enumerator name='B_FALSE' value='0'/> + <enumerator name='B_TRUE' value='1'/> + </enum-decl> + <typedef-decl name='boolean_t' type-id='f58c8277' id='c19b74c3'/> + <typedef-decl name='int32_t' type-id='33f57a65' id='3ff5601b'/> + <typedef-decl name='uint32_t' type-id='62f1140c' id='8f92235e'/> + <typedef-decl name='uint64_t' type-id='8910171f' id='9c313c2d'/> + <typedef-decl name='__int32_t' type-id='95e97e5e' id='33f57a65'/> + <typedef-decl name='__uint32_t' type-id='f0981eeb' id='62f1140c'/> + <typedef-decl name='__uint64_t' type-id='7359adad' id='8910171f'/> <typedef-decl name='__off_t' type-id='bd54fe1a' id='79989e9c'/> <typedef-decl name='__off64_t' type-id='bd54fe1a' id='724e4de6'/> <typedef-decl name='FILE' type-id='ec1ed955' id='aa12d1ba'/> @@ -182,15 +167,413 @@ <var-decl name='_unused2' type-id='664ac0b7' visibility='default'/> </data-member> </class-decl> + <typedef-decl name='size_t' type-id='7359adad' id='b59d7dce'/> <pointer-type-def type-id='aa12d1ba' size-in-bits='64' id='822cd80b'/> + <qualified-type-def type-id='822cd80b' restrict='yes' id='e75a27e9'/> <pointer-type-def type-id='ec1ed955' size-in-bits='64' id='dca988a5'/> <pointer-type-def type-id='a4036571' size-in-bits='64' id='570f8c59'/> <pointer-type-def type-id='bb4788fa' size-in-bits='64' id='cecf4ea7'/> <pointer-type-def type-id='010ae0b9' size-in-bits='64' id='e4c6fa61'/> <pointer-type-def type-id='79bd3751' size-in-bits='64' id='c65a1f29'/> + <pointer-type-def type-id='a84c031d' size-in-bits='64' id='26a90f95'/> + <pointer-type-def type-id='26a90f95' size-in-bits='64' id='9b23c9ad'/> + <qualified-type-def type-id='9b23c9ad' restrict='yes' id='8c85230f'/> + <qualified-type-def type-id='a84c031d' const='yes' id='9b45d938'/> + <pointer-type-def type-id='9b45d938' size-in-bits='64' id='80f4b756'/> + <qualified-type-def type-id='80f4b756' restrict='yes' id='9d26089a'/> + <pointer-type-def type-id='80f4b756' size-in-bits='64' id='7d3cd834'/> + <qualified-type-def type-id='8e8d4be3' const='yes' id='693c3853'/> + <pointer-type-def type-id='693c3853' size-in-bits='64' id='22cce67b'/> + <pointer-type-def type-id='95942d0c' size-in-bits='64' id='b0382bb3'/> + <pointer-type-def type-id='8e8d4be3' size-in-bits='64' id='5ce45b60'/> + <pointer-type-def type-id='5ce45b60' size-in-bits='64' id='857bb57e'/> + <pointer-type-def type-id='9c313c2d' size-in-bits='64' id='5d6479ae'/> + <pointer-type-def type-id='48b5725f' size-in-bits='64' id='eaa32e2f'/> + <pointer-type-def type-id='b1efc708' size-in-bits='64' id='4c81de99'/> <class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='a4036571'/> <class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='010ae0b9'/> <class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='79bd3751'/> + <class-decl name='libzfs_handle' is-struct='yes' visibility='default' is-declaration-only='yes' id='c8a9d9d8'/> + <class-decl name='zpool_handle' is-struct='yes' visibility='default' is-declaration-only='yes' id='67002a8a'/> + <function-decl name='libzfs_init' visibility='default' binding='global' size-in-bits='64'> + <return type-id='b0382bb3'/> + </function-decl> + <function-decl name='libzfs_fini' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b0382bb3'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='libzfs_error_description' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b0382bb3'/> + <return type-id='80f4b756'/> + </function-decl> + <function-decl name='zpool_open' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b0382bb3'/> + <parameter type-id='80f4b756'/> + <return type-id='4c81de99'/> + </function-decl> + <function-decl name='zpool_close' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='4c81de99'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='zpool_set_bootenv' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='4c81de99'/> + <parameter type-id='22cce67b'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='zpool_get_bootenv' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='4c81de99'/> + <parameter type-id='857bb57e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_free' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='nvlist_lookup_uint64' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='22cce67b'/> + <parameter type-id='80f4b756'/> + <parameter type-id='5d6479ae'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_string' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='22cce67b'/> + <parameter type-id='80f4b756'/> + <parameter type-id='7d3cd834'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_exists' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='22cce67b'/> + <parameter type-id='80f4b756'/> + <return type-id='c19b74c3'/> + </function-decl> + <function-decl name='fnvlist_alloc' visibility='default' binding='global' size-in-bits='64'> + <return type-id='5ce45b60'/> + </function-decl> + <function-decl name='fnvlist_free' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_uint64' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='9c313c2d'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_add_string' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='fnvlist_remove' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='free' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='eaa32e2f'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='strncmp' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <parameter type-id='b59d7dce'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='strdup' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <return type-id='26a90f95'/> + </function-decl> + <function-decl name='strlen' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <return type-id='b59d7dce'/> + </function-decl> + <function-decl name='__fprintf_chk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='e75a27e9'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='9d26089a'/> + <parameter is-variadic='yes'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='__asprintf_chk' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='8c85230f'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='9d26089a'/> + <parameter is-variadic='yes'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzbe_set_boot_device' mangled-name='lzbe_set_boot_device' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_set_boot_device'> + <parameter type-id='80f4b756' name='pool'/> + <parameter type-id='a1936f04' name='flag'/> + <parameter type-id='80f4b756' name='device'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzbe_get_boot_device' mangled-name='lzbe_get_boot_device' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_get_boot_device'> + <parameter type-id='80f4b756' name='pool'/> + <parameter type-id='9b23c9ad' name='device'/> + <return type-id='95e97e5e'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='lib/libzfsbootenv/lzbe_pair.c' language='LANG_C99'> + <type-decl name='short int' size-in-bits='16' id='a2185560'/> + <type-decl name='unsigned char' size-in-bits='8' id='002ac4a6'/> + <typedef-decl name='uchar_t' type-id='002ac4a6' id='d8bf0010'/> + <typedef-decl name='uint_t' type-id='f0981eeb' id='3502e3ff'/> + <typedef-decl name='int8_t' type-id='2171a512' id='ee31ee44'/> + <typedef-decl name='int16_t' type-id='03896e23' id='23bd8cb5'/> + <typedef-decl name='int64_t' type-id='0c9942d2' id='9da381c4'/> + <typedef-decl name='uint8_t' type-id='c51d6389' id='b96825af'/> + <typedef-decl name='uint16_t' type-id='253c2d2a' id='149c6638'/> + <typedef-decl name='__int8_t' type-id='28577a57' id='2171a512'/> + <typedef-decl name='__uint8_t' type-id='002ac4a6' id='c51d6389'/> + <typedef-decl name='__int16_t' type-id='a2185560' id='03896e23'/> + <typedef-decl name='__uint16_t' type-id='8efea9e5' id='253c2d2a'/> + <typedef-decl name='__int64_t' type-id='bd54fe1a' id='0c9942d2'/> + <qualified-type-def type-id='c19b74c3' const='yes' id='12373e33'/> + <pointer-type-def type-id='12373e33' size-in-bits='64' id='c5f6c15b'/> + <qualified-type-def type-id='80f4b756' const='yes' id='b99c00c9'/> + <pointer-type-def type-id='b99c00c9' size-in-bits='64' id='13956559'/> + <qualified-type-def type-id='23bd8cb5' const='yes' id='75f7b0c5'/> + <pointer-type-def type-id='75f7b0c5' size-in-bits='64' id='a3eb883d'/> + <qualified-type-def type-id='3ff5601b' const='yes' id='922df12b'/> + <pointer-type-def type-id='922df12b' size-in-bits='64' id='1f526493'/> + <qualified-type-def type-id='9da381c4' const='yes' id='f07b7694'/> + <pointer-type-def type-id='f07b7694' size-in-bits='64' id='505bed1a'/> + <qualified-type-def type-id='ee31ee44' const='yes' id='721c32d4'/> + <pointer-type-def type-id='721c32d4' size-in-bits='64' id='a06445da'/> + <qualified-type-def type-id='22cce67b' const='yes' id='d2816df0'/> + <pointer-type-def type-id='d2816df0' size-in-bits='64' id='3bbfee2e'/> + <qualified-type-def type-id='d8bf0010' const='yes' id='a9125480'/> + <pointer-type-def type-id='a9125480' size-in-bits='64' id='d1db479e'/> + <qualified-type-def type-id='149c6638' const='yes' id='b01a5ac8'/> + <pointer-type-def type-id='b01a5ac8' size-in-bits='64' id='1b7d11c6'/> + <qualified-type-def type-id='8f92235e' const='yes' id='b9930aae'/> + <pointer-type-def type-id='b9930aae' size-in-bits='64' id='a6798dcc'/> + <qualified-type-def type-id='9c313c2d' const='yes' id='c3b7ba7d'/> + <pointer-type-def type-id='c3b7ba7d' size-in-bits='64' id='713a56f5'/> + <qualified-type-def type-id='b96825af' const='yes' id='2b61797f'/> + <pointer-type-def type-id='2b61797f' size-in-bits='64' id='9f7200cf'/> + <pointer-type-def type-id='eaa32e2f' size-in-bits='64' id='63e171df'/> + <function-decl name='nvlist_alloc' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='857bb57e'/> + <parameter type-id='3502e3ff'/> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_dup' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='22cce67b'/> + <parameter type-id='857bb57e'/> + <parameter type-id='95e97e5e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_boolean_value' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='c19b74c3'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_byte' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='d8bf0010'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_int8' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='ee31ee44'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_uint8' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='b96825af'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_int16' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='23bd8cb5'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_uint16' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='149c6638'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_int32' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='3ff5601b'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_uint32' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='8f92235e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_int64' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='9da381c4'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_uint64' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='9c313c2d'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_string' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_nvlist' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='22cce67b'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_boolean_array' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='c5f6c15b'/> + <parameter type-id='3502e3ff'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_byte_array' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='d1db479e'/> + <parameter type-id='3502e3ff'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_int8_array' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='a06445da'/> + <parameter type-id='3502e3ff'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_uint8_array' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='9f7200cf'/> + <parameter type-id='3502e3ff'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_int16_array' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='a3eb883d'/> + <parameter type-id='3502e3ff'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_uint16_array' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='1b7d11c6'/> + <parameter type-id='3502e3ff'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_int32_array' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='1f526493'/> + <parameter type-id='3502e3ff'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_uint32_array' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='a6798dcc'/> + <parameter type-id='3502e3ff'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_int64_array' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='505bed1a'/> + <parameter type-id='3502e3ff'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_uint64_array' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='713a56f5'/> + <parameter type-id='3502e3ff'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_string_array' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='13956559'/> + <parameter type-id='3502e3ff'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_add_nvlist_array' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='3bbfee2e'/> + <parameter type-id='3502e3ff'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_remove_all' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='nvlist_lookup_nvlist' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='5ce45b60'/> + <parameter type-id='80f4b756'/> + <parameter type-id='857bb57e'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='strcmp' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='80f4b756'/> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzbe_nvlist_get' mangled-name='lzbe_nvlist_get' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_nvlist_get'> + <parameter type-id='80f4b756' name='pool'/> + <parameter type-id='80f4b756' name='key'/> + <parameter type-id='63e171df' name='ptr'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzbe_nvlist_set' mangled-name='lzbe_nvlist_set' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_nvlist_set'> + <parameter type-id='80f4b756' name='pool'/> + <parameter type-id='80f4b756' name='key'/> + <parameter type-id='eaa32e2f' name='ptr'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzbe_nvlist_free' mangled-name='lzbe_nvlist_free' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_nvlist_free'> + <parameter type-id='eaa32e2f' name='ptr'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='lzbe_add_pair' mangled-name='lzbe_add_pair' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_add_pair'> + <parameter type-id='eaa32e2f' name='ptr'/> + <parameter type-id='80f4b756' name='key'/> + <parameter type-id='80f4b756' name='type'/> + <parameter type-id='eaa32e2f' name='value'/> + <parameter type-id='b59d7dce' name='size'/> + <return type-id='95e97e5e'/> + </function-decl> + <function-decl name='lzbe_remove_pair' mangled-name='lzbe_remove_pair' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_remove_pair'> + <parameter type-id='eaa32e2f' name='ptr'/> + <parameter type-id='80f4b756' name='key'/> + <return type-id='95e97e5e'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='lib/libzfsbootenv/lzbe_util.c' language='LANG_C99'> + <function-decl name='nvlist_print' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='822cd80b'/> + <parameter type-id='5ce45b60'/> + <return type-id='48b5725f'/> + </function-decl> <function-decl name='lzbe_bootenv_print' mangled-name='lzbe_bootenv_print' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_bootenv_print'> <parameter type-id='80f4b756' name='pool'/> <parameter type-id='80f4b756' name='nvlist'/> diff --git a/sys/contrib/openzfs/lib/libzfsbootenv/lzbe_device.c b/sys/contrib/openzfs/lib/libzfsbootenv/lzbe_device.c index 2d9c7b749ef2..f155960bfea0 100644 --- a/sys/contrib/openzfs/lib/libzfsbootenv/lzbe_device.c +++ b/sys/contrib/openzfs/lib/libzfsbootenv/lzbe_device.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * This file and its contents are supplied under the terms of the * Common Development and Distribution License ("CDDL"), version 1.0. @@ -63,7 +64,7 @@ lzbe_set_boot_device(const char *pool, lzbe_flags_t flag, const char *device) /* Drop this nvlist */ fnvlist_free(nv); } - fallthrough; + zfs_fallthrough; case lzbe_replace: nv = fnvlist_alloc(); break; @@ -74,6 +75,7 @@ lzbe_set_boot_device(const char *pool, lzbe_flags_t flag, const char *device) /* version is mandatory */ fnvlist_add_uint64(nv, BOOTENV_VERSION, VB_NVLIST); + rv = 0; /* * If device name is empty, remove boot device configuration. */ @@ -95,8 +97,8 @@ lzbe_set_boot_device(const char *pool, lzbe_flags_t flag, const char *device) rv = ENOMEM; } } - - rv = zpool_set_bootenv(zphdl, nv); + if (rv == 0) + rv = zpool_set_bootenv(zphdl, nv); if (rv != 0) fprintf(stderr, "%s\n", libzfs_error_description(hdl)); @@ -115,7 +117,7 @@ lzbe_get_boot_device(const char *pool, char **device) libzfs_handle_t *hdl; zpool_handle_t *zphdl; nvlist_t *nv; - char *val; + const char *val; int rv = -1; if (pool == NULL || *pool == '\0' || device == NULL) @@ -139,14 +141,13 @@ lzbe_get_boot_device(const char *pool, char **device) * we only do need dataset name. */ if (strncmp(val, "zfs:", 4) == 0) { - val += 4; - val = strdup(val); - if (val != NULL) { - size_t len = strlen(val); - - if (val[len - 1] == ':') - val[len - 1] = '\0'; - *device = val; + char *tmp = strdup(val + 4); + if (tmp != NULL) { + size_t len = strlen(tmp); + + if (tmp[len - 1] == ':') + tmp[len - 1] = '\0'; + *device = tmp; } else { rv = ENOMEM; } diff --git a/sys/contrib/openzfs/lib/libzfsbootenv/lzbe_pair.c b/sys/contrib/openzfs/lib/libzfsbootenv/lzbe_pair.c index 831355ba4b7c..3f576a569f28 100644 --- a/sys/contrib/openzfs/lib/libzfsbootenv/lzbe_pair.c +++ b/sys/contrib/openzfs/lib/libzfsbootenv/lzbe_pair.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * This file and its contents are supplied under the terms of the * Common Development and Distribution License ("CDDL"), version 1.0. @@ -293,7 +294,8 @@ lzbe_add_pair(void *ptr, const char *key, const char *type, void *value, break; case DATA_TYPE_NVLIST_ARRAY: - rv = nvlist_add_nvlist_array(nv, key, value, size); + rv = nvlist_add_nvlist_array(nv, key, (const nvlist_t **)value, + size); break; case DATA_TYPE_BOOLEAN_VALUE: diff --git a/sys/contrib/openzfs/lib/libzfsbootenv/lzbe_util.c b/sys/contrib/openzfs/lib/libzfsbootenv/lzbe_util.c index 35e98549582e..fc60f698f3bc 100644 --- a/sys/contrib/openzfs/lib/libzfsbootenv/lzbe_util.c +++ b/sys/contrib/openzfs/lib/libzfsbootenv/lzbe_util.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * This file and its contents are supplied under the terms of the * Common Development and Distribution License ("CDDL"), version 1.0. diff --git a/sys/contrib/openzfs/lib/libzpool/Makefile.am b/sys/contrib/openzfs/lib/libzpool/Makefile.am index 3cc0c2f2ec05..8553b377a760 100644 --- a/sys/contrib/openzfs/lib/libzpool/Makefile.am +++ b/sys/contrib/openzfs/lib/libzpool/Makefile.am @@ -1,222 +1,203 @@ -include $(top_srcdir)/config/Rules.am +libzpool_la_CFLAGS = $(AM_CFLAGS) $(KERNEL_CFLAGS) $(LIBRARY_CFLAGS) +libzpool_la_CFLAGS += $(ZLIB_CFLAGS) -VPATH = \ - $(top_srcdir)/module/zfs \ - $(top_srcdir)/module/zcommon \ - $(top_srcdir)/module/lua \ - $(top_srcdir)/module/os/linux/zfs \ - $(top_srcdir)/lib/libzpool +libzpool_la_CPPFLAGS = $(AM_CPPFLAGS) $(LIBZPOOL_CPPFLAGS) +libzpool_la_CPPFLAGS += -I$(srcdir)/include/os/@ac_system_l@/zfs +libzpool_la_CPPFLAGS += -DLIB_ZPOOL_BUILD -if BUILD_FREEBSD -DEFAULT_INCLUDES += -I$(top_srcdir)/include/os/freebsd/zfs -endif -if BUILD_LINUX -DEFAULT_INCLUDES += -I$(top_srcdir)/include/os/linux/zfs -endif - -# Unconditionally enable debugging for libzpool -AM_CPPFLAGS += -DDEBUG -UNDEBUG -DZFS_DEBUG - -# Suppress unused but set variable warnings often due to ASSERTs -AM_CFLAGS += $(NO_UNUSED_BUT_SET_VARIABLE) - -# Includes kernel code generate warnings for large stack frames -AM_CFLAGS += $(FRAME_LARGER_THAN) - -AM_CFLAGS += $(ZLIB_CFLAGS) - -AM_CFLAGS += -DLIB_ZPOOL_BUILD - -lib_LTLIBRARIES = libzpool.la - -USER_C = \ - kernel.c \ - taskq.c \ - util.c - -KERNEL_C = \ - zfeature_common.c \ - zfs_comutil.c \ - zfs_deleg.c \ - zfs_fletcher.c \ - zfs_fletcher_aarch64_neon.c \ - zfs_fletcher_avx512.c \ - zfs_fletcher_intel.c \ - zfs_fletcher_sse.c \ - zfs_fletcher_superscalar.c \ - zfs_fletcher_superscalar4.c \ - zfs_namecheck.c \ - zfs_prop.c \ - zpool_prop.c \ - zprop_common.c \ - abd.c \ - abd_os.c \ - aggsum.c \ - arc.c \ - arc_os.c \ - blkptr.c \ - bplist.c \ - bpobj.c \ - bptree.c \ - btree.c \ - bqueue.c \ - cityhash.c \ - dbuf.c \ - dbuf_stats.c \ - ddt.c \ - ddt_zap.c \ - dmu.c \ - dmu_diff.c \ - dmu_object.c \ - dmu_objset.c \ - dmu_recv.c \ - dmu_redact.c \ - dmu_send.c \ - dmu_traverse.c \ - dmu_tx.c \ - dmu_zfetch.c \ - dnode.c \ - dnode_sync.c \ - dsl_bookmark.c \ - dsl_dataset.c \ - dsl_deadlist.c \ - dsl_deleg.c \ - dsl_dir.c \ - dsl_crypt.c \ - dsl_pool.c \ - dsl_prop.c \ - dsl_scan.c \ - dsl_synctask.c \ - dsl_destroy.c \ - dsl_userhold.c \ - edonr_zfs.c \ - hkdf.c \ - fm.c \ - gzip.c \ - lzjb.c \ - lz4.c \ - metaslab.c \ - mmp.c \ - multilist.c \ - objlist.c \ - pathname.c \ - range_tree.c \ - refcount.c \ - rrwlock.c \ - sa.c \ - sha256.c \ - skein_zfs.c \ - spa.c \ - spa_boot.c \ - spa_checkpoint.c \ - spa_config.c \ - spa_errlog.c \ - spa_history.c \ - spa_log_spacemap.c \ - spa_misc.c \ - spa_stats.c \ - space_map.c \ - space_reftree.c \ - txg.c \ - trace.c \ - uberblock.c \ - unique.c \ - vdev.c \ - vdev_cache.c \ - vdev_draid.c \ - vdev_draid_rand.c \ - vdev_file.c \ - vdev_indirect_births.c \ - vdev_indirect.c \ - vdev_indirect_mapping.c \ - vdev_initialize.c \ - vdev_label.c \ - vdev_mirror.c \ - vdev_missing.c \ - vdev_queue.c \ - vdev_raidz.c \ - vdev_raidz_math_aarch64_neon.c \ - vdev_raidz_math_aarch64_neonx2.c \ - vdev_raidz_math_avx2.c \ - vdev_raidz_math_avx512bw.c \ - vdev_raidz_math_avx512f.c \ - vdev_raidz_math.c \ - vdev_raidz_math_scalar.c \ - vdev_raidz_math_sse2.c \ - vdev_raidz_math_ssse3.c \ - vdev_raidz_math_powerpc_altivec.c \ - vdev_rebuild.c \ - vdev_removal.c \ - vdev_root.c \ - vdev_trim.c \ - zap.c \ - zap_leaf.c \ - zap_micro.c \ - zcp.c \ - zcp_get.c \ - zcp_global.c \ - zcp_iter.c \ - zcp_set.c \ - zcp_synctask.c \ - zfeature.c \ - zfs_byteswap.c \ - zfs_debug.c \ - zfs_fm.c \ - zfs_fuid.c \ - zfs_racct.c \ - zfs_sa.c \ - zfs_znode.c \ - zfs_ratelimit.c \ - zfs_rlock.c \ - zil.c \ - zio.c \ - zio_checksum.c \ - zio_compress.c \ - zio_crypt.c \ - zio_inject.c \ - zle.c \ - zrlock.c \ - zthr.c - -LUA_C = \ - lapi.c \ - lauxlib.c \ - lbaselib.c \ - lcode.c \ - lcompat.c \ - lcorolib.c \ - lctype.c \ - ldebug.c \ - ldo.c \ - lfunc.c \ - lgc.c \ - llex.c \ - lmem.c \ - lobject.c \ - lopcodes.c \ - lparser.c \ - lstate.c \ - lstring.c \ - lstrlib.c \ - ltable.c \ - ltablib.c \ - ltm.c \ - lvm.c \ - lzio.c +lib_LTLIBRARIES += libzpool.la +CPPCHECKTARGETS += libzpool.la dist_libzpool_la_SOURCES = \ - $(USER_C) + %D%/abd_os.c \ + %D%/arc_os.c \ + %D%/kernel.c \ + %D%/taskq.c \ + %D%/util.c \ + %D%/vdev_label_os.c \ + %D%/zfs_racct.c \ + %D%/zfs_debug.c nodist_libzpool_la_SOURCES = \ - $(KERNEL_C) \ - $(LUA_C) + module/lua/lapi.c \ + module/lua/lauxlib.c \ + module/lua/lbaselib.c \ + module/lua/lcode.c \ + module/lua/lcompat.c \ + module/lua/lcorolib.c \ + module/lua/lctype.c \ + module/lua/ldebug.c \ + module/lua/ldo.c \ + module/lua/lfunc.c \ + module/lua/lgc.c \ + module/lua/llex.c \ + module/lua/lmem.c \ + module/lua/lobject.c \ + module/lua/lopcodes.c \ + module/lua/lparser.c \ + module/lua/lstate.c \ + module/lua/lstring.c \ + module/lua/lstrlib.c \ + module/lua/ltable.c \ + module/lua/ltablib.c \ + module/lua/ltm.c \ + module/lua/lvm.c \ + module/lua/lzio.c \ + \ + module/os/linux/zfs/zio_crypt.c \ + \ + module/zcommon/cityhash.c \ + module/zcommon/simd_stat.c \ + module/zcommon/zfeature_common.c \ + module/zcommon/zfs_comutil.c \ + module/zcommon/zfs_deleg.c \ + module/zcommon/zfs_fletcher.c \ + module/zcommon/zfs_fletcher_aarch64_neon.c \ + module/zcommon/zfs_fletcher_avx512.c \ + module/zcommon/zfs_fletcher_intel.c \ + module/zcommon/zfs_fletcher_sse.c \ + module/zcommon/zfs_fletcher_superscalar.c \ + module/zcommon/zfs_fletcher_superscalar4.c \ + module/zcommon/zfs_namecheck.c \ + module/zcommon/zfs_prop.c \ + module/zcommon/zfs_valstr.c \ + module/zcommon/zpool_prop.c \ + module/zcommon/zprop_common.c \ + \ + module/zfs/abd.c \ + module/zfs/aggsum.c \ + module/zfs/arc.c \ + module/zfs/blake3_zfs.c \ + module/zfs/blkptr.c \ + module/zfs/bplist.c \ + module/zfs/bpobj.c \ + module/zfs/bptree.c \ + module/zfs/bqueue.c \ + module/zfs/btree.c \ + module/zfs/brt.c \ + module/zfs/dbuf.c \ + module/zfs/dbuf_stats.c \ + module/zfs/ddt.c \ + module/zfs/ddt_log.c \ + module/zfs/ddt_stats.c \ + module/zfs/ddt_zap.c \ + module/zfs/dmu.c \ + module/zfs/dmu_diff.c \ + module/zfs/dmu_direct.c \ + module/zfs/dmu_object.c \ + module/zfs/dmu_objset.c \ + module/zfs/dmu_recv.c \ + module/zfs/dmu_redact.c \ + module/zfs/dmu_send.c \ + module/zfs/dmu_traverse.c \ + module/zfs/dmu_tx.c \ + module/zfs/dmu_zfetch.c \ + module/zfs/dnode.c \ + module/zfs/dnode_sync.c \ + module/zfs/dsl_bookmark.c \ + module/zfs/dsl_crypt.c \ + module/zfs/dsl_dataset.c \ + module/zfs/dsl_deadlist.c \ + module/zfs/dsl_deleg.c \ + module/zfs/dsl_destroy.c \ + module/zfs/dsl_dir.c \ + module/zfs/dsl_pool.c \ + module/zfs/dsl_prop.c \ + module/zfs/dsl_scan.c \ + module/zfs/dsl_synctask.c \ + module/zfs/dsl_userhold.c \ + module/zfs/edonr_zfs.c \ + module/zfs/fm.c \ + module/zfs/gzip.c \ + module/zfs/hkdf.c \ + module/zfs/lz4.c \ + module/zfs/lz4_zfs.c \ + module/zfs/lzjb.c \ + module/zfs/metaslab.c \ + module/zfs/mmp.c \ + module/zfs/multilist.c \ + module/zfs/objlist.c \ + module/zfs/pathname.c \ + module/zfs/range_tree.c \ + module/zfs/refcount.c \ + module/zfs/rrwlock.c \ + module/zfs/sa.c \ + module/zfs/sha2_zfs.c \ + module/zfs/skein_zfs.c \ + module/zfs/spa.c \ + module/zfs/spa_checkpoint.c \ + module/zfs/spa_config.c \ + module/zfs/spa_errlog.c \ + module/zfs/spa_history.c \ + module/zfs/spa_log_spacemap.c \ + module/zfs/spa_misc.c \ + module/zfs/spa_stats.c \ + module/zfs/space_map.c \ + module/zfs/space_reftree.c \ + module/zfs/txg.c \ + module/zfs/uberblock.c \ + module/zfs/unique.c \ + module/zfs/vdev.c \ + module/zfs/vdev_draid.c \ + module/zfs/vdev_draid_rand.c \ + module/zfs/vdev_file.c \ + module/zfs/vdev_indirect.c \ + module/zfs/vdev_indirect_births.c \ + module/zfs/vdev_indirect_mapping.c \ + module/zfs/vdev_initialize.c \ + module/zfs/vdev_label.c \ + module/zfs/vdev_mirror.c \ + module/zfs/vdev_missing.c \ + module/zfs/vdev_queue.c \ + module/zfs/vdev_raidz.c \ + module/zfs/vdev_raidz_math.c \ + module/zfs/vdev_raidz_math_aarch64_neon.c \ + module/zfs/vdev_raidz_math_aarch64_neonx2.c \ + module/zfs/vdev_raidz_math_avx2.c \ + module/zfs/vdev_raidz_math_avx512bw.c \ + module/zfs/vdev_raidz_math_avx512f.c \ + module/zfs/vdev_raidz_math_powerpc_altivec.c \ + module/zfs/vdev_raidz_math_scalar.c \ + module/zfs/vdev_raidz_math_sse2.c \ + module/zfs/vdev_raidz_math_ssse3.c \ + module/zfs/vdev_rebuild.c \ + module/zfs/vdev_removal.c \ + module/zfs/vdev_root.c \ + module/zfs/vdev_trim.c \ + module/zfs/zap.c \ + module/zfs/zap_leaf.c \ + module/zfs/zap_micro.c \ + module/zfs/zcp.c \ + module/zfs/zcp_get.c \ + module/zfs/zcp_global.c \ + module/zfs/zcp_iter.c \ + module/zfs/zcp_set.c \ + module/zfs/zcp_synctask.c \ + module/zfs/zfeature.c \ + module/zfs/zfs_byteswap.c \ + module/zfs/zfs_chksum.c \ + module/zfs/zfs_debug_common.c \ + module/zfs/zfs_fm.c \ + module/zfs/zfs_fuid.c \ + module/zfs/zfs_ratelimit.c \ + module/zfs/zfs_rlock.c \ + module/zfs/zfs_sa.c \ + module/zfs/zfs_znode.c \ + module/zfs/zil.c \ + module/zfs/zio.c \ + module/zfs/zio_checksum.c \ + module/zfs/zio_compress.c \ + module/zfs/zio_inject.c \ + module/zfs/zle.c \ + module/zfs/zrlock.c \ + module/zfs/zthr.c libzpool_la_LIBADD = \ - $(abs_top_builddir)/lib/libicp/libicp.la \ - $(abs_top_builddir)/lib/libunicode/libunicode.la \ - $(abs_top_builddir)/lib/libnvpair/libnvpair.la \ - $(abs_top_builddir)/lib/libzstd/libzstd.la \ - $(abs_top_builddir)/lib/libzutil/libzutil.la + libicp.la \ + libunicode.la \ + libnvpair.la \ + libzstd.la \ + libzutil.la libzpool_la_LIBADD += $(LIBCLOCK_GETTIME) $(ZLIB_LIBS) -ldl -lm @@ -230,11 +211,9 @@ if BUILD_FREEBSD libzpool_la_LIBADD += -lgeom endif -libzpool_la_LDFLAGS += -version-info 5:0:0 +libzpool_la_LDFLAGS += -version-info 6:0:0 if TARGET_CPU_POWERPC -vdev_raidz_math_powerpc_altivec.$(OBJEXT): CFLAGS += -maltivec -vdev_raidz_math_powerpc_altivec.l$(OBJEXT): CFLAGS += -maltivec +module/zfs/libzpool_la-vdev_raidz_math_powerpc_altivec.$(OBJEXT) : CFLAGS += -maltivec +module/zfs/libzpool_la-vdev_raidz_math_powerpc_altivec.l$(OBJEXT): CFLAGS += -maltivec endif - -include $(top_srcdir)/config/CppCheck.am diff --git a/sys/contrib/openzfs/lib/libzpool/abd_os.c b/sys/contrib/openzfs/lib/libzpool/abd_os.c new file mode 100644 index 000000000000..0d5795de143a --- /dev/null +++ b/sys/contrib/openzfs/lib/libzpool/abd_os.c @@ -0,0 +1,430 @@ +// SPDX-License-Identifier: CDDL-1.0 +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or https://opensource.org/licenses/CDDL-1.0. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright (c) 2014 by Chunwei Chen. All rights reserved. + * Copyright (c) 2019 by Delphix. All rights reserved. + * Copyright (c) 2023, 2024, Klara Inc. + */ + +#include <sys/abd_impl.h> +#include <sys/param.h> +#include <sys/zio.h> +#include <sys/arc.h> +#include <sys/zfs_context.h> +#include <sys/zfs_znode.h> + +/* + * We're simulating scatter/gather with 4K allocations, since that's more like + * what a typical kernel does. + */ +#define ABD_PAGESIZE (4096) +#define ABD_PAGESHIFT (12) +#define ABD_PAGEMASK (ABD_PAGESIZE-1) + +/* + * See rationale in module/os/linux/zfs/abd_os.c, but in userspace this is + * mostly useful to get a mix of linear and scatter ABDs for testing. + */ +#define ABD_SCATTER_MIN_SIZE (512 * 3) + +abd_t *abd_zero_scatter = NULL; + +static uint_t +abd_iovcnt_for_bytes(size_t size) +{ + /* + * Each iovec points to a 4K page. There's no real reason to do this + * in userspace, but our whole point here is to make it feel a bit + * more like a real paged memory model. + */ + return (P2ROUNDUP(size, ABD_PAGESIZE) / ABD_PAGESIZE); +} + +abd_t * +abd_alloc_struct_impl(size_t size) +{ + /* + * Zero-sized means it will be used for a linear or gang abd, so just + * allocate the abd itself and return. + */ + if (size == 0) + return (umem_alloc(sizeof (abd_t), UMEM_NOFAIL)); + + /* + * Allocating for a scatter abd, so compute how many ABD_PAGESIZE + * iovecs we will need to hold this size. Append that allocation to the + * end. Note that struct abd_scatter has includes abd_iov[1], so we + * allocate one less iovec than we need. + * + * Note we're not allocating the pages proper, just the iovec pointers. + * That's down in abd_alloc_chunks. We _could_ do it here in a single + * allocation, but it's fiddly and harder to read for no real gain. + */ + uint_t n = abd_iovcnt_for_bytes(size); + abd_t *abd = umem_alloc(sizeof (abd_t) + (n-1) * sizeof (struct iovec), + UMEM_NOFAIL); + ABD_SCATTER(abd).abd_offset = 0; + ABD_SCATTER(abd).abd_iovcnt = n; + return (abd); +} + +void +abd_free_struct_impl(abd_t *abd) +{ + /* For scatter, compute the extra amount we need to free */ + uint_t iovcnt = + abd_is_linear(abd) || abd_is_gang(abd) ? + 0 : (ABD_SCATTER(abd).abd_iovcnt - 1); + umem_free(abd, sizeof (abd_t) + iovcnt * sizeof (struct iovec)); +} + +void +abd_alloc_chunks(abd_t *abd, size_t size) +{ + /* + * We've already allocated the iovec array; ensure that the wanted size + * actually matches, otherwise the caller has made a mistake somewhere. + */ + uint_t n = ABD_SCATTER(abd).abd_iovcnt; + ASSERT3U(n, ==, abd_iovcnt_for_bytes(size)); + + /* + * Allocate a ABD_PAGESIZE region for each iovec. + */ + struct iovec *iov = ABD_SCATTER(abd).abd_iov; + for (int i = 0; i < n; i++) { + iov[i].iov_base = + umem_alloc_aligned(ABD_PAGESIZE, ABD_PAGESIZE, UMEM_NOFAIL); + iov[i].iov_len = ABD_PAGESIZE; + } +} + +void +abd_free_chunks(abd_t *abd) +{ + uint_t n = ABD_SCATTER(abd).abd_iovcnt; + struct iovec *iov = ABD_SCATTER(abd).abd_iov; + for (int i = 0; i < n; i++) + umem_free_aligned(iov[i].iov_base, ABD_PAGESIZE); +} + +boolean_t +abd_size_alloc_linear(size_t size) +{ + return (size < ABD_SCATTER_MIN_SIZE); +} + +void +abd_update_scatter_stats(abd_t *abd, abd_stats_op_t op) +{ + ASSERT(op == ABDSTAT_INCR || op == ABDSTAT_DECR); + int waste = P2ROUNDUP(abd->abd_size, ABD_PAGESIZE) - abd->abd_size; + if (op == ABDSTAT_INCR) { + arc_space_consume(waste, ARC_SPACE_ABD_CHUNK_WASTE); + } else { + arc_space_return(waste, ARC_SPACE_ABD_CHUNK_WASTE); + } +} + +void +abd_update_linear_stats(abd_t *abd, abd_stats_op_t op) +{ + (void) abd; + (void) op; + ASSERT(op == ABDSTAT_INCR || op == ABDSTAT_DECR); +} + +void +abd_verify_scatter(abd_t *abd) +{ +#ifdef ZFS_DEBUG + /* + * scatter abds shall have: + * - at least one iovec + * - all iov_base point somewhere + * - all iov_len are ABD_PAGESIZE + * - offset set within the abd pages somewhere + */ + uint_t n = ABD_SCATTER(abd).abd_iovcnt; + ASSERT3U(n, >, 0); + + uint_t len = 0; + for (int i = 0; i < n; i++) { + ASSERT3P(ABD_SCATTER(abd).abd_iov[i].iov_base, !=, NULL); + ASSERT3U(ABD_SCATTER(abd).abd_iov[i].iov_len, ==, ABD_PAGESIZE); + len += ABD_PAGESIZE; + } + + ASSERT3U(ABD_SCATTER(abd).abd_offset, <, len); +#endif +} + +void +abd_init(void) +{ + /* + * Create the "zero" scatter abd. This is always the size of the + * largest possible block, but only actually has a single allocated + * page, which all iovecs in the abd point to. + */ + abd_zero_scatter = abd_alloc_struct(SPA_MAXBLOCKSIZE); + abd_zero_scatter->abd_flags |= ABD_FLAG_OWNER; + abd_zero_scatter->abd_size = SPA_MAXBLOCKSIZE; + + void *zero = + umem_alloc_aligned(ABD_PAGESIZE, ABD_PAGESIZE, UMEM_NOFAIL); + memset(zero, 0, ABD_PAGESIZE); + + uint_t n = abd_iovcnt_for_bytes(SPA_MAXBLOCKSIZE); + struct iovec *iov = ABD_SCATTER(abd_zero_scatter).abd_iov; + for (int i = 0; i < n; i++) { + iov[i].iov_base = zero; + iov[i].iov_len = ABD_PAGESIZE; + } +} + +void +abd_fini(void) +{ + umem_free_aligned( + ABD_SCATTER(abd_zero_scatter).abd_iov[0].iov_base, ABD_PAGESIZE); + abd_free_struct(abd_zero_scatter); + abd_zero_scatter = NULL; +} + +void +abd_free_linear_page(abd_t *abd) +{ + /* + * LINEAR_PAGE is specific to the Linux kernel; we never set this + * flag, so this will never be called. + */ + (void) abd; + PANIC("unreachable"); +} + +abd_t * +abd_alloc_for_io(size_t size, boolean_t is_metadata) +{ + return (abd_alloc(size, is_metadata)); +} + +abd_t * +abd_get_offset_scatter(abd_t *dabd, abd_t *sabd, size_t off, size_t size) +{ + + /* + * Create a new scatter dabd by borrowing data pages from sabd to cover + * off+size. + * + * sabd is an existing scatter abd with a set of iovecs, each covering + * an ABD_PAGESIZE (4K) allocation. It's "zero" is at abd_offset. + * + * [........][........][........][........] + * ^- sabd_offset + * + * We want to produce a new abd, referencing those allocations at the + * given offset. + * + * [........][........][........][........] + * ^- dabd_offset = sabd_offset + off + * ^- dabd_offset + size + * + * In this example, dabd needs three iovecs. The first iovec is offset + * 0, so the final dabd_offset is masked back into the first iovec. + * + * [........][........][........] + * ^- dabd_offset + */ + size_t soff = ABD_SCATTER(sabd).abd_offset + off; + size_t doff = soff & ABD_PAGEMASK; + size_t iovcnt = abd_iovcnt_for_bytes(doff + size); + + /* + * If the passed-in abd has enough allocated iovecs already, reuse it. + * Otherwise, make a new one. The caller will free the original if the + * one it gets back is not the same. + * + * Note that it's ok if we reuse an abd with more iovecs than we need. + * abd_size has the usable amount of data, and the abd does not own the + * pages referenced by the iovecs. At worst, they're holding dangling + * pointers that we'll never use anyway. + */ + if (dabd == NULL || ABD_SCATTER(dabd).abd_iovcnt < iovcnt) + dabd = abd_alloc_struct(iovcnt << ABD_PAGESHIFT); + + /* Set offset into first page in view */ + ABD_SCATTER(dabd).abd_offset = doff; + + /* Copy the wanted iovecs from the source to the dest */ + memcpy(&ABD_SCATTER(dabd).abd_iov[0], + &ABD_SCATTER(sabd).abd_iov[soff >> ABD_PAGESHIFT], + iovcnt * sizeof (struct iovec)); + + return (dabd); +} + +void +abd_iter_init(struct abd_iter *aiter, abd_t *abd) +{ + ASSERT(!abd_is_gang(abd)); + abd_verify(abd); + memset(aiter, 0, sizeof (struct abd_iter)); + aiter->iter_abd = abd; +} + +boolean_t +abd_iter_at_end(struct abd_iter *aiter) +{ + ASSERT3U(aiter->iter_pos, <=, aiter->iter_abd->abd_size); + return (aiter->iter_pos == aiter->iter_abd->abd_size); +} + +void +abd_iter_advance(struct abd_iter *aiter, size_t amount) +{ + ASSERT3P(aiter->iter_mapaddr, ==, NULL); + ASSERT0(aiter->iter_mapsize); + + if (abd_iter_at_end(aiter)) + return; + + aiter->iter_pos += amount; + ASSERT3U(aiter->iter_pos, <=, aiter->iter_abd->abd_size); +} + +void +abd_iter_map(struct abd_iter *aiter) +{ + ASSERT3P(aiter->iter_mapaddr, ==, NULL); + ASSERT0(aiter->iter_mapsize); + + if (abd_iter_at_end(aiter)) + return; + + if (abd_is_linear(aiter->iter_abd)) { + aiter->iter_mapaddr = + ABD_LINEAR_BUF(aiter->iter_abd) + aiter->iter_pos; + aiter->iter_mapsize = + aiter->iter_abd->abd_size - aiter->iter_pos; + return; + } + + /* + * For scatter, we index into the appropriate iovec, and return the + * smaller of the amount requested, or up to the end of the page. + */ + size_t poff = aiter->iter_pos + ABD_SCATTER(aiter->iter_abd).abd_offset; + + ASSERT3U(poff >> ABD_PAGESHIFT, <=, + ABD_SCATTER(aiter->iter_abd).abd_iovcnt); + struct iovec *iov = &ABD_SCATTER(aiter->iter_abd). + abd_iov[poff >> ABD_PAGESHIFT]; + + aiter->iter_mapsize = MIN(ABD_PAGESIZE - (poff & ABD_PAGEMASK), + aiter->iter_abd->abd_size - aiter->iter_pos); + ASSERT3U(aiter->iter_mapsize, <=, ABD_PAGESIZE); + + aiter->iter_mapaddr = iov->iov_base + (poff & ABD_PAGEMASK); +} + +void +abd_iter_unmap(struct abd_iter *aiter) +{ + if (abd_iter_at_end(aiter)) + return; + + ASSERT3P(aiter->iter_mapaddr, !=, NULL); + ASSERT3U(aiter->iter_mapsize, >, 0); + + aiter->iter_mapaddr = NULL; + aiter->iter_mapsize = 0; +} + +void +abd_cache_reap_now(void) +{ +} + +/* + * Borrow a raw buffer from an ABD without copying the contents of the ABD + * into the buffer. If the ABD is scattered, this will alloate a raw buffer + * whose contents are undefined. To copy over the existing data in the ABD, use + * abd_borrow_buf_copy() instead. + */ +void * +abd_borrow_buf(abd_t *abd, size_t n) +{ + void *buf; + abd_verify(abd); + ASSERT3U(abd->abd_size, >=, 0); + if (abd_is_linear(abd)) { + buf = abd_to_buf(abd); + } else { + buf = zio_buf_alloc(n); + } +#ifdef ZFS_DEBUG + (void) zfs_refcount_add_many(&abd->abd_children, n, buf); +#endif + return (buf); +} + +void * +abd_borrow_buf_copy(abd_t *abd, size_t n) +{ + void *buf = abd_borrow_buf(abd, n); + if (!abd_is_linear(abd)) { + abd_copy_to_buf(buf, abd, n); + } + return (buf); +} + +/* + * Return a borrowed raw buffer to an ABD. If the ABD is scattered, this will + * no change the contents of the ABD and will ASSERT that you didn't modify + * the buffer since it was borrowed. If you want any changes you made to buf to + * be copied back to abd, use abd_return_buf_copy() instead. + */ +void +abd_return_buf(abd_t *abd, void *buf, size_t n) +{ + abd_verify(abd); + ASSERT3U(abd->abd_size, >=, n); +#ifdef ZFS_DEBUG + (void) zfs_refcount_remove_many(&abd->abd_children, n, buf); +#endif + if (abd_is_linear(abd)) { + ASSERT3P(buf, ==, abd_to_buf(abd)); + } else { + ASSERT0(abd_cmp_buf(abd, buf, n)); + zio_buf_free(buf, n); + } +} + +void +abd_return_buf_copy(abd_t *abd, void *buf, size_t n) +{ + if (!abd_is_linear(abd)) { + abd_copy_from_buf(abd, buf, n); + } + abd_return_buf(abd, buf, n); +} diff --git a/sys/contrib/openzfs/lib/libzpool/arc_os.c b/sys/contrib/openzfs/lib/libzpool/arc_os.c new file mode 100644 index 000000000000..6ad1a2bcda6e --- /dev/null +++ b/sys/contrib/openzfs/lib/libzpool/arc_os.c @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: CDDL-1.0 +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or https://opensource.org/licenses/CDDL-1.0. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Joyent, Inc. + * Copyright (c) 2011, 2019 by Delphix. All rights reserved. + * Copyright (c) 2014 by Saso Kiselkov. All rights reserved. + * Copyright 2017 Nexenta Systems, Inc. All rights reserved. + */ + +#include <sys/zfs_context.h> +#include <sys/arc_impl.h> + +/* + * Return a default max arc size based on the amount of physical memory. + * This may be overridden by tuning the zfs_arc_max module parameter. + */ +uint64_t +arc_default_max(uint64_t min, uint64_t allmem) +{ + uint64_t size; + + if (allmem >= 1 << 30) + size = allmem - (1 << 30); + else + size = min; + return (MAX(allmem * 5 / 8, size)); +} + +int64_t +arc_available_memory(void) +{ + int64_t lowest = INT64_MAX; + + /* Every 100 calls, free a small amount */ + if (random_in_range(100) == 0) + lowest = -1024; + + return (lowest); +} + +int +arc_memory_throttle(spa_t *spa, uint64_t reserve, uint64_t txg) +{ + (void) spa, (void) reserve, (void) txg; + return (0); +} + +uint64_t +arc_all_memory(void) +{ + return (ptob(physmem) / 2); +} + +uint64_t +arc_free_memory(void) +{ + return (random_in_range(arc_all_memory() * 20 / 100)); +} + +void +arc_register_hotplug(void) +{ +} + +void +arc_unregister_hotplug(void) +{ +} diff --git a/sys/contrib/openzfs/lib/libzpool/kernel.c b/sys/contrib/openzfs/lib/libzpool/kernel.c index ef75706fa6e3..e397fc851cc1 100644 --- a/sys/contrib/openzfs/lib/libzpool/kernel.c +++ b/sys/contrib/openzfs/lib/libzpool/kernel.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -31,6 +32,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <limits.h> #include <libzutil.h> #include <sys/crypto/icp.h> #include <sys/processor.h> @@ -53,7 +55,7 @@ */ uint64_t physmem; -char hw_serial[HW_HOSTID_LEN]; +uint32_t hostid; struct utsname hw_utsname; /* If set, all blocks read will be copied to the specified directory. */ @@ -75,13 +77,29 @@ struct proc p0; #define TS_STACK_MIN MAX(PTHREAD_STACK_MIN, 32768) #define TS_STACK_MAX (256 * 1024) -/*ARGSUSED*/ +struct zk_thread_wrapper { + void (*func)(void *); + void *arg; +}; + +static void * +zk_thread_wrapper(void *arg) +{ + struct zk_thread_wrapper ztw; + memcpy(&ztw, arg, sizeof (ztw)); + free(arg); + ztw.func(ztw.arg); + return (NULL); +} + kthread_t * -zk_thread_create(void (*func)(void *), void *arg, size_t stksize, int state) +zk_thread_create(const char *name, void (*func)(void *), void *arg, + size_t stksize, int state) { pthread_attr_t attr; pthread_t tid; char *stkstr; + struct zk_thread_wrapper *ztw; int detachstate = PTHREAD_CREATE_DETACHED; VERIFY0(pthread_attr_init(&attr)); @@ -118,9 +136,14 @@ zk_thread_create(void (*func)(void *), void *arg, size_t stksize, int state) VERIFY0(pthread_attr_setstacksize(&attr, stksize)); VERIFY0(pthread_attr_setguardsize(&attr, PAGESIZE)); - VERIFY0(pthread_create(&tid, &attr, (void *(*)(void *))func, arg)); + VERIFY(ztw = malloc(sizeof (*ztw))); + ztw->func = func; + ztw->arg = arg; + VERIFY0(pthread_create(&tid, &attr, zk_thread_wrapper, ztw)); VERIFY0(pthread_attr_destroy(&attr)); + pthread_setname_np(tid, name); + return ((void *)(uintptr_t)tid); } @@ -129,30 +152,35 @@ zk_thread_create(void (*func)(void *), void *arg, size_t stksize, int state) * kstats * ========================================================================= */ -/*ARGSUSED*/ kstat_t * kstat_create(const char *module, int instance, const char *name, const char *class, uchar_t type, ulong_t ndata, uchar_t ks_flag) { + (void) module, (void) instance, (void) name, (void) class, (void) type, + (void) ndata, (void) ks_flag; return (NULL); } -/*ARGSUSED*/ void kstat_install(kstat_t *ksp) -{} +{ + (void) ksp; +} -/*ARGSUSED*/ void kstat_delete(kstat_t *ksp) -{} +{ + (void) ksp; +} void kstat_set_raw_ops(kstat_t *ksp, int (*headers)(char *buf, size_t size), int (*data)(char *buf, size_t size, void *data), void *(*addr)(kstat_t *ksp, loff_t index)) -{} +{ + (void) ksp, (void) headers, (void) data, (void) addr; +} /* * ========================================================================= @@ -163,6 +191,7 @@ kstat_set_raw_ops(kstat_t *ksp, void mutex_init(kmutex_t *mp, char *name, int type, void *cookie) { + (void) name, (void) type, (void) cookie; VERIFY0(pthread_mutex_init(&mp->m_lock, NULL)); memset(&mp->m_owner, 0, sizeof (pthread_t)); } @@ -181,11 +210,18 @@ mutex_enter(kmutex_t *mp) } int -mutex_tryenter(kmutex_t *mp) +mutex_enter_check_return(kmutex_t *mp) { - int error; + int error = pthread_mutex_lock(&mp->m_lock); + if (error == 0) + mp->m_owner = pthread_self(); + return (error); +} - error = pthread_mutex_trylock(&mp->m_lock); +int +mutex_tryenter(kmutex_t *mp) +{ + int error = pthread_mutex_trylock(&mp->m_lock); if (error == 0) { mp->m_owner = pthread_self(); return (1); @@ -211,6 +247,7 @@ mutex_exit(kmutex_t *mp) void rw_init(krwlock_t *rwlp, char *name, int type, void *arg) { + (void) name, (void) type, (void) arg; VERIFY0(pthread_rwlock_init(&rwlp->rw_lock, NULL)); rwlp->rw_readers = 0; rwlp->rw_owner = 0; @@ -269,19 +306,20 @@ rw_tryenter(krwlock_t *rwlp, krw_t rw) return (0); } -/* ARGSUSED */ uint32_t zone_get_hostid(void *zonep) { /* * We're emulating the system's hostid in userland. */ - return (strtoul(hw_serial, NULL, 10)); + (void) zonep; + return (hostid); } int rw_tryupgrade(krwlock_t *rwlp) { + (void) rwlp; return (0); } @@ -294,6 +332,7 @@ rw_tryupgrade(krwlock_t *rwlp) void cv_init(kcondvar_t *cv, char *name, int type, void *arg) { + (void) name, (void) type, (void) arg; VERIFY0(pthread_cond_init(cv, NULL)); } @@ -351,11 +390,11 @@ cv_timedwait(kcondvar_t *cv, kmutex_t *mp, clock_t abstime) return (1); } -/*ARGSUSED*/ int cv_timedwait_hires(kcondvar_t *cv, kmutex_t *mp, hrtime_t tim, hrtime_t res, int flag) { + (void) res; int error; struct timeval tv; struct timespec ts; @@ -411,7 +450,9 @@ cv_broadcast(kcondvar_t *cv) void seq_printf(struct seq_file *m, const char *fmt, ...) -{} +{ + (void) m, (void) fmt; +} void procfs_list_install(const char *module, @@ -424,6 +465,8 @@ procfs_list_install(const char *module, int (*clear)(procfs_list_t *procfs_list), size_t procfs_list_node_off) { + (void) module, (void) submodule, (void) name, (void) mode, (void) show, + (void) show_header, (void) clear; mutex_init(&procfs_list->pl_lock, NULL, MUTEX_DEFAULT, NULL); list_create(&procfs_list->pl_list, procfs_list_node_off + sizeof (procfs_list_node_t), @@ -434,7 +477,9 @@ procfs_list_install(const char *module, void procfs_list_uninstall(procfs_list_t *procfs_list) -{} +{ + (void) procfs_list; +} void procfs_list_destroy(procfs_list_t *procfs_list) @@ -602,7 +647,7 @@ __dprintf(boolean_t dprint, const char *file, const char *func, static char ce_prefix[CE_IGNORE][10] = { "", "NOTICE: ", "WARNING: ", "" }; static char ce_suffix[CE_IGNORE][2] = { "", "\n", "\n", "" }; -void +__attribute__((noreturn)) void vpanic(const char *fmt, va_list adx) { (void) fprintf(stderr, "error: "); @@ -612,7 +657,7 @@ vpanic(const char *fmt, va_list adx) abort(); /* think of it as a "user-level crash dump" */ } -void +__attribute__((noreturn)) void panic(const char *fmt, ...) { va_list adx; @@ -736,22 +781,10 @@ random_get_pseudo_bytes(uint8_t *ptr, size_t len) } int -ddi_strtoul(const char *hw_serial, char **nptr, int base, unsigned long *result) -{ - char *end; - - *result = strtoul(hw_serial, &end, base); - if (*result == 0) - return (errno); - return (0); -} - -int ddi_strtoull(const char *str, char **nptr, int base, u_longlong_t *result) { - char *end; - - *result = strtoull(str, &end, base); + errno = 0; + *result = strtoull(str, nptr, base); if (*result == 0) return (errno); return (0); @@ -790,8 +823,7 @@ kernel_init(int mode) dprintf("physmem = %llu pages (%.2f GB)\n", (u_longlong_t)physmem, (double)physmem * sysconf(_SC_PAGE_SIZE) / (1ULL << 30)); - (void) snprintf(hw_serial, sizeof (hw_serial), "%ld", - (mode & SPA_MODE_WRITE) ? get_system_hostid() : 0); + hostid = (mode & SPA_MODE_WRITE) ? get_system_hostid() : 0; random_init(); @@ -826,60 +858,63 @@ kernel_fini(void) uid_t crgetuid(cred_t *cr) { + (void) cr; return (0); } uid_t crgetruid(cred_t *cr) { + (void) cr; return (0); } gid_t crgetgid(cred_t *cr) { + (void) cr; return (0); } int crgetngroups(cred_t *cr) { + (void) cr; return (0); } gid_t * crgetgroups(cred_t *cr) { + (void) cr; return (NULL); } int zfs_secpolicy_snapshot_perms(const char *name, cred_t *cr) { + (void) name, (void) cr; return (0); } int zfs_secpolicy_rename_perms(const char *from, const char *to, cred_t *cr) { + (void) from, (void) to, (void) cr; return (0); } int zfs_secpolicy_destroy_perms(const char *name, cred_t *cr) { + (void) name, (void) cr; return (0); } int secpolicy_zfs(const cred_t *cr) { - return (0); -} - -int -secpolicy_zfs_proc(const cred_t *cr, proc_t *proc) -{ + (void) cr; return (0); } @@ -926,25 +961,54 @@ kmem_asprintf(const char *fmt, ...) return (buf); } -/* ARGSUSED */ +/* + * kmem_scnprintf() will return the number of characters that it would have + * printed whenever it is limited by value of the size variable, rather than + * the number of characters that it did print. This can cause misbehavior on + * subsequent uses of the return value, so we define a safe version that will + * return the number of characters actually printed, minus the NULL format + * character. Subsequent use of this by the safe string functions is safe + * whether it is snprintf(), strlcat() or strlcpy(). + */ +int +kmem_scnprintf(char *restrict str, size_t size, const char *restrict fmt, ...) +{ + int n; + va_list ap; + + /* Make the 0 case a no-op so that we do not return -1 */ + if (size == 0) + return (0); + + va_start(ap, fmt); + n = vsnprintf(str, size, fmt, ap); + va_end(ap); + + if (n >= size) + n = size - 1; + + return (n); +} + zfs_file_t * zfs_onexit_fd_hold(int fd, minor_t *minorp) { + (void) fd; *minorp = 0; return (NULL); } -/* ARGSUSED */ void zfs_onexit_fd_rele(zfs_file_t *fp) { + (void) fp; } -/* ARGSUSED */ int zfs_onexit_add_cb(minor_t minor, void (*func)(void *), void *data, - uint64_t *action_handle) + uintptr_t *action_handle) { + (void) minor, (void) func, (void) data, (void) action_handle; return (0); } @@ -957,6 +1021,7 @@ spl_fstrans_mark(void) void spl_fstrans_unmark(fstrans_cookie_t cookie) { + (void) cookie; } int @@ -971,27 +1036,29 @@ kmem_cache_reap_active(void) return (0); } -void *zvol_tag = "zvol_tag"; - void zvol_create_minor(const char *name) { + (void) name; } void zvol_create_minors_recursive(const char *name) { + (void) name; } void zvol_remove_minors(spa_t *spa, const char *name, boolean_t async) { + (void) spa, (void) name, (void) async; } void zvol_rename_minors(spa_t *spa, const char *oldname, const char *newname, boolean_t async) { + (void) spa, (void) oldname, (void) newname, (void) async; } /* @@ -1285,33 +1352,41 @@ zfs_file_getattr(zfs_file_t *fp, zfs_file_attr_t *zfattr) int zfs_file_fsync(zfs_file_t *fp, int flags) { - int rc; + (void) flags; - rc = fsync(fp->f_fd); - if (rc < 0) + if (fsync(fp->f_fd) < 0) return (errno); return (0); } /* - * fallocate - allocate or free space on disk + * deallocate - zero and/or deallocate file storage * * fp - file pointer - * mode (non-standard options for hole punching etc) - * offset - offset to start allocating or freeing from - * len - length to free / allocate - * - * OPTIONAL + * offset - offset to start zeroing or deallocating + * len - length to zero or deallocate */ int -zfs_file_fallocate(zfs_file_t *fp, int mode, loff_t offset, loff_t len) +zfs_file_deallocate(zfs_file_t *fp, loff_t offset, loff_t len) { -#ifdef __linux__ - return (fallocate(fp->f_fd, mode, offset, len)); + int rc; +#if defined(__linux__) + rc = fallocate(fp->f_fd, + FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, offset, len); +#elif defined(__FreeBSD__) && (__FreeBSD_version >= 1400029) + struct spacectl_range rqsr = { + .r_offset = offset, + .r_len = len, + }; + rc = fspacectl(fp->f_fd, SPACECTL_DEALLOC, &rqsr, 0, &rqsr); #else - return (EOPNOTSUPP); + (void) fp, (void) offset, (void) len; + rc = EOPNOTSUPP; #endif + if (rc) + return (SET_ERROR(rc)); + return (0); } /* @@ -1353,8 +1428,8 @@ zfs_file_unlink(const char *path) zfs_file_t * zfs_file_get(int fd) { + (void) fd; abort(); - return (NULL); } /* @@ -1368,9 +1443,35 @@ void zfs_file_put(zfs_file_t *fp) { abort(); + (void) fp; } void zfsvfs_update_fromname(const char *oldname, const char *newname) { + (void) oldname, (void) newname; +} + +void +spa_import_os(spa_t *spa) +{ + (void) spa; +} + +void +spa_export_os(spa_t *spa) +{ + (void) spa; +} + +void +spa_activate_os(spa_t *spa) +{ + (void) spa; +} + +void +spa_deactivate_os(spa_t *spa) +{ + (void) spa; } diff --git a/sys/contrib/openzfs/lib/libzpool/taskq.c b/sys/contrib/openzfs/lib/libzpool/taskq.c index 456080f7f247..0457de21fa18 100644 --- a/sys/contrib/openzfs/lib/libzpool/taskq.c +++ b/sys/contrib/openzfs/lib/libzpool/taskq.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -134,9 +135,10 @@ taskq_dispatch(taskq_t *tq, task_func_t func, void *arg, uint_t tqflags) } taskqid_t -taskq_dispatch_delay(taskq_t *tq, task_func_t func, void *arg, uint_t tqflags, +taskq_dispatch_delay(taskq_t *tq, task_func_t func, void *arg, uint_t tqflags, clock_t expire_time) { + (void) tq, (void) func, (void) arg, (void) tqflags, (void) expire_time; return (0); } @@ -199,16 +201,18 @@ taskq_wait(taskq_t *tq) void taskq_wait_id(taskq_t *tq, taskqid_t id) { + (void) id; taskq_wait(tq); } void taskq_wait_outstanding(taskq_t *tq, taskqid_t id) { + (void) id; taskq_wait(tq); } -static void +static __attribute__((noreturn)) void taskq_thread(void *arg) { taskq_t *tq = arg; @@ -247,11 +251,11 @@ taskq_thread(void *arg) thread_exit(); } -/*ARGSUSED*/ taskq_t * taskq_create(const char *name, int nthreads, pri_t pri, int minalloc, int maxalloc, uint_t flags) { + (void) pri; taskq_t *tq = kmem_zalloc(sizeof (taskq_t), KM_SLEEP); int t; @@ -273,7 +277,7 @@ taskq_create(const char *name, int nthreads, pri_t pri, cv_init(&tq->tq_dispatch_cv, NULL, CV_DEFAULT, NULL); cv_init(&tq->tq_wait_cv, NULL, CV_DEFAULT, NULL); cv_init(&tq->tq_maxalloc_cv, NULL, CV_DEFAULT, NULL); - (void) strncpy(tq->tq_name, name, TASKQ_NAMELEN); + (void) strlcpy(tq->tq_name, name, sizeof (tq->tq_name)); tq->tq_flags = flags | TASKQ_ACTIVE; tq->tq_active = nthreads; tq->tq_nthreads = nthreads; @@ -292,8 +296,8 @@ taskq_create(const char *name, int nthreads, pri_t pri, } for (t = 0; t < nthreads; t++) - VERIFY((tq->tq_threadlist[t] = thread_create(NULL, 0, - taskq_thread, tq, 0, &p0, TS_RUN, pri)) != NULL); + VERIFY((tq->tq_threadlist[t] = thread_create_named(tq->tq_name, + NULL, 0, taskq_thread, tq, 0, &p0, TS_RUN, pri)) != NULL); return (tq); } @@ -316,7 +320,9 @@ taskq_destroy(taskq_t *tq) tq->tq_minalloc = 0; while (tq->tq_nalloc != 0) { ASSERT(tq->tq_freelist != NULL); - task_free(tq, task_alloc(tq, KM_SLEEP)); + taskq_ent_t *tqent_nexttq = tq->tq_freelist->tqent_next; + task_free(tq, tq->tq_freelist); + tq->tq_freelist = tqent_nexttq; } mutex_exit(&tq->tq_lock); @@ -332,6 +338,36 @@ taskq_destroy(taskq_t *tq) kmem_free(tq, sizeof (taskq_t)); } +/* + * Create a taskq with a specified number of pool threads. Allocate + * and return an array of nthreads kthread_t pointers, one for each + * thread in the pool. The array is not ordered and must be freed + * by the caller. + */ +taskq_t * +taskq_create_synced(const char *name, int nthreads, pri_t pri, + int minalloc, int maxalloc, uint_t flags, kthread_t ***ktpp) +{ + taskq_t *tq; + kthread_t **kthreads = kmem_zalloc(sizeof (*kthreads) * nthreads, + KM_SLEEP); + + (void) pri; (void) minalloc; (void) maxalloc; + + flags &= ~(TASKQ_DYNAMIC | TASKQ_THREADS_CPU_PCT | TASKQ_DC_BATCH); + + tq = taskq_create(name, nthreads, minclsyspri, nthreads, INT_MAX, + flags | TASKQ_PREPOPULATE); + VERIFY(tq != NULL); + VERIFY(tq->tq_nthreads == nthreads); + + for (int i = 0; i < nthreads; i++) { + kthreads[i] = tq->tq_threadlist[i]; + } + *ktpp = kthreads; + return (tq); +} + int taskq_member(taskq_t *tq, kthread_t *t) { @@ -356,6 +392,7 @@ taskq_of_curthread(void) int taskq_cancel_id(taskq_t *tq, taskqid_t id) { + (void) tq, (void) id; return (ENOENT); } diff --git a/sys/contrib/openzfs/lib/libzpool/util.c b/sys/contrib/openzfs/lib/libzpool/util.c index a2bdfec1d173..a297daedbd4d 100644 --- a/sys/contrib/openzfs/lib/libzpool/util.c +++ b/sys/contrib/openzfs/lib/libzpool/util.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -64,7 +65,8 @@ show_vdev_stats(const char *desc, const char *ctype, nvlist_t *nv, int indent) } if (desc != NULL) { - char *suffix = "", *bias = NULL; + const char *suffix = ""; + const char *bias = NULL; char bias_suffix[32]; (void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_IS_LOG, &is_log); @@ -112,7 +114,8 @@ show_vdev_stats(const char *desc, const char *ctype, nvlist_t *nv, int indent) for (c = 0; c < children; c++) { nvlist_t *cnv = child[c]; - char *cname = NULL, *tname; + const char *cname = NULL; + char *tname; uint64_t np; int len; if (nvlist_lookup_string(cnv, ZPOOL_CONFIG_PATH, &cname) && @@ -132,7 +135,7 @@ void show_pool_stats(spa_t *spa) { nvlist_t *config, *nvroot; - char *name; + const char *name; VERIFY(spa_get_stats(spa_name(spa), &config, NULL, 0) == 0); @@ -173,12 +176,13 @@ set_global_var_parse_kv(const char *arg, char **k_out, u_longlong_t *v_out) goto err_free; } - *k_out = k; + *k_out = strdup(k); *v_out = val; + free(d); return (0); err_free: - free(k); + free(d); return (err); } @@ -227,13 +231,14 @@ set_global_var(char const *arg) fprintf(stderr, "Failed to open libzpool.so to set global " "variable\n"); ret = EIO; - goto out_dlclose; + goto out_free; } ret = 0; out_dlclose: dlclose(zpoolhdl); +out_free: free(varname); out_ret: return (ret); @@ -242,6 +247,7 @@ out_ret: static nvlist_t * refresh_config(void *unused, nvlist_t *tryconfig) { + (void) unused; return (spa_tryimport(tryconfig)); } @@ -254,9 +260,12 @@ refresh_config(void *unused, nvlist_t *tryconfig) static int pool_active(void *unused, const char *name, uint64_t guid, boolean_t *isactive) { + (void) unused, (void) guid; zfs_iocparm_t zp; zfs_cmd_t *zc = NULL; +#ifdef ZFS_LEGACY_SUPPORT zfs_cmd_legacy_t *zcl = NULL; +#endif unsigned long request; int ret; @@ -291,6 +300,7 @@ pool_active(void *unused, const char *name, uint64_t guid, boolean_t *isactive) umem_free(zc, sizeof (zfs_cmd_t)); break; +#ifdef ZFS_LEGACY_SUPPORT case ZFS_IOCVER_LEGACY: zcl = umem_zalloc(sizeof (zfs_cmd_legacy_t), UMEM_NOFAIL); @@ -306,6 +316,7 @@ pool_active(void *unused, const char *name, uint64_t guid, boolean_t *isactive) umem_free(zcl, sizeof (zfs_cmd_legacy_t)); break; +#endif default: fprintf(stderr, "unrecognized zfs ioctl version %d", ver); exit(1); @@ -322,6 +333,7 @@ static int pool_active(void *unused, const char *name, uint64_t guid, boolean_t *isactive) { + (void) unused, (void) guid; int fd = open(ZFS_DEV, O_RDWR | O_CLOEXEC); if (fd < 0) return (-1); @@ -345,7 +357,7 @@ pool_active(void *unused, const char *name, uint64_t guid, } #endif -const pool_config_ops_t libzpool_config_ops = { +pool_config_ops_t libzpool_config_ops = { .pco_refresh_config = refresh_config, .pco_pool_active = pool_active, }; diff --git a/sys/contrib/openzfs/lib/libzpool/vdev_label_os.c b/sys/contrib/openzfs/lib/libzpool/vdev_label_os.c new file mode 100644 index 000000000000..803840884b24 --- /dev/null +++ b/sys/contrib/openzfs/lib/libzpool/vdev_label_os.c @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: CDDL-1.0 +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or https://opensource.org/licenses/CDDL-1.0. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2023 by iXsystems, Inc. + */ + +#include <sys/zfs_context.h> +#include <sys/spa.h> +#include <sys/spa_impl.h> +#include <sys/vdev.h> +#include <sys/vdev_impl.h> + +/* + * Check if the reserved boot area is in-use. This is called from + * spa_vdev_attach() when adding a device to a raidz vdev, to ensure that the + * reserved area is available as scratch space for raidz expansion. + * + * This function currently always returns 0. On Linux, there are no known + * external uses of the reserved area. On FreeBSD, the reserved boot area is + * used when booting to a ZFS root from an MBR partition. + * + * Currently nothing using libzpool can add a disk to a pool, so this does + * nothing. + */ +int +vdev_check_boot_reserve(spa_t *spa, vdev_t *childvd) +{ + (void) spa; + (void) childvd; + + return (0); +} diff --git a/sys/contrib/openzfs/lib/libzpool/zfs_debug.c b/sys/contrib/openzfs/lib/libzpool/zfs_debug.c new file mode 100644 index 000000000000..3e5cff76abe9 --- /dev/null +++ b/sys/contrib/openzfs/lib/libzpool/zfs_debug.c @@ -0,0 +1,125 @@ +// SPDX-License-Identifier: CDDL-1.0 +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or https://opensource.org/licenses/CDDL-1.0. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2014 by Delphix. All rights reserved. + * Copyright (c) 2024, Rob Norris <robn@despairlabs.com> + */ + +#include <sys/zfs_context.h> + +typedef struct zfs_dbgmsg { + list_node_t zdm_node; + uint64_t zdm_timestamp; + uint_t zdm_size; + char zdm_msg[]; /* variable length allocation */ +} zfs_dbgmsg_t; + +static list_t zfs_dbgmsgs; +static kmutex_t zfs_dbgmsgs_lock; +static uint_t zfs_dbgmsg_size = 0; +static uint_t zfs_dbgmsg_maxsize = 4<<20; /* 4MB */ + +int zfs_dbgmsg_enable = B_TRUE; + +static void +zfs_dbgmsg_purge(uint_t max_size) +{ + while (zfs_dbgmsg_size > max_size) { + zfs_dbgmsg_t *zdm = list_remove_head(&zfs_dbgmsgs); + if (zdm == NULL) + return; + + uint_t size = zdm->zdm_size; + kmem_free(zdm, size); + zfs_dbgmsg_size -= size; + } +} + +void +zfs_dbgmsg_init(void) +{ + list_create(&zfs_dbgmsgs, sizeof (zfs_dbgmsg_t), + offsetof(zfs_dbgmsg_t, zdm_node)); + mutex_init(&zfs_dbgmsgs_lock, NULL, MUTEX_DEFAULT, NULL); +} + +void +zfs_dbgmsg_fini(void) +{ + zfs_dbgmsg_t *zdm; + while ((zdm = list_remove_head(&zfs_dbgmsgs))) + umem_free(zdm, zdm->zdm_size); + mutex_destroy(&zfs_dbgmsgs_lock); +} + +void +__set_error(const char *file, const char *func, int line, int err) +{ + if (zfs_flags & ZFS_DEBUG_SET_ERROR) + __dprintf(B_FALSE, file, func, line, "error %lu", + (ulong_t)err); +} + +void +__zfs_dbgmsg(char *buf) +{ + uint_t size = sizeof (zfs_dbgmsg_t) + strlen(buf) + 1; + zfs_dbgmsg_t *zdm = umem_zalloc(size, KM_SLEEP); + zdm->zdm_size = size; + zdm->zdm_timestamp = gethrestime_sec(); + strcpy(zdm->zdm_msg, buf); + + mutex_enter(&zfs_dbgmsgs_lock); + list_insert_tail(&zfs_dbgmsgs, zdm); + zfs_dbgmsg_size += size; + zfs_dbgmsg_purge(zfs_dbgmsg_maxsize); + mutex_exit(&zfs_dbgmsgs_lock); +} + +void +zfs_dbgmsg_print(int fd, const char *tag) +{ + ssize_t ret __attribute__((unused)); + + mutex_enter(&zfs_dbgmsgs_lock); + + /* + * We use write() in this function instead of printf() + * so it is safe to call from a signal handler. + */ + ret = write(fd, "ZFS_DBGMSG(", 11); + ret = write(fd, tag, strlen(tag)); + ret = write(fd, ") START:\n", 9); + + for (zfs_dbgmsg_t *zdm = list_head(&zfs_dbgmsgs); zdm != NULL; + zdm = list_next(&zfs_dbgmsgs, zdm)) { + ret = write(fd, zdm->zdm_msg, strlen(zdm->zdm_msg)); + ret = write(fd, "\n", 1); + } + + ret = write(fd, "ZFS_DBGMSG(", 11); + ret = write(fd, tag, strlen(tag)); + ret = write(fd, ") END\n", 6); + + mutex_exit(&zfs_dbgmsgs_lock); +} diff --git a/sys/contrib/openzfs/lib/libzpool/zfs_racct.c b/sys/contrib/openzfs/lib/libzpool/zfs_racct.c new file mode 100644 index 000000000000..5c9583581d94 --- /dev/null +++ b/sys/contrib/openzfs/lib/libzpool/zfs_racct.c @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: BSD-2-Clause +/* + * Copyright (c) 2021 iXsystems, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <sys/zfs_racct.h> + +void +zfs_racct_read(spa_t *spa, uint64_t size, uint64_t iops, dmu_flags_t flags) +{ + (void) spa, (void) size, (void) iops, (void) flags; +} + +void +zfs_racct_write(spa_t *spa, uint64_t size, uint64_t iops, dmu_flags_t flags) +{ + (void) spa, (void) size, (void) iops, (void) flags; +} diff --git a/sys/contrib/openzfs/lib/libzstd/Makefile.am b/sys/contrib/openzfs/lib/libzstd/Makefile.am index c9ed7e2aafbc..856175137906 100644 --- a/sys/contrib/openzfs/lib/libzstd/Makefile.am +++ b/sys/contrib/openzfs/lib/libzstd/Makefile.am @@ -1,23 +1,34 @@ -include $(top_srcdir)/config/Rules.am - -VPATH = $(top_srcdir)/module/zstd +libzstd_la_CFLAGS = $(AM_CFLAGS) $(LIBRARY_CFLAGS) +libzstd_la_CPPFLAGS = $(AM_CPPFLAGS) $(LIBZPOOL_CPPFLAGS) # -fno-tree-vectorize is set for gcc in zstd/common/compiler.h # Set it for other compilers, too. -AM_CFLAGS += -fno-tree-vectorize - -noinst_LTLIBRARIES = libzstd.la - -KERNEL_C = \ - lib/zstd.c \ - zfs_zstd.c - -nodist_libzstd_la_SOURCES = $(KERNEL_C) - -lib/zstd.$(OBJEXT): CFLAGS += -fno-tree-vectorize -include $(top_srcdir)/module/zstd/include/zstd_compat_wrapper.h -Wp,-w -lib/zstd.l$(OBJEXT): CFLAGS += -fno-tree-vectorize -include $(top_srcdir)/module/zstd/include/zstd_compat_wrapper.h -Wp,-w - -zfs_zstd.$(OBJEXT): CFLAGS += -include $(top_srcdir)/module/zstd/include/zstd_compat_wrapper.h -zfs_zstd.l$(OBJEXT): CFLAGS += -include $(top_srcdir)/module/zstd/include/zstd_compat_wrapper.h - -include $(top_srcdir)/config/CppCheck.am +libzstd_la_CFLAGS += -fno-tree-vectorize + +noinst_LTLIBRARIES += libzstd.la + +nodist_libzstd_la_SOURCES = \ + module/zstd/lib/common/entropy_common.c \ + module/zstd/lib/common/error_private.c \ + module/zstd/lib/common/fse_decompress.c \ + module/zstd/lib/common/pool.c \ + module/zstd/lib/common/zstd_common.c \ + module/zstd/lib/compress/fse_compress.c \ + module/zstd/lib/compress/hist.c \ + module/zstd/lib/compress/huf_compress.c \ + module/zstd/lib/compress/zstd_compress_literals.c \ + module/zstd/lib/compress/zstd_compress_sequences.c \ + module/zstd/lib/compress/zstd_compress_superblock.c \ + module/zstd/lib/compress/zstd_compress.c \ + module/zstd/lib/compress/zstd_double_fast.c \ + module/zstd/lib/compress/zstd_fast.c \ + module/zstd/lib/compress/zstd_lazy.c \ + module/zstd/lib/compress/zstd_ldm.c \ + module/zstd/lib/compress/zstd_opt.c \ + module/zstd/lib/decompress/huf_decompress.c \ + module/zstd/lib/decompress/zstd_ddict.c \ + module/zstd/lib/decompress/zstd_decompress.c \ + module/zstd/lib/decompress/zstd_decompress_block.c \ + module/zstd/zfs_zstd.c + +libzstd_la_CFLAGS += -include $(top_srcdir)/module/zstd/include/zstd_compat_wrapper.h -fno-tree-vectorize -Wp,-w $(AM_CFLAGS) diff --git a/sys/contrib/openzfs/lib/libzutil/Makefile.am b/sys/contrib/openzfs/lib/libzutil/Makefile.am index b163250619ba..519906235f7f 100644 --- a/sys/contrib/openzfs/lib/libzutil/Makefile.am +++ b/sys/contrib/openzfs/lib/libzutil/Makefile.am @@ -1,47 +1,43 @@ -include $(top_srcdir)/config/Rules.am +libzutil_la_CFLAGS = $(AM_CFLAGS) $(LIBRARY_CFLAGS) +libzutil_la_CFLAGS += $(LIBBLKID_CFLAGS) $(LIBUDEV_CFLAGS) +libzutil_la_CFLAGS += -fvisibility=hidden -# Suppress unused but set variable warnings often due to ASSERTs -AM_CFLAGS += $(NO_UNUSED_BUT_SET_VARIABLE) -AM_CFLAGS += $(LIBBLKID_CFLAGS) $(LIBUDEV_CFLAGS) -AM_CFLAGS += -fvisibility=hidden +libzutil_la_CPPFLAGS = $(AM_CPPFLAGS) +libzutil_la_CPPFLAGS += -I$(srcdir)/%D% -DEFAULT_INCLUDES += -I$(srcdir) +noinst_LTLIBRARIES += libzutil.la +CPPCHECKTARGETS += libzutil.la -noinst_LTLIBRARIES = libzutil.la - -USER_C = \ - zutil_device_path.c \ - zutil_import.c \ - zutil_import.h \ - zutil_nicenum.c \ - zutil_pool.c +libzutil_la_SOURCES = \ + %D%/zutil_device_path.c \ + %D%/zutil_import.c \ + %D%/zutil_import.h \ + %D%/zutil_nicenum.c \ + %D%/zutil_pool.c if BUILD_LINUX -USER_C += \ - os/linux/zutil_device_path_os.c \ - os/linux/zutil_import_os.c +libzutil_la_SOURCES += \ + %D%/os/linux/zutil_setproctitle.c \ + %D%/os/linux/zutil_device_path_os.c \ + %D%/os/linux/zutil_import_os.c endif if BUILD_FREEBSD -USER_C += \ - os/freebsd/zutil_device_path_os.c \ - os/freebsd/zutil_import_os.c +libzutil_la_SOURCES += \ + %D%/os/freebsd/zutil_device_path_os.c \ + %D%/os/freebsd/zutil_import_os.c endif -libzutil_la_SOURCES = $(USER_C) - libzutil_la_LIBADD = \ - $(abs_top_builddir)/lib/libavl/libavl.la \ - $(abs_top_builddir)/lib/libtpool/libtpool.la \ - $(abs_top_builddir)/lib/libnvpair/libnvpair.la \ - $(abs_top_builddir)/lib/libspl/libspl.la + libavl.la \ + libtpool.la \ + libnvpair.la \ + libspl.la if BUILD_LINUX libzutil_la_LIBADD += \ - $(abs_top_builddir)/lib/libefi/libefi.la \ + libefi.la \ -lrt endif libzutil_la_LIBADD += -lm $(LIBBLKID_LIBS) $(LIBUDEV_LIBS) - -include $(top_srcdir)/config/CppCheck.am diff --git a/sys/contrib/openzfs/lib/libzutil/os/freebsd/zutil_device_path_os.c b/sys/contrib/openzfs/lib/libzutil/os/freebsd/zutil_device_path_os.c index 71c936005242..6e348e8b6ec1 100644 --- a/sys/contrib/openzfs/lib/libzutil/os/freebsd/zutil_device_path_os.c +++ b/sys/contrib/openzfs/lib/libzutil/os/freebsd/zutil_device_path_os.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -40,7 +41,7 @@ * Note: The caller must free the returned string. */ char * -zfs_strip_partition(char *dev) +zfs_strip_partition(const char *dev) { return (strdup(dev)); } @@ -56,8 +57,8 @@ zfs_append_partition(char *path, size_t max_len) * On FreeBSD we only want to remove "/dev/" from the beginning of * paths if present. */ -char * -zfs_strip_path(char *path) +const char * +zfs_strip_path(const char *path) { if (strncmp(path, _PATH_DEV, sizeof (_PATH_DEV) - 1) == 0) return (path + sizeof (_PATH_DEV) - 1); @@ -124,9 +125,9 @@ zpool_label_disk_wait(const char *path, int timeout_ms) return (ENODEV); } -/* ARGSUSED */ boolean_t is_mpath_whole_disk(const char *path) { + (void) path; return (B_FALSE); } diff --git a/sys/contrib/openzfs/lib/libzutil/os/freebsd/zutil_import_os.c b/sys/contrib/openzfs/lib/libzutil/os/freebsd/zutil_import_os.c index 3da661f4c557..324ba1cf372b 100644 --- a/sys/contrib/openzfs/lib/libzutil/os/freebsd/zutil_import_os.c +++ b/sys/contrib/openzfs/lib/libzutil/os/freebsd/zutil_import_os.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -243,12 +244,31 @@ zpool_find_import_blkid(libpc_handle_t *hdl, pthread_mutex_t *lock, } int -zfs_dev_flush(int fd __unused) +zfs_dev_flush(int fd) { + (void) fd; return (0); } void +update_vdev_config_dev_sysfs_path(nvlist_t *nv, const char *path, + const char *key) +{ + (void) nv; + (void) path; + (void) key; +} + +void update_vdevs_config_dev_sysfs_path(nvlist_t *config) { + (void) config; +} + +int +zpool_disk_wait(const char *path) +{ + + (void) path; + return (ENOTSUP); } diff --git a/sys/contrib/openzfs/lib/libzutil/os/linux/zutil_device_path_os.c b/sys/contrib/openzfs/lib/libzutil/os/linux/zutil_device_path_os.c index 13f8bd031612..8ed062bf9b37 100644 --- a/sys/contrib/openzfs/lib/libzutil/os/linux/zutil_device_path_os.c +++ b/sys/contrib/openzfs/lib/libzutil/os/linux/zutil_device_path_os.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -81,7 +82,7 @@ zfs_append_partition(char *path, size_t max_len) * caller must free the returned string */ char * -zfs_strip_partition(char *path) +zfs_strip_partition(const char *path) { char *tmp = strdup(path); char *part = NULL, *d = NULL; @@ -117,7 +118,7 @@ zfs_strip_partition(char *path) * Returned string must be freed. */ static char * -zfs_strip_partition_path(char *path) +zfs_strip_partition_path(const char *path) { char *newpath = strdup(path); char *sd_offset; @@ -148,10 +149,18 @@ zfs_strip_partition_path(char *path) /* * Strip the unwanted portion of a device path. */ -char * -zfs_strip_path(char *path) +const char * +zfs_strip_path(const char *path) { - return (strrchr(path, '/') + 1); + size_t spath_count; + const char *const *spaths = zpool_default_search_paths(&spath_count); + + for (size_t i = 0; i < spath_count; ++i) + if (strncmp(path, spaths[i], strlen(spaths[i])) == 0 && + path[strlen(spaths[i])] == '/') + return (path + strlen(spaths[i]) + 1); + + return (path); } /* @@ -265,7 +274,6 @@ zfs_get_pci_slots_sys_path(const char *dev_name) free(address2); if (asprintf(&path, "/sys/bus/pci/slots/%s", ep->d_name) == -1) { - free(tmp); continue; } break; @@ -337,6 +345,8 @@ zfs_get_enclosure_sysfs_path(const char *dev_name) if (strstr(ep->d_name, "enclosure_device") == NULL) continue; + if (tmp2 != NULL) + free(tmp2); if (asprintf(&tmp2, "%s/%s", tmp1, ep->d_name) == -1) { tmp2 = NULL; break; @@ -365,14 +375,13 @@ zfs_get_enclosure_sysfs_path(const char *dev_name) if (tmp3 == NULL) break; + if (path != NULL) + free(path); if (asprintf(&path, "/sys/class/%s", tmp3) == -1) { /* If asprintf() fails, 'path' is undefined */ path = NULL; break; } - - if (path == NULL) - break; } end: @@ -420,7 +429,6 @@ dm_get_underlying_path(const char *dm_name) char *tmp = NULL; char *path = NULL; char *dev_str; - int size; char *first_path = NULL; char *enclosure_path; @@ -442,7 +450,7 @@ dm_get_underlying_path(const char *dm_name) else dev_str = tmp; - if ((size = asprintf(&tmp, "/sys/block/%s/slaves/", dev_str)) == -1) { + if (asprintf(&tmp, "/sys/block/%s/slaves/", dev_str) == -1) { tmp = NULL; goto end; } @@ -471,8 +479,7 @@ dm_get_underlying_path(const char *dm_name) if (!enclosure_path) continue; - if ((size = asprintf( - &path, "/dev/%s", ep->d_name)) == -1) + if (asprintf(&path, "/dev/%s", ep->d_name) == -1) path = NULL; free(enclosure_path); break; @@ -491,7 +498,7 @@ end: * enclosure devices. Throw up out hands and return the first * underlying path. */ - if ((size = asprintf(&path, "/dev/%s", first_path)) == -1) + if (asprintf(&path, "/dev/%s", first_path) == -1) path = NULL; } @@ -527,7 +534,7 @@ zfs_dev_is_dm(const char *dev_name) boolean_t zfs_dev_is_whole_disk(const char *dev_name) { - struct dk_gpt *label; + struct dk_gpt *label = NULL; int fd; if ((fd = open(dev_name, O_RDONLY | O_DIRECT | O_CLOEXEC)) < 0) @@ -613,22 +620,24 @@ zfs_get_underlying_path(const char *dev_name) /* * A disk is considered a multipath whole disk when: * DEVNAME key value has "dm-" - * DM_NAME key value has "mpath" prefix - * DM_UUID key exists + * DM_UUID key exists and starts with 'mpath-' * ID_PART_TABLE_TYPE key does not exist or is not gpt + * ID_FS_LABEL key does not exist (disk isn't labeled) */ static boolean_t -udev_mpath_whole_disk(struct udev_device *dev) +is_mpath_udev_sane(struct udev_device *dev) { - const char *devname, *type, *uuid; + const char *devname, *type, *uuid, *label; devname = udev_device_get_property_value(dev, "DEVNAME"); type = udev_device_get_property_value(dev, "ID_PART_TABLE_TYPE"); uuid = udev_device_get_property_value(dev, "DM_UUID"); + label = udev_device_get_property_value(dev, "ID_FS_LABEL"); if ((devname != NULL && strncmp(devname, "/dev/dm-", 8) == 0) && ((type == NULL) || (strcmp(type, "gpt") != 0)) && - (uuid != NULL)) { + ((uuid != NULL) && (strncmp(uuid, "mpath-", 6) == 0)) && + (label == NULL)) { return (B_TRUE); } @@ -636,7 +645,11 @@ udev_mpath_whole_disk(struct udev_device *dev) } /* - * Check if a disk is effectively a multipath whole disk + * Check if a disk is a multipath "blank" disk: + * + * 1. The disk has udev values that suggest it's a multipath disk + * 2. The disk is not currently labeled with a filesystem of any type + * 3. There are no partitions on the disk */ boolean_t is_mpath_whole_disk(const char *path) @@ -645,7 +658,6 @@ is_mpath_whole_disk(const char *path) struct udev_device *dev = NULL; char nodepath[MAXPATHLEN]; char *sysname; - boolean_t wholedisk = B_FALSE; if (realpath(path, nodepath) == NULL) return (B_FALSE); @@ -660,18 +672,19 @@ is_mpath_whole_disk(const char *path) return (B_FALSE); } - wholedisk = udev_mpath_whole_disk(dev); - + /* Sanity check some udev values */ + boolean_t is_sane = is_mpath_udev_sane(dev); udev_device_unref(dev); - return (wholedisk); + + return (is_sane); } #else /* HAVE_LIBUDEV */ -/* ARGSUSED */ boolean_t is_mpath_whole_disk(const char *path) { + (void) path; return (B_FALSE); } diff --git a/sys/contrib/openzfs/lib/libzutil/os/linux/zutil_import_os.c b/sys/contrib/openzfs/lib/libzutil/os/linux/zutil_import_os.c index ab692401d88e..2b2043889e68 100644 --- a/sys/contrib/openzfs/lib/libzutil/os/linux/zutil_import_os.c +++ b/sys/contrib/openzfs/lib/libzutil/os/linux/zutil_import_os.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -168,27 +169,19 @@ zpool_open_func(void *arg) * Add additional entries for paths described by this label. */ if (rn->rn_labelpaths) { - char *path = NULL; - char *devid = NULL; - char *env = NULL; + const char *path = NULL; + const char *devid = NULL; rdsk_node_t *slice; avl_index_t where; - int timeout; int error; if (label_paths(rn->rn_hdl, rn->rn_config, &path, &devid)) return; - env = getenv("ZPOOL_IMPORT_UDEV_TIMEOUT_MS"); - if ((env == NULL) || sscanf(env, "%d", &timeout) != 1 || - timeout < 0) { - timeout = DISK_LABEL_WAIT; - } - /* * Allow devlinks to stabilize so all paths are available. */ - zpool_label_disk_wait(rn->rn_name, timeout); + zpool_disk_wait(rn->rn_name); if (path != NULL) { slice = zutil_alloc(hdl, sizeof (rdsk_node_t)); @@ -264,36 +257,36 @@ zpool_default_search_paths(size_t *count) * index in the passed 'order' variable, otherwise return an error. */ static int -zfs_path_order(char *name, int *order) +zfs_path_order(const char *name, int *order) { - int i, error = ENOENT; - char *dir, *env, *envdup, *tmp = NULL; + const char *env = getenv("ZPOOL_IMPORT_PATH"); - env = getenv("ZPOOL_IMPORT_PATH"); if (env) { - envdup = strdup(env); - for (dir = strtok_r(envdup, ":", &tmp), i = 0; - dir != NULL; - dir = strtok_r(NULL, ":", &tmp), i++) { - if (strncmp(name, dir, strlen(dir)) == 0) { - *order = i; - error = 0; + for (int i = 0; ; ++i) { + env += strspn(env, ":"); + size_t dirlen = strcspn(env, ":"); + if (dirlen) { + if (strncmp(name, env, dirlen) == 0) { + *order = i; + return (0); + } + + env += dirlen; + } else break; - } } - free(envdup); } else { - for (i = 0; i < ARRAY_SIZE(zpool_default_import_path); i++) { + for (int i = 0; i < ARRAY_SIZE(zpool_default_import_path); + ++i) { if (strncmp(name, zpool_default_import_path[i], strlen(zpool_default_import_path[i])) == 0) { *order = i; - error = 0; - break; + return (0); } } } - return (error); + return (ENOENT); } /* @@ -328,7 +321,9 @@ zpool_find_import_blkid(libpc_handle_t *hdl, pthread_mutex_t *lock, return (EINVAL); } - error = blkid_dev_set_search(iter, "TYPE", "zfs_member"); + /* Only const char *s since 2.32 */ + error = blkid_dev_set_search(iter, + (char *)"TYPE", (char *)"zfs_member"); if (error != 0) { blkid_dev_iterate_end(iter); blkid_put_cache(cache); @@ -560,17 +555,17 @@ udev_device_is_ready(struct udev_device *dev) #else -/* ARGSUSED */ int zfs_device_get_devid(struct udev_device *dev, char *bufptr, size_t buflen) { + (void) dev, (void) bufptr, (void) buflen; return (ENODATA); } -/* ARGSUSED */ int zfs_device_get_physical(struct udev_device *dev, char *bufptr, size_t buflen) { + (void) dev, (void) bufptr, (void) buflen; return (ENODATA); } @@ -580,9 +575,8 @@ zfs_device_get_physical(struct udev_device *dev, char *bufptr, size_t buflen) * Wait up to timeout_ms for udev to set up the device node. The device is * considered ready when libudev determines it has been initialized, all of * the device links have been verified to exist, and it has been allowed to - * settle. At this point the device the device can be accessed reliably. - * Depending on the complexity of the udev rules this process could take - * several seconds. + * settle. At this point the device can be accessed reliably. Depending on + * the complexity of the udev rules this process could take several seconds. */ int zpool_label_disk_wait(const char *path, int timeout_ms) @@ -682,6 +676,20 @@ zpool_label_disk_wait(const char *path, int timeout_ms) } /* + * Simplified version of zpool_label_disk_wait() where we wait for a device + * to appear using the default timeouts. + */ +int +zpool_disk_wait(const char *path) +{ + int timeout; + timeout = zpool_getenv_int("ZPOOL_IMPORT_UDEV_TIMEOUT_MS", + DISK_LABEL_WAIT); + + return (zpool_label_disk_wait(path, timeout)); +} + +/* * Encode the persistent devices strings * used for the vdev disk label */ @@ -754,6 +762,9 @@ no_dev: return (ret); #else + (void) path; + (void) ds; + (void) wholedisk; return (ENOENT); #endif } @@ -762,20 +773,37 @@ no_dev: * Rescan the enclosure sysfs path for turning on enclosure LEDs and store it * in the nvlist * (if applicable). Like: * vdev_enc_sysfs_path: '/sys/class/enclosure/11:0:1:0/SLOT 4' + * + * If an old path was in the nvlist, and the rescan can not find a new path, + * then keep the old path, since the disk may have been removed. + * + * path: The vdev path (value from ZPOOL_CONFIG_PATH) + * key: The nvlist_t name (like ZPOOL_CONFIG_VDEV_ENC_SYSFS_PATH) */ -static void -update_vdev_config_dev_sysfs_path(nvlist_t *nv, char *path) +void +update_vdev_config_dev_sysfs_path(nvlist_t *nv, const char *path, + const char *key) { char *upath, *spath; + const char *oldpath = NULL; + + (void) nvlist_lookup_string(nv, key, &oldpath); /* Add enclosure sysfs path (if disk is in an enclosure). */ upath = zfs_get_underlying_path(path); spath = zfs_get_enclosure_sysfs_path(upath); if (spath) { - nvlist_add_string(nv, ZPOOL_CONFIG_VDEV_ENC_SYSFS_PATH, spath); + (void) nvlist_add_string(nv, key, spath); } else { - nvlist_remove_all(nv, ZPOOL_CONFIG_VDEV_ENC_SYSFS_PATH); + /* + * We couldn't dynamically scan the disk's enclosure sysfs path. + * This could be because the disk went away. If there's an old + * enclosure sysfs path in the nvlist, then keep using it. + */ + if (!oldpath) { + (void) nvlist_remove_all(nv, key); + } } free(upath); @@ -788,12 +816,15 @@ update_vdev_config_dev_sysfs_path(nvlist_t *nv, char *path) static int sysfs_path_pool_vdev_iter_f(void *hdl_data, nvlist_t *nv, void *data) { - char *path = NULL; + (void) hdl_data, (void) data; + + const char *path = NULL; if (nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) != 0) return (1); /* Rescan our enclosure sysfs path for this vdev */ - update_vdev_config_dev_sysfs_path(nv, path); + update_vdev_config_dev_sysfs_path(nv, path, + ZPOOL_CONFIG_VDEV_ENC_SYSFS_PATH); return (0); } @@ -834,7 +865,7 @@ void update_vdev_config_dev_strs(nvlist_t *nv) { vdev_dev_strs_t vds; - char *env, *type, *path; + const char *env, *type, *path; uint64_t wholedisk = 0; /* @@ -882,7 +913,8 @@ update_vdev_config_dev_strs(nvlist_t *nv) (void) nvlist_add_string(nv, ZPOOL_CONFIG_PHYS_PATH, vds.vds_devphys); } - update_vdev_config_dev_sysfs_path(nv, path); + update_vdev_config_dev_sysfs_path(nv, path, + ZPOOL_CONFIG_VDEV_ENC_SYSFS_PATH); } else { /* Clear out any stale entries. */ (void) nvlist_remove_all(nv, ZPOOL_CONFIG_DEVID); diff --git a/sys/contrib/openzfs/lib/libzutil/os/linux/zutil_setproctitle.c b/sys/contrib/openzfs/lib/libzutil/os/linux/zutil_setproctitle.c new file mode 100644 index 000000000000..fc727e29ce2a --- /dev/null +++ b/sys/contrib/openzfs/lib/libzutil/os/linux/zutil_setproctitle.c @@ -0,0 +1,277 @@ +// SPDX-License-Identifier: BSD-3-Clause +/* + * Copyright © 2013 Guillem Jover <guillem@hadrons.org> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <errno.h> +#include <stddef.h> +#include <stdarg.h> +#include <stdlib.h> +#include <stdio.h> +#include <err.h> +#include <unistd.h> +#include <string.h> +#include <sys/param.h> +#include <libzutil.h> + +static struct { + /* Original value. */ + const char *arg0; + + /* Title space available. */ + char *base, *end; + + /* Pointer to original nul character within base. */ + char *nul; + + boolean_t warned; + boolean_t reset; + int error; +} SPT; + +#define LIBBSD_IS_PATHNAME_SEPARATOR(c) ((c) == '/') +#define SPT_MAXTITLE 255 + +extern const char *__progname; + +static const char * +getprogname(void) +{ + return (__progname); +} + +static void +setprogname(const char *progname) +{ + size_t i; + + for (i = strlen(progname); i > 0; i--) { + if (LIBBSD_IS_PATHNAME_SEPARATOR(progname[i - 1])) { + __progname = progname + i; + return; + } + } + __progname = progname; +} + + +static inline size_t +spt_min(size_t a, size_t b) +{ + return ((a < b) ? a : b); +} + +static int +spt_copyenv(int envc, char *envp[]) +{ + char **envcopy; + char *eq; + int envsize; + int i, error = 0; + + if (environ != envp) + return (0); + + /* + * Make a copy of the old environ array of pointers, in case + * clearenv() or setenv() is implemented to free the internal + * environ array, because we will need to access the old environ + * contents to make the new copy. + */ + envsize = (envc + 1) * sizeof (char *); + envcopy = malloc(envsize); + if (envcopy == NULL) + return (errno); + memcpy(envcopy, envp, envsize); + + environ = NULL; + + for (i = 0; envcopy[i]; i++) { + eq = strchr(envcopy[i], '='); + if (eq == NULL) + continue; + + *eq = '\0'; + if (setenv(envcopy[i], eq + 1, 1) < 0) + error = errno; + *eq = '='; + + if (error) { + clearenv(); + environ = envp; + free(envcopy); + return (error); + } + } + + /* + * Dispose of the shallow copy, now that we've finished transfering + * the old environment. + */ + free(envcopy); + + return (0); +} + +static int +spt_copyargs(int argc, char *argv[]) +{ + char *tmp; + int i; + + for (i = 1; i < argc || (i >= argc && argv[i]); i++) { + if (argv[i] == NULL) + continue; + + tmp = strdup(argv[i]); + if (tmp == NULL) + return (errno); + + argv[i] = tmp; + } + + return (0); +} + +void +zfs_setproctitle_init(int argc, char *argv[], char *envp[]) +{ + char *base, *end, *nul, *tmp; + int i, envc, error; + + /* Try to make sure we got called with main() arguments. */ + if (argc < 0) + return; + + base = argv[0]; + if (base == NULL) + return; + + nul = base + strlen(base); + end = nul + 1; + + for (i = 0; i < argc || (i >= argc && argv[i]); i++) { + if (argv[i] == NULL || argv[i] != end) + continue; + + end = argv[i] + strlen(argv[i]) + 1; + } + + for (i = 0; envp[i]; i++) { + if (envp[i] != end) + continue; + + end = envp[i] + strlen(envp[i]) + 1; + } + envc = i; + + SPT.arg0 = strdup(argv[0]); + if (SPT.arg0 == NULL) { + SPT.error = errno; + return; + } + + tmp = strdup(getprogname()); + if (tmp == NULL) { + SPT.error = errno; + return; + } + setprogname(tmp); + + error = spt_copyenv(envc, envp); + if (error) { + SPT.error = error; + return; + } + + error = spt_copyargs(argc, argv); + if (error) { + SPT.error = error; + return; + } + + SPT.nul = nul; + SPT.base = base; + SPT.end = end; +} + +void +zfs_setproctitle(const char *fmt, ...) +{ + /* Use buffer in case argv[0] is passed. */ + char buf[SPT_MAXTITLE + 1]; + va_list ap; + char *nul; + int len; + if (SPT.base == NULL) { + if (!SPT.warned) { + warnx("setproctitle not initialized, please" + "call zfs_setproctitle_init()"); + SPT.warned = B_TRUE; + } + return; + } + + if (fmt) { + if (fmt[0] == '-') { + /* Skip program name prefix. */ + fmt++; + len = 0; + } else { + /* Print program name heading for grep. */ + snprintf(buf, sizeof (buf), "%s: ", getprogname()); + len = strlen(buf); + } + + va_start(ap, fmt); + len += vsnprintf(buf + len, sizeof (buf) - len, fmt, ap); + va_end(ap); + } else { + len = snprintf(buf, sizeof (buf), "%s", SPT.arg0); + } + + if (len <= 0) { + SPT.error = errno; + return; + } + + if (!SPT.reset) { + memset(SPT.base, 0, SPT.end - SPT.base); + SPT.reset = B_TRUE; + } else { + memset(SPT.base, 0, spt_min(sizeof (buf), SPT.end - SPT.base)); + } + + len = spt_min(len, spt_min(sizeof (buf), SPT.end - SPT.base) - 1); + memcpy(SPT.base, buf, len); + nul = SPT.base + len; + + if (nul < SPT.nul) { + *SPT.nul = '.'; + } else if (nul == SPT.nul && nul + 1 < SPT.end) { + *SPT.nul = ' '; + *++nul = '\0'; + } +} diff --git a/sys/contrib/openzfs/lib/libzutil/zutil_device_path.c b/sys/contrib/openzfs/lib/libzutil/zutil_device_path.c index 435c444b2460..97a2a998bb62 100644 --- a/sys/contrib/openzfs/lib/libzutil/zutil_device_path.c +++ b/sys/contrib/openzfs/lib/libzutil/zutil_device_path.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -56,35 +57,51 @@ zfs_dirnamelen(const char *path) int zfs_resolve_shortname(const char *name, char *path, size_t len) { - int i, error = -1; - char *dir, *env, *envdup, *tmp = NULL; - - env = getenv("ZPOOL_IMPORT_PATH"); - errno = ENOENT; + const char *env = getenv("ZPOOL_IMPORT_PATH"); + char resolved_path[PATH_MAX]; if (env) { - envdup = strdup(env); - for (dir = strtok_r(envdup, ":", &tmp); - dir != NULL && error != 0; - dir = strtok_r(NULL, ":", &tmp)) { - (void) snprintf(path, len, "%s/%s", dir, name); - error = access(path, F_OK); + for (;;) { + env += strspn(env, ":"); + size_t dirlen = strcspn(env, ":"); + if (dirlen) { + (void) snprintf(path, len, "%.*s/%s", + (int)dirlen, env, name); + if (access(path, F_OK) == 0) + return (0); + + env += dirlen; + } else + break; } - free(envdup); } else { - const char * const *zpool_default_import_path; size_t count; + const char *const *zpool_default_import_path = + zpool_default_search_paths(&count); - zpool_default_import_path = zpool_default_search_paths(&count); - - for (i = 0; i < count && error < 0; i++) { + for (size_t i = 0; i < count; ++i) { (void) snprintf(path, len, "%s/%s", zpool_default_import_path[i], name); - error = access(path, F_OK); + if (access(path, F_OK) == 0) + return (0); } } - return (error ? ENOENT : 0); + /* + * The user can pass a relative path like ./file1 for the vdev. The path + * must contain a directory prefix like './file1' or '../file1'. Simply + * passing 'file1' is not allowed, as it may match a block device name. + */ + if ((strncmp(name, "./", 2) == 0 || strncmp(name, "../", 3) == 0) && + realpath(name, resolved_path) != NULL) { + if (access(resolved_path, F_OK) == 0) { + if (strlen(resolved_path) + 1 <= len) { + if (strlcpy(path, resolved_path, len) < len) + return (0); /* success */ + } + } + } + return (errno = ENOENT); } /* @@ -100,7 +117,7 @@ zfs_strcmp_shortname(const char *name, const char *cmp_name, int wholedisk) int path_len, cmp_len, i = 0, error = ENOENT; char *dir, *env, *envdup = NULL, *tmp = NULL; char path_name[MAXPATHLEN]; - const char * const *zpool_default_import_path = NULL; + const char *const *zpool_default_import_path = NULL; size_t count; cmp_len = strlen(cmp_name); diff --git a/sys/contrib/openzfs/lib/libzutil/zutil_import.c b/sys/contrib/openzfs/lib/libzutil/zutil_import.c index 9eb55aaf77ce..ccdc874076c3 100644 --- a/sys/contrib/openzfs/lib/libzutil/zutil_import.c +++ b/sys/contrib/openzfs/lib/libzutil/zutil_import.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -47,7 +48,9 @@ * using our derived config, and record the results. */ +#ifdef HAVE_AIO_H #include <aio.h> +#endif #include <ctype.h> #include <dirent.h> #include <errno.h> @@ -69,6 +72,30 @@ #include "zutil_import.h" +const char * +libpc_error_description(libpc_handle_t *hdl) +{ + if (hdl->lpc_desc[0] != '\0') + return (hdl->lpc_desc); + + switch (hdl->lpc_error) { + case LPC_BADCACHE: + return (dgettext(TEXT_DOMAIN, "invalid or missing cache file")); + case LPC_BADPATH: + return (dgettext(TEXT_DOMAIN, "must be an absolute path")); + case LPC_NOMEM: + return (dgettext(TEXT_DOMAIN, "out of memory")); + case LPC_EACCESS: + return (dgettext(TEXT_DOMAIN, "some devices require root " + "privileges")); + case LPC_UNKNOWN: + return (dgettext(TEXT_DOMAIN, "unknown error")); + default: + assert(hdl->lpc_error == 0); + return (dgettext(TEXT_DOMAIN, "no error")); + } +} + static __attribute__((format(printf, 2, 3))) void zutil_error_aux(libpc_handle_t *hdl, const char *fmt, ...) { @@ -83,28 +110,27 @@ zutil_error_aux(libpc_handle_t *hdl, const char *fmt, ...) } static void -zutil_verror(libpc_handle_t *hdl, const char *error, const char *fmt, +zutil_verror(libpc_handle_t *hdl, lpc_error_t error, const char *fmt, va_list ap) { char action[1024]; (void) vsnprintf(action, sizeof (action), fmt, ap); + hdl->lpc_error = error; if (hdl->lpc_desc_active) hdl->lpc_desc_active = B_FALSE; else hdl->lpc_desc[0] = '\0'; - if (hdl->lpc_printerr) { - if (hdl->lpc_desc[0] != '\0') - error = hdl->lpc_desc; - - (void) fprintf(stderr, "%s: %s\n", action, error); - } + if (hdl->lpc_printerr) + (void) fprintf(stderr, "%s: %s\n", action, + libpc_error_description(hdl)); } static __attribute__((format(printf, 3, 4))) int -zutil_error_fmt(libpc_handle_t *hdl, const char *error, const char *fmt, ...) +zutil_error_fmt(libpc_handle_t *hdl, lpc_error_t error, + const char *fmt, ...) { va_list ap; @@ -118,7 +144,7 @@ zutil_error_fmt(libpc_handle_t *hdl, const char *error, const char *fmt, ...) } static int -zutil_error(libpc_handle_t *hdl, const char *error, const char *msg) +zutil_error(libpc_handle_t *hdl, lpc_error_t error, const char *msg) { return (zutil_error_fmt(hdl, error, "%s", msg)); } @@ -126,7 +152,7 @@ zutil_error(libpc_handle_t *hdl, const char *error, const char *msg) static int zutil_no_memory(libpc_handle_t *hdl) { - zutil_error(hdl, EZFS_NOMEM, "internal error"); + zutil_error(hdl, LPC_NOMEM, "internal error"); exit(1); } @@ -208,7 +234,7 @@ fix_paths(libpc_handle_t *hdl, nvlist_t *nv, name_entry_t *names) uint_t c, children; uint64_t guid; name_entry_t *ne, *best; - char *path; + const char *path; if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN, &child, &children) == 0) { @@ -472,15 +498,13 @@ get_configs(libpc_handle_t *hdl, pool_list_t *pl, boolean_t active_ok, uint_t i, nspares, nl2cache; boolean_t config_seen; uint64_t best_txg; - char *name, *hostname = NULL; + const char *name, *hostname = NULL; uint64_t guid; uint_t children = 0; nvlist_t **child = NULL; - uint_t holes; uint64_t *hole_array, max_id; uint_t c; boolean_t isactive; - uint64_t hostid; nvlist_t *nvl; boolean_t valid_top_config = B_FALSE; @@ -488,7 +512,8 @@ get_configs(libpc_handle_t *hdl, pool_list_t *pl, boolean_t active_ok, goto nomem; for (pe = pl->pools; pe != NULL; pe = pe->pe_next) { - uint64_t id, max_txg = 0; + uint64_t id, max_txg = 0, hostid = 0; + uint_t holes = 0; if (nvlist_alloc(&config, NV_UNIQUE_NAME, 0) != 0) goto nomem; @@ -567,8 +592,8 @@ get_configs(libpc_handle_t *hdl, pool_list_t *pl, boolean_t active_ok, * hostname (if available) */ uint64_t state, version; - char *comment = NULL; - char *compatibility = NULL; + const char *comment = NULL; + const char *compatibility = NULL; version = fnvlist_lookup_uint64(tmp, ZPOOL_CONFIG_VERSION); @@ -749,7 +774,7 @@ get_configs(libpc_handle_t *hdl, pool_list_t *pl, boolean_t active_ok, nvlist_add_uint64(nvroot, ZPOOL_CONFIG_ID, 0ULL) != 0 || nvlist_add_uint64(nvroot, ZPOOL_CONFIG_GUID, guid) != 0 || nvlist_add_nvlist_array(nvroot, ZPOOL_CONFIG_CHILDREN, - child, children) != 0) { + (const nvlist_t **)child, children) != 0) { nvlist_free(nvroot); goto nomem; } @@ -910,7 +935,6 @@ zpool_read_label_slow(int fd, nvlist_t **config, int *num_labels) vdev_phys_t *label; nvlist_t *expected_config = NULL; uint64_t expected_guid = 0, size; - int error; *config = NULL; @@ -918,8 +942,9 @@ zpool_read_label_slow(int fd, nvlist_t **config, int *num_labels) return (0); size = P2ALIGN_TYPED(statbuf.st_size, sizeof (vdev_label_t), uint64_t); - error = posix_memalign((void **)&label, PAGESIZE, sizeof (*label)); - if (error) + label = (vdev_phys_t *)umem_alloc_aligned(sizeof (*label), PAGESIZE, + UMEM_DEFAULT); + if (label == NULL) return (-1); for (l = 0; l < VDEV_LABELS; l++) { @@ -968,7 +993,7 @@ zpool_read_label_slow(int fd, nvlist_t **config, int *num_labels) if (num_labels != NULL) *num_labels = count; - free(label); + umem_free_aligned(label, sizeof (*label)); *config = expected_config; return (0); @@ -982,6 +1007,9 @@ zpool_read_label_slow(int fd, nvlist_t **config, int *num_labels) int zpool_read_label(int fd, nvlist_t **config, int *num_labels) { +#ifndef HAVE_AIO_H + return (zpool_read_label_slow(fd, config, num_labels)); +#else struct stat64 statbuf; struct aiocb aiocbs[VDEV_LABELS]; struct aiocb *aiocbps[VDEV_LABELS]; @@ -996,9 +1024,9 @@ zpool_read_label(int fd, nvlist_t **config, int *num_labels) return (0); size = P2ALIGN_TYPED(statbuf.st_size, sizeof (vdev_label_t), uint64_t); - error = posix_memalign((void **)&labels, PAGESIZE, - VDEV_LABELS * sizeof (*labels)); - if (error) + labels = (vdev_phys_t *)umem_alloc_aligned( + VDEV_LABELS * sizeof (*labels), PAGESIZE, UMEM_DEFAULT); + if (labels == NULL) return (-1); memset(aiocbs, 0, sizeof (aiocbs)); @@ -1029,14 +1057,26 @@ zpool_read_label(int fd, nvlist_t **config, int *num_labels) case EINVAL: break; case EINPROGRESS: - // This shouldn't be possible to - // encounter, die if we do. + /* + * This shouldn't be possible to + * encounter, die if we do. + */ ASSERT(B_FALSE); - fallthrough; + zfs_fallthrough; + case EREMOTEIO: + /* + * May be returned by an NVMe device + * which is visible in /dev/ but due + * to a low-level format change, or + * other error, needs to be rescanned. + * Try the slow method. + */ + zfs_fallthrough; + case EAGAIN: case EOPNOTSUPP: case ENOSYS: do_slow = B_TRUE; - fallthrough; + zfs_fallthrough; case 0: default: (void) aio_return(&aiocbs[l]); @@ -1051,7 +1091,7 @@ zpool_read_label(int fd, nvlist_t **config, int *num_labels) error = zpool_read_label_slow(fd, config, num_labels); saved_errno = errno; } - free(labels); + umem_free_aligned(labels, VDEV_LABELS * sizeof (*labels)); errno = saved_errno; return (error); } @@ -1100,10 +1140,11 @@ zpool_read_label(int fd, nvlist_t **config, int *num_labels) if (num_labels != NULL) *num_labels = count; - free(labels); + umem_free_aligned(labels, VDEV_LABELS * sizeof (*labels)); *config = expected_config; return (0); +#endif } /* @@ -1133,12 +1174,12 @@ slice_cache_compare(const void *arg1, const void *arg2) static int label_paths_impl(libpc_handle_t *hdl, nvlist_t *nvroot, uint64_t pool_guid, - uint64_t vdev_guid, char **path, char **devid) + uint64_t vdev_guid, const char **path, const char **devid) { nvlist_t **child; uint_t c, children; uint64_t guid; - char *val; + const char *val; int error; if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_CHILDREN, @@ -1176,18 +1217,32 @@ label_paths_impl(libpc_handle_t *hdl, nvlist_t *nvroot, uint64_t pool_guid, * The returned pointers are only valid as long as label remains valid. */ int -label_paths(libpc_handle_t *hdl, nvlist_t *label, char **path, char **devid) +label_paths(libpc_handle_t *hdl, nvlist_t *label, const char **path, + const char **devid) { nvlist_t *nvroot; uint64_t pool_guid; uint64_t vdev_guid; + uint64_t state; *path = NULL; *devid = NULL; + if (nvlist_lookup_uint64(label, ZPOOL_CONFIG_GUID, &vdev_guid) != 0) + return (ENOENT); + + /* + * In case of spare or l2cache, we directly return path/devid from the + * label. + */ + if (!(nvlist_lookup_uint64(label, ZPOOL_CONFIG_POOL_STATE, &state)) && + (state == POOL_STATE_SPARE || state == POOL_STATE_L2CACHE)) { + (void) nvlist_lookup_string(label, ZPOOL_CONFIG_PATH, path); + (void) nvlist_lookup_string(label, ZPOOL_CONFIG_DEVID, devid); + return (0); + } if (nvlist_lookup_nvlist(label, ZPOOL_CONFIG_VDEV_TREE, &nvroot) || - nvlist_lookup_uint64(label, ZPOOL_CONFIG_POOL_GUID, &pool_guid) || - nvlist_lookup_uint64(label, ZPOOL_CONFIG_GUID, &vdev_guid)) + nvlist_lookup_uint64(label, ZPOOL_CONFIG_POOL_GUID, &pool_guid)) return (ENOENT); return (label_paths_impl(hdl, nvroot, pool_guid, vdev_guid, path, @@ -1237,18 +1292,18 @@ zpool_find_import_scan_dir(libpc_handle_t *hdl, pthread_mutex_t *lock, if (error == ENOENT) return (0); - zutil_error_aux(hdl, "%s", strerror(error)); - (void) zutil_error_fmt(hdl, EZFS_BADPATH, dgettext( - TEXT_DOMAIN, "cannot resolve path '%s'"), dir); + zutil_error_aux(hdl, "%s", zfs_strerror(error)); + (void) zutil_error_fmt(hdl, LPC_BADPATH, dgettext(TEXT_DOMAIN, + "cannot resolve path '%s'"), dir); return (error); } dirp = opendir(path); if (dirp == NULL) { error = errno; - zutil_error_aux(hdl, "%s", strerror(error)); - (void) zutil_error_fmt(hdl, EZFS_BADPATH, - dgettext(TEXT_DOMAIN, "cannot open '%s'"), path); + zutil_error_aux(hdl, "%s", zfs_strerror(error)); + (void) zutil_error_fmt(hdl, LPC_BADPATH, dgettext(TEXT_DOMAIN, + "cannot open '%s'"), path); return (error); } @@ -1308,9 +1363,9 @@ zpool_find_import_scan_path(libpc_handle_t *hdl, pthread_mutex_t *lock, goto out; } - zutil_error_aux(hdl, "%s", strerror(error)); - (void) zutil_error_fmt(hdl, EZFS_BADPATH, dgettext( - TEXT_DOMAIN, "cannot resolve path '%s'"), dir); + zutil_error_aux(hdl, "%s", zfs_strerror(error)); + (void) zutil_error_fmt(hdl, LPC_BADPATH, dgettext(TEXT_DOMAIN, + "cannot resolve path '%s'"), dir); goto out; } @@ -1346,8 +1401,8 @@ zpool_find_import_scan(libpc_handle_t *hdl, pthread_mutex_t *lock, if (error == ENOENT) continue; - zutil_error_aux(hdl, "%s", strerror(error)); - (void) zutil_error_fmt(hdl, EZFS_BADPATH, dgettext( + zutil_error_aux(hdl, "%s", zfs_strerror(error)); + (void) zutil_error_fmt(hdl, LPC_BADPATH, dgettext( TEXT_DOMAIN, "cannot resolve path '%s'"), dir[i]); goto error; } @@ -1393,6 +1448,7 @@ static nvlist_t * zpool_find_import_impl(libpc_handle_t *hdl, importargs_t *iarg, pthread_mutex_t *lock, avl_tree_t *cache) { + (void) lock; nvlist_t *ret = NULL; pool_list_t pools = { 0 }; pool_entry_t *pe, *penext; @@ -1410,7 +1466,21 @@ zpool_find_import_impl(libpc_handle_t *hdl, importargs_t *iarg, * validating labels, a large number of threads can be used due to * minimal contention. */ - t = tpool_create(1, 2 * sysconf(_SC_NPROCESSORS_ONLN), 0, NULL); + long threads = 2 * sysconf(_SC_NPROCESSORS_ONLN); +#ifdef HAVE_AIO_H + long am; +#ifdef _SC_AIO_LISTIO_MAX + am = sysconf(_SC_AIO_LISTIO_MAX); + if (am >= VDEV_LABELS) + threads = MIN(threads, am / VDEV_LABELS); +#endif +#ifdef _SC_AIO_MAX + am = sysconf(_SC_AIO_MAX); + if (am >= VDEV_LABELS) + threads = MIN(threads, am / VDEV_LABELS); +#endif +#endif + t = tpool_create(1, threads, 0, NULL); for (slice = avl_first(cache); slice; (slice = avl_walk(cache, slice, AVL_AFTER))) (void) tpool_dispatch(t, zpool_open_func, slice); @@ -1444,7 +1514,7 @@ zpool_find_import_impl(libpc_handle_t *hdl, importargs_t *iarg, } if (iarg->poolname != NULL && !aux) { - char *pname; + const char *pname; matched = nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME, &pname) == 0 && @@ -1518,7 +1588,7 @@ static int discover_cached_paths(libpc_handle_t *hdl, nvlist_t *nv, avl_tree_t *cache, pthread_mutex_t *lock) { - char *path = NULL; + const char *path = NULL; ssize_t dl; uint_t children; nvlist_t **child; @@ -1535,12 +1605,21 @@ discover_cached_paths(libpc_handle_t *hdl, nvlist_t *nv, * our directory cache. */ if (nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0) { - if ((dl = zfs_dirnamelen(path)) == -1) + int ret; + char c = '\0'; + if ((dl = zfs_dirnamelen(path)) == -1) { path = "."; - else - path[dl] = '\0'; - return (zpool_find_import_scan_dir(hdl, lock, cache, - path, 0)); + } else { + c = path[dl]; + ((char *)path)[dl] = '\0'; + + } + ret = zpool_find_import_scan_dir(hdl, lock, cache, + path, 0); + if (c != '\0') + ((char *)path)[dl] = c; + + return (ret); } return (0); } @@ -1559,24 +1638,24 @@ zpool_find_import_cached(libpc_handle_t *hdl, importargs_t *iarg) nvlist_t *raw, *src, *dst; nvlist_t *pools; nvpair_t *elem; - char *name; + const char *name; uint64_t this_guid; boolean_t active; verify(iarg->poolname == NULL || iarg->guid == 0); if ((fd = open(iarg->cachefile, O_RDONLY | O_CLOEXEC)) < 0) { - zutil_error_aux(hdl, "%s", strerror(errno)); - (void) zutil_error(hdl, EZFS_BADCACHE, - dgettext(TEXT_DOMAIN, "failed to open cache file")); + zutil_error_aux(hdl, "%s", zfs_strerror(errno)); + (void) zutil_error(hdl, LPC_BADCACHE, dgettext(TEXT_DOMAIN, + "failed to open cache file")); return (NULL); } if (fstat64(fd, &statbuf) != 0) { - zutil_error_aux(hdl, "%s", strerror(errno)); + zutil_error_aux(hdl, "%s", zfs_strerror(errno)); (void) close(fd); - (void) zutil_error(hdl, EZFS_BADCACHE, - dgettext(TEXT_DOMAIN, "failed to get size of cache file")); + (void) zutil_error(hdl, LPC_BADCACHE, dgettext(TEXT_DOMAIN, + "failed to get size of cache file")); return (NULL); } @@ -1588,8 +1667,7 @@ zpool_find_import_cached(libpc_handle_t *hdl, importargs_t *iarg) if (read(fd, buf, statbuf.st_size) != statbuf.st_size) { (void) close(fd); free(buf); - (void) zutil_error(hdl, EZFS_BADCACHE, - dgettext(TEXT_DOMAIN, + (void) zutil_error(hdl, LPC_BADCACHE, dgettext(TEXT_DOMAIN, "failed to read cache file contents")); return (NULL); } @@ -1598,8 +1676,7 @@ zpool_find_import_cached(libpc_handle_t *hdl, importargs_t *iarg) if (nvlist_unpack(buf, statbuf.st_size, &raw, 0) != 0) { free(buf); - (void) zutil_error(hdl, EZFS_BADCACHE, - dgettext(TEXT_DOMAIN, + (void) zutil_error(hdl, LPC_BADCACHE, dgettext(TEXT_DOMAIN, "invalid or corrupt cache file contents")); return (NULL); } @@ -1687,6 +1764,8 @@ zpool_find_import_cached(libpc_handle_t *hdl, importargs_t *iarg) * caller. */ nvpair_t *pair = nvlist_next_nvpair(nv, NULL); + if (pair == NULL) + continue; fnvlist_add_nvlist(pools, nvpair_name(pair), fnvpair_value_nvlist(pair)); @@ -1768,26 +1847,20 @@ zpool_find_import(libpc_handle_t *hdl, importargs_t *iarg) nvlist_t * -zpool_search_import(void *hdl, importargs_t *import, - const pool_config_ops_t *pco) +zpool_search_import(libpc_handle_t *hdl, importargs_t *import) { - libpc_handle_t handle = { 0 }; nvlist_t *pools = NULL; - handle.lpc_lib_handle = hdl; - handle.lpc_ops = pco; - handle.lpc_printerr = B_TRUE; - verify(import->poolname == NULL || import->guid == 0); if (import->cachefile != NULL) - pools = zpool_find_import_cached(&handle, import); + pools = zpool_find_import_cached(hdl, import); else - pools = zpool_find_import(&handle, import); + pools = zpool_find_import(hdl, import); if ((pools == NULL || nvlist_empty(pools)) && - handle.lpc_open_access_error && geteuid() != 0) { - (void) zutil_error(&handle, EZFS_EACESS, dgettext(TEXT_DOMAIN, + hdl->lpc_open_access_error && geteuid() != 0) { + (void) zutil_error(hdl, LPC_EACCESS, dgettext(TEXT_DOMAIN, "no pools found")); } @@ -1795,10 +1868,10 @@ zpool_search_import(void *hdl, importargs_t *import, } static boolean_t -pool_match(nvlist_t *cfg, char *tgt) +pool_match(nvlist_t *cfg, const char *tgt) { uint64_t v, guid = strtoull(tgt, NULL, 0); - char *s; + const char *s; if (guid != 0) { if (nvlist_lookup_uint64(cfg, ZPOOL_CONFIG_POOL_GUID, &v) == 0) @@ -1811,8 +1884,8 @@ pool_match(nvlist_t *cfg, char *tgt) } int -zpool_find_config(void *hdl, const char *target, nvlist_t **configp, - importargs_t *args, const pool_config_ops_t *pco) +zpool_find_config(libpc_handle_t *hdl, const char *target, nvlist_t **configp, + importargs_t *args) { nvlist_t *pools; nvlist_t *match = NULL; @@ -1821,12 +1894,15 @@ zpool_find_config(void *hdl, const char *target, nvlist_t **configp, int count = 0; char *targetdup = strdup(target); + if (targetdup == NULL) + return (ENOMEM); + *configp = NULL; if ((sepp = strpbrk(targetdup, "/@")) != NULL) *sepp = '\0'; - pools = zpool_search_import(hdl, args, pco); + pools = zpool_search_import(hdl, args); if (pools != NULL) { nvpair_t *elem = NULL; @@ -1862,6 +1938,104 @@ zpool_find_config(void *hdl, const char *target, nvlist_t **configp, return (0); } +/* Return if a vdev is a leaf vdev. Note: draid spares are leaf vdevs. */ +static boolean_t +vdev_is_leaf(nvlist_t *nv) +{ + uint_t children = 0; + nvlist_t **child; + + (void) nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN, + &child, &children); + + return (children == 0); +} + +/* Return if a vdev is a leaf vdev and a real device (disk or file) */ +static boolean_t +vdev_is_real_leaf(nvlist_t *nv) +{ + const char *type = NULL; + if (!vdev_is_leaf(nv)) + return (B_FALSE); + + (void) nvlist_lookup_string(nv, ZPOOL_CONFIG_TYPE, &type); + if ((strcmp(type, VDEV_TYPE_DISK) == 0) || + (strcmp(type, VDEV_TYPE_FILE) == 0)) { + return (B_TRUE); + } + + return (B_FALSE); +} + +/* + * This function is called by our FOR_EACH_VDEV() macros. + * + * state: State machine status (stored inside of a (nvlist_t *)) + * nv: The current vdev nvlist_t we are iterating over. + * last_nv: The previous vdev nvlist_t we returned to the user in + * the last iteration of FOR_EACH_VDEV(). We use it + * to find the next vdev nvlist_t we should return. + * real_leaves_only: Only return leaf vdevs. + * + * Returns 1 if we found the next vdev nvlist_t for this iteration. 0 if + * we're still searching for it. + */ +static int +__for_each_vdev_macro_helper_func(void *state, nvlist_t *nv, void *last_nv, + boolean_t real_leaves_only) +{ + enum {FIRST_NV = 0, NEXT_IS_MATCH = 1, STOP_LOOKING = 2}; + + /* The very first entry in the NV list is a special case */ + if (*((nvlist_t **)state) == (nvlist_t *)FIRST_NV) { + if (real_leaves_only && !vdev_is_real_leaf(nv)) + return (0); + + *((nvlist_t **)last_nv) = nv; + *((nvlist_t **)state) = (nvlist_t *)STOP_LOOKING; + return (1); + } + + /* + * We came across our last_nv, meaning the next one is the one we + * want + */ + if (nv == *((nvlist_t **)last_nv)) { + /* Next iteration of this function will return the nvlist_t */ + *((nvlist_t **)state) = (nvlist_t *)NEXT_IS_MATCH; + return (0); + } + + /* + * We marked NEXT_IS_MATCH on the previous iteration, so this is the one + * we want. + */ + if (*(nvlist_t **)state == (nvlist_t *)NEXT_IS_MATCH) { + if (real_leaves_only && !vdev_is_real_leaf(nv)) + return (0); + + *((nvlist_t **)last_nv) = nv; + *((nvlist_t **)state) = (nvlist_t *)STOP_LOOKING; + return (1); + } + + return (0); +} + +int +for_each_vdev_macro_helper_func(void *state, nvlist_t *nv, void *last_nv) +{ + return (__for_each_vdev_macro_helper_func(state, nv, last_nv, B_FALSE)); +} + +int +for_each_real_leaf_vdev_macro_helper_func(void *state, nvlist_t *nv, + void *last_nv) +{ + return (__for_each_vdev_macro_helper_func(state, nv, last_nv, B_TRUE)); +} + /* * Internal function for iterating over the vdevs. * @@ -1880,7 +2054,7 @@ for_each_vdev_cb(void *zhp, nvlist_t *nv, pool_vdev_iter_f func, uint_t c, children; int ret = 0; int i; - char *type; + const char *type; const char *list[] = { ZPOOL_CONFIG_SPARES, @@ -1888,6 +2062,14 @@ for_each_vdev_cb(void *zhp, nvlist_t *nv, pool_vdev_iter_f func, ZPOOL_CONFIG_CHILDREN }; + if (nvlist_lookup_string(nv, ZPOOL_CONFIG_TYPE, &type) != 0) + return (ret); + + /* Don't run our function on indirect vdevs */ + if (strcmp(type, VDEV_TYPE_INDIRECT) != 0) { + ret |= func(zhp, nv, data); + } + for (i = 0; i < ARRAY_SIZE(list); i++) { if (nvlist_lookup_nvlist_array(nv, list[i], &child, &children) == 0) { @@ -1906,14 +2088,6 @@ for_each_vdev_cb(void *zhp, nvlist_t *nv, pool_vdev_iter_f func, } } - if (nvlist_lookup_string(nv, ZPOOL_CONFIG_TYPE, &type) != 0) - return (ret); - - /* Don't run our function on root vdevs */ - if (strcmp(type, VDEV_TYPE_ROOT) != 0) { - ret |= func(zhp, nv, data); - } - return (ret); } diff --git a/sys/contrib/openzfs/lib/libzutil/zutil_import.h b/sys/contrib/openzfs/lib/libzutil/zutil_import.h index 0108eb45c5cf..0c140c226b03 100644 --- a/sys/contrib/openzfs/lib/libzutil/zutil_import.h +++ b/sys/contrib/openzfs/lib/libzutil/zutil_import.h @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -28,28 +29,13 @@ #ifndef _LIBZUTIL_ZUTIL_IMPORT_H_ #define _LIBZUTIL_ZUTIL_IMPORT_H_ -#define EZFS_BADCACHE "invalid or missing cache file" -#define EZFS_BADPATH "must be an absolute path" -#define EZFS_NOMEM "out of memory" -#define EZFS_EACESS "some devices require root privileges" - #define IMPORT_ORDER_PREFERRED_1 1 #define IMPORT_ORDER_PREFERRED_2 2 #define IMPORT_ORDER_SCAN_OFFSET 10 #define IMPORT_ORDER_DEFAULT 100 -typedef struct libpc_handle { - boolean_t lpc_printerr; - boolean_t lpc_open_access_error; - boolean_t lpc_desc_active; - char lpc_desc[1024]; - const pool_config_ops_t *lpc_ops; - void *lpc_lib_handle; -} libpc_handle_t; - - -int label_paths(libpc_handle_t *hdl, nvlist_t *label, char **path, - char **devid); +int label_paths(libpc_handle_t *hdl, nvlist_t *label, const char **path, + const char **devid); int zpool_find_import_blkid(libpc_handle_t *hdl, pthread_mutex_t *lock, avl_tree_t **slice_cache); diff --git a/sys/contrib/openzfs/lib/libzutil/zutil_nicenum.c b/sys/contrib/openzfs/lib/libzutil/zutil_nicenum.c index 4dcac1f855ff..44d68e85d0db 100644 --- a/sys/contrib/openzfs/lib/libzutil/zutil_nicenum.c +++ b/sys/contrib/openzfs/lib/libzutil/zutil_nicenum.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * diff --git a/sys/contrib/openzfs/lib/libzutil/zutil_pool.c b/sys/contrib/openzfs/lib/libzutil/zutil_pool.c index 734650f3cffc..2aacfa53b5e0 100644 --- a/sys/contrib/openzfs/lib/libzutil/zutil_pool.c +++ b/sys/contrib/openzfs/lib/libzutil/zutil_pool.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: CDDL-1.0 /* * CDDL HEADER START * @@ -6,7 +7,7 @@ * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. + * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * @@ -28,6 +29,7 @@ #include <string.h> #include <sys/nvpair.h> #include <sys/fs/zfs.h> +#include <math.h> #include <libzutil.h> @@ -120,8 +122,9 @@ zpool_history_unpack(char *buf, uint64_t bytes_read, uint64_t *leftover, break; /* unpack record */ - if (nvlist_unpack(buf + sizeof (reclen), reclen, &nv, 0) != 0) - return (ENOMEM); + int err = nvlist_unpack(buf + sizeof (reclen), reclen, &nv, 0); + if (err != 0) + return (err); bytes_read -= sizeof (reclen) + reclen; buf += sizeof (reclen) + reclen; @@ -143,3 +146,33 @@ zpool_history_unpack(char *buf, uint64_t bytes_read, uint64_t *leftover, *leftover = bytes_read; return (0); } + +/* + * Floating point sleep(). Allows you to pass in a floating point value for + * seconds. + */ +void +fsleep(float sec) +{ + struct timespec req; + req.tv_sec = floor(sec); + req.tv_nsec = (sec - (float)req.tv_sec) * NANOSEC; + nanosleep(&req, NULL); +} + +/* + * Get environment variable 'env' and return it as an integer. + * If 'env' is not set, then return 'default_val' instead. + */ +int +zpool_getenv_int(const char *env, int default_val) +{ + char *str; + int val; + str = getenv(env); + if ((str == NULL) || sscanf(str, "%d", &val) != 1 || + val < 0) { + val = default_val; + } + return (val); +} |