aboutsummaryrefslogtreecommitdiff
path: root/sys/contrib/openzfs/lib
diff options
context:
space:
mode:
Diffstat (limited to 'sys/contrib/openzfs/lib')
-rw-r--r--sys/contrib/openzfs/lib/Makefile.am110
-rw-r--r--sys/contrib/openzfs/lib/libavl/Makefile.am18
-rw-r--r--sys/contrib/openzfs/lib/libefi/Makefile.am18
-rw-r--r--sys/contrib/openzfs/lib/libefi/rdwr_efi.c56
-rw-r--r--sys/contrib/openzfs/lib/libicp/Makefile.am139
-rw-r--r--sys/contrib/openzfs/lib/libnvpair/Makefile.am45
-rw-r--r--sys/contrib/openzfs/lib/libnvpair/libnvpair.abi3199
-rw-r--r--sys/contrib/openzfs/lib/libnvpair/libnvpair.c240
-rw-r--r--sys/contrib/openzfs/lib/libnvpair/libnvpair_json.c11
-rw-r--r--sys/contrib/openzfs/lib/libnvpair/nvpair_alloc_system.c13
-rw-r--r--sys/contrib/openzfs/lib/libshare/Makefile.am39
-rw-r--r--sys/contrib/openzfs/lib/libshare/libshare.c345
-rw-r--r--sys/contrib/openzfs/lib/libshare/libshare_impl.h47
-rw-r--r--sys/contrib/openzfs/lib/libshare/nfs.c279
-rw-r--r--sys/contrib/openzfs/lib/libshare/nfs.h12
-rw-r--r--sys/contrib/openzfs/lib/libshare/os/freebsd/nfs.c276
-rw-r--r--sys/contrib/openzfs/lib/libshare/os/freebsd/smb.c61
-rw-r--r--sys/contrib/openzfs/lib/libshare/os/linux/nfs.c352
-rw-r--r--sys/contrib/openzfs/lib/libshare/os/linux/smb.c174
-rw-r--r--sys/contrib/openzfs/lib/libshare/smb.h7
-rw-r--r--sys/contrib/openzfs/lib/libspl/Makefile.am67
-rw-r--r--sys/contrib/openzfs/lib/libspl/assert.c78
-rw-r--r--sys/contrib/openzfs/lib/libspl/atomic.c149
-rw-r--r--sys/contrib/openzfs/lib/libspl/backtrace.c303
-rw-r--r--sys/contrib/openzfs/lib/libspl/getexecname.c3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/Makefile.am124
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/assert.h192
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/atomic.h10
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/ia32/Makefile.am1
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/ia32/sys/Makefile.am3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/libdevinfo.h30
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/libgen.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/libshare.h45
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/locale.h35
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/Makefile.am7
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/freebsd/Makefile.am5
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/freebsd/fcntl.h1
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/Makefile.am12
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/byteorder.h19
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/fcntl.h1
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/file.h11
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/ia32/asm_linkage.h185
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/mnttab.h7
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/mount.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/param.h5
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/stat.h9
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/vfs.h1
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/zfs_context_os.h2
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/linux/Makefile.am1
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/linux/sys/Makefile.am10
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/linux/sys/byteorder.h19
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/linux/sys/errno.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/linux/sys/ia32/asm_linkage.h (renamed from sys/contrib/openzfs/lib/libspl/include/ia32/sys/asm_linkage.h)200
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/linux/sys/mnttab.h5
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/linux/sys/mount.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/linux/sys/param.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/linux/sys/stat.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/linux/sys/sysmacros.h6
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/linux/sys/zfs_context_os.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/rpc/Makefile.am3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/rpc/xdr.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/statcommon.h7
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/stdio.h34
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/stdlib.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/string.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/Makefile.am48
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/abd_impl_os.h (renamed from sys/contrib/openzfs/lib/libspl/include/stropts.h)25
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/abd_os.h (renamed from sys/contrib/openzfs/lib/libzfs/os/linux/libzfs_sendrecv_os.c)50
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/acl.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/acl_impl.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/asm_linkage.h (renamed from sys/contrib/openzfs/lib/libspl/include/limits.h)32
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/backtrace.h (renamed from sys/contrib/openzfs/lib/libspl/include/sys/va_list.h)13
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/callb.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/cmn_err.h37
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/cred.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/debug.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/dkio.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/dklabel.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/dktp/Makefile.am4
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/dktp/fdisk.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/feature_tests.h10
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/int_limits.h30
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/int_types.h32
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/inttypes.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/isa_defs.h52
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/kmem.h7
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/kstat.h48
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/list.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/list_impl.h4
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/mhd.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/mkdev.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/policy.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/poll.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/priv.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/processor.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/sha2.h151
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/simd.h155
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/stack.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/stdtypes.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/string.h1
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/strings.h33
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/sunddi.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/systeminfo.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/time.h5
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/types.h32
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/types32.h8
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/tzfile.h164
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/uio.h34
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/varargs.h30
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/vnode.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/vtoc.h350
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/wmsum.h1
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/zone.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/thread.h30
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/tzfile.h32
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/ucred.h32
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/umem.h33
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/unistd.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/util/Makefile.am3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/util/sscanf.h30
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/zone.h15
-rw-r--r--sys/contrib/openzfs/lib/libspl/libspl_impl.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/list.c7
-rw-r--r--sys/contrib/openzfs/lib/libspl/mkdirp.c3
-rw-r--r--sys/contrib/openzfs/lib/libspl/os/freebsd/getexecname.c3
-rw-r--r--sys/contrib/openzfs/lib/libspl/os/freebsd/gethostid.c3
-rw-r--r--sys/contrib/openzfs/lib/libspl/os/freebsd/getmntany.c8
-rw-r--r--sys/contrib/openzfs/lib/libspl/os/freebsd/mnttab.c49
-rw-r--r--sys/contrib/openzfs/lib/libspl/os/freebsd/zone.c1
-rw-r--r--sys/contrib/openzfs/lib/libspl/os/linux/getexecname.c3
-rw-r--r--sys/contrib/openzfs/lib/libspl/os/linux/gethostid.c9
-rw-r--r--sys/contrib/openzfs/lib/libspl/os/linux/getmntany.c10
-rw-r--r--sys/contrib/openzfs/lib/libspl/os/linux/zone.c37
-rw-r--r--sys/contrib/openzfs/lib/libspl/page.c3
-rw-r--r--sys/contrib/openzfs/lib/libspl/strlcat.c3
-rw-r--r--sys/contrib/openzfs/lib/libspl/strlcpy.c3
-rw-r--r--sys/contrib/openzfs/lib/libspl/timestamp.c50
-rw-r--r--sys/contrib/openzfs/lib/libtpool/Makefile.am20
-rw-r--r--sys/contrib/openzfs/lib/libtpool/thread_pool.c35
-rw-r--r--sys/contrib/openzfs/lib/libtpool/thread_pool_impl.h3
-rw-r--r--sys/contrib/openzfs/lib/libunicode/Makefile.am17
-rw-r--r--sys/contrib/openzfs/lib/libuutil/Makefile.am33
-rw-r--r--sys/contrib/openzfs/lib/libuutil/libuutil.abi1232
-rw-r--r--sys/contrib/openzfs/lib/libuutil/uu_alloc.c3
-rw-r--r--sys/contrib/openzfs/lib/libuutil/uu_avl.c33
-rw-r--r--sys/contrib/openzfs/lib/libuutil/uu_ident.c3
-rw-r--r--sys/contrib/openzfs/lib/libuutil/uu_list.c47
-rw-r--r--sys/contrib/openzfs/lib/libuutil/uu_misc.c3
-rw-r--r--sys/contrib/openzfs/lib/libuutil/uu_pname.c201
-rw-r--r--sys/contrib/openzfs/lib/libuutil/uu_string.c3
-rw-r--r--sys/contrib/openzfs/lib/libzdb/Makefile.am7
-rw-r--r--sys/contrib/openzfs/lib/libzdb/libzdb.c102
-rw-r--r--sys/contrib/openzfs/lib/libzfs/Makefile.am126
-rw-r--r--sys/contrib/openzfs/lib/libzfs/libzfs.abi9496
-rw-r--r--sys/contrib/openzfs/lib/libzfs/libzfs_changelist.c130
-rw-r--r--sys/contrib/openzfs/lib/libzfs/libzfs_config.c45
-rw-r--r--sys/contrib/openzfs/lib/libzfs/libzfs_crypto.c90
-rw-r--r--sys/contrib/openzfs/lib/libzfs/libzfs_dataset.c488
-rw-r--r--sys/contrib/openzfs/lib/libzfs/libzfs_diff.c165
-rw-r--r--sys/contrib/openzfs/lib/libzfs/libzfs_impl.h57
-rw-r--r--sys/contrib/openzfs/lib/libzfs/libzfs_import.c105
-rw-r--r--sys/contrib/openzfs/lib/libzfs/libzfs_iter.c116
-rw-r--r--sys/contrib/openzfs/lib/libzfs/libzfs_mount.c445
-rw-r--r--sys/contrib/openzfs/lib/libzfs/libzfs_pool.c1976
-rw-r--r--sys/contrib/openzfs/lib/libzfs/libzfs_sendrecv.c1407
-rw-r--r--sys/contrib/openzfs/lib/libzfs/libzfs_status.c65
-rw-r--r--sys/contrib/openzfs/lib/libzfs/libzfs_util.c674
-rw-r--r--sys/contrib/openzfs/lib/libzfs/os/freebsd/libzfs_compat.c77
-rw-r--r--sys/contrib/openzfs/lib/libzfs/os/freebsd/libzfs_zmount.c38
-rw-r--r--sys/contrib/openzfs/lib/libzfs/os/linux/libzfs_mount_os.c48
-rw-r--r--sys/contrib/openzfs/lib/libzfs/os/linux/libzfs_pool_os.c34
-rw-r--r--sys/contrib/openzfs/lib/libzfs/os/linux/libzfs_util_os.c266
-rw-r--r--sys/contrib/openzfs/lib/libzfs_core/Makefile.am44
-rw-r--r--sys/contrib/openzfs/lib/libzfs_core/libzfs_core.abi1973
-rw-r--r--sys/contrib/openzfs/lib/libzfs_core/libzfs_core.c398
-rw-r--r--sys/contrib/openzfs/lib/libzfs_core/libzfs_core_impl.h (renamed from sys/contrib/openzfs/lib/libspl/include/sys/stropts.h)19
-rw-r--r--sys/contrib/openzfs/lib/libzfs_core/os/freebsd/libzfs_core_ioctl.c21
-rw-r--r--sys/contrib/openzfs/lib/libzfs_core/os/linux/libzfs_core_ioctl.c6
-rw-r--r--sys/contrib/openzfs/lib/libzfsbootenv/Makefile.am38
-rw-r--r--sys/contrib/openzfs/lib/libzfsbootenv/libzfsbootenv.abi509
-rw-r--r--sys/contrib/openzfs/lib/libzfsbootenv/lzbe_device.c25
-rw-r--r--sys/contrib/openzfs/lib/libzfsbootenv/lzbe_pair.c4
-rw-r--r--sys/contrib/openzfs/lib/libzfsbootenv/lzbe_util.c1
-rw-r--r--sys/contrib/openzfs/lib/libzpool/Makefile.am411
-rw-r--r--sys/contrib/openzfs/lib/libzpool/abd_os.c430
-rw-r--r--sys/contrib/openzfs/lib/libzpool/arc_os.c88
-rw-r--r--sys/contrib/openzfs/lib/libzpool/kernel.c227
-rw-r--r--sys/contrib/openzfs/lib/libzpool/taskq.c53
-rw-r--r--sys/contrib/openzfs/lib/libzpool/util.c28
-rw-r--r--sys/contrib/openzfs/lib/libzpool/vdev_label_os.c52
-rw-r--r--sys/contrib/openzfs/lib/libzpool/zfs_debug.c125
-rw-r--r--sys/contrib/openzfs/lib/libzpool/zfs_racct.c39
-rw-r--r--sys/contrib/openzfs/lib/libzstd/Makefile.am51
-rw-r--r--sys/contrib/openzfs/lib/libzutil/Makefile.am54
-rw-r--r--sys/contrib/openzfs/lib/libzutil/os/freebsd/zutil_device_path_os.c11
-rw-r--r--sys/contrib/openzfs/lib/libzutil/os/freebsd/zutil_import_os.c24
-rw-r--r--sys/contrib/openzfs/lib/libzutil/os/linux/zutil_device_path_os.c67
-rw-r--r--sys/contrib/openzfs/lib/libzutil/os/linux/zutil_import_os.c118
-rw-r--r--sys/contrib/openzfs/lib/libzutil/os/linux/zutil_setproctitle.c277
-rw-r--r--sys/contrib/openzfs/lib/libzutil/zutil_device_path.c57
-rw-r--r--sys/contrib/openzfs/lib/libzutil/zutil_import.c358
-rw-r--r--sys/contrib/openzfs/lib/libzutil/zutil_import.h22
-rw-r--r--sys/contrib/openzfs/lib/libzutil/zutil_nicenum.c3
-rw-r--r--sys/contrib/openzfs/lib/libzutil/zutil_pool.c39
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), &gtnd);
if (err != 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 && 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);
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);
+}