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/libicp/Makefile.am7
-rw-r--r--sys/contrib/openzfs/lib/libnvpair/Makefile.am2
-rw-r--r--sys/contrib/openzfs/lib/libspl/Makefile.am15
-rw-r--r--sys/contrib/openzfs/lib/libspl/condvar.c153
-rw-r--r--sys/contrib/openzfs/lib/libspl/cred.c64
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/Makefile.am26
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/libspl.h40
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/fcntl.h2
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/mount.h2
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/param.h2
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/zfs_context_os.h35
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/linux/sys/param.h2
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/linux/sys/stat.h2
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/linux/sys/vfs.h (renamed from sys/contrib/openzfs/lib/libspl/include/os/linux/sys/zfs_context_os.h)10
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/acl.h4
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/callb.h29
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/cmn_err.h27
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/condvar.h70
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/cred.h18
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/debug.h24
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/kmem.h68
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/kstat.h743
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/misc.h40
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/mutex.h58
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/procfs_list.h71
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/random.h54
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/rwlock.h62
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/sid.h44
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/simd.h28
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/string.h3
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/sunddi.h8
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/sysmacros.h (renamed from sys/contrib/openzfs/lib/libspl/include/os/linux/sys/sysmacros.h)49
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/systm.h36
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/taskq.h119
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/thread.h79
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/time.h9
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/timer.h64
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/trace.h73
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/trace_spl.h24
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/trace_zfs.h24
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/tsd.h42
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/tunables.h13
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/types.h4
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/uio.h1
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/vnode.h35
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/sys/zone.h18
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/umem.h1
-rw-r--r--sys/contrib/openzfs/lib/libspl/kmem.c102
-rw-r--r--sys/contrib/openzfs/lib/libspl/kstat.c64
-rw-r--r--sys/contrib/openzfs/lib/libspl/libspl.c67
-rw-r--r--sys/contrib/openzfs/lib/libspl/libspl_impl.h7
-rw-r--r--sys/contrib/openzfs/lib/libspl/mutex.c89
-rw-r--r--sys/contrib/openzfs/lib/libspl/procfs_list.c93
-rw-r--r--sys/contrib/openzfs/lib/libspl/random.c101
-rw-r--r--sys/contrib/openzfs/lib/libspl/rwlock.c108
-rw-r--r--sys/contrib/openzfs/lib/libspl/sid.c47
-rw-r--r--sys/contrib/openzfs/lib/libspl/taskq.c (renamed from sys/contrib/openzfs/lib/libzpool/taskq.c)44
-rw-r--r--sys/contrib/openzfs/lib/libspl/thread.c118
-rw-r--r--sys/contrib/openzfs/lib/libuutil/libuutil.abi1269
-rw-r--r--sys/contrib/openzfs/lib/libzfs/Makefile.am2
-rw-r--r--sys/contrib/openzfs/lib/libzfs/libzfs.abi1039
-rw-r--r--sys/contrib/openzfs/lib/libzfs/libzfs_config.c17
-rw-r--r--sys/contrib/openzfs/lib/libzfs/libzfs_crypto.c3
-rw-r--r--sys/contrib/openzfs/lib/libzfs/libzfs_pool.c22
-rw-r--r--sys/contrib/openzfs/lib/libzfs/libzfs_sendrecv.c5
-rw-r--r--sys/contrib/openzfs/lib/libzfs/libzfs_status.c78
-rw-r--r--sys/contrib/openzfs/lib/libzfs/libzfs_util.c5
-rw-r--r--sys/contrib/openzfs/lib/libzfs/os/linux/libzfs_util_os.c37
-rw-r--r--sys/contrib/openzfs/lib/libzfs_core/libzfs_core.abi1242
-rw-r--r--sys/contrib/openzfs/lib/libzfsbootenv/libzfsbootenv.abi2
-rw-r--r--sys/contrib/openzfs/lib/libzpool/Makefile.am7
-rw-r--r--sys/contrib/openzfs/lib/libzpool/include/Makefile.am8
-rw-r--r--sys/contrib/openzfs/lib/libzpool/include/sys/abd_impl_os.h (renamed from sys/contrib/openzfs/lib/libspl/include/sys/abd_impl_os.h)0
-rw-r--r--sys/contrib/openzfs/lib/libzpool/include/sys/abd_os.h (renamed from sys/contrib/openzfs/lib/libspl/include/sys/abd_os.h)0
-rw-r--r--sys/contrib/openzfs/lib/libzpool/include/sys/trace_zfs.h (renamed from sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/sysmacros.h)0
-rw-r--r--sys/contrib/openzfs/lib/libzpool/include/sys/zfs_bootenv_os.h39
-rw-r--r--sys/contrib/openzfs/lib/libzpool/include/sys/zfs_context_os.h34
-rw-r--r--sys/contrib/openzfs/lib/libzpool/include/sys/zfs_debug_os.h29
-rw-r--r--sys/contrib/openzfs/lib/libzpool/kernel.c820
-rw-r--r--sys/contrib/openzfs/lib/libzpool/util.c1
-rw-r--r--sys/contrib/openzfs/lib/libzutil/zutil_import.c39
81 files changed, 5633 insertions, 2209 deletions
diff --git a/sys/contrib/openzfs/lib/libicp/Makefile.am b/sys/contrib/openzfs/lib/libicp/Makefile.am
index ce24d13a760f..a8937e60b770 100644
--- a/sys/contrib/openzfs/lib/libicp/Makefile.am
+++ b/sys/contrib/openzfs/lib/libicp/Makefile.am
@@ -1,6 +1,9 @@
libicp_la_CCASFLAGS = $(AM_CCASFLAGS)
libicp_la_CFLAGS = $(AM_CFLAGS) $(KERNEL_CFLAGS) $(LIBRARY_CFLAGS)
+libicp_la_CPPFLAGS = $(AM_CPPFLAGS) $(LIBZPOOL_CPPFLAGS)
+libicp_la_CPPFLAGS += -I$(top_srcdir)/module/icp/include
+
noinst_LTLIBRARIES += libicp.la
nodist_libicp_la_SOURCES = \
@@ -35,8 +38,7 @@ nodist_libicp_la_SOURCES = \
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
+ module/icp/core/kcf_prov_tabs.c
if TARGET_CPU_AARCH64
nodist_libicp_la_SOURCES += \
@@ -69,6 +71,7 @@ nodist_libicp_la_SOURCES += \
module/icp/asm-x86_64/aes/aes_aesni.S \
module/icp/asm-x86_64/modes/gcm_pclmulqdq.S \
module/icp/asm-x86_64/modes/aesni-gcm-x86_64.S \
+ module/icp/asm-x86_64/modes/aesni-gcm-avx2-vaes.S \
module/icp/asm-x86_64/modes/ghash-x86_64.S \
module/icp/asm-x86_64/sha2/sha256-x86_64.S \
module/icp/asm-x86_64/sha2/sha512-x86_64.S \
diff --git a/sys/contrib/openzfs/lib/libnvpair/Makefile.am b/sys/contrib/openzfs/lib/libnvpair/Makefile.am
index 87b8d32aa175..0b3f964781b0 100644
--- a/sys/contrib/openzfs/lib/libnvpair/Makefile.am
+++ b/sys/contrib/openzfs/lib/libnvpair/Makefile.am
@@ -30,6 +30,6 @@ if !ASAN_ENABLED
libnvpair_la_LDFLAGS += -Wl,-z,defs
endif
-libnvpair_la_LDFLAGS += -version-info 3:0:0
+libnvpair_la_LDFLAGS += -version-info 4:0:1
dist_noinst_DATA += %D%/libnvpair.abi %D%/libnvpair.suppr
diff --git a/sys/contrib/openzfs/lib/libspl/Makefile.am b/sys/contrib/openzfs/lib/libspl/Makefile.am
index 6640ecd582a7..27f004634487 100644
--- a/sys/contrib/openzfs/lib/libspl/Makefile.am
+++ b/sys/contrib/openzfs/lib/libspl/Makefile.am
@@ -2,6 +2,9 @@ include $(srcdir)/%D%/include/Makefile.am
libspl_assert_la_CFLAGS = $(AM_CFLAGS) $(LIBRARY_CFLAGS) $(LIBUNWIND_CFLAGS)
libspl_la_CFLAGS = $(libspl_assert_la_CFLAGS)
+if TARGET_CPU_I386
+libspl_la_CFLAGS += $(NO_ATOMIC_ALIGNMENT)
+endif
noinst_LTLIBRARIES += libspl_assert.la libspl.la
CPPCHECKTARGETS += libspl_assert.la libspl.la
@@ -13,12 +16,24 @@ libspl_assert_la_SOURCES = \
libspl_la_SOURCES = \
%D%/libspl_impl.h \
%D%/atomic.c \
+ %D%/condvar.c \
+ %D%/cred.c \
%D%/getexecname.c \
+ %D%/kmem.c \
+ %D%/kstat.c \
+ %D%/libspl.c \
%D%/list.c \
%D%/mkdirp.c \
+ %D%/mutex.c \
%D%/page.c \
+ %D%/procfs_list.c \
+ %D%/random.c \
+ %D%/rwlock.c \
+ %D%/sid.c \
%D%/strlcat.c \
%D%/strlcpy.c \
+ %D%/taskq.c \
+ %D%/thread.c \
%D%/timestamp.c \
%D%/tunables.c \
%D%/include/sys/list.h \
diff --git a/sys/contrib/openzfs/lib/libspl/condvar.c b/sys/contrib/openzfs/lib/libspl/condvar.c
new file mode 100644
index 000000000000..3d70fe152089
--- /dev/null
+++ b/sys/contrib/openzfs/lib/libspl/condvar.c
@@ -0,0 +1,153 @@
+// 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) 2012, 2018 by Delphix. All rights reserved.
+ * Copyright (c) 2016 Actifio, Inc. All rights reserved.
+ * Copyright (c) 2025, Klara, Inc.
+ */
+
+#include <assert.h>
+#include <pthread.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/timer.h>
+#include <sys/condvar.h>
+
+/*
+ * =========================================================================
+ * condition variables
+ * =========================================================================
+ */
+
+void
+cv_init(kcondvar_t *cv, char *name, int type, void *arg)
+{
+ (void) name, (void) type, (void) arg;
+ VERIFY0(pthread_cond_init(cv, NULL));
+}
+
+void
+cv_destroy(kcondvar_t *cv)
+{
+ VERIFY0(pthread_cond_destroy(cv));
+}
+
+void
+cv_wait(kcondvar_t *cv, kmutex_t *mp)
+{
+ memset(&mp->m_owner, 0, sizeof (pthread_t));
+ VERIFY0(pthread_cond_wait(cv, &mp->m_lock));
+ mp->m_owner = pthread_self();
+}
+
+int
+cv_wait_sig(kcondvar_t *cv, kmutex_t *mp)
+{
+ cv_wait(cv, mp);
+ return (1);
+}
+
+int
+cv_timedwait(kcondvar_t *cv, kmutex_t *mp, clock_t abstime)
+{
+ int error;
+ struct timeval tv;
+ struct timespec ts;
+ clock_t delta;
+
+ delta = abstime - ddi_get_lbolt();
+ if (delta <= 0)
+ return (-1);
+
+ VERIFY0(gettimeofday(&tv, NULL));
+
+ ts.tv_sec = tv.tv_sec + delta / hz;
+ ts.tv_nsec = tv.tv_usec * NSEC_PER_USEC + (delta % hz) * (NANOSEC / hz);
+ if (ts.tv_nsec >= NANOSEC) {
+ ts.tv_sec++;
+ ts.tv_nsec -= NANOSEC;
+ }
+
+ memset(&mp->m_owner, 0, sizeof (pthread_t));
+ error = pthread_cond_timedwait(cv, &mp->m_lock, &ts);
+ mp->m_owner = pthread_self();
+
+ if (error == ETIMEDOUT)
+ return (-1);
+
+ VERIFY0(error);
+
+ return (1);
+}
+
+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;
+ hrtime_t delta;
+
+ ASSERT(flag == 0 || flag == CALLOUT_FLAG_ABSOLUTE);
+
+ delta = tim;
+ if (flag & CALLOUT_FLAG_ABSOLUTE)
+ delta -= gethrtime();
+
+ if (delta <= 0)
+ return (-1);
+
+ VERIFY0(gettimeofday(&tv, NULL));
+
+ ts.tv_sec = tv.tv_sec + delta / NANOSEC;
+ ts.tv_nsec = tv.tv_usec * NSEC_PER_USEC + (delta % NANOSEC);
+ if (ts.tv_nsec >= NANOSEC) {
+ ts.tv_sec++;
+ ts.tv_nsec -= NANOSEC;
+ }
+
+ memset(&mp->m_owner, 0, sizeof (pthread_t));
+ error = pthread_cond_timedwait(cv, &mp->m_lock, &ts);
+ mp->m_owner = pthread_self();
+
+ if (error == ETIMEDOUT)
+ return (-1);
+
+ VERIFY0(error);
+
+ return (1);
+}
+
+void
+cv_signal(kcondvar_t *cv)
+{
+ VERIFY0(pthread_cond_signal(cv));
+}
+
+void
+cv_broadcast(kcondvar_t *cv)
+{
+ VERIFY0(pthread_cond_broadcast(cv));
+}
diff --git a/sys/contrib/openzfs/lib/libspl/cred.c b/sys/contrib/openzfs/lib/libspl/cred.c
new file mode 100644
index 000000000000..130323ea91a7
--- /dev/null
+++ b/sys/contrib/openzfs/lib/libspl/cred.c
@@ -0,0 +1,64 @@
+// 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) 2012, 2018 by Delphix. All rights reserved.
+ * Copyright (c) 2016 Actifio, Inc. All rights reserved.
+ * Copyright (c) 2025, Klara, Inc.
+ */
+
+#include <sys/cred.h>
+
+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);
+}
diff --git a/sys/contrib/openzfs/lib/libspl/include/Makefile.am b/sys/contrib/openzfs/lib/libspl/include/Makefile.am
index 21f0c70db9e7..e68742409839 100644
--- a/sys/contrib/openzfs/lib/libspl/include/Makefile.am
+++ b/sys/contrib/openzfs/lib/libspl/include/Makefile.am
@@ -4,6 +4,7 @@ libspl_HEADERS = \
%D%/atomic.h \
%D%/libgen.h \
%D%/libshare.h \
+ %D%/libspl.h \
%D%/statcommon.h \
%D%/stdlib.h \
%D%/string.h \
@@ -24,14 +25,13 @@ libspl_rpc_HEADERS = \
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/condvar.h \
%D%/sys/cred.h \
%D%/sys/debug.h \
%D%/sys/dkio.h \
@@ -43,22 +43,33 @@ libspl_sys_HEADERS = \
%D%/sys/kstat.h \
%D%/sys/list.h \
%D%/sys/list_impl.h \
+ %D%/sys/misc.h \
%D%/sys/mhd.h \
%D%/sys/mkdev.h \
%D%/sys/mod.h \
+ %D%/sys/mutex.h \
%D%/sys/policy.h \
%D%/sys/poll.h \
%D%/sys/priv.h \
%D%/sys/processor.h \
+ %D%/sys/procfs_list.h \
+ %D%/sys/random.h \
+ %D%/sys/rwlock.h \
+ %D%/sys/sid.h \
%D%/sys/simd.h \
%D%/sys/stack.h \
%D%/sys/stdtypes.h \
%D%/sys/string.h \
%D%/sys/sunddi.h \
+ %D%/sys/sysmacros.h \
%D%/sys/systeminfo.h \
+ %D%/sys/systm.h \
+ %D%/sys/thread.h \
+ %D%/sys/taskq.h \
%D%/sys/time.h \
- %D%/sys/trace_spl.h \
- %D%/sys/trace_zfs.h \
+ %D%/sys/timer.h \
+ %D%/sys/trace.h \
+ %D%/sys/tsd.h \
%D%/sys/tunables.h \
%D%/sys/types.h \
%D%/sys/types32.h \
@@ -77,8 +88,7 @@ libspl_sys_HEADERS += \
%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
+ %D%/os/linux/sys/vfs.h
libspl_ia32_HEADERS = \
%D%/os/linux/sys/ia32/asm_linkage.h
@@ -93,9 +103,7 @@ libspl_sys_HEADERS += \
%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
+ %D%/os/freebsd/sys/vfs.h
libspl_ia32_HEADERS = \
%D%/os/freebsd/sys/ia32/asm_linkage.h
diff --git a/sys/contrib/openzfs/lib/libspl/include/libspl.h b/sys/contrib/openzfs/lib/libspl/include/libspl.h
new file mode 100644
index 000000000000..68756bb9597b
--- /dev/null
+++ b/sys/contrib/openzfs/lib/libspl/include/libspl.h
@@ -0,0 +1,40 @@
+// 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) 2025, Rob Norris <robn@despairlabs.com>
+ */
+
+#ifndef _LIBSPL_H
+#define _LIBSPL_H extern __attribute__((visibility("default")))
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LIBSPL_H void libspl_init(void);
+_LIBSPL_H void libspl_fini(void);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif /* _LIBSPL_H */
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 64dd4d7ebe45..04fcc9f85c91 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
@@ -27,7 +27,9 @@
#ifndef _LIBSPL_SYS_FCNTL_H_
#define _LIBSPL_SYS_FCNTL_H_
+#if !defined(__linux__) || !defined(IN_BASE)
#include_next <sys/fcntl.h>
+#endif
#define O_LARGEFILE 0
#define O_RSYNC 0
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 231c250d3410..5548ad7d22b2 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
@@ -29,8 +29,10 @@
#ifndef _LIBSPL_SYS_MOUNT_H
#define _LIBSPL_SYS_MOUNT_H
+#if !defined(__linux__) || !defined(IN_BASE)
#undef _SYS_MOUNT_H_
#include_next <sys/mount.h>
+#endif
#include <assert.h>
#include <string.h>
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 55fa1de0e8ff..a693149115db 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
@@ -58,6 +58,8 @@
extern size_t spl_pagesize(void);
#define PAGESIZE (spl_pagesize())
+#define ptob(x) ((x) * PAGESIZE)
+
#ifndef HAVE_EXECVPE
extern int execvpe(const char *name, char * const argv[], char * const envp[]);
#endif
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
deleted file mode 100644
index 1dd036d02ac6..000000000000
--- a/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/zfs_context_os.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// SPDX-License-Identifier: BSD-2-Clause
-/*
- * Copyright (c) 2020 iXsystems, Inc.
- * All rights reserved.
- *
- * 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.
- *
- * $FreeBSD$
- */
-
-#ifndef ZFS_CONTEXT_OS_H_
-#define ZFS_CONTEXT_OS_H_
-
-#define HAVE_LARGE_STACKS 1
-
-#endif
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 814f8feaf37f..169d5875fcf0 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
@@ -65,4 +65,6 @@
extern size_t spl_pagesize(void);
#define PAGESIZE (spl_pagesize())
+#define ptob(x) ((x) * PAGESIZE)
+
#endif
diff --git a/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/stat.h b/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/stat.h
index a605af962a6d..13cc0b46ac93 100644
--- a/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/stat.h
+++ b/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/stat.h
@@ -33,7 +33,7 @@
#ifdef HAVE_STATX
#include <fcntl.h>
-#include <linux/stat.h>
+#include <sys/stat.h>
#endif
/*
diff --git a/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/zfs_context_os.h b/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/vfs.h
index bbfb4d17e06d..c7b567ff44a4 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/vfs.h
@@ -20,10 +20,14 @@
*
* CDDL HEADER END
*/
+/* Copyright 2025 by Lawrence Livermore National Security, LLC. */
-#ifndef ZFS_CONTEXT_OS_H
-#define ZFS_CONTEXT_OS_H
+/* This is the Linux userspace version of include/os/linux/spl/sys/vfs.h */
-#define HAVE_LARGE_STACKS 1
+#ifndef _LIBSPL_SYS_VFS_H
+#define _LIBSPL_SYS_VFS_H
+
+#include <linux/fs.h>
+#include <sys/statfs.h>
#endif
diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/acl.h b/sys/contrib/openzfs/lib/libspl/include/sys/acl.h
index 602043bbb196..3e79040c5307 100644
--- a/sys/contrib/openzfs/lib/libspl/include/sys/acl.h
+++ b/sys/contrib/openzfs/lib/libspl/include/sys/acl.h
@@ -141,8 +141,6 @@ typedef struct acl_info acl_t;
#define ACE_ALL_TYPES 0x001F
-#if defined(_KERNEL)
-
typedef struct ace_object {
uid_t a_who; /* uid or gid */
uint32_t a_access_mask; /* read,write,... */
@@ -152,8 +150,6 @@ typedef struct ace_object {
uint8_t a_inherit_obj_type[16]; /* inherit obj */
} ace_object_t;
-#endif
-
#define ACE_ALL_PERMS (ACE_READ_DATA|ACE_LIST_DIRECTORY|ACE_WRITE_DATA| \
ACE_ADD_FILE|ACE_APPEND_DATA|ACE_ADD_SUBDIRECTORY|ACE_READ_NAMED_ATTRS| \
ACE_WRITE_NAMED_ATTRS|ACE_EXECUTE|ACE_DELETE_CHILD|ACE_READ_ATTRIBUTES| \
diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/callb.h b/sys/contrib/openzfs/lib/libspl/include/sys/callb.h
index 46ed166e52f8..6e8e22338b8b 100644
--- a/sys/contrib/openzfs/lib/libspl/include/sys/callb.h
+++ b/sys/contrib/openzfs/lib/libspl/include/sys/callb.h
@@ -21,11 +21,36 @@
* CDDL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
+ * Copyright (c) 2012, 2018 by Delphix. All rights reserved.
+ * Copyright (c) 2012, Joyent, Inc. All rights reserved.
*/
#ifndef _SYS_CALLB_H
#define _SYS_CALLB_H
+#include <sys/mutex.h>
+
+typedef struct callb_cpr {
+ kmutex_t *cc_lockp;
+} callb_cpr_t;
+
+#define CALLB_CPR_INIT(cp, lockp, func, name) { \
+ (cp)->cc_lockp = lockp; \
+}
+
+#define CALLB_CPR_SAFE_BEGIN(cp) { \
+ ASSERT(MUTEX_HELD((cp)->cc_lockp)); \
+}
+
+#define CALLB_CPR_SAFE_END(cp, lockp) { \
+ ASSERT(MUTEX_HELD((cp)->cc_lockp)); \
+}
+
+#define CALLB_CPR_EXIT(cp) { \
+ ASSERT(MUTEX_HELD((cp)->cc_lockp)); \
+ mutex_exit((cp)->cc_lockp); \
+}
+
#endif
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 32930adaeffa..5e7136f7fdc2 100644
--- a/sys/contrib/openzfs/lib/libspl/include/sys/cmn_err.h
+++ b/sys/contrib/openzfs/lib/libspl/include/sys/cmn_err.h
@@ -62,4 +62,31 @@ do { \
} \
} while (0)
+/*
+ * Note that we are not using the debugging levels.
+ */
+
+#define CE_CONT 0 /* continuation */
+#define CE_NOTE 1 /* notice */
+#define CE_WARN 2 /* warning */
+#define CE_PANIC 3 /* panic */
+#define CE_IGNORE 4 /* print nothing */
+
+/*
+ * ZFS debugging
+ */
+
+extern void dprintf_setup(int *argc, char **argv);
+
+extern void cmn_err(int, const char *, ...)
+ __attribute__((format(printf, 2, 3)));
+extern void vcmn_err(int, const char *, va_list)
+ __attribute__((format(printf, 2, 0)));
+extern void panic(const char *, ...)
+ __attribute__((format(printf, 1, 2), noreturn));
+extern void vpanic(const char *, va_list)
+ __attribute__((format(printf, 1, 0), noreturn));
+
+#define fm_panic panic
+
#endif
diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/condvar.h b/sys/contrib/openzfs/lib/libspl/include/sys/condvar.h
new file mode 100644
index 000000000000..fb8f7c9bf6b1
--- /dev/null
+++ b/sys/contrib/openzfs/lib/libspl/include/sys/condvar.h
@@ -0,0 +1,70 @@
+// 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 2011 Nexenta Systems, Inc. All rights reserved.
+ * Copyright (c) 2012, 2018 by Delphix. All rights reserved.
+ * Copyright (c) 2012, Joyent, Inc. All rights reserved.
+ */
+
+#ifndef _SYS_CONDVAR_H
+#define _SYS_CONDVAR_H
+
+#ifdef SKIP_SPL_SYS_CONDVAR_H
+#include_next <sys/condvar.h>
+#else
+
+#include <pthread.h>
+#include <sys/time.h>
+#include <sys/mutex.h>
+
+/*
+ * Condition variables
+ */
+typedef pthread_cond_t kcondvar_t;
+
+#define CV_DEFAULT 0
+#define CALLOUT_FLAG_ABSOLUTE 0x2
+
+extern void cv_init(kcondvar_t *cv, char *name, int type, void *arg);
+extern void cv_destroy(kcondvar_t *cv);
+extern void cv_wait(kcondvar_t *cv, kmutex_t *mp);
+extern int cv_wait_sig(kcondvar_t *cv, kmutex_t *mp);
+extern int cv_timedwait(kcondvar_t *cv, kmutex_t *mp, clock_t abstime);
+extern int cv_timedwait_hires(kcondvar_t *cvp, kmutex_t *mp, hrtime_t tim,
+ hrtime_t res, int flag);
+extern void cv_signal(kcondvar_t *cv);
+extern void cv_broadcast(kcondvar_t *cv);
+
+#define cv_timedwait_io(cv, mp, at) cv_timedwait(cv, mp, at)
+#define cv_timedwait_idle(cv, mp, at) cv_timedwait(cv, mp, at)
+#define cv_timedwait_sig(cv, mp, at) cv_timedwait(cv, mp, at)
+#define cv_wait_io(cv, mp) cv_wait(cv, mp)
+#define cv_wait_idle(cv, mp) cv_wait(cv, mp)
+#define cv_wait_io_sig(cv, mp) cv_wait_sig(cv, mp)
+#define cv_timedwait_sig_hires(cv, mp, t, r, f) \
+ cv_timedwait_hires(cv, mp, t, r, f)
+#define cv_timedwait_idle_hires(cv, mp, t, r, f) \
+ cv_timedwait_hires(cv, mp, t, r, f)
+
+#endif /* SKIP_SPL_CONDVAR_H */
+#endif /* _SYS_CONDVAR_H */
diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/cred.h b/sys/contrib/openzfs/lib/libspl/include/sys/cred.h
index 4f6183762a0a..deceecee0f19 100644
--- a/sys/contrib/openzfs/lib/libspl/include/sys/cred.h
+++ b/sys/contrib/openzfs/lib/libspl/include/sys/cred.h
@@ -28,6 +28,24 @@
#ifndef _LIBSPL_SYS_CRED_H
#define _LIBSPL_SYS_CRED_H
+#include <sys/stat.h>
+
+/*
+ * Credentials
+ */
+
typedef struct cred cred_t;
+extern uid_t crgetuid(cred_t *cr);
+extern uid_t crgetruid(cred_t *cr);
+extern gid_t crgetgid(cred_t *cr);
+extern int crgetngroups(cred_t *cr);
+extern gid_t *crgetgroups(cred_t *cr);
+
+#define kcred NULL
+#define CRED() NULL
+
+#define crhold(cr) ((void)cr)
+#define crfree(cr) ((void)cr)
+
#endif
diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/debug.h b/sys/contrib/openzfs/lib/libspl/include/sys/debug.h
index 02f33a68b75b..2bd077686f1c 100644
--- a/sys/contrib/openzfs/lib/libspl/include/sys/debug.h
+++ b/sys/contrib/openzfs/lib/libspl/include/sys/debug.h
@@ -24,6 +24,12 @@
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
+/*
+ * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
+ * Copyright (c) 2012, 2018 by Delphix. All rights reserved.
+ * Copyright (c) 2012, Joyent, Inc. All rights reserved.
+ */
#ifndef _LIBSPL_SYS_DEBUG_H
#define _LIBSPL_SYS_DEBUG_H
@@ -42,4 +48,22 @@
#define __must_check __attribute__((warn_unused_result))
#endif
+#ifndef noinline
+#define noinline __attribute__((noinline))
+#endif
+
+#ifndef likely
+#define likely(x) __builtin_expect((x), 1)
+#endif
+
+#ifndef unlikely
+#define unlikely(x) __builtin_expect((x), 0)
+#endif
+
+/*
+ * Kernel modules
+ */
+#define __init
+#define __exit
+
#endif
diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/kmem.h b/sys/contrib/openzfs/lib/libspl/include/sys/kmem.h
index 279461f8d4c1..33e618f46bb0 100644
--- a/sys/contrib/openzfs/lib/libspl/include/sys/kmem.h
+++ b/sys/contrib/openzfs/lib/libspl/include/sys/kmem.h
@@ -20,26 +20,76 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
+ * Copyright (c) 2012, 2018 by Delphix. All rights reserved.
+ * Copyright (c) 2012, Joyent, Inc. All rights reserved.
*/
#ifndef _SYS_KMEM_H
#define _SYS_KMEM_H
-#include <stdlib.h>
+#include <umem.h>
+#include <sys/types.h>
-#ifdef __cplusplus
+#ifdef __cplusplus
extern "C" {
#endif
-#define KM_SLEEP 0x00000000 /* same as KM_SLEEP */
-#define KM_NOSLEEP 0x00000001 /* same as KM_NOSLEEP */
+/*
+ * Kernel memory
+ */
+#define KM_SLEEP UMEM_NOFAIL
+#define KM_PUSHPAGE KM_SLEEP
+#define KM_NOSLEEP UMEM_DEFAULT
+#define KM_NORMALPRI 0 /* not needed with UMEM_DEFAULT */
+#define KMC_NODEBUG UMC_NODEBUG
+#define KMC_KVMEM 0x0
+#define KMC_RECLAIMABLE 0x0
+#define kmem_alloc(_s, _f) umem_alloc(_s, _f)
+#define kmem_zalloc(_s, _f) umem_zalloc(_s, _f)
+#define kmem_free(_b, _s) umem_free(_b, _s)
+#define vmem_alloc(_s, _f) kmem_alloc(_s, _f)
+#define vmem_zalloc(_s, _f) kmem_zalloc(_s, _f)
+#define vmem_free(_b, _s) kmem_free(_b, _s)
+#define kmem_cache_create(_a, _b, _c, _d, _e, _f, _g, _h, _i) \
+ umem_cache_create(_a, _b, _c, _d, _e, _f, _g, _h, _i)
+#define kmem_cache_destroy(_c) umem_cache_destroy(_c)
+#define kmem_cache_alloc(_c, _f) umem_cache_alloc(_c, _f)
+#define kmem_cache_free(_c, _b) umem_cache_free(_c, _b)
+#define kmem_debugging() 0
+#define kmem_cache_reap_now(_c) umem_cache_reap_now(_c);
+extern int kmem_cache_reap_active(void);
+#define kmem_cache_set_move(_c, _cb) /* nothing */
+#define POINTER_INVALIDATE(_pp) /* nothing */
+#define POINTER_IS_VALID(_p) 0
+
+extern char *kmem_vasprintf(const char *fmt, va_list adx);
+extern char *kmem_asprintf(const char *fmt, ...);
+#define kmem_strfree(str) kmem_free((str), strlen(str) + 1)
+#define kmem_strdup(s) strdup(s)
+
+#ifndef __cplusplus
+extern int kmem_scnprintf(char *restrict str, size_t size,
+ const char *restrict fmt, ...);
+#endif
+
+typedef umem_cache_t kmem_cache_t;
+
+typedef enum kmem_cbrc {
+ KMEM_CBRC_YES,
+ KMEM_CBRC_NO,
+ KMEM_CBRC_LATER,
+ KMEM_CBRC_DONT_NEED,
+ KMEM_CBRC_DONT_KNOW
+} kmem_cbrc_t;
+
+typedef int fstrans_cookie_t;
-#define kmem_alloc(size, flags) ((void) sizeof (flags), malloc(size))
-#define kmem_free(ptr, size) ((void) sizeof (size), free(ptr))
+extern fstrans_cookie_t spl_fstrans_mark(void);
+extern void spl_fstrans_unmark(fstrans_cookie_t);
-#ifdef __cplusplus
+#ifdef __cplusplus
}
#endif
diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/kstat.h b/sys/contrib/openzfs/lib/libspl/include/sys/kstat.h
index 7777888c31eb..361f24df3f58 100644
--- a/sys/contrib/openzfs/lib/libspl/include/sys/kstat.h
+++ b/sys/contrib/openzfs/lib/libspl/include/sys/kstat.h
@@ -27,758 +27,65 @@
#ifndef _SYS_KSTAT_H
#define _SYS_KSTAT_H
-
-
-/*
- * Definition of general kernel statistics structures and /dev/kstat ioctls
- */
-
#include <sys/types.h>
#include <sys/time.h>
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef int kid_t; /* unique kstat id */
-
-/*
- * Kernel statistics driver (/dev/kstat) ioctls
- */
-
-#define KSTAT_IOC_BASE ('K' << 8)
-
-#define KSTAT_IOC_CHAIN_ID KSTAT_IOC_BASE | 0x01
-#define KSTAT_IOC_READ KSTAT_IOC_BASE | 0x02
-#define KSTAT_IOC_WRITE KSTAT_IOC_BASE | 0x03
-
-/*
- * /dev/kstat ioctl usage (kd denotes /dev/kstat descriptor):
- *
- * kcid = ioctl(kd, KSTAT_IOC_CHAIN_ID, NULL);
- * kcid = ioctl(kd, KSTAT_IOC_READ, kstat_t *);
- * kcid = ioctl(kd, KSTAT_IOC_WRITE, kstat_t *);
- */
-
#define KSTAT_STRLEN 255 /* 254 chars + NULL; must be 16 * n - 1 */
-/*
- * The generic kstat header
- */
-
typedef struct kstat {
- /*
- * Fields relevant to both kernel and user
- */
- hrtime_t ks_crtime; /* creation time (from gethrtime()) */
- struct kstat *ks_next; /* kstat chain linkage */
- kid_t ks_kid; /* unique kstat ID */
- char ks_module[KSTAT_STRLEN]; /* provider module name */
- uchar_t ks_resv; /* reserved, currently just padding */
- int ks_instance; /* provider module's instance */
- char ks_name[KSTAT_STRLEN]; /* kstat name */
- uchar_t ks_type; /* kstat data type */
- char ks_class[KSTAT_STRLEN]; /* kstat class */
- uchar_t ks_flags; /* kstat flags */
- void *ks_data; /* kstat type-specific data */
- uint_t ks_ndata; /* # of type-specific data records */
- size_t ks_data_size; /* total size of kstat data section */
- hrtime_t ks_snaptime; /* time of last data snapshot */
- /*
- * Fields relevant to kernel only
- */
- int (*ks_update)(struct kstat *, int); /* dynamic update */
- void *ks_private; /* arbitrary provider-private data */
- int (*ks_snapshot)(struct kstat *, void *, int);
- void *ks_lock; /* protects this kstat's data */
+ uchar_t ks_flags;
+ void *ks_data;
+ uint_t ks_ndata;
+ size_t ks_data_size;
+ int (*ks_update)(struct kstat *, int);
+ void *ks_private;
+ void *ks_lock;
} kstat_t;
-/*
- * kstat structure and locking strategy
- *
- * Each kstat consists of a header section (a kstat_t) and a data section.
- * The system maintains a set of kstats, protected by kstat_chain_lock.
- * kstat_chain_lock protects all additions to/deletions from this set,
- * as well as all changes to kstat headers. kstat data sections are
- * *optionally* protected by the per-kstat ks_lock. If ks_lock is non-NULL,
- * kstat clients (e.g. /dev/kstat) will acquire this lock for all of their
- * operations on that kstat. It is up to the kstat provider to decide whether
- * guaranteeing consistent data to kstat clients is sufficiently important
- * to justify the locking cost. Note, however, that most statistic updates
- * already occur under one of the provider's mutexes, so if the provider sets
- * ks_lock to point to that mutex, then kstat data locking is free.
- *
- * NOTE: variable-size kstats MUST employ kstat data locking, to prevent
- * data-size races with kstat clients.
- *
- * NOTE: ks_lock is really of type (kmutex_t *); it is declared as (void *)
- * in the kstat header so that users don't have to be exposed to all of the
- * kernel's lock-related data structures.
- */
-
-#if defined(_KERNEL)
-
-#define KSTAT_ENTER(k) \
- { kmutex_t *lp = (k)->ks_lock; if (lp) mutex_enter(lp); }
-
-#define KSTAT_EXIT(k) \
- { kmutex_t *lp = (k)->ks_lock; if (lp) mutex_exit(lp); }
-
-#define KSTAT_UPDATE(k, rw) (*(k)->ks_update)((k), (rw))
-
-#define KSTAT_SNAPSHOT(k, buf, rw) (*(k)->ks_snapshot)((k), (buf), (rw))
-
-#endif /* defined(_KERNEL) */
-
-/*
- * kstat time
- *
- * All times associated with kstats (e.g. creation time, snapshot time,
- * kstat_timer_t and kstat_io_t timestamps, etc.) are 64-bit nanosecond values,
- * as returned by gethrtime(). The accuracy of these timestamps is machine
- * dependent, but the precision (units) is the same across all platforms.
- */
-
-/*
- * kstat identity (KID)
- *
- * Each kstat is assigned a unique KID (kstat ID) when it is added to the
- * global kstat chain. The KID is used as a cookie by /dev/kstat to
- * request information about the corresponding kstat. There is also
- * an identity associated with the entire kstat chain, kstat_chain_id,
- * which is bumped each time a kstat is added or deleted. /dev/kstat uses
- * the chain ID to detect changes in the kstat chain (e.g., a new disk
- * coming online) between ioctl()s.
- */
-
-/*
- * kstat module, kstat instance
- *
- * ks_module and ks_instance contain the name and instance of the module
- * that created the kstat. In cases where there can only be one instance,
- * ks_instance is 0. The kernel proper (/kernel/unix) uses "unix" as its
- * module name.
- */
-
-/*
- * kstat name
- *
- * ks_name gives a meaningful name to a kstat. The full kstat namespace
- * is module.instance.name, so the name only need be unique within a
- * module. kstat_create() will fail if you try to create a kstat with
- * an already-used (ks_module, ks_instance, ks_name) triplet. Spaces are
- * allowed in kstat names, but strongly discouraged, since they hinder
- * awk-style processing at user level.
- */
-
-/*
- * kstat type
- *
- * The kstat mechanism provides several flavors of kstat data, defined
- * below. The "raw" kstat type is just treated as an array of bytes; you
- * can use this to export any kind of data you want.
- *
- * Some kstat types allow multiple data structures per kstat, e.g.
- * KSTAT_TYPE_NAMED; others do not. This is part of the spec for each
- * kstat data type.
- *
- * User-level tools should *not* rely on the #define KSTAT_NUM_TYPES. To
- * get this information, read out the standard system kstat "kstat_types".
- */
-
-#define KSTAT_TYPE_RAW 0 /* can be anything */
- /* ks_ndata >= 1 */
-#define KSTAT_TYPE_NAMED 1 /* name/value pair */
- /* ks_ndata >= 1 */
-#define KSTAT_TYPE_INTR 2 /* interrupt statistics */
- /* ks_ndata == 1 */
-#define KSTAT_TYPE_IO 3 /* I/O statistics */
- /* ks_ndata == 1 */
-#define KSTAT_TYPE_TIMER 4 /* event timer */
- /* ks_ndata >= 1 */
-
-#define KSTAT_NUM_TYPES 5
-
-/*
- * kstat class
- *
- * Each kstat can be characterized as belonging to some broad class
- * of statistics, e.g. disk, tape, net, vm, streams, etc. This field
- * can be used as a filter to extract related kstats. The following
- * values are currently in use: disk, tape, net, controller, vm, kvm,
- * hat, streams, kstat, and misc. (The kstat class encompasses things
- * like kstat_types.)
- */
-
-/*
- * kstat flags
- *
- * Any of the following flags may be passed to kstat_create(). They are
- * all zero by default.
- *
- * KSTAT_FLAG_VIRTUAL:
- *
- * Tells kstat_create() not to allocate memory for the
- * kstat data section; instead, you will set the ks_data
- * field to point to the data you wish to export. This
- * provides a convenient way to export existing data
- * structures.
- *
- * KSTAT_FLAG_VAR_SIZE:
- *
- * The size of the kstat you are creating will vary over time.
- * For example, you may want to use the kstat mechanism to
- * export a linked list. NOTE: The kstat framework does not
- * manage the data section, so all variable-size kstats must be
- * virtual kstats. Moreover, variable-size kstats MUST employ
- * kstat data locking to prevent data-size races with kstat
- * clients. See the section on "kstat snapshot" for details.
- *
- * KSTAT_FLAG_WRITABLE:
- *
- * Makes the kstat's data section writable by root.
- * The ks_snapshot routine (see below) does not need to check for
- * this; permission checking is handled in the kstat driver.
- *
- * KSTAT_FLAG_PERSISTENT:
- *
- * Indicates that this kstat is to be persistent over time.
- * For persistent kstats, kstat_delete() simply marks the
- * kstat as dormant; a subsequent kstat_create() reactivates
- * the kstat. This feature is provided so that statistics
- * are not lost across driver close/open (e.g., raw disk I/O
- * on a disk with no mounted partitions.)
- * NOTE: Persistent kstats cannot be virtual, since ks_data
- * points to garbage as soon as the driver goes away.
- *
- * The following flags are maintained by the kstat framework:
- *
- * KSTAT_FLAG_DORMANT:
- *
- * For persistent kstats, indicates that the kstat is in the
- * dormant state (e.g., the corresponding device is closed).
- *
- * KSTAT_FLAG_INVALID:
- *
- * This flag is set when a kstat is in a transitional state,
- * e.g. between kstat_create() and kstat_install().
- * kstat clients must not attempt to access the kstat's data
- * if this flag is set.
- */
+#define KSTAT_TYPE_RAW 0
+#define KSTAT_TYPE_NAMED 1
#define KSTAT_FLAG_VIRTUAL 0x01
-#define KSTAT_FLAG_VAR_SIZE 0x02
-#define KSTAT_FLAG_WRITABLE 0x04
-#define KSTAT_FLAG_PERSISTENT 0x08
-#define KSTAT_FLAG_DORMANT 0x10
-#define KSTAT_FLAG_INVALID 0x20
-#define KSTAT_FLAG_LONGSTRINGS 0x40
#define KSTAT_FLAG_NO_HEADERS 0x80
-/*
- * Dynamic update support
- *
- * The kstat mechanism allows for an optional ks_update function to update
- * kstat data. This is useful for drivers where the underlying device
- * keeps cheap hardware stats, but extraction is expensive. Instead of
- * constantly keeping the kstat data section up to date, you can supply a
- * ks_update function which updates the kstat's data section on demand.
- * To take advantage of this feature, simply set the ks_update field before
- * calling kstat_install().
- *
- * The ks_update function, if supplied, must have the following structure:
- *
- * int
- * foo_kstat_update(kstat_t *ksp, int rw)
- * {
- * if (rw == KSTAT_WRITE) {
- * ... update the native stats from ksp->ks_data;
- * return EACCES if you don't support this
- * } else {
- * ... update ksp->ks_data from the native stats
- * }
- * }
- *
- * The ks_update return codes are: 0 for success, EACCES if you don't allow
- * KSTAT_WRITE, and EIO for any other type of error.
- *
- * In general, the ks_update function may need to refer to provider-private
- * data; for example, it may need a pointer to the provider's raw statistics.
- * The ks_private field is available for this purpose. Its use is entirely
- * at the provider's discretion.
- *
- * All variable-size kstats MUST supply a ks_update routine, which computes
- * and sets ks_data_size (and ks_ndata if that is meaningful), since these
- * are needed to perform kstat snapshots (see below).
- *
- * No kstat locking should be done inside the ks_update routine. The caller
- * will already be holding the kstat's ks_lock (to ensure consistent data).
- */
-
#define KSTAT_READ 0
#define KSTAT_WRITE 1
-/*
- * Kstat snapshot
- *
- * In order to get a consistent view of a kstat's data, clients must obey
- * the kstat's locking strategy. However, these clients may need to perform
- * operations on the data which could cause a fault (e.g. copyout()), or
- * operations which are simply expensive. Doing so could cause deadlock
- * (e.g. if you're holding a disk's kstat lock which is ultimately required
- * to resolve a copyout() fault), performance degradation (since the providers'
- * activity is serialized at the kstat lock), device timing problems, etc.
- *
- * To avoid these problems, kstat data is provided via snapshots. Taking
- * a snapshot is a simple process: allocate a wired-down kernel buffer,
- * acquire the kstat's data lock, copy the data into the buffer ("take the
- * snapshot"), and release the lock. This ensures that the kstat's data lock
- * will be held as briefly as possible, and that no faults will occur while
- * the lock is held.
- *
- * Normally, the snapshot is taken by default_kstat_snapshot(), which
- * timestamps the data (sets ks_snaptime), copies it, and does a little
- * massaging to deal with incomplete transactions on i/o kstats. However,
- * this routine only works for kstats with contiguous data (the typical case).
- * If you create a kstat whose data is, say, a linked list, you must provide
- * your own ks_snapshot routine. The routine you supply must have the
- * following prototype (replace "foo" with something appropriate):
- *
- * int foo_kstat_snapshot(kstat_t *ksp, void *buf, int rw);
- *
- * The minimal snapshot routine -- one which copies contiguous data that
- * doesn't need any massaging -- would be this:
- *
- * ksp->ks_snaptime = gethrtime();
- * if (rw == KSTAT_WRITE)
- * memcpy(ksp->ks_data, buf, ksp->ks_data_size);
- * else
- * memcpy(buf, ksp->ks_data, ksp->ks_data_size);
- * return (0);
- *
- * A more illuminating example is taking a snapshot of a linked list:
- *
- * ksp->ks_snaptime = gethrtime();
- * if (rw == KSTAT_WRITE)
- * return (EACCES); ... See below ...
- * for (foo = first_foo; foo; foo = foo->next) {
- * memcpy(buf, foo, sizeof (struct foo));
- * buf = ((struct foo *) buf) + 1;
- * }
- * return (0);
- *
- * In the example above, we have decided that we don't want to allow
- * KSTAT_WRITE access, so we return EACCES if this is attempted.
- *
- * The key points are:
- *
- * (1) ks_snaptime must be set (via gethrtime()) to timestamp the data.
- * (2) Data gets copied from the kstat to the buffer on KSTAT_READ,
- * and from the buffer to the kstat on KSTAT_WRITE.
- * (3) ks_snapshot return values are: 0 for success, EACCES if you
- * don't allow KSTAT_WRITE, and EIO for any other type of error.
- *
- * Named kstats (see section on "Named statistics" below) containing long
- * strings (KSTAT_DATA_STRING) need special handling. The kstat driver
- * assumes that all strings are copied into the buffer after the array of
- * named kstats, and the pointers (KSTAT_NAMED_STR_PTR()) are updated to point
- * into the copy within the buffer. The default snapshot routine does this,
- * but overriding routines should contain at least the following:
- *
- * if (rw == KSTAT_READ) {
- * kstat_named_t *knp = buf;
- * char *end = knp + ksp->ks_ndata;
- * uint_t i;
- *
- * ... Do the regular copy ...
- * 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) {
- * memcpy(end, KSTAT_NAMED_STR_PTR(knp),
- * KSTAT_NAMED_STR_BUFLEN(knp));
- * KSTAT_NAMED_STR_PTR(knp) = end;
- * end += KSTAT_NAMED_STR_BUFLEN(knp);
- * }
- * }
- */
-
-/*
- * Named statistics.
- *
- * List of arbitrary name=value statistics.
- */
-
typedef struct kstat_named {
- char name[KSTAT_STRLEN]; /* name of counter */
- uchar_t data_type; /* data type */
+ char name[KSTAT_STRLEN];
+ uchar_t data_type;
union {
- char c[16]; /* enough for 128-bit ints */
- int32_t i32;
- uint32_t ui32;
struct {
union {
- char *ptr; /* NULL-term string */
-#if defined(_KERNEL) && defined(_MULTI_DATAMODEL)
- caddr32_t ptr32;
-#endif
- char __pad[8]; /* 64-bit padding */
+ char *ptr;
+ char __pad[8];
} addr;
- uint32_t len; /* # bytes for strlen + '\0' */
+ uint32_t len;
} str;
-/*
- * The int64_t and uint64_t types are not valid for a maximally conformant
- * 32-bit compilation environment (cc -Xc) using compilers prior to the
- * introduction of C99 conforming compiler (reference ISO/IEC 9899:1990).
- * In these cases, the visibility of i64 and ui64 is only permitted for
- * 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/inttypes.h).
- */
-#if defined(_INT64_TYPE)
int64_t i64;
uint64_t ui64;
-#endif
- long l;
- ulong_t ul;
-
- /* These structure members are obsolete */
-
- longlong_t ll;
- u_longlong_t ull;
- float f;
- double d;
- } value; /* value of counter */
+ } value;
} kstat_named_t;
-#define KSTAT_DATA_CHAR 0
-#define KSTAT_DATA_INT32 1
#define KSTAT_DATA_UINT32 2
#define KSTAT_DATA_INT64 3
#define KSTAT_DATA_UINT64 4
-
-#if !defined(_LP64)
-#define KSTAT_DATA_LONG KSTAT_DATA_INT32
-#define KSTAT_DATA_ULONG KSTAT_DATA_UINT32
-#else
-#if !defined(_KERNEL)
-#define KSTAT_DATA_LONG KSTAT_DATA_INT64
-#define KSTAT_DATA_ULONG KSTAT_DATA_UINT64
-#else
-#define KSTAT_DATA_LONG 7 /* only visible to the kernel */
-#define KSTAT_DATA_ULONG 8 /* only visible to the kernel */
-#endif /* !_KERNEL */
-#endif /* !_LP64 */
-
-/*
- * Statistics exporting named kstats with long strings (KSTAT_DATA_STRING)
- * may not make the assumption that ks_data_size is equal to (ks_ndata * sizeof
- * (kstat_named_t)). ks_data_size in these cases is equal to the sum of the
- * amount of space required to store the strings (ie, the sum of
- * KSTAT_NAMED_STR_BUFLEN() for all KSTAT_DATA_STRING statistics) plus the
- * space required to store the kstat_named_t's.
- *
- * The default update routine will update ks_data_size automatically for
- * variable-length kstats containing long strings (using the default update
- * routine only makes sense if the string is the only thing that is changing
- * in size, and ks_ndata is constant). Fixed-length kstats containing long
- * strings must explicitly change ks_data_size (after creation but before
- * initialization) to reflect the correct amount of space required for the
- * long strings and the kstat_named_t's.
- */
#define KSTAT_DATA_STRING 9
-/* These types are obsolete */
-
-#define KSTAT_DATA_LONGLONG KSTAT_DATA_INT64
-#define KSTAT_DATA_ULONGLONG KSTAT_DATA_UINT64
-#define KSTAT_DATA_FLOAT 5
-#define KSTAT_DATA_DOUBLE 6
-
-#define KSTAT_NAMED_PTR(kptr) ((kstat_named_t *)(kptr)->ks_data)
-
-/*
- * Retrieve the pointer of the string contained in the given named kstat.
- */
-#define KSTAT_NAMED_STR_PTR(knptr) ((knptr)->value.str.addr.ptr)
-
-/*
- * Retrieve the length of the buffer required to store the string in the given
- * named kstat.
- */
-#define KSTAT_NAMED_STR_BUFLEN(knptr) ((knptr)->value.str.len)
+#define KSTAT_NAMED_PTR(kptr) ((kstat_named_t *)(kptr)->ks_data)
+#define KSTAT_NAMED_STR_PTR(knptr) ((knptr)->value.str.addr.ptr)
+#define KSTAT_NAMED_STR_BUFLEN(knptr) ((knptr)->value.str.len)
/*
- * Interrupt statistics.
- *
- * An interrupt is a hard interrupt (sourced from the hardware device
- * itself), a soft interrupt (induced by the system via the use of
- * some system interrupt source), a watchdog interrupt (induced by
- * a periodic timer call), spurious (an interrupt entry point was
- * entered but there was no interrupt condition to service),
- * or multiple service (an interrupt condition was detected and
- * serviced just prior to returning from any of the other types).
- *
- * Measurement of the spurious class of interrupts is useful for
- * autovectored devices in order to pinpoint any interrupt latency
- * problems in a particular system configuration.
- *
- * Devices that have more than one interrupt of the same
- * type should use multiple structures.
+ * kstat creation, installation and deletion
*/
-
-#define KSTAT_INTR_HARD 0
-#define KSTAT_INTR_SOFT 1
-#define KSTAT_INTR_WATCHDOG 2
-#define KSTAT_INTR_SPURIOUS 3
-#define KSTAT_INTR_MULTSVC 4
-
-#define KSTAT_NUM_INTRS 5
-
-typedef struct kstat_intr {
- uint_t intrs[KSTAT_NUM_INTRS]; /* interrupt counters */
-} kstat_intr_t;
-
-#define KSTAT_INTR_PTR(kptr) ((kstat_intr_t *)(kptr)->ks_data)
-
-/*
- * I/O statistics.
- */
-
-typedef struct kstat_io {
-
- /*
- * Basic counters.
- *
- * The counters should be updated at the end of service
- * (e.g., just prior to calling biodone()).
- */
-
- u_longlong_t nread; /* number of bytes read */
- u_longlong_t nwritten; /* number of bytes written */
- uint_t reads; /* number of read operations */
- uint_t writes; /* number of write operations */
-
- /*
- * Accumulated time and queue length statistics.
- *
- * Accumulated time statistics are kept as a running sum
- * of "active" time. Queue length statistics are kept as a
- * running sum of the product of queue length and elapsed time
- * at that length -- i.e., a Riemann sum for queue length
- * integrated against time. (You can also think of the active time
- * as a Riemann sum, for the boolean function (queue_length > 0)
- * integrated against time, or you can think of it as the
- * Lebesgue measure of the set on which queue_length > 0.)
- *
- * ^
- * | _________
- * 8 | i4 |
- * | | |
- * Queue 6 | |
- * Length | _________ | |
- * 4 | i2 |_______| |
- * | | i3 |
- * 2_______| |
- * | i1 |
- * |_______________________________|
- * Time-> t1 t2 t3 t4
- *
- * At each change of state (entry or exit from the queue),
- * we add the elapsed time (since the previous state change)
- * to the active time if the queue length was non-zero during
- * that interval; and we add the product of the elapsed time
- * times the queue length to the running length*time sum.
- *
- * This method is generalizable to measuring residency
- * in any defined system: instead of queue lengths, think
- * of "outstanding RPC calls to server X".
- *
- * A large number of I/O subsystems have at least two basic
- * "lists" of transactions they manage: one for transactions
- * that have been accepted for processing but for which processing
- * has yet to begin, and one for transactions which are actively
- * being processed (but not done). For this reason, two cumulative
- * time statistics are defined here: wait (pre-service) time,
- * and run (service) time.
- *
- * All times are 64-bit nanoseconds (hrtime_t), as returned by
- * gethrtime().
- *
- * The units of cumulative busy time are accumulated nanoseconds.
- * The units of cumulative length*time products are elapsed time
- * times queue length.
- *
- * Updates to the fields below are performed implicitly by calls to
- * these five functions:
- *
- * kstat_waitq_enter()
- * kstat_waitq_exit()
- * kstat_runq_enter()
- * kstat_runq_exit()
- *
- * kstat_waitq_to_runq() (see below)
- * kstat_runq_back_to_waitq() (see below)
- *
- * Since kstat_waitq_exit() is typically followed immediately
- * by kstat_runq_enter(), there is a single kstat_waitq_to_runq()
- * function which performs both operations. This is a performance
- * win since only one timestamp is required.
- *
- * In some instances, it may be necessary to move a request from
- * the run queue back to the wait queue, e.g. for write throttling.
- * For these situations, call kstat_runq_back_to_waitq().
- *
- * These fields should never be updated by any other means.
- */
-
- hrtime_t wtime; /* cumulative wait (pre-service) time */
- hrtime_t wlentime; /* cumulative wait length*time product */
- hrtime_t wlastupdate; /* last time wait queue changed */
- hrtime_t rtime; /* cumulative run (service) time */
- hrtime_t rlentime; /* cumulative run length*time product */
- hrtime_t rlastupdate; /* last time run queue changed */
-
- uint_t wcnt; /* count of elements in wait state */
- uint_t rcnt; /* count of elements in run state */
-
-} kstat_io_t;
-
-#define KSTAT_IO_PTR(kptr) ((kstat_io_t *)(kptr)->ks_data)
-
-/*
- * Event timer statistics - cumulative elapsed time and number of events.
- *
- * Updates to these fields are performed implicitly by calls to
- * kstat_timer_start() and kstat_timer_stop().
- */
-
-typedef struct kstat_timer {
- char name[KSTAT_STRLEN]; /* event name */
- uchar_t resv; /* reserved */
- u_longlong_t num_events; /* number of events */
- hrtime_t elapsed_time; /* cumulative elapsed time */
- hrtime_t min_time; /* shortest event duration */
- hrtime_t max_time; /* longest event duration */
- hrtime_t start_time; /* previous event start time */
- hrtime_t stop_time; /* previous event stop time */
-} kstat_timer_t;
-
-#define KSTAT_TIMER_PTR(kptr) ((kstat_timer_t *)(kptr)->ks_data)
-
-#if defined(_KERNEL)
-
-#include <sys/t_lock.h>
-
-extern kid_t kstat_chain_id; /* bumped at each state change */
-extern void kstat_init(void); /* initialize kstat framework */
-
-/*
- * Adding and deleting kstats.
- *
- * The typical sequence to add a kstat is:
- *
- * ksp = kstat_create(module, instance, name, class, type, ndata, flags);
- * if (ksp) {
- * ... provider initialization, if necessary
- * kstat_install(ksp);
- * }
- *
- * There are three logically distinct steps here:
- *
- * Step 1: System Initialization (kstat_create)
- *
- * kstat_create() performs system initialization. kstat_create()
- * allocates memory for the entire kstat (header plus data), initializes
- * all header fields, initializes the data section to all zeroes, assigns
- * a unique KID, and puts the kstat onto the system's kstat chain.
- * The returned kstat is marked invalid (KSTAT_FLAG_INVALID is set),
- * because the provider (caller) has not yet had a chance to initialize
- * the data section.
- *
- * By default, kstats are exported to all zones on the system. A kstat may be
- * created via kstat_create_zone() to specify a zone to which the statistics
- * should be exported. kstat_zone_add() may be used to specify additional
- * zones to which the statistics are to be exported.
- *
- * Step 2: Provider Initialization
- *
- * The provider performs any necessary initialization of the data section,
- * e.g. setting the name fields in a KSTAT_TYPE_NAMED. Virtual kstats set
- * the ks_data field at this time. The provider may also set the ks_update,
- * ks_snapshot, ks_private, and ks_lock fields if necessary.
- *
- * Step 3: Installation (kstat_install)
- *
- * Once the kstat is completely initialized, kstat_install() clears the
- * INVALID flag, thus making the kstat accessible to the outside world.
- * kstat_install() also clears the DORMANT flag for persistent kstats.
- *
- * Removing a kstat from the system
- *
- * kstat_delete(ksp) removes ksp from the kstat chain and frees all
- * associated system resources. NOTE: When you call kstat_delete(),
- * you must NOT be holding that kstat's ks_lock. Otherwise, you may
- * deadlock with a kstat reader.
- *
- * Persistent kstats
- *
- * From the provider's point of view, persistence is transparent. The only
- * difference between ephemeral (normal) kstats and persistent kstats
- * is that you pass KSTAT_FLAG_PERSISTENT to kstat_create(). Magically,
- * this has the effect of making your data visible even when you're
- * not home. Persistence is important to tools like iostat, which want
- * to get a meaningful picture of disk activity. Without persistence,
- * raw disk i/o statistics could never accumulate: they would come and
- * go with each open/close of the raw device.
- *
- * The magic of persistence works by slightly altering the behavior of
- * kstat_create() and kstat_delete(). The first call to kstat_create()
- * creates a new kstat, as usual. However, kstat_delete() does not
- * actually delete the kstat: it performs one final update of the data
- * (i.e., calls the ks_update routine), marks the kstat as dormant, and
- * sets the ks_lock, ks_update, ks_private, and ks_snapshot fields back
- * to their default values (since they might otherwise point to garbage,
- * e.g. if the provider is going away). kstat clients can still access
- * the dormant kstat just like a live kstat; they just continue to see
- * the final data values as long as the kstat remains dormant.
- * All subsequent kstat_create() calls simply find the already-existing,
- * dormant kstat and return a pointer to it, without altering any fields.
- * The provider then performs its usual initialization sequence, and
- * calls kstat_install(). kstat_install() uses the old data values to
- * initialize the native data (i.e., ks_update is called with KSTAT_WRITE),
- * thus making it seem like you were never gone.
- */
-
-extern kstat_t *kstat_create(const char *, int, const char *, const char *,
- uchar_t, uint_t, uchar_t);
-extern kstat_t *kstat_create_zone(const char *, int, const char *,
- const char *, uchar_t, uint_t, uchar_t, zoneid_t);
+extern kstat_t *kstat_create(const char *, int,
+ const char *, const char *, uchar_t, ulong_t, uchar_t);
extern void kstat_install(kstat_t *);
extern void kstat_delete(kstat_t *);
-extern void kstat_named_setstr(kstat_named_t *knp, const char *src);
-extern void kstat_set_string(char *, const char *);
-extern void kstat_delete_byname(const char *, int, const char *);
-extern void kstat_delete_byname_zone(const char *, int, const char *, zoneid_t);
-extern void kstat_named_init(kstat_named_t *, const char *, uchar_t);
-extern void kstat_timer_init(kstat_timer_t *, const char *);
-extern void kstat_timer_start(kstat_timer_t *);
-extern void kstat_timer_stop(kstat_timer_t *);
-
-extern void kstat_zone_add(kstat_t *, zoneid_t);
-extern void kstat_zone_remove(kstat_t *, zoneid_t);
-extern int kstat_zone_find(kstat_t *, zoneid_t);
-
-extern kstat_t *kstat_hold_bykid(kid_t kid, zoneid_t);
-extern kstat_t *kstat_hold_byname(const char *, int, const char *, zoneid_t);
-extern void kstat_rele(kstat_t *);
-
-#endif /* defined(_KERNEL) */
-
-#ifdef __cplusplus
-}
-#endif
+extern 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));
#endif /* _SYS_KSTAT_H */
diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/misc.h b/sys/contrib/openzfs/lib/libspl/include/sys/misc.h
new file mode 100644
index 000000000000..171bbc1de798
--- /dev/null
+++ b/sys/contrib/openzfs/lib/libspl/include/sys/misc.h
@@ -0,0 +1,40 @@
+// 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 2011 Nexenta Systems, Inc. All rights reserved.
+ * Copyright (c) 2012, 2018 by Delphix. All rights reserved.
+ * Copyright (c) 2012, Joyent, Inc. All rights reserved.
+ */
+
+#ifndef _LIBSPL_SYS_MISC_H
+#define _LIBSPL_SYS_MISC_H
+
+#include <sys/utsname.h>
+
+/*
+ * Hostname information
+ */
+typedef struct utsname utsname_t;
+extern utsname_t *utsname(void);
+
+#endif
diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/mutex.h b/sys/contrib/openzfs/lib/libspl/include/sys/mutex.h
new file mode 100644
index 000000000000..1da0e632d60f
--- /dev/null
+++ b/sys/contrib/openzfs/lib/libspl/include/sys/mutex.h
@@ -0,0 +1,58 @@
+// 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 2011 Nexenta Systems, Inc. All rights reserved.
+ * Copyright (c) 2012, 2018 by Delphix. All rights reserved.
+ * Copyright (c) 2012, Joyent, Inc. All rights reserved.
+ */
+
+#ifndef _SYS_MUTEX_H
+#define _SYS_MUTEX_H
+
+#include <pthread.h>
+
+/*
+ * Mutexes
+ */
+typedef struct kmutex {
+ pthread_mutex_t m_lock;
+ pthread_t m_owner;
+} kmutex_t;
+
+#define MUTEX_DEFAULT 0
+#define MUTEX_NOLOCKDEP MUTEX_DEFAULT
+#define MUTEX_HELD(mp) pthread_equal((mp)->m_owner, pthread_self())
+#define MUTEX_NOT_HELD(mp) !MUTEX_HELD(mp)
+
+extern void mutex_init(kmutex_t *mp, char *name, int type, void *cookie);
+extern void mutex_destroy(kmutex_t *mp);
+extern void mutex_enter(kmutex_t *mp);
+extern int mutex_enter_check_return(kmutex_t *mp);
+extern void mutex_exit(kmutex_t *mp);
+extern int mutex_tryenter(kmutex_t *mp);
+
+#define NESTED_SINGLE 1
+#define mutex_enter_nested(mp, class) mutex_enter(mp)
+#define mutex_enter_interruptible(mp) mutex_enter_check_return(mp)
+
+#endif /* _SYS_MUTEX_H */
diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/procfs_list.h b/sys/contrib/openzfs/lib/libspl/include/sys/procfs_list.h
new file mode 100644
index 000000000000..144a8a22b9b5
--- /dev/null
+++ b/sys/contrib/openzfs/lib/libspl/include/sys/procfs_list.h
@@ -0,0 +1,71 @@
+// 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 2011 Nexenta Systems, Inc. All rights reserved.
+ * Copyright (c) 2012, 2018 by Delphix. All rights reserved.
+ * Copyright (c) 2012, Joyent, Inc. All rights reserved.
+ */
+
+#ifndef _SYS_PROCFS_LIST_H
+#define _SYS_PROCFS_LIST_H
+
+#include <sys/types.h>
+#include <sys/mutex.h>
+#include <sys/list.h>
+
+/*
+ * procfs list manipulation
+ */
+
+typedef struct procfs_list {
+ void *pl_private;
+ kmutex_t pl_lock;
+ list_t pl_list;
+ uint64_t pl_next_id;
+ size_t pl_node_offset;
+} procfs_list_t;
+
+#ifndef __cplusplus
+struct seq_file { };
+void seq_printf(struct seq_file *m, const char *fmt, ...);
+
+typedef struct procfs_list_node {
+ list_node_t pln_link;
+ uint64_t pln_id;
+} procfs_list_node_t;
+
+void procfs_list_install(const char *module,
+ const char *submodule,
+ const char *name,
+ mode_t mode,
+ procfs_list_t *procfs_list,
+ int (*show)(struct seq_file *f, void *p),
+ int (*show_header)(struct seq_file *f),
+ int (*clear)(procfs_list_t *procfs_list),
+ size_t procfs_list_node_off);
+void procfs_list_uninstall(procfs_list_t *procfs_list);
+void procfs_list_destroy(procfs_list_t *procfs_list);
+void procfs_list_add(procfs_list_t *procfs_list, void *p);
+#endif
+
+#endif /* _SYS_PROCFS_LIST_H */
diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/random.h b/sys/contrib/openzfs/lib/libspl/include/sys/random.h
new file mode 100644
index 000000000000..09ca0662d1a3
--- /dev/null
+++ b/sys/contrib/openzfs/lib/libspl/include/sys/random.h
@@ -0,0 +1,54 @@
+// 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 2011 Nexenta Systems, Inc. All rights reserved.
+ * Copyright (c) 2012, 2018 by Delphix. All rights reserved.
+ * Copyright (c) 2012, Joyent, Inc. All rights reserved.
+ */
+
+#ifndef _SYS_RANDOM_H
+#define _SYS_RANDOM_H
+
+extern int random_get_bytes(uint8_t *ptr, size_t len);
+extern int random_get_pseudo_bytes(uint8_t *ptr, size_t len);
+
+extern void random_force_pseudo(boolean_t onoff);
+
+static __inline__ uint32_t
+random_in_range(uint32_t range)
+{
+ uint32_t r;
+
+#if !defined(__APPLE__) || !defined(IN_BASE)
+ ASSERT(range != 0);
+#endif
+
+ if (range == 1)
+ return (0);
+
+ (void) random_get_pseudo_bytes((uint8_t *)&r, sizeof (r));
+
+ return (r % range);
+}
+
+#endif /* _SYS_RANDOM_H */
diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/rwlock.h b/sys/contrib/openzfs/lib/libspl/include/sys/rwlock.h
new file mode 100644
index 000000000000..9f82f270d939
--- /dev/null
+++ b/sys/contrib/openzfs/lib/libspl/include/sys/rwlock.h
@@ -0,0 +1,62 @@
+// 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 2011 Nexenta Systems, Inc. All rights reserved.
+ * Copyright (c) 2012, 2018 by Delphix. All rights reserved.
+ * Copyright (c) 2012, Joyent, Inc. All rights reserved.
+ */
+
+#ifndef _SYS_RWLOCK_H
+#define _SYS_RWLOCK_H
+
+#include <pthread.h>
+
+/*
+ * RW locks
+ */
+typedef struct krwlock {
+ pthread_rwlock_t rw_lock;
+ pthread_t rw_owner;
+ uint_t rw_readers;
+} krwlock_t;
+
+typedef int krw_t;
+
+#define RW_READER 0
+#define RW_WRITER 1
+#define RW_DEFAULT RW_READER
+#define RW_NOLOCKDEP RW_READER
+
+#define RW_READ_HELD(rw) ((rw)->rw_readers > 0)
+#define RW_WRITE_HELD(rw) pthread_equal((rw)->rw_owner, pthread_self())
+#define RW_LOCK_HELD(rw) (RW_READ_HELD(rw) || RW_WRITE_HELD(rw))
+
+extern void rw_init(krwlock_t *rwlp, char *name, int type, void *arg);
+extern void rw_destroy(krwlock_t *rwlp);
+extern void rw_enter(krwlock_t *rwlp, krw_t rw);
+extern int rw_tryenter(krwlock_t *rwlp, krw_t rw);
+extern int rw_tryupgrade(krwlock_t *rwlp);
+extern void rw_exit(krwlock_t *rwlp);
+#define rw_downgrade(rwlp) do { } while (0)
+
+#endif /* _SYS_RWLOCK_H */
diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/sid.h b/sys/contrib/openzfs/lib/libspl/include/sys/sid.h
new file mode 100644
index 000000000000..74789c5d9a62
--- /dev/null
+++ b/sys/contrib/openzfs/lib/libspl/include/sys/sid.h
@@ -0,0 +1,44 @@
+// 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 2011 Nexenta Systems, Inc. All rights reserved.
+ * Copyright (c) 2012, 2018 by Delphix. All rights reserved.
+ * Copyright (c) 2012, Joyent, Inc. All rights reserved.
+ */
+
+#ifndef _SYS_SID_H
+#define _SYS_SID_H
+
+#include <sys/types.h>
+
+/* SID stuff */
+typedef struct ksiddomain {
+ uint_t kd_ref;
+ uint_t kd_len;
+ char *kd_name;
+} ksiddomain_t;
+
+ksiddomain_t *ksid_lookupdomain(const char *);
+void ksiddomain_rele(ksiddomain_t *);
+
+#endif
diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/simd.h b/sys/contrib/openzfs/lib/libspl/include/sys/simd.h
index 1ef24f5a7d39..4772a5416b2e 100644
--- a/sys/contrib/openzfs/lib/libspl/include/sys/simd.h
+++ b/sys/contrib/openzfs/lib/libspl/include/sys/simd.h
@@ -102,7 +102,9 @@ typedef enum cpuid_inst_sets {
AES,
PCLMULQDQ,
MOVBE,
- SHA_NI
+ SHA_NI,
+ VAES,
+ VPCLMULQDQ
} cpuid_inst_sets_t;
/*
@@ -127,6 +129,8 @@ typedef struct cpuid_feature_desc {
#define _AES_BIT (1U << 25)
#define _PCLMULQDQ_BIT (1U << 1)
#define _MOVBE_BIT (1U << 22)
+#define _VAES_BIT (1U << 9)
+#define _VPCLMULQDQ_BIT (1U << 10)
#define _SHA_NI_BIT (1U << 29)
/*
@@ -157,6 +161,8 @@ static const cpuid_feature_desc_t cpuid_features[] = {
[PCLMULQDQ] = {1U, 0U, _PCLMULQDQ_BIT, ECX },
[MOVBE] = {1U, 0U, _MOVBE_BIT, ECX },
[SHA_NI] = {7U, 0U, _SHA_NI_BIT, EBX },
+ [VAES] = {7U, 0U, _VAES_BIT, ECX },
+ [VPCLMULQDQ] = {7U, 0U, _VPCLMULQDQ_BIT, ECX },
};
/*
@@ -231,6 +237,8 @@ CPUID_FEATURE_CHECK(aes, AES);
CPUID_FEATURE_CHECK(pclmulqdq, PCLMULQDQ);
CPUID_FEATURE_CHECK(movbe, MOVBE);
CPUID_FEATURE_CHECK(shani, SHA_NI);
+CPUID_FEATURE_CHECK(vaes, VAES);
+CPUID_FEATURE_CHECK(vpclmulqdq, VPCLMULQDQ);
/*
* Detect register set support
@@ -382,6 +390,24 @@ zfs_shani_available(void)
}
/*
+ * Check if VAES instruction is available
+ */
+static inline boolean_t
+zfs_vaes_available(void)
+{
+ return (__cpuid_has_vaes());
+}
+
+/*
+ * Check if VPCLMULQDQ instruction is available
+ */
+static inline boolean_t
+zfs_vpclmulqdq_available(void)
+{
+ return (__cpuid_has_vpclmulqdq());
+}
+
+/*
* AVX-512 family of instruction sets:
*
* AVX512F Foundation
diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/string.h b/sys/contrib/openzfs/lib/libspl/include/sys/string.h
index 3b2f5900276f..55ccbd09041a 100644
--- a/sys/contrib/openzfs/lib/libspl/include/sys/string.h
+++ b/sys/contrib/openzfs/lib/libspl/include/sys/string.h
@@ -1 +1,4 @@
+#ifndef _LIBSPL_SYS_STRING_H
+#define _LIBSPL_SYS_STRING_H
#include <string.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 8489c7139bad..48e0b15a4542 100644
--- a/sys/contrib/openzfs/lib/libspl/include/sys/sunddi.h
+++ b/sys/contrib/openzfs/lib/libspl/include/sys/sunddi.h
@@ -21,10 +21,16 @@
* CDDL HEADER END
*/
/*
- * Copyright (c) 2008 by Sun Microsystems, Inc.
+ * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
+ * Copyright (c) 2012, 2018 by Delphix. All rights reserved.
+ * Copyright (c) 2012, Joyent, Inc. All rights reserved.
*/
#ifndef _SYS_SUNDDI_H
#define _SYS_SUNDDI_H
+extern int ddi_strtoull(const char *str, char **nptr, int base,
+ u_longlong_t *result);
+
#endif /* _SYS_SUNDDI_H */
diff --git a/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/sysmacros.h b/sys/contrib/openzfs/lib/libspl/include/sys/sysmacros.h
index 66e0da6b5afe..f67b081c42fa 100644
--- a/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/sysmacros.h
+++ b/sys/contrib/openzfs/lib/libspl/include/sys/sysmacros.h
@@ -3,9 +3,8 @@
* 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 https://opensource.org/licenses/CDDL-1.0.
@@ -21,14 +20,32 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
+ * Copyright (c) 2012, 2018 by Delphix. All rights reserved.
+ * Copyright (c) 2012, Joyent, Inc. All rights reserved.
*/
#ifndef _LIBSPL_SYS_SYSMACROS_H
#define _LIBSPL_SYS_SYSMACROS_H
+#include <stdint.h>
+
+#ifdef __linux__
+/*
+ * On Linux, we need the system-provided sysmacros.h to get the makedev(),
+ * major() and minor() definitions for makedevice() below. FreeBSD does not
+ * have this header, so include_next won't find it and will abort. So, we
+ * protect it with a platform check.
+ */
+#ifndef IN_BASE
#include_next <sys/sysmacros.h>
+#endif
+#endif
+
+#ifdef __FreeBSD__
+#include <sys/param.h>
+#endif
/* common macros */
#ifndef MIN
@@ -94,10 +111,22 @@
#define P2SAMEHIGHBIT_TYPED(x, y, type) \
(((type)(x) ^ (type)(y)) < ((type)(x) & (type)(y)))
+#define max_ncpus 64
+#define boot_ncpus (sysconf(_SC_NPROCESSORS_ONLN))
-/* avoid any possibility of clashing with <stddef.h> version */
-#if defined(_KERNEL) && !defined(_KMEMUSER) && !defined(offsetof)
-#define offsetof(s, m) ((size_t)(&(((s *)0)->m)))
-#endif
+/*
+ * Process priorities as defined by setpriority(2) and getpriority(2).
+ */
+#define minclsyspri 19
+#define defclsyspri 0
+/* Write issue taskq priority. */
+#define wtqclsyspri -19
+#define maxclsyspri -20
+
+#define CPU_SEQID ((uintptr_t)pthread_self() & (max_ncpus - 1))
+#define CPU_SEQID_UNSTABLE CPU_SEQID
+
+extern int lowbit64(uint64_t i);
+extern int highbit64(uint64_t i);
-#endif /* _LIBSPL_SYS_SYSMACROS_H */
+#endif /* _SYS_SYSMACROS_H */
diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/systm.h b/sys/contrib/openzfs/lib/libspl/include/sys/systm.h
new file mode 100644
index 000000000000..f984125c3315
--- /dev/null
+++ b/sys/contrib/openzfs/lib/libspl/include/sys/systm.h
@@ -0,0 +1,36 @@
+// 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 2011 Nexenta Systems, Inc. All rights reserved.
+ * Copyright (c) 2012, 2018 by Delphix. All rights reserved.
+ * Copyright (c) 2012, Joyent, Inc. All rights reserved.
+ */
+
+#ifndef _LIBSPL_SYS_SYSTM_H
+#define _LIBSPL_SYS_SYSTM_H
+
+uint64_t libspl_physmem(void);
+
+#define physmem libspl_physmem()
+
+#endif
diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/taskq.h b/sys/contrib/openzfs/lib/libspl/include/sys/taskq.h
new file mode 100644
index 000000000000..fbe3f388c05f
--- /dev/null
+++ b/sys/contrib/openzfs/lib/libspl/include/sys/taskq.h
@@ -0,0 +1,119 @@
+// 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 2011 Nexenta Systems, Inc. All rights reserved.
+ * Copyright (c) 2012, 2018 by Delphix. All rights reserved.
+ * Copyright (c) 2012, Joyent, Inc. All rights reserved.
+ */
+
+#ifndef _SYS_TASKQ_H
+#define _SYS_TASKQ_H
+
+#include <pthread.h>
+#include <stdint.h>
+#include <sys/mutex.h>
+#include <sys/rwlock.h>
+#include <sys/condvar.h>
+
+/*
+ * Task queues
+ */
+
+#define TASKQ_NAMELEN 31
+
+typedef uintptr_t taskqid_t;
+typedef void (task_func_t)(void *);
+
+typedef struct taskq_ent {
+ struct taskq_ent *tqent_next;
+ struct taskq_ent *tqent_prev;
+ task_func_t *tqent_func;
+ void *tqent_arg;
+ uintptr_t tqent_flags;
+} taskq_ent_t;
+
+typedef struct taskq {
+ char tq_name[TASKQ_NAMELEN + 1];
+ kmutex_t tq_lock;
+ krwlock_t tq_threadlock;
+ kcondvar_t tq_dispatch_cv;
+ kcondvar_t tq_wait_cv;
+ kthread_t **tq_threadlist;
+ int tq_flags;
+ int tq_active;
+ int tq_nthreads;
+ int tq_nalloc;
+ int tq_minalloc;
+ int tq_maxalloc;
+ kcondvar_t tq_maxalloc_cv;
+ int tq_maxalloc_wait;
+ taskq_ent_t *tq_freelist;
+ taskq_ent_t tq_task;
+} taskq_t;
+
+#define TQENT_FLAG_PREALLOC 0x1 /* taskq_dispatch_ent used */
+
+#define TASKQ_PREPOPULATE 0x0001
+#define TASKQ_CPR_SAFE 0x0002 /* Use CPR safe protocol */
+#define TASKQ_DYNAMIC 0x0004 /* Use dynamic thread scheduling */
+#define TASKQ_THREADS_CPU_PCT 0x0008 /* Scale # threads by # cpus */
+#define TASKQ_DC_BATCH 0x0010 /* Mark threads as batch */
+
+#define TQ_SLEEP KM_SLEEP /* Can block for memory */
+#define TQ_NOSLEEP KM_NOSLEEP /* cannot block for memory; may fail */
+#define TQ_NOQUEUE 0x02 /* Do not enqueue if can't dispatch */
+#define TQ_FRONT 0x08 /* Queue in front */
+
+#define TASKQID_INVALID ((taskqid_t)0)
+
+extern taskq_t *_system_taskq(void);
+extern taskq_t *_system_delay_taskq(void);
+
+#define system_taskq _system_taskq()
+#define system_delay_taskq _system_delay_taskq()
+
+extern taskq_t *taskq_create(const char *, int, pri_t, int, int, uint_t);
+extern taskq_t *taskq_create_synced(const char *, int, pri_t, int, int, uint_t,
+ kthread_t ***);
+#define taskq_create_proc(a, b, c, d, e, p, f) \
+ (taskq_create(a, b, c, d, e, f))
+#define taskq_create_sysdc(a, b, d, e, p, dc, f) \
+ ((void) sizeof (dc), taskq_create(a, b, maxclsyspri, d, e, f))
+extern taskqid_t taskq_dispatch(taskq_t *, task_func_t, void *, uint_t);
+extern taskqid_t taskq_dispatch_delay(taskq_t *, task_func_t, void *, uint_t,
+ clock_t);
+extern void taskq_dispatch_ent(taskq_t *, task_func_t, void *, uint_t,
+ taskq_ent_t *);
+extern int taskq_empty_ent(taskq_ent_t *);
+extern void taskq_init_ent(taskq_ent_t *);
+extern void taskq_destroy(taskq_t *);
+extern void taskq_wait(taskq_t *);
+extern void taskq_wait_id(taskq_t *, taskqid_t);
+extern void taskq_wait_outstanding(taskq_t *, taskqid_t);
+extern int taskq_member(taskq_t *, kthread_t *);
+extern taskq_t *taskq_of_curthread(void);
+extern int taskq_cancel_id(taskq_t *, taskqid_t);
+extern void system_taskq_init(void);
+extern void system_taskq_fini(void);
+
+#endif /* _SYS_TASKQ_H */
diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/thread.h b/sys/contrib/openzfs/lib/libspl/include/sys/thread.h
new file mode 100644
index 000000000000..6390c5bfd863
--- /dev/null
+++ b/sys/contrib/openzfs/lib/libspl/include/sys/thread.h
@@ -0,0 +1,79 @@
+// 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 2011 Nexenta Systems, Inc. All rights reserved.
+ * Copyright (c) 2012, 2018 by Delphix. All rights reserved.
+ * Copyright (c) 2012, Joyent, Inc. All rights reserved.
+ */
+
+#ifndef _SYS_THREAD_H
+#define _SYS_THREAD_H
+
+#include <pthread.h>
+
+/*
+ * Threads.
+ */
+typedef pthread_t kthread_t;
+
+#define TS_RUN 0x00000002
+#define TS_JOINABLE 0x00000004
+
+#define curthread ((void *)(uintptr_t)pthread_self())
+#define getcomm() "unknown"
+
+#define thread_create_named(name, stk, stksize, func, arg, len, \
+ pp, state, pri) \
+ zk_thread_create(name, func, arg, stksize, state)
+#define thread_create(stk, stksize, func, arg, len, pp, state, pri) \
+ zk_thread_create(#func, func, arg, stksize, state)
+#define thread_exit() pthread_exit(NULL)
+#define thread_join(t) pthread_join((pthread_t)(t), NULL)
+
+#define newproc(f, a, cid, pri, ctp, pid) (ENOSYS)
+/*
+ * Check if the current thread is a memory reclaim thread.
+ * Always returns false in userspace (no memory reclaim thread).
+ */
+#define current_is_reclaim_thread() (0)
+
+/* in libzpool, p0 exists only to have its address taken */
+typedef void (proc_t)(void);
+extern void p0(void);
+
+#define curproc (&p0)
+
+#define PS_NONE -1
+
+extern kthread_t *zk_thread_create(const char *name, void (*func)(void *),
+ void *arg, size_t stksize, int state);
+
+#define issig() (FALSE)
+
+#define KPREEMPT_SYNC (-1)
+
+#define kpreempt(x) sched_yield()
+#define kpreempt_disable() ((void)0)
+#define kpreempt_enable() ((void)0)
+
+#endif /* _SYS_THREAD_H */
diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/time.h b/sys/contrib/openzfs/lib/libspl/include/sys/time.h
index da80a5852ae5..062c6ec979fc 100644
--- a/sys/contrib/openzfs/lib/libspl/include/sys/time.h
+++ b/sys/contrib/openzfs/lib/libspl/include/sys/time.h
@@ -98,6 +98,15 @@ gethrestime_sec(void)
}
static inline hrtime_t
+getlrtime(void)
+{
+ struct timeval tv;
+ (void) gettimeofday(&tv, NULL);
+ return ((((uint64_t)tv.tv_sec) * NANOSEC) +
+ ((uint64_t)tv.tv_usec * NSEC_PER_USEC));
+}
+
+static inline hrtime_t
gethrtime(void)
{
struct timespec ts;
diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/timer.h b/sys/contrib/openzfs/lib/libspl/include/sys/timer.h
new file mode 100644
index 000000000000..850d11f063c3
--- /dev/null
+++ b/sys/contrib/openzfs/lib/libspl/include/sys/timer.h
@@ -0,0 +1,64 @@
+// 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.
+ *
+ * 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 2011 Nexenta Systems, Inc. All rights reserved.
+ * Copyright (c) 2012, 2018 by Delphix. All rights reserved.
+ * Copyright (c) 2012, Joyent, Inc. All rights reserved.
+ */
+
+#ifndef _SPL_TIMER_H
+#define _SPL_TIMER_H
+
+#include <sys/time.h>
+
+#define ddi_get_lbolt() (gethrtime() >> 23)
+#define ddi_get_lbolt64() (gethrtime() >> 23)
+#define hz 119 /* frequency when using gethrtime() >> 23 for lbolt */
+
+#define ddi_time_before(a, b) (a < b)
+#define ddi_time_after(a, b) ddi_time_before(b, a)
+#define ddi_time_before_eq(a, b) (!ddi_time_after(a, b))
+#define ddi_time_after_eq(a, b) ddi_time_before_eq(b, a)
+
+#define ddi_time_before64(a, b) (a < b)
+#define ddi_time_after64(a, b) ddi_time_before64(b, a)
+#define ddi_time_before_eq64(a, b) (!ddi_time_after64(a, b))
+#define ddi_time_after_eq64(a, b) ddi_time_before_eq64(b, a)
+
+extern void delay(clock_t ticks);
+
+#define SEC_TO_TICK(sec) ((sec) * hz)
+#define MSEC_TO_TICK(msec) (howmany((hrtime_t)(msec) * hz, MILLISEC))
+#define USEC_TO_TICK(usec) (howmany((hrtime_t)(usec) * hz, MICROSEC))
+#define NSEC_TO_TICK(nsec) (howmany((hrtime_t)(nsec) * hz, NANOSEC))
+
+#define usleep_range(min, max) \
+ do { \
+ struct timespec ts; \
+ ts.tv_sec = min / MICROSEC; \
+ ts.tv_nsec = USEC2NSEC(min); \
+ (void) nanosleep(&ts, NULL); \
+ } while (0)
+
+#endif /* _SPL_TIMER_H */
diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/trace.h b/sys/contrib/openzfs/lib/libspl/include/sys/trace.h
new file mode 100644
index 000000000000..17b812faed20
--- /dev/null
+++ b/sys/contrib/openzfs/lib/libspl/include/sys/trace.h
@@ -0,0 +1,73 @@
+// 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 2011 Nexenta Systems, Inc. All rights reserved.
+ * Copyright (c) 2012, 2018 by Delphix. All rights reserved.
+ * Copyright (c) 2012, Joyent, Inc. All rights reserved.
+ */
+
+#ifndef _SYS_TRACE_H
+#define _SYS_TRACE_H
+
+/*
+ * DTrace SDT probes have different signatures in userland than they do in
+ * the kernel. If they're being used in kernel code, re-define them out of
+ * existence for their counterparts in libzpool.
+ *
+ * Here's an example of how to use the set-error probes in userland:
+ * zfs$target:::set-error /arg0 == EBUSY/ {stack();}
+ *
+ * Here's an example of how to use DTRACE_PROBE probes in userland:
+ * If there is a probe declared as follows:
+ * DTRACE_PROBE2(zfs__probe_name, uint64_t, blkid, dnode_t *, dn);
+ * Then you can use it as follows:
+ * zfs$target:::probe2 /copyinstr(arg0) == "zfs__probe_name"/
+ * {printf("%u %p\n", arg1, arg2);}
+ */
+
+#ifdef DTRACE_PROBE
+#undef DTRACE_PROBE
+#endif /* DTRACE_PROBE */
+#define DTRACE_PROBE(a)
+
+#ifdef DTRACE_PROBE1
+#undef DTRACE_PROBE1
+#endif /* DTRACE_PROBE1 */
+#define DTRACE_PROBE1(a, b, c)
+
+#ifdef DTRACE_PROBE2
+#undef DTRACE_PROBE2
+#endif /* DTRACE_PROBE2 */
+#define DTRACE_PROBE2(a, b, c, d, e)
+
+#ifdef DTRACE_PROBE3
+#undef DTRACE_PROBE3
+#endif /* DTRACE_PROBE3 */
+#define DTRACE_PROBE3(a, b, c, d, e, f, g)
+
+#ifdef DTRACE_PROBE4
+#undef DTRACE_PROBE4
+#endif /* DTRACE_PROBE4 */
+#define DTRACE_PROBE4(a, b, c, d, e, f, g, h, i)
+
+#endif /* _SYS_TRACE_H */
diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/trace_spl.h b/sys/contrib/openzfs/lib/libspl/include/sys/trace_spl.h
deleted file mode 100644
index b80d288f7332..000000000000
--- a/sys/contrib/openzfs/lib/libspl/include/sys/trace_spl.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Here to keep the libspl build happy */
-
-#ifndef _LIBSPL_SPL_TRACE_H
-#define _LIBSPL_SPL_TRACE_H
-
-/*
- * The set-error SDT probe is extra static, in that we declare its fake
- * function literally, rather than with the DTRACE_PROBE1() macro. This is
- * necessary so that SET_ERROR() can evaluate to a value, which wouldn't
- * be possible if it required multiple statements (to declare the function
- * and then call it).
- *
- * SET_ERROR() uses the comma operator so that it can be used without much
- * additional code. For example, "return (EINVAL);" becomes
- * "return (SET_ERROR(EINVAL));". Note that the argument will be evaluated
- * twice, so it should not have side effects (e.g. something like:
- * "return (SET_ERROR(log_error(EINVAL, info)));" would log the error twice).
- */
-#undef SET_ERROR
-#define SET_ERROR(err) \
- (__set_error(__FILE__, __func__, __LINE__, err), err)
-
-
-#endif
diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/trace_zfs.h b/sys/contrib/openzfs/lib/libspl/include/sys/trace_zfs.h
deleted file mode 100644
index 87ed5ad3c3be..000000000000
--- a/sys/contrib/openzfs/lib/libspl/include/sys/trace_zfs.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Here to keep the libspl build happy */
-
-#ifndef _LIBSPL_ZFS_TRACE_H
-#define _LIBSPL_ZFS_TRACE_H
-
-/*
- * The set-error SDT probe is extra static, in that we declare its fake
- * function literally, rather than with the DTRACE_PROBE1() macro. This is
- * necessary so that SET_ERROR() can evaluate to a value, which wouldn't
- * be possible if it required multiple statements (to declare the function
- * and then call it).
- *
- * SET_ERROR() uses the comma operator so that it can be used without much
- * additional code. For example, "return (EINVAL);" becomes
- * "return (SET_ERROR(EINVAL));". Note that the argument will be evaluated
- * twice, so it should not have side effects (e.g. something like:
- * "return (SET_ERROR(log_error(EINVAL, info)));" would log the error twice).
- */
-#undef SET_ERROR
-#define SET_ERROR(err) \
- (__set_error(__FILE__, __func__, __LINE__, err), err)
-
-
-#endif
diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/tsd.h b/sys/contrib/openzfs/lib/libspl/include/sys/tsd.h
new file mode 100644
index 000000000000..fa91519b3de5
--- /dev/null
+++ b/sys/contrib/openzfs/lib/libspl/include/sys/tsd.h
@@ -0,0 +1,42 @@
+// 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 2011 Nexenta Systems, Inc. All rights reserved.
+ * Copyright (c) 2012, 2018 by Delphix. All rights reserved.
+ * Copyright (c) 2012, Joyent, Inc. All rights reserved.
+ */
+
+#ifndef _SYS_TSD_H
+#define _SYS_TSD_H
+
+#include <pthread.h>
+
+/*
+ * Thread-specific data
+ */
+#define tsd_get(k) pthread_getspecific(k)
+#define tsd_set(k, v) pthread_setspecific(k, v)
+#define tsd_create(kp, d) pthread_key_create((pthread_key_t *)kp, d)
+#define tsd_destroy(kp) /* nothing */
+
+#endif /* _SYS_MUTEX_H */
diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/tunables.h b/sys/contrib/openzfs/lib/libspl/include/sys/tunables.h
index 5d9bb3d71a4a..d93425733709 100644
--- a/sys/contrib/openzfs/lib/libspl/include/sys/tunables.h
+++ b/sys/contrib/openzfs/lib/libspl/include/sys/tunables.h
@@ -25,7 +25,8 @@
*/
#ifndef _SYS_TUNABLES_H
-#define _SYS_TUNABLES_H
+//#define _SYS_TUNABLES_H extern __attribute__((visibility("hidden")))
+#define _SYS_TUNABLES_H extern
typedef enum {
ZFS_TUNABLE_TYPE_INT,
@@ -49,12 +50,14 @@ typedef struct zfs_tunable {
const char *zt_desc;
} zfs_tunable_t;
-int zfs_tunable_set(const zfs_tunable_t *tunable, const char *val);
-int zfs_tunable_get(const zfs_tunable_t *tunable, char *val, size_t valsz);
+_SYS_TUNABLES_H int zfs_tunable_set(const zfs_tunable_t *tunable,
+ const char *val);
+_SYS_TUNABLES_H int zfs_tunable_get(const zfs_tunable_t *tunable, char *val,
+ size_t valsz);
-const zfs_tunable_t *zfs_tunable_lookup(const char *name);
+_SYS_TUNABLES_H const zfs_tunable_t *zfs_tunable_lookup(const char *name);
typedef int (*zfs_tunable_iter_t)(const zfs_tunable_t *tunable, void *arg);
-void zfs_tunable_iter(zfs_tunable_iter_t cb, void *arg);
+_SYS_TUNABLES_H void zfs_tunable_iter(zfs_tunable_iter_t cb, void *arg);
#endif
diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/types.h b/sys/contrib/openzfs/lib/libspl/include/sys/types.h
index f4bb85c7942e..9af20d781674 100644
--- a/sys/contrib/openzfs/lib/libspl/include/sys/types.h
+++ b/sys/contrib/openzfs/lib/libspl/include/sys/types.h
@@ -50,4 +50,8 @@ typedef int projid_t;
#include <sys/param.h> /* for NBBY */
+#ifdef __FreeBSD__
+typedef off_t loff_t;
+#endif
+
#endif
diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/uio.h b/sys/contrib/openzfs/lib/libspl/include/sys/uio.h
index 93aa4984d734..9ada482be000 100644
--- a/sys/contrib/openzfs/lib/libspl/include/sys/uio.h
+++ b/sys/contrib/openzfs/lib/libspl/include/sys/uio.h
@@ -41,6 +41,7 @@
#ifndef _LIBSPL_SYS_UIO_H
#define _LIBSPL_SYS_UIO_H
+#include <sys/sysmacros.h>
#include <sys/types.h>
#include_next <sys/uio.h>
diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/vnode.h b/sys/contrib/openzfs/lib/libspl/include/sys/vnode.h
index 49afe12c52b1..ed9901eede22 100644
--- a/sys/contrib/openzfs/lib/libspl/include/sys/vnode.h
+++ b/sys/contrib/openzfs/lib/libspl/include/sys/vnode.h
@@ -25,7 +25,36 @@
* Use is subject to license terms.
*/
-#ifndef _LIBSPL_SYS_VNODE_H
-#define _LIBSPL_SYS_VNODE_H
+#ifndef _SYS_VNODE_H
+#define _SYS_VNODE_H
-#endif /* _LIBSPL_SYS_VNODE_H */
+typedef struct vattr {
+ uint_t va_mask; /* bit-mask of attributes */
+ u_offset_t va_size; /* file size in bytes */
+} vattr_t;
+
+#define AT_MODE 0x00002
+#define AT_UID 0x00004
+#define AT_GID 0x00008
+#define AT_FSID 0x00010
+#define AT_NODEID 0x00020
+#define AT_NLINK 0x00040
+#define AT_SIZE 0x00080
+#define AT_ATIME 0x00100
+#define AT_MTIME 0x00200
+#define AT_CTIME 0x00400
+#define AT_RDEV 0x00800
+#define AT_BLKSIZE 0x01000
+#define AT_NBLOCKS 0x02000
+#define AT_SEQ 0x08000
+#define AT_XVATTR 0x10000
+
+#define ATTR_XVATTR AT_XVATTR
+
+#define CRCREAT 0
+
+#define F_FREESP 11
+#define FIGNORECASE 0x80000 /* request case-insensitive lookups */
+
+
+#endif /* _SYS_VNODE_H */
diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/zone.h b/sys/contrib/openzfs/lib/libspl/include/sys/zone.h
index f4037b4875a9..179cc004fdb8 100644
--- a/sys/contrib/openzfs/lib/libspl/include/sys/zone.h
+++ b/sys/contrib/openzfs/lib/libspl/include/sys/zone.h
@@ -21,11 +21,19 @@
* CDDL HEADER END
*/
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
+ * Copyright (c) 2012, 2018 by Delphix. All rights reserved.
+ * Copyright (c) 2012, Joyent, Inc. All rights reserved.
*/
-#ifndef _LIBSPL_SYS_ZONE_H
-#define _LIBSPL_SYS_ZONE_H
+#ifndef _SYS_ZONE_H
+#define _SYS_ZONE_H
-#endif
+#define zone_dataset_visible(x, y) (1)
+
+#define INGLOBALZONE(z) (1)
+
+extern uint32_t zone_get_hostid(void *zonep);
+
+#endif /* _SYS_ZONE_H */
diff --git a/sys/contrib/openzfs/lib/libspl/include/umem.h b/sys/contrib/openzfs/lib/libspl/include/umem.h
index 3e44610e4e21..1b79fee56d23 100644
--- a/sys/contrib/openzfs/lib/libspl/include/umem.h
+++ b/sys/contrib/openzfs/lib/libspl/include/umem.h
@@ -42,6 +42,7 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
+#include <errno.h>
#ifdef __cplusplus
extern "C" {
diff --git a/sys/contrib/openzfs/lib/libspl/kmem.c b/sys/contrib/openzfs/lib/libspl/kmem.c
new file mode 100644
index 000000000000..c64e94597cf4
--- /dev/null
+++ b/sys/contrib/openzfs/lib/libspl/kmem.c
@@ -0,0 +1,102 @@
+// 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) 2012, 2018 by Delphix. All rights reserved.
+ * Copyright (c) 2016 Actifio, Inc. All rights reserved.
+ * Copyright (c) 2025, Klara, Inc.
+ */
+
+#include <sys/kmem.h>
+
+char *
+kmem_vasprintf(const char *fmt, va_list adx)
+{
+ char *buf = NULL;
+ va_list adx_copy;
+
+ va_copy(adx_copy, adx);
+ VERIFY(vasprintf(&buf, fmt, adx_copy) != -1);
+ va_end(adx_copy);
+
+ return (buf);
+}
+
+char *
+kmem_asprintf(const char *fmt, ...)
+{
+ char *buf = NULL;
+ va_list adx;
+
+ va_start(adx, fmt);
+ VERIFY(vasprintf(&buf, fmt, adx) != -1);
+ va_end(adx);
+
+ return (buf);
+}
+
+/*
+ * 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);
+}
+
+fstrans_cookie_t
+spl_fstrans_mark(void)
+{
+ return ((fstrans_cookie_t)0);
+}
+
+void
+spl_fstrans_unmark(fstrans_cookie_t cookie)
+{
+ (void) cookie;
+}
+
+int
+kmem_cache_reap_active(void)
+{
+ return (0);
+}
diff --git a/sys/contrib/openzfs/lib/libspl/kstat.c b/sys/contrib/openzfs/lib/libspl/kstat.c
new file mode 100644
index 000000000000..af4b870edadf
--- /dev/null
+++ b/sys/contrib/openzfs/lib/libspl/kstat.c
@@ -0,0 +1,64 @@
+// 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) 2012, 2018 by Delphix. All rights reserved.
+ * Copyright (c) 2016 Actifio, Inc. All rights reserved.
+ * Copyright (c) 2025, Klara, Inc.
+ */
+
+#include <sys/kstat.h>
+
+/*
+ * =========================================================================
+ * kstats
+ * =========================================================================
+ */
+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);
+}
+
+void
+kstat_install(kstat_t *ksp)
+{
+ (void) ksp;
+}
+
+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;
+}
diff --git a/sys/contrib/openzfs/lib/libspl/libspl.c b/sys/contrib/openzfs/lib/libspl/libspl.c
new file mode 100644
index 000000000000..208b3e428536
--- /dev/null
+++ b/sys/contrib/openzfs/lib/libspl/libspl.c
@@ -0,0 +1,67 @@
+// 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) 2012, 2018 by Delphix. All rights reserved.
+ * Copyright (c) 2016 Actifio, Inc. All rights reserved.
+ * Copyright (c) 2025, Klara, Inc.
+ * Copyright (c) 2025, Rob Norris <robn@despairlabs.com>
+ */
+
+#include <libspl.h>
+#include <assert.h>
+#include <unistd.h>
+#include <sys/misc.h>
+#include <sys/systm.h>
+#include <sys/utsname.h>
+#include "libspl_impl.h"
+
+static uint64_t hw_physmem = 0;
+static struct utsname hw_utsname = {};
+
+uint64_t
+libspl_physmem(void)
+{
+ return (hw_physmem);
+}
+
+utsname_t *
+utsname(void)
+{
+ return (&hw_utsname);
+}
+
+void
+libspl_init(void)
+{
+ hw_physmem = sysconf(_SC_PHYS_PAGES);
+
+ VERIFY0(uname(&hw_utsname));
+
+ random_init();
+}
+
+void
+libspl_fini(void)
+{
+ random_fini();
+}
diff --git a/sys/contrib/openzfs/lib/libspl/libspl_impl.h b/sys/contrib/openzfs/lib/libspl/libspl_impl.h
index 39392da09ef5..446801f2564b 100644
--- a/sys/contrib/openzfs/lib/libspl/libspl_impl.h
+++ b/sys/contrib/openzfs/lib/libspl/libspl_impl.h
@@ -21,5 +21,12 @@
* CDDL HEADER END
*/
+#ifndef _LIBSPL_IMPL_H
+#define _LIBSPL_IMPL_H
extern ssize_t getexecname_impl(char *execname);
+
+extern void random_init(void);
+extern void random_fini(void);
+
+#endif
diff --git a/sys/contrib/openzfs/lib/libspl/mutex.c b/sys/contrib/openzfs/lib/libspl/mutex.c
new file mode 100644
index 000000000000..36e5bec396ed
--- /dev/null
+++ b/sys/contrib/openzfs/lib/libspl/mutex.c
@@ -0,0 +1,89 @@
+// 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) 2012, 2018 by Delphix. All rights reserved.
+ * Copyright (c) 2016 Actifio, Inc. All rights reserved.
+ * Copyright (c) 2025, Klara, Inc.
+ */
+
+#include <assert.h>
+#include <pthread.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/mutex.h>
+
+/*
+ * =========================================================================
+ * mutexes
+ * =========================================================================
+ */
+
+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));
+}
+
+void
+mutex_destroy(kmutex_t *mp)
+{
+ VERIFY0(pthread_mutex_destroy(&mp->m_lock));
+}
+
+void
+mutex_enter(kmutex_t *mp)
+{
+ VERIFY0(pthread_mutex_lock(&mp->m_lock));
+ mp->m_owner = pthread_self();
+}
+
+int
+mutex_enter_check_return(kmutex_t *mp)
+{
+ int error = pthread_mutex_lock(&mp->m_lock);
+ if (error == 0)
+ mp->m_owner = pthread_self();
+ return (error);
+}
+
+int
+mutex_tryenter(kmutex_t *mp)
+{
+ int error = pthread_mutex_trylock(&mp->m_lock);
+ if (error == 0) {
+ mp->m_owner = pthread_self();
+ return (1);
+ } else {
+ VERIFY3S(error, ==, EBUSY);
+ return (0);
+ }
+}
+
+void
+mutex_exit(kmutex_t *mp)
+{
+ memset(&mp->m_owner, 0, sizeof (pthread_t));
+ VERIFY0(pthread_mutex_unlock(&mp->m_lock));
+}
diff --git a/sys/contrib/openzfs/lib/libspl/procfs_list.c b/sys/contrib/openzfs/lib/libspl/procfs_list.c
new file mode 100644
index 000000000000..0ce327db6343
--- /dev/null
+++ b/sys/contrib/openzfs/lib/libspl/procfs_list.c
@@ -0,0 +1,93 @@
+// 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) 2012, 2018 by Delphix. All rights reserved.
+ * Copyright (c) 2016 Actifio, Inc. All rights reserved.
+ * Copyright (c) 2025, Klara, Inc.
+ */
+
+#include <assert.h>
+#include <pthread.h>
+#include <stddef.h>
+#include <sys/procfs_list.h>
+#include <sys/mutex.h>
+#include <sys/list.h>
+
+/*
+ * =========================================================================
+ * procfs list
+ * =========================================================================
+ */
+
+void
+seq_printf(struct seq_file *m, const char *fmt, ...)
+{
+ (void) m, (void) fmt;
+}
+
+void
+procfs_list_install(const char *module,
+ const char *submodule,
+ const char *name,
+ mode_t mode,
+ procfs_list_t *procfs_list,
+ int (*show)(struct seq_file *f, void *p),
+ int (*show_header)(struct seq_file *f),
+ 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),
+ procfs_list_node_off + offsetof(procfs_list_node_t, pln_link));
+ procfs_list->pl_next_id = 1;
+ procfs_list->pl_node_offset = procfs_list_node_off;
+}
+
+void
+procfs_list_uninstall(procfs_list_t *procfs_list)
+{
+ (void) procfs_list;
+}
+
+void
+procfs_list_destroy(procfs_list_t *procfs_list)
+{
+ ASSERT(list_is_empty(&procfs_list->pl_list));
+ list_destroy(&procfs_list->pl_list);
+ mutex_destroy(&procfs_list->pl_lock);
+}
+
+#define NODE_ID(procfs_list, obj) \
+ (((procfs_list_node_t *)(((char *)obj) + \
+ (procfs_list)->pl_node_offset))->pln_id)
+
+void
+procfs_list_add(procfs_list_t *procfs_list, void *p)
+{
+ ASSERT(MUTEX_HELD(&procfs_list->pl_lock));
+ NODE_ID(procfs_list, p) = procfs_list->pl_next_id++;
+ list_insert_tail(&procfs_list->pl_list, p);
+}
diff --git a/sys/contrib/openzfs/lib/libspl/random.c b/sys/contrib/openzfs/lib/libspl/random.c
new file mode 100644
index 000000000000..c6f0ee7ae0f7
--- /dev/null
+++ b/sys/contrib/openzfs/lib/libspl/random.c
@@ -0,0 +1,101 @@
+// 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) 2012, 2018 by Delphix. All rights reserved.
+ * Copyright (c) 2016 Actifio, Inc. All rights reserved.
+ * Copyright (c) 2025, Klara, Inc.
+ */
+
+#include <stdint.h>
+#include <fcntl.h>
+#include <assert.h>
+#include <sys/random.h>
+#include "libspl_impl.h"
+
+#define RANDOM_PATH "/dev/random"
+#define URANDOM_PATH "/dev/urandom"
+
+static int random_fd = -1, urandom_fd = -1;
+
+static boolean_t force_pseudo = B_FALSE;
+
+void
+random_init(void)
+{
+ /* Handle multiple calls. */
+ if (random_fd != -1) {
+ ASSERT3U(urandom_fd, !=, -1);
+ return;
+ }
+
+ VERIFY((random_fd = open(RANDOM_PATH, O_RDONLY | O_CLOEXEC)) != -1);
+ VERIFY((urandom_fd = open(URANDOM_PATH, O_RDONLY | O_CLOEXEC)) != -1);
+}
+
+void
+random_fini(void)
+{
+ close(random_fd);
+ close(urandom_fd);
+
+ random_fd = -1;
+ urandom_fd = -1;
+}
+
+void
+random_force_pseudo(boolean_t onoff)
+{
+ force_pseudo = onoff;
+}
+
+static int
+random_get_bytes_common(uint8_t *ptr, size_t len, int fd)
+{
+ size_t resid = len;
+ ssize_t bytes;
+
+ ASSERT(fd != -1);
+
+ while (resid != 0) {
+ bytes = read(fd, ptr, resid);
+ ASSERT3S(bytes, >=, 0);
+ ptr += bytes;
+ resid -= bytes;
+ }
+
+ return (0);
+}
+
+int
+random_get_bytes(uint8_t *ptr, size_t len)
+{
+ if (force_pseudo)
+ return (random_get_pseudo_bytes(ptr, len));
+ return (random_get_bytes_common(ptr, len, random_fd));
+}
+
+int
+random_get_pseudo_bytes(uint8_t *ptr, size_t len)
+{
+ return (random_get_bytes_common(ptr, len, urandom_fd));
+}
diff --git a/sys/contrib/openzfs/lib/libspl/rwlock.c b/sys/contrib/openzfs/lib/libspl/rwlock.c
new file mode 100644
index 000000000000..3712829ef594
--- /dev/null
+++ b/sys/contrib/openzfs/lib/libspl/rwlock.c
@@ -0,0 +1,108 @@
+// 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) 2012, 2018 by Delphix. All rights reserved.
+ * Copyright (c) 2016 Actifio, Inc. All rights reserved.
+ * Copyright (c) 2025, Klara, Inc.
+ */
+
+#include <assert.h>
+#include <pthread.h>
+#include <errno.h>
+#include <atomic.h>
+#include <sys/rwlock.h>
+
+/*
+ * =========================================================================
+ * rwlocks
+ * =========================================================================
+ */
+
+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;
+}
+
+void
+rw_destroy(krwlock_t *rwlp)
+{
+ VERIFY0(pthread_rwlock_destroy(&rwlp->rw_lock));
+}
+
+void
+rw_enter(krwlock_t *rwlp, krw_t rw)
+{
+ if (rw == RW_READER) {
+ VERIFY0(pthread_rwlock_rdlock(&rwlp->rw_lock));
+ atomic_inc_uint(&rwlp->rw_readers);
+ } else {
+ VERIFY0(pthread_rwlock_wrlock(&rwlp->rw_lock));
+ rwlp->rw_owner = pthread_self();
+ }
+}
+
+void
+rw_exit(krwlock_t *rwlp)
+{
+ if (RW_READ_HELD(rwlp))
+ atomic_dec_uint(&rwlp->rw_readers);
+ else
+ rwlp->rw_owner = 0;
+
+ VERIFY0(pthread_rwlock_unlock(&rwlp->rw_lock));
+}
+
+int
+rw_tryenter(krwlock_t *rwlp, krw_t rw)
+{
+ int error;
+
+ if (rw == RW_READER)
+ error = pthread_rwlock_tryrdlock(&rwlp->rw_lock);
+ else
+ error = pthread_rwlock_trywrlock(&rwlp->rw_lock);
+
+ if (error == 0) {
+ if (rw == RW_READER)
+ atomic_inc_uint(&rwlp->rw_readers);
+ else
+ rwlp->rw_owner = pthread_self();
+
+ return (1);
+ }
+
+ VERIFY3S(error, ==, EBUSY);
+
+ return (0);
+}
+
+int
+rw_tryupgrade(krwlock_t *rwlp)
+{
+ (void) rwlp;
+ return (0);
+}
diff --git a/sys/contrib/openzfs/lib/libspl/sid.c b/sys/contrib/openzfs/lib/libspl/sid.c
new file mode 100644
index 000000000000..b7d5b5f2e778
--- /dev/null
+++ b/sys/contrib/openzfs/lib/libspl/sid.c
@@ -0,0 +1,47 @@
+// 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) 2012, 2018 by Delphix. All rights reserved.
+ * Copyright (c) 2016 Actifio, Inc. All rights reserved.
+ * Copyright (c) 2025, Klara, Inc.
+ */
+
+#include <sys/sid.h>
+#include <umem.h>
+
+ksiddomain_t *
+ksid_lookupdomain(const char *dom)
+{
+ ksiddomain_t *kd;
+
+ kd = umem_zalloc(sizeof (ksiddomain_t), UMEM_NOFAIL);
+ kd->kd_name = strdup(dom);
+ return (kd);
+}
+
+void
+ksiddomain_rele(ksiddomain_t *ksid)
+{
+ free(ksid->kd_name);
+ umem_free(ksid, sizeof (ksiddomain_t));
+}
diff --git a/sys/contrib/openzfs/lib/libzpool/taskq.c b/sys/contrib/openzfs/lib/libspl/taskq.c
index 0457de21fa18..043f70225551 100644
--- a/sys/contrib/openzfs/lib/libzpool/taskq.c
+++ b/sys/contrib/openzfs/lib/libspl/taskq.c
@@ -29,11 +29,27 @@
* Copyright (c) 2014 by Delphix. All rights reserved.
*/
-#include <sys/zfs_context.h>
+#include <sys/sysmacros.h>
+#include <sys/timer.h>
+#include <sys/types.h>
+#include <sys/thread.h>
+#include <sys/taskq.h>
+#include <sys/kmem.h>
+
+static taskq_t *__system_taskq = NULL;
+static taskq_t *__system_delay_taskq = NULL;
+
+taskq_t
+*_system_taskq(void)
+{
+ return (__system_taskq);
+}
-int taskq_now;
-taskq_t *system_taskq;
-taskq_t *system_delay_taskq;
+taskq_t
+*_system_delay_taskq(void)
+{
+ return (__system_delay_taskq);
+}
static pthread_key_t taskq_tsd;
@@ -106,11 +122,6 @@ taskq_dispatch(taskq_t *tq, task_func_t func, void *arg, uint_t tqflags)
{
taskq_ent_t *t;
- if (taskq_now) {
- func(arg);
- return (1);
- }
-
mutex_enter(&tq->tq_lock);
ASSERT(tq->tq_flags & TASKQ_ACTIVE);
if ((t = task_alloc(tq, tqflags)) == NULL) {
@@ -373,9 +384,6 @@ taskq_member(taskq_t *tq, kthread_t *t)
{
int i;
- if (taskq_now)
- return (1);
-
for (i = 0; i < tq->tq_nthreads; i++)
if (tq->tq_threadlist[i] == t)
return (1);
@@ -400,18 +408,18 @@ void
system_taskq_init(void)
{
VERIFY0(pthread_key_create(&taskq_tsd, NULL));
- system_taskq = taskq_create("system_taskq", 64, maxclsyspri, 4, 512,
+ __system_taskq = taskq_create("system_taskq", 64, maxclsyspri, 4, 512,
TASKQ_DYNAMIC | TASKQ_PREPOPULATE);
- system_delay_taskq = taskq_create("delay_taskq", 4, maxclsyspri, 4,
+ __system_delay_taskq = taskq_create("delay_taskq", 4, maxclsyspri, 4,
512, TASKQ_DYNAMIC | TASKQ_PREPOPULATE);
}
void
system_taskq_fini(void)
{
- taskq_destroy(system_taskq);
- system_taskq = NULL; /* defensive */
- taskq_destroy(system_delay_taskq);
- system_delay_taskq = NULL;
+ taskq_destroy(__system_taskq);
+ __system_taskq = NULL; /* defensive */
+ taskq_destroy(__system_delay_taskq);
+ __system_delay_taskq = NULL;
VERIFY0(pthread_key_delete(taskq_tsd));
}
diff --git a/sys/contrib/openzfs/lib/libspl/thread.c b/sys/contrib/openzfs/lib/libspl/thread.c
new file mode 100644
index 000000000000..f00e0a01a06b
--- /dev/null
+++ b/sys/contrib/openzfs/lib/libspl/thread.c
@@ -0,0 +1,118 @@
+// 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) 2012, 2018 by Delphix. All rights reserved.
+ * Copyright (c) 2016 Actifio, Inc. All rights reserved.
+ * Copyright (c) 2025, Klara, Inc.
+ */
+
+#include <assert.h>
+#include <pthread.h>
+#include <string.h>
+#include <sys/thread.h>
+
+/* this only exists to have its address taken */
+void p0(void) {}
+
+/*
+ * =========================================================================
+ * threads
+ * =========================================================================
+ *
+ * TS_STACK_MIN is dictated by the minimum allowed pthread stack size. While
+ * TS_STACK_MAX is somewhat arbitrary, it was selected to be large enough for
+ * the expected stack depth while small enough to avoid exhausting address
+ * space with high thread counts.
+ */
+#define TS_STACK_MIN MAX(PTHREAD_STACK_MIN, 32768)
+#define TS_STACK_MAX (256 * 1024)
+
+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(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));
+
+ if (state & TS_JOINABLE)
+ detachstate = PTHREAD_CREATE_JOINABLE;
+
+ VERIFY0(pthread_attr_setdetachstate(&attr, detachstate));
+
+ /*
+ * We allow the default stack size in user space to be specified by
+ * setting the ZFS_STACK_SIZE environment variable. This allows us
+ * the convenience of observing and debugging stack overruns in
+ * user space. Explicitly specified stack sizes will be honored.
+ * The usage of ZFS_STACK_SIZE is discussed further in the
+ * ENVIRONMENT VARIABLES sections of the ztest(1) man page.
+ */
+ if (stksize == 0) {
+ stkstr = getenv("ZFS_STACK_SIZE");
+
+ if (stkstr == NULL)
+ stksize = TS_STACK_MAX;
+ else
+ stksize = MAX(atoi(stkstr), TS_STACK_MIN);
+ }
+
+ VERIFY3S(stksize, >, 0);
+ stksize = P2ROUNDUP(MAX(stksize, TS_STACK_MIN), PAGESIZE);
+
+ /*
+ * If this ever fails, it may be because the stack size is not a
+ * multiple of system page size.
+ */
+ VERIFY0(pthread_attr_setstacksize(&attr, stksize));
+ VERIFY0(pthread_attr_setguardsize(&attr, PAGESIZE));
+
+ 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);
+}
diff --git a/sys/contrib/openzfs/lib/libuutil/libuutil.abi b/sys/contrib/openzfs/lib/libuutil/libuutil.abi
index 6c736c61e4a5..ca2bcdb57dbf 100644
--- a/sys/contrib/openzfs/lib/libuutil/libuutil.abi
+++ b/sys/contrib/openzfs/lib/libuutil/libuutil.abi
@@ -6,6 +6,8 @@
</elf-needed>
<elf-function-symbols>
<elf-symbol name='_sol_getmntent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='_system_delay_taskq' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='_system_taskq' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='atomic_add_16' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='atomic_add_16_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='atomic_add_32' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
@@ -144,6 +146,19 @@
<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='crgetgid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='crgetgroups' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='crgetngroups' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='crgetruid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='crgetuid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='cv_broadcast' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='cv_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='cv_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='cv_signal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='cv_timedwait' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='cv_timedwait_hires' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='cv_wait' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='cv_wait_sig' 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'/>
@@ -151,8 +166,21 @@
<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='kmem_asprintf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='kmem_cache_reap_active' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='kmem_scnprintf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='kmem_vasprintf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='ksid_lookupdomain' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='ksiddomain_rele' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='kstat_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='kstat_delete' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='kstat_install' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='kstat_set_raw_ops' 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_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='libspl_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='libspl_physmem' 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'/>
@@ -178,10 +206,52 @@
<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='mutex_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='mutex_enter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='mutex_enter_check_return' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='mutex_exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='mutex_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='mutex_tryenter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='p0' 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='procfs_list_add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='procfs_list_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='procfs_list_install' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='procfs_list_uninstall' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='random_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='random_force_pseudo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='random_get_bytes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='random_get_pseudo_bytes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='random_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='rw_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='rw_enter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='rw_exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='rw_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='rw_tryenter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='rw_tryupgrade' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='seq_printf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='spl_fstrans_mark' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='spl_fstrans_unmark' 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='system_taskq_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='system_taskq_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_cancel_id' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_create_synced' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_dispatch' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_dispatch_delay' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_dispatch_ent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_empty_ent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_init_ent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_member' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_of_curthread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_wait' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_wait_id' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_wait_outstanding' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='utsname' 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'/>
@@ -244,10 +314,7 @@
<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_zalloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
- <elf-symbol name='zfs_tunable_get' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
- <elf-symbol name='zfs_tunable_iter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
- <elf-symbol name='zfs_tunable_lookup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
- <elf-symbol name='zfs_tunable_set' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='zk_thread_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-function-symbols>
<abi-instr address-size='64' path='lib/libspl/assert.c' language='LANG_C99'>
<typedef-decl name='__pid_t' type-id='95e97e5e' id='3629bad8'/>
@@ -634,8 +701,6 @@
<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'/>
@@ -799,6 +864,230 @@
</function-decl>
<type-decl name='unsigned long int' size-in-bits='64' id='7359adad'/>
</abi-instr>
+ <abi-instr address-size='64' path='lib/libspl/condvar.c' language='LANG_C99'>
+ <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>
+ <type-decl name='long long int' size-in-bits='64' id='1eb56b1e'/>
+ <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='kcondvar_t' type-id='62fab762' id='29dbc0dd'/>
+ <class-decl name='kmutex' size-in-bits='384' is-struct='yes' visibility='default' id='f1cacfe1'>
+ <data-member access='public' layout-offset-in-bits='0'>
+ <var-decl name='m_lock' type-id='7a6844eb' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='320'>
+ <var-decl name='m_owner' type-id='4051f5e7' visibility='default'/>
+ </data-member>
+ </class-decl>
+ <typedef-decl name='kmutex_t' type-id='f1cacfe1' id='b9eccc8f'/>
+ <typedef-decl name='hrtime_t' type-id='1eb56b1e' id='cebdd548'/>
+ <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'>
+ <var-decl name='__value32' 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'>
+ <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'/>
+ </data-member>
+ </class-decl>
+ <typedef-decl name='__atomic_wide_counter' type-id='613ce450' id='f3b40860'/>
+ <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='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_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'/>
+ </data-member>
+ <data-member access='public'>
+ <var-decl name='__size' type-id='36d7f119' visibility='default'/>
+ </data-member>
+ <data-member access='public'>
+ <var-decl name='__align' type-id='1eb56b1e' visibility='default'/>
+ </data-member>
+ </union-decl>
+ <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='__wseq' type-id='f3b40860' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='64'>
+ <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'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='192'>
+ <var-decl name='__g_size' type-id='0d532ec1' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='256'>
+ <var-decl name='__g1_orig_size' type-id='f0981eeb' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='288'>
+ <var-decl name='__wrefs' type-id='f0981eeb' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='320'>
+ <var-decl name='__g_signals' type-id='0d532ec1' visibility='default'/>
+ </data-member>
+ </class-decl>
+ <typedef-decl name='__clock_t' type-id='bd54fe1a' id='4d66c6d7'/>
+ <typedef-decl name='__time_t' type-id='bd54fe1a' id='65eda9c0'/>
+ <typedef-decl name='__suseconds_t' type-id='bd54fe1a' id='5b102a54'/>
+ <typedef-decl name='__clockid_t' type-id='95e97e5e' id='08f9a87a'/>
+ <typedef-decl name='__syscall_slong_t' type-id='bd54fe1a' id='03085adc'/>
+ <typedef-decl name='clock_t' type-id='4d66c6d7' id='4c3a2c61'/>
+ <typedef-decl name='clockid_t' type-id='08f9a87a' id='a1c3b834'/>
+ <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>
+ <class-decl name='timeval' size-in-bits='128' is-struct='yes' visibility='default' id='2a693ac3'>
+ <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_usec' type-id='5b102a54' visibility='default'/>
+ </data-member>
+ </class-decl>
+ <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='a9c79a1f' const='yes' id='cd087e36'/>
+ <pointer-type-def type-id='cd087e36' size-in-bits='64' id='e05e8614'/>
+ <qualified-type-def type-id='e05e8614' restrict='yes' id='0be2e71c'/>
+ <pointer-type-def type-id='29dbc0dd' size-in-bits='64' id='068c4f7e'/>
+ <pointer-type-def type-id='b9eccc8f' size-in-bits='64' id='78830f38'/>
+ <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='a9c79a1f' size-in-bits='64' id='3d83ba87'/>
+ <pointer-type-def type-id='2a693ac3' size-in-bits='64' id='896f1b83'/>
+ <qualified-type-def type-id='896f1b83' restrict='yes' id='4bcf44c1'/>
+ <qualified-type-def type-id='eaa32e2f' restrict='yes' id='1b7446cd'/>
+ <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='pthread_cond_destroy' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='db285b03'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <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='pthread_cond_broadcast' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='db285b03'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <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='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='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='gettimeofday' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='4bcf44c1'/>
+ <parameter type-id='1b7446cd'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='cv_init' mangled-name='cv_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cv_init'>
+ <parameter type-id='068c4f7e' name='cv'/>
+ <parameter type-id='26a90f95' name='name'/>
+ <parameter type-id='95e97e5e' name='type'/>
+ <parameter type-id='eaa32e2f' name='arg'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='cv_destroy' mangled-name='cv_destroy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cv_destroy'>
+ <parameter type-id='068c4f7e' name='cv'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='cv_wait' mangled-name='cv_wait' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cv_wait'>
+ <parameter type-id='068c4f7e' name='cv'/>
+ <parameter type-id='78830f38' name='mp'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='cv_wait_sig' mangled-name='cv_wait_sig' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cv_wait_sig'>
+ <parameter type-id='068c4f7e' name='cv'/>
+ <parameter type-id='78830f38' name='mp'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='cv_timedwait' mangled-name='cv_timedwait' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cv_timedwait'>
+ <parameter type-id='068c4f7e' name='cv'/>
+ <parameter type-id='78830f38' name='mp'/>
+ <parameter type-id='4c3a2c61' name='abstime'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='cv_timedwait_hires' mangled-name='cv_timedwait_hires' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cv_timedwait_hires'>
+ <parameter type-id='068c4f7e' name='cv'/>
+ <parameter type-id='78830f38' name='mp'/>
+ <parameter type-id='cebdd548' name='tim'/>
+ <parameter type-id='cebdd548' name='res'/>
+ <parameter type-id='95e97e5e' name='flag'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='cv_signal' mangled-name='cv_signal' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cv_signal'>
+ <parameter type-id='068c4f7e' name='cv'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='cv_broadcast' mangled-name='cv_broadcast' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cv_broadcast'>
+ <parameter type-id='068c4f7e' name='cv'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ </abi-instr>
+ <abi-instr address-size='64' path='lib/libspl/cred.c' language='LANG_C99'>
+ <class-decl name='cred' is-struct='yes' visibility='default' is-declaration-only='yes' id='6739dd09'/>
+ <typedef-decl name='cred_t' type-id='6739dd09' id='a42f1a8f'/>
+ <typedef-decl name='__uid_t' type-id='f0981eeb' id='cc5fcceb'/>
+ <typedef-decl name='__gid_t' type-id='f0981eeb' id='d94ec6d9'/>
+ <typedef-decl name='gid_t' type-id='d94ec6d9' id='2bb2b96f'/>
+ <typedef-decl name='uid_t' type-id='cc5fcceb' id='354978ed'/>
+ <pointer-type-def type-id='a42f1a8f' size-in-bits='64' id='f89fcf80'/>
+ <pointer-type-def type-id='2bb2b96f' size-in-bits='64' id='b52814e6'/>
+ <class-decl name='cred' is-struct='yes' visibility='default' is-declaration-only='yes' id='6739dd09'/>
+ <function-decl name='crgetuid' mangled-name='crgetuid' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='crgetuid'>
+ <parameter type-id='f89fcf80' name='cr'/>
+ <return type-id='354978ed'/>
+ </function-decl>
+ <function-decl name='crgetngroups' mangled-name='crgetngroups' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='crgetngroups'>
+ <parameter type-id='f89fcf80' name='cr'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='crgetgroups' mangled-name='crgetgroups' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='crgetgroups'>
+ <parameter type-id='f89fcf80' name='cr'/>
+ <return type-id='b52814e6'/>
+ </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'/>
@@ -808,6 +1097,176 @@
<return type-id='79a0948f'/>
</function-decl>
</abi-instr>
+ <abi-instr address-size='64' path='lib/libspl/kmem.c' language='LANG_C99'>
+ <typedef-decl name='fstrans_cookie_t' type-id='95e97e5e' id='059934c1'/>
+ <qualified-type-def type-id='26a90f95' restrict='yes' id='266fe297'/>
+ <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='__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='kmem_vasprintf' mangled-name='kmem_vasprintf' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kmem_vasprintf'>
+ <parameter type-id='80f4b756' name='fmt'/>
+ <parameter type-id='b7f2d5e6' name='adx'/>
+ <return type-id='26a90f95'/>
+ </function-decl>
+ <function-decl name='kmem_asprintf' mangled-name='kmem_asprintf' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kmem_asprintf'>
+ <parameter type-id='80f4b756' name='fmt'/>
+ <parameter is-variadic='yes'/>
+ <return type-id='26a90f95'/>
+ </function-decl>
+ <function-decl name='kmem_scnprintf' mangled-name='kmem_scnprintf' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kmem_scnprintf'>
+ <parameter type-id='266fe297' name='str'/>
+ <parameter type-id='b59d7dce' name='size'/>
+ <parameter type-id='9d26089a' name='fmt'/>
+ <parameter is-variadic='yes'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='spl_fstrans_unmark' mangled-name='spl_fstrans_unmark' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='spl_fstrans_unmark'>
+ <parameter type-id='059934c1' name='cookie'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='kmem_cache_reap_active' mangled-name='kmem_cache_reap_active' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kmem_cache_reap_active'>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ </abi-instr>
+ <abi-instr address-size='64' path='lib/libspl/kstat.c' language='LANG_C99'>
+ <class-decl name='kstat' size-in-bits='448' is-struct='yes' visibility='default' id='5f5c9d88'>
+ <data-member access='public' layout-offset-in-bits='0'>
+ <var-decl name='ks_flags' type-id='d8bf0010' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='64'>
+ <var-decl name='ks_data' type-id='eaa32e2f' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='128'>
+ <var-decl name='ks_ndata' type-id='3502e3ff' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='192'>
+ <var-decl name='ks_data_size' type-id='b59d7dce' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='256'>
+ <var-decl name='ks_update' type-id='8cf7b7e1' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='320'>
+ <var-decl name='ks_private' type-id='eaa32e2f' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='384'>
+ <var-decl name='ks_lock' type-id='eaa32e2f' visibility='default'/>
+ </data-member>
+ </class-decl>
+ <typedef-decl name='kstat_t' type-id='5f5c9d88' id='dd12e024'/>
+ <typedef-decl name='uchar_t' type-id='002ac4a6' id='d8bf0010'/>
+ <typedef-decl name='__loff_t' type-id='724e4de6' id='00c9d214'/>
+ <typedef-decl name='loff_t' type-id='00c9d214' id='69bf7bee'/>
+ <pointer-type-def type-id='9d5d322a' size-in-bits='64' id='bbe97414'/>
+ <pointer-type-def type-id='05b3c714' size-in-bits='64' id='27cc5c36'/>
+ <pointer-type-def type-id='7a9ace65' size-in-bits='64' id='8cf7b7e1'/>
+ <pointer-type-def type-id='5f5c9d88' size-in-bits='64' id='0e87f9be'/>
+ <pointer-type-def type-id='dd12e024' size-in-bits='64' id='46e5e463'/>
+ <pointer-type-def type-id='527a97c5' size-in-bits='64' id='673f2af9'/>
+ <function-decl name='kstat_create' mangled-name='kstat_create' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kstat_create'>
+ <parameter type-id='80f4b756' name='module'/>
+ <parameter type-id='95e97e5e' name='instance'/>
+ <parameter type-id='80f4b756' name='name'/>
+ <parameter type-id='80f4b756' name='class'/>
+ <parameter type-id='d8bf0010' name='type'/>
+ <parameter type-id='ee1f298e' name='ndata'/>
+ <parameter type-id='d8bf0010' name='ks_flag'/>
+ <return type-id='46e5e463'/>
+ </function-decl>
+ <function-decl name='kstat_install' mangled-name='kstat_install' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kstat_install'>
+ <parameter type-id='46e5e463' name='ksp'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='kstat_set_raw_ops' mangled-name='kstat_set_raw_ops' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kstat_set_raw_ops'>
+ <parameter type-id='46e5e463' name='ksp'/>
+ <parameter type-id='bbe97414' name='headers'/>
+ <parameter type-id='27cc5c36' name='data'/>
+ <parameter type-id='673f2af9' name='addr'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-type size-in-bits='64' id='9d5d322a'>
+ <parameter type-id='26a90f95'/>
+ <parameter type-id='b59d7dce'/>
+ <return type-id='95e97e5e'/>
+ </function-type>
+ <function-type size-in-bits='64' id='05b3c714'>
+ <parameter type-id='26a90f95'/>
+ <parameter type-id='b59d7dce'/>
+ <parameter type-id='eaa32e2f'/>
+ <return type-id='95e97e5e'/>
+ </function-type>
+ <function-type size-in-bits='64' id='7a9ace65'>
+ <parameter type-id='0e87f9be'/>
+ <parameter type-id='95e97e5e'/>
+ <return type-id='95e97e5e'/>
+ </function-type>
+ <function-type size-in-bits='64' id='527a97c5'>
+ <parameter type-id='46e5e463'/>
+ <parameter type-id='69bf7bee'/>
+ <return type-id='eaa32e2f'/>
+ </function-type>
+ </abi-instr>
+ <abi-instr address-size='64' path='lib/libspl/libspl.c' language='LANG_C99'>
+ <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='520' id='5ddd38d2'>
+ <subrange length='65' type-id='7359adad' id='b50e2e4a'/>
+ </array-type-def>
+ <typedef-decl name='utsname_t' type-id='414a2ac6' id='5278297a'/>
+ <typedef-decl name='uint64_t' type-id='8910171f' id='9c313c2d'/>
+ <typedef-decl name='__uint64_t' type-id='7359adad' id='8910171f'/>
+ <class-decl name='utsname' size-in-bits='3120' is-struct='yes' visibility='default' id='414a2ac6'>
+ <data-member access='public' layout-offset-in-bits='0'>
+ <var-decl name='sysname' type-id='5ddd38d2' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='520'>
+ <var-decl name='nodename' type-id='5ddd38d2' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='1040'>
+ <var-decl name='release' type-id='5ddd38d2' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='1560'>
+ <var-decl name='version' type-id='5ddd38d2' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2080'>
+ <var-decl name='machine' type-id='5ddd38d2' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2600'>
+ <var-decl name='domainname' type-id='5ddd38d2' visibility='default'/>
+ </data-member>
+ </class-decl>
+ <pointer-type-def type-id='414a2ac6' size-in-bits='64' id='a6724cec'/>
+ <pointer-type-def type-id='5278297a' size-in-bits='64' id='5c7868ad'/>
+ <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='uname' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='a6724cec'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='libspl_physmem' mangled-name='libspl_physmem' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libspl_physmem'>
+ <return type-id='9c313c2d'/>
+ </function-decl>
+ <function-decl name='utsname' mangled-name='utsname' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='utsname'>
+ <return type-id='5c7868ad'/>
+ </function-decl>
+ <function-decl name='libspl_init' mangled-name='libspl_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libspl_init'>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='libspl_fini' mangled-name='libspl_fini' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libspl_fini'>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='random_init' mangled-name='random_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='random_init'>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='random_fini' mangled-name='random_fini' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='random_fini'>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ </abi-instr>
<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'/>
@@ -920,7 +1379,6 @@
<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'/>
@@ -970,6 +1428,39 @@
<return type-id='95e97e5e'/>
</function-decl>
</abi-instr>
+ <abi-instr address-size='64' path='lib/libspl/mutex.c' language='LANG_C99'>
+ <function-decl name='pthread_mutex_trylock' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='18c91f9e'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='mutex_init' mangled-name='mutex_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mutex_init'>
+ <parameter type-id='78830f38' name='mp'/>
+ <parameter type-id='26a90f95' name='name'/>
+ <parameter type-id='95e97e5e' name='type'/>
+ <parameter type-id='eaa32e2f' name='cookie'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='mutex_destroy' mangled-name='mutex_destroy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mutex_destroy'>
+ <parameter type-id='78830f38' name='mp'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='mutex_enter' mangled-name='mutex_enter' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mutex_enter'>
+ <parameter type-id='78830f38' name='mp'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='mutex_enter_check_return' mangled-name='mutex_enter_check_return' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mutex_enter_check_return'>
+ <parameter type-id='78830f38' name='mp'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='mutex_tryenter' mangled-name='mutex_tryenter' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mutex_tryenter'>
+ <parameter type-id='78830f38' name='mp'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='mutex_exit' mangled-name='mutex_exit' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mutex_exit'>
+ <parameter type-id='78830f38' name='mp'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ </abi-instr>
<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'/>
@@ -980,7 +1471,6 @@
</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'/>
<function-decl name='fclose' visibility='default' binding='global' size-in-bits='64'>
<parameter type-id='822cd80b'/>
<return type-id='95e97e5e'/>
@@ -991,27 +1481,6 @@
<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>
@@ -1020,13 +1489,6 @@
<array-type-def dimensions='1' type-id='03085adc' size-in-bits='192' id='083f8d58'>
<subrange length='3' type-id='7359adad' id='56f209d2'/>
</array-type-def>
- <array-type-def dimensions='1' type-id='d315442e' size-in-bits='16' id='811205dc'>
- <subrange length='1' type-id='7359adad' id='52f813b4'/>
- </array-type-def>
- <array-type-def dimensions='1' type-id='d3130597' size-in-bits='768' id='f63f23b9'>
- <subrange length='12' type-id='7359adad' id='84827bdc'/>
- </array-type-def>
- <type-decl name='long long int' size-in-bits='64' id='1eb56b1e'/>
<class-decl name='mnttab' size-in-bits='256' is-struct='yes' visibility='default' id='1b055409'>
<data-member access='public' layout-offset-in-bits='0'>
<var-decl name='mnt_special' type-id='26a90f95' visibility='default'/>
@@ -1061,93 +1523,6 @@
<var-decl name='mnt_minor' type-id='3502e3ff' visibility='default'/>
</data-member>
</class-decl>
- <typedef-decl name='__u16' type-id='8efea9e5' id='d315442e'/>
- <typedef-decl name='__s32' type-id='95e97e5e' id='3158a266'/>
- <typedef-decl name='__u32' type-id='f0981eeb' id='3f1a6b60'/>
- <typedef-decl name='__s64' type-id='1eb56b1e' id='49659421'/>
- <typedef-decl name='__u64' type-id='3a47d82b' id='d3130597'/>
- <class-decl name='statx_timestamp' size-in-bits='128' is-struct='yes' visibility='default' id='94101016'>
- <data-member access='public' layout-offset-in-bits='0'>
- <var-decl name='tv_sec' type-id='49659421' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='64'>
- <var-decl name='tv_nsec' type-id='3f1a6b60' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='96'>
- <var-decl name='__reserved' type-id='3158a266' visibility='default'/>
- </data-member>
- </class-decl>
- <class-decl name='statx' size-in-bits='2048' is-struct='yes' visibility='default' id='720b04c5'>
- <data-member access='public' layout-offset-in-bits='0'>
- <var-decl name='stx_mask' type-id='3f1a6b60' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='32'>
- <var-decl name='stx_blksize' type-id='3f1a6b60' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='64'>
- <var-decl name='stx_attributes' type-id='d3130597' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='128'>
- <var-decl name='stx_nlink' type-id='3f1a6b60' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='160'>
- <var-decl name='stx_uid' type-id='3f1a6b60' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='192'>
- <var-decl name='stx_gid' type-id='3f1a6b60' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='224'>
- <var-decl name='stx_mode' type-id='d315442e' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='240'>
- <var-decl name='__spare0' type-id='811205dc' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='256'>
- <var-decl name='stx_ino' type-id='d3130597' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='320'>
- <var-decl name='stx_size' type-id='d3130597' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='384'>
- <var-decl name='stx_blocks' type-id='d3130597' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='448'>
- <var-decl name='stx_attributes_mask' type-id='d3130597' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='512'>
- <var-decl name='stx_atime' type-id='94101016' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='640'>
- <var-decl name='stx_btime' type-id='94101016' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='768'>
- <var-decl name='stx_ctime' type-id='94101016' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='896'>
- <var-decl name='stx_mtime' type-id='94101016' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='1024'>
- <var-decl name='stx_rdev_major' type-id='3f1a6b60' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='1056'>
- <var-decl name='stx_rdev_minor' type-id='3f1a6b60' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='1088'>
- <var-decl name='stx_dev_major' type-id='3f1a6b60' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='1120'>
- <var-decl name='stx_dev_minor' type-id='3f1a6b60' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='1152'>
- <var-decl name='stx_mnt_id' type-id='d3130597' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='1216'>
- <var-decl name='__spare2' type-id='d3130597' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='1280'>
- <var-decl name='__spare3' type-id='f63f23b9' visibility='default'/>
- </data-member>
- </class-decl>
<class-decl name='mntent' size-in-bits='320' is-struct='yes' visibility='default' id='56fe4a37'>
<data-member access='public' layout-offset-in-bits='0'>
<var-decl name='mnt_fsname' type-id='26a90f95' visibility='default'/>
@@ -1216,29 +1591,16 @@
</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='__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>
<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'/>
<qualified-type-def type-id='62f7a03d' restrict='yes' id='f1cadedf'/>
- <pointer-type-def type-id='720b04c5' size-in-bits='64' id='936b8e35'/>
- <qualified-type-def type-id='936b8e35' restrict='yes' id='31d265b7'/>
<function-decl name='getmntent_r' visibility='default' binding='global' size-in-bits='64'>
<parameter type-id='e75a27e9'/>
<parameter type-id='3cad23cd'/>
@@ -1254,14 +1616,6 @@
<parameter type-id='95e97e5e'/>
<return type-id='26a90f95'/>
</function-decl>
- <function-decl name='statx' visibility='default' binding='global' size-in-bits='64'>
- <parameter type-id='95e97e5e'/>
- <parameter type-id='9d26089a'/>
- <parameter type-id='95e97e5e'/>
- <parameter type-id='f0981eeb'/>
- <parameter type-id='31d265b7'/>
- <return type-id='95e97e5e'/>
- </function-decl>
<function-decl name='__fprintf_chk' visibility='default' binding='global' size-in-bits='64'>
<parameter type-id='e75a27e9'/>
<parameter type-id='95e97e5e'/>
@@ -1305,14 +1659,294 @@
</function-decl>
</abi-instr>
<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='lib/libspl/procfs_list.c' language='LANG_C99'>
+ <class-decl name='procfs_list' size-in-bits='768' is-struct='yes' visibility='default' id='0f4d3b87'>
+ <data-member access='public' layout-offset-in-bits='0'>
+ <var-decl name='pl_private' type-id='eaa32e2f' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='64'>
+ <var-decl name='pl_lock' type-id='b9eccc8f' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='448'>
+ <var-decl name='pl_list' type-id='0899125f' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='640'>
+ <var-decl name='pl_next_id' type-id='9c313c2d' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='704'>
+ <var-decl name='pl_node_offset' type-id='b59d7dce' visibility='default'/>
+ </data-member>
+ </class-decl>
+ <typedef-decl name='procfs_list_t' type-id='0f4d3b87' id='e5b5a21b'/>
+ <class-decl name='seq_file' is-struct='yes' visibility='default' id='f3415517'/>
+ <pointer-type-def type-id='be39c944' size-in-bits='64' id='b5c3ae96'/>
+ <pointer-type-def type-id='86932239' size-in-bits='64' id='6255c89d'/>
+ <pointer-type-def type-id='cf9ec29d' size-in-bits='64' id='0131eb61'/>
+ <pointer-type-def type-id='e5b5a21b' size-in-bits='64' id='7f432372'/>
+ <pointer-type-def type-id='f3415517' size-in-bits='64' id='f8dc9def'/>
+ <function-decl name='seq_printf' mangled-name='seq_printf' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='seq_printf'>
+ <parameter type-id='f8dc9def' name='m'/>
+ <parameter type-id='80f4b756' name='fmt'/>
+ <parameter is-variadic='yes'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='procfs_list_install' mangled-name='procfs_list_install' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='procfs_list_install'>
+ <parameter type-id='80f4b756' name='module'/>
+ <parameter type-id='80f4b756' name='submodule'/>
+ <parameter type-id='80f4b756' name='name'/>
+ <parameter type-id='d50d396c' name='mode'/>
+ <parameter type-id='7f432372' name='procfs_list'/>
+ <parameter type-id='0131eb61' name='show'/>
+ <parameter type-id='6255c89d' name='show_header'/>
+ <parameter type-id='b5c3ae96' name='clear'/>
+ <parameter type-id='b59d7dce' name='procfs_list_node_off'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='procfs_list_uninstall' mangled-name='procfs_list_uninstall' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='procfs_list_uninstall'>
+ <parameter type-id='7f432372' name='procfs_list'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='procfs_list_destroy' mangled-name='procfs_list_destroy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='procfs_list_destroy'>
+ <parameter type-id='7f432372' name='procfs_list'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='procfs_list_add' mangled-name='procfs_list_add' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='procfs_list_add'>
+ <parameter type-id='7f432372' name='procfs_list'/>
+ <parameter type-id='eaa32e2f' name='p'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-type size-in-bits='64' id='be39c944'>
+ <parameter type-id='7f432372'/>
+ <return type-id='95e97e5e'/>
+ </function-type>
+ <function-type size-in-bits='64' id='86932239'>
+ <parameter type-id='f8dc9def'/>
+ <return type-id='95e97e5e'/>
+ </function-type>
+ <function-type size-in-bits='64' id='cf9ec29d'>
+ <parameter type-id='f8dc9def'/>
+ <parameter type-id='eaa32e2f'/>
+ <return type-id='95e97e5e'/>
+ </function-type>
+ </abi-instr>
+ <abi-instr address-size='64' path='lib/libspl/random.c' language='LANG_C99'>
+ <pointer-type-def type-id='b96825af' size-in-bits='64' id='ae3e8ca6'/>
+ <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='random_force_pseudo' mangled-name='random_force_pseudo' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='random_force_pseudo'>
+ <parameter type-id='c19b74c3' name='onoff'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='random_get_bytes' mangled-name='random_get_bytes' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='random_get_bytes'>
+ <parameter type-id='ae3e8ca6' name='ptr'/>
+ <parameter type-id='b59d7dce' name='len'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='random_get_pseudo_bytes' mangled-name='random_get_pseudo_bytes' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='random_get_pseudo_bytes'>
+ <parameter type-id='ae3e8ca6' name='ptr'/>
+ <parameter type-id='b59d7dce' name='len'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ </abi-instr>
+ <abi-instr address-size='64' path='lib/libspl/rwlock.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>
+ <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='64' id='8e100159'>
+ <subrange length='8' type-id='7359adad' id='56e0c0b1'/>
+ </array-type-def>
+ <array-type-def dimensions='1' type-id='002ac4a6' size-in-bits='56' id='08f7ce77'>
+ <subrange length='7' type-id='7359adad' id='16fc326e'/>
+ </array-type-def>
+ <class-decl name='krwlock' size-in-bits='576' is-struct='yes' visibility='default' id='4361e3b2'>
+ <data-member access='public' layout-offset-in-bits='0'>
+ <var-decl name='rw_lock' type-id='3f680bc6' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='448'>
+ <var-decl name='rw_owner' type-id='4051f5e7' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='512'>
+ <var-decl name='rw_readers' type-id='3502e3ff' visibility='default'/>
+ </data-member>
+ </class-decl>
+ <typedef-decl name='krwlock_t' type-id='4361e3b2' id='477df69a'/>
+ <typedef-decl name='krw_t' type-id='95e97e5e' id='932eed5d'/>
+ <union-decl name='pthread_rwlock_t' size-in-bits='448' naming-typedef-id='3f680bc6' visibility='default' id='981886f6'>
+ <data-member access='public'>
+ <var-decl name='__data' type-id='afe414a4' visibility='default'/>
+ </data-member>
+ <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_rwlock_t' type-id='981886f6' id='3f680bc6'/>
+ <union-decl name='pthread_rwlockattr_t' size-in-bits='64' naming-typedef-id='1b1c4591' visibility='default' id='b8e57521'>
+ <data-member access='public'>
+ <var-decl name='__size' type-id='8e100159' 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_rwlockattr_t' type-id='b8e57521' id='1b1c4591'/>
+ <class-decl name='__pthread_rwlock_arch_t' size-in-bits='448' is-struct='yes' visibility='default' id='afe414a4'>
+ <data-member access='public' layout-offset-in-bits='0'>
+ <var-decl name='__readers' type-id='f0981eeb' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='32'>
+ <var-decl name='__writers' type-id='f0981eeb' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='64'>
+ <var-decl name='__wrphase_futex' type-id='f0981eeb' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='96'>
+ <var-decl name='__writers_futex' type-id='f0981eeb' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='128'>
+ <var-decl name='__pad3' type-id='f0981eeb' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='160'>
+ <var-decl name='__pad4' type-id='f0981eeb' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='192'>
+ <var-decl name='__cur_writer' type-id='95e97e5e' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='224'>
+ <var-decl name='__shared' type-id='95e97e5e' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='256'>
+ <var-decl name='__rwelision' type-id='28577a57' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='264'>
+ <var-decl name='__pad1' type-id='08f7ce77' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='320'>
+ <var-decl name='__pad2' type-id='7359adad' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='384'>
+ <var-decl name='__flags' type-id='f0981eeb' visibility='default'/>
+ </data-member>
+ </class-decl>
+ <qualified-type-def type-id='1b1c4591' const='yes' id='52c85581'/>
+ <pointer-type-def type-id='52c85581' size-in-bits='64' id='fc5edc31'/>
+ <qualified-type-def type-id='fc5edc31' restrict='yes' id='295e8f33'/>
+ <pointer-type-def type-id='477df69a' size-in-bits='64' id='0126db61'/>
+ <pointer-type-def type-id='3f680bc6' size-in-bits='64' id='a6210c87'/>
+ <qualified-type-def type-id='a6210c87' restrict='yes' id='27210b05'/>
+ <qualified-type-def type-id='3502e3ff' volatile='yes' id='d0290e74'/>
+ <pointer-type-def type-id='d0290e74' size-in-bits='64' id='0ea19dfa'/>
+ <function-decl name='atomic_inc_uint' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='0ea19dfa'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='atomic_dec_uint' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='0ea19dfa'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='pthread_rwlock_init' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='27210b05'/>
+ <parameter type-id='295e8f33'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='pthread_rwlock_destroy' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='a6210c87'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='pthread_rwlock_rdlock' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='a6210c87'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='pthread_rwlock_tryrdlock' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='a6210c87'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='pthread_rwlock_wrlock' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='a6210c87'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='pthread_rwlock_trywrlock' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='a6210c87'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='pthread_rwlock_unlock' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='a6210c87'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='rw_init' mangled-name='rw_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rw_init'>
+ <parameter type-id='0126db61' name='rwlp'/>
+ <parameter type-id='26a90f95' name='name'/>
+ <parameter type-id='95e97e5e' name='type'/>
+ <parameter type-id='eaa32e2f' name='arg'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='rw_destroy' mangled-name='rw_destroy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rw_destroy'>
+ <parameter type-id='0126db61' name='rwlp'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='rw_enter' mangled-name='rw_enter' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rw_enter'>
+ <parameter type-id='0126db61' name='rwlp'/>
+ <parameter type-id='932eed5d' name='rw'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='rw_exit' mangled-name='rw_exit' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rw_exit'>
+ <parameter type-id='0126db61' name='rwlp'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='rw_tryenter' mangled-name='rw_tryenter' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rw_tryenter'>
+ <parameter type-id='0126db61' name='rwlp'/>
+ <parameter type-id='932eed5d' name='rw'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='rw_tryupgrade' mangled-name='rw_tryupgrade' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rw_tryupgrade'>
+ <parameter type-id='0126db61' name='rwlp'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ </abi-instr>
+ <abi-instr address-size='64' path='lib/libspl/sid.c' language='LANG_C99'>
+ <class-decl name='ksiddomain' size-in-bits='128' is-struct='yes' visibility='default' id='b3a38f42'>
+ <data-member access='public' layout-offset-in-bits='0'>
+ <var-decl name='kd_ref' type-id='3502e3ff' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='32'>
+ <var-decl name='kd_len' type-id='3502e3ff' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='64'>
+ <var-decl name='kd_name' type-id='26a90f95' visibility='default'/>
+ </data-member>
+ </class-decl>
+ <typedef-decl name='ksiddomain_t' type-id='b3a38f42' id='db2eb030'/>
+ <pointer-type-def type-id='db2eb030' size-in-bits='64' id='3b684881'/>
+ <function-decl name='ksid_lookupdomain' mangled-name='ksid_lookupdomain' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='ksid_lookupdomain'>
+ <parameter type-id='80f4b756' name='dom'/>
+ <return type-id='3b684881'/>
+ </function-decl>
+ <function-decl name='ksiddomain_rele' mangled-name='ksiddomain_rele' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='ksiddomain_rele'>
+ <parameter type-id='3b684881' name='ksid'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ </abi-instr>
<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'/>
@@ -1321,9 +1955,275 @@
<return type-id='b59d7dce'/>
</function-decl>
</abi-instr>
+ <abi-instr address-size='64' path='lib/libspl/taskq.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>
+ <typedef-decl name='pri_t' type-id='a2185560' id='c497180a'/>
+ <typedef-decl name='taskqid_t' type-id='e475ab95' id='de0ea20e'/>
+ <typedef-decl name='task_func_t' type-id='c5c76c9c' id='d8481e1f'/>
+ <class-decl name='taskq_ent' size-in-bits='320' is-struct='yes' visibility='default' id='cfda1b05'>
+ <data-member access='public' layout-offset-in-bits='0'>
+ <var-decl name='tqent_next' type-id='67918d75' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='64'>
+ <var-decl name='tqent_prev' type-id='67918d75' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='128'>
+ <var-decl name='tqent_func' type-id='41cce5ce' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='192'>
+ <var-decl name='tqent_arg' type-id='eaa32e2f' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='256'>
+ <var-decl name='tqent_flags' type-id='e475ab95' visibility='default'/>
+ </data-member>
+ </class-decl>
+ <typedef-decl name='taskq_ent_t' type-id='cfda1b05' id='65d297d1'/>
+ <class-decl name='taskq' size-in-bits='3072' is-struct='yes' visibility='default' id='1804594f'>
+ <data-member access='public' layout-offset-in-bits='0'>
+ <var-decl name='tq_name' type-id='16dc656a' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='256'>
+ <var-decl name='tq_lock' type-id='b9eccc8f' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='640'>
+ <var-decl name='tq_threadlock' type-id='477df69a' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='1216'>
+ <var-decl name='tq_dispatch_cv' type-id='29dbc0dd' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='1600'>
+ <var-decl name='tq_wait_cv' type-id='29dbc0dd' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='1984'>
+ <var-decl name='tq_threadlist' type-id='6e87b565' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2048'>
+ <var-decl name='tq_flags' type-id='95e97e5e' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2080'>
+ <var-decl name='tq_active' type-id='95e97e5e' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2112'>
+ <var-decl name='tq_nthreads' type-id='95e97e5e' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2144'>
+ <var-decl name='tq_nalloc' type-id='95e97e5e' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2176'>
+ <var-decl name='tq_minalloc' type-id='95e97e5e' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2208'>
+ <var-decl name='tq_maxalloc' type-id='95e97e5e' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2240'>
+ <var-decl name='tq_maxalloc_cv' type-id='29dbc0dd' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2624'>
+ <var-decl name='tq_maxalloc_wait' type-id='95e97e5e' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2688'>
+ <var-decl name='tq_freelist' type-id='3a4f23d4' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2752'>
+ <var-decl name='tq_task' type-id='65d297d1' visibility='default'/>
+ </data-member>
+ </class-decl>
+ <typedef-decl name='taskq_t' type-id='1804594f' id='ef507f03'/>
+ <typedef-decl name='kthread_t' type-id='4051f5e7' id='9bccee1a'/>
+ <pointer-type-def type-id='9bccee1a' size-in-bits='64' id='6ae5a80d'/>
+ <pointer-type-def type-id='6ae5a80d' size-in-bits='64' id='6e87b565'/>
+ <pointer-type-def type-id='6e87b565' size-in-bits='64' id='4ea26b5d'/>
+ <pointer-type-def type-id='d8481e1f' size-in-bits='64' id='41cce5ce'/>
+ <pointer-type-def type-id='cfda1b05' size-in-bits='64' id='67918d75'/>
+ <pointer-type-def type-id='65d297d1' size-in-bits='64' id='3a4f23d4'/>
+ <pointer-type-def type-id='ef507f03' size-in-bits='64' id='4f8ed29a'/>
+ <function-decl name='zk_thread_create' mangled-name='zk_thread_create' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zk_thread_create'>
+ <parameter type-id='80f4b756'/>
+ <parameter type-id='b7f9d8e6'/>
+ <parameter type-id='eaa32e2f'/>
+ <parameter type-id='b59d7dce'/>
+ <parameter type-id='95e97e5e'/>
+ <return type-id='6ae5a80d'/>
+ </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_key_delete' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='2de5383b'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='_system_taskq' mangled-name='_system_taskq' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_system_taskq'>
+ <return type-id='4f8ed29a'/>
+ </function-decl>
+ <function-decl name='_system_delay_taskq' mangled-name='_system_delay_taskq' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_system_delay_taskq'>
+ <return type-id='4f8ed29a'/>
+ </function-decl>
+ <function-decl name='taskq_dispatch' mangled-name='taskq_dispatch' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_dispatch'>
+ <parameter type-id='4f8ed29a' name='tq'/>
+ <parameter type-id='41cce5ce' name='func'/>
+ <parameter type-id='eaa32e2f' name='arg'/>
+ <parameter type-id='3502e3ff' name='tqflags'/>
+ <return type-id='de0ea20e'/>
+ </function-decl>
+ <function-decl name='taskq_dispatch_delay' mangled-name='taskq_dispatch_delay' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_dispatch_delay'>
+ <parameter type-id='4f8ed29a' name='tq'/>
+ <parameter type-id='41cce5ce' name='func'/>
+ <parameter type-id='eaa32e2f' name='arg'/>
+ <parameter type-id='3502e3ff' name='tqflags'/>
+ <parameter type-id='4c3a2c61' name='expire_time'/>
+ <return type-id='de0ea20e'/>
+ </function-decl>
+ <function-decl name='taskq_empty_ent' mangled-name='taskq_empty_ent' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_empty_ent'>
+ <parameter type-id='3a4f23d4' name='t'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='taskq_init_ent' mangled-name='taskq_init_ent' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_init_ent'>
+ <parameter type-id='3a4f23d4' name='t'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='taskq_dispatch_ent' mangled-name='taskq_dispatch_ent' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_dispatch_ent'>
+ <parameter type-id='4f8ed29a' name='tq'/>
+ <parameter type-id='41cce5ce' name='func'/>
+ <parameter type-id='eaa32e2f' name='arg'/>
+ <parameter type-id='3502e3ff' name='flags'/>
+ <parameter type-id='3a4f23d4' name='t'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='taskq_wait' mangled-name='taskq_wait' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_wait'>
+ <parameter type-id='4f8ed29a' name='tq'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='taskq_wait_id' mangled-name='taskq_wait_id' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_wait_id'>
+ <parameter type-id='4f8ed29a' name='tq'/>
+ <parameter type-id='de0ea20e' name='id'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='taskq_create' mangled-name='taskq_create' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_create'>
+ <parameter type-id='80f4b756' name='name'/>
+ <parameter type-id='95e97e5e' name='nthreads'/>
+ <parameter type-id='c497180a' name='pri'/>
+ <parameter type-id='95e97e5e' name='minalloc'/>
+ <parameter type-id='95e97e5e' name='maxalloc'/>
+ <parameter type-id='3502e3ff' name='flags'/>
+ <return type-id='4f8ed29a'/>
+ </function-decl>
+ <function-decl name='taskq_destroy' mangled-name='taskq_destroy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_destroy'>
+ <parameter type-id='4f8ed29a' name='tq'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='taskq_create_synced' mangled-name='taskq_create_synced' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_create_synced'>
+ <parameter type-id='80f4b756' name='name'/>
+ <parameter type-id='95e97e5e' name='nthreads'/>
+ <parameter type-id='c497180a' name='pri'/>
+ <parameter type-id='95e97e5e' name='minalloc'/>
+ <parameter type-id='95e97e5e' name='maxalloc'/>
+ <parameter type-id='3502e3ff' name='flags'/>
+ <parameter type-id='4ea26b5d' name='ktpp'/>
+ <return type-id='4f8ed29a'/>
+ </function-decl>
+ <function-decl name='taskq_member' mangled-name='taskq_member' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_member'>
+ <parameter type-id='4f8ed29a' name='tq'/>
+ <parameter type-id='6ae5a80d' name='t'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='taskq_of_curthread' mangled-name='taskq_of_curthread' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_of_curthread'>
+ <return type-id='4f8ed29a'/>
+ </function-decl>
+ <function-decl name='taskq_cancel_id' mangled-name='taskq_cancel_id' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_cancel_id'>
+ <parameter type-id='4f8ed29a' name='tq'/>
+ <parameter type-id='de0ea20e' name='id'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='system_taskq_init' mangled-name='system_taskq_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='system_taskq_init'>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='system_taskq_fini' mangled-name='system_taskq_fini' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='system_taskq_fini'>
+ <return type-id='48b5725f'/>
+ </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='lib/libspl/thread.c' language='LANG_C99'>
+ <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'/>
+ <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='7d8569fd' size-in-bits='64' id='7347a39e'/>
+ <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='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_attr_init' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='7347a39e'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <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='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='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='pthread_attr_setstacksize' 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='pthread_setname_np' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='4051f5e7'/>
+ <parameter type-id='80f4b756'/>
+ <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='getenv' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='80f4b756'/>
+ <return type-id='26a90f95'/>
+ </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='p0' mangled-name='p0' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='p0'>
+ <return type-id='48b5725f'/>
+ </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='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'/>
@@ -1413,52 +2313,10 @@
</function-decl>
</abi-instr>
<abi-instr address-size='64' path='lib/libspl/tunables.c' language='LANG_C99'>
- <enum-decl name='zfs_tunable_type_t' naming-typedef-id='f50b1525' id='56905369'>
- <underlying-type type-id='9cac1fee'/>
- <enumerator name='ZFS_TUNABLE_TYPE_INT' value='0'/>
- <enumerator name='ZFS_TUNABLE_TYPE_UINT' value='1'/>
- <enumerator name='ZFS_TUNABLE_TYPE_ULONG' value='2'/>
- <enumerator name='ZFS_TUNABLE_TYPE_U64' value='3'/>
- <enumerator name='ZFS_TUNABLE_TYPE_STRING' value='4'/>
- </enum-decl>
- <typedef-decl name='zfs_tunable_type_t' type-id='56905369' id='f50b1525'/>
- <enum-decl name='zfs_tunable_perm_t' naming-typedef-id='ada7336b' id='e80e6ebf'>
- <underlying-type type-id='9cac1fee'/>
- <enumerator name='ZFS_TUNABLE_PERM_ZMOD_RW' value='0'/>
- <enumerator name='ZFS_TUNABLE_PERM_ZMOD_RD' value='1'/>
- </enum-decl>
- <typedef-decl name='zfs_tunable_perm_t' type-id='e80e6ebf' id='ada7336b'/>
- <class-decl name='zfs_tunable' size-in-bits='320' is-struct='yes' visibility='default' id='1a97ee0e'>
- <data-member access='public' layout-offset-in-bits='0'>
- <var-decl name='zt_name' type-id='80f4b756' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='64'>
- <var-decl name='zt_varp' type-id='eaa32e2f' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='128'>
- <var-decl name='zt_varsz' type-id='b59d7dce' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='192'>
- <var-decl name='zt_type' type-id='f50b1525' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='224'>
- <var-decl name='zt_perm' type-id='ada7336b' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='256'>
- <var-decl name='zt_desc' type-id='80f4b756' visibility='default'/>
- </data-member>
- </class-decl>
- <typedef-decl name='zfs_tunable_t' type-id='1a97ee0e' id='12bf5c5e'/>
- <typedef-decl name='zfs_tunable_iter_t' type-id='7ef33f92' id='d8d5f4ab'/>
<typedef-decl name='intmax_t' type-id='5b475db0' id='e104d842'/>
<typedef-decl name='uintmax_t' type-id='04d82f4b' id='f8b828c9'/>
<typedef-decl name='__intmax_t' type-id='bd54fe1a' id='5b475db0'/>
<typedef-decl name='__uintmax_t' type-id='7359adad' id='04d82f4b'/>
- <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='12bf5c5e' const='yes' id='180e47ee'/>
- <pointer-type-def type-id='180e47ee' size-in-bits='64' id='a27af98c'/>
- <pointer-type-def type-id='92f86508' size-in-bits='64' id='7ef33f92'/>
<function-decl name='strtoimax' visibility='default' binding='global' size-in-bits='64'>
<parameter type-id='9d26089a'/>
<parameter type-id='8c85230f'/>
@@ -1471,31 +2329,6 @@
<parameter type-id='95e97e5e'/>
<return type-id='f8b828c9'/>
</function-decl>
- <function-decl name='zfs_tunable_lookup' mangled-name='zfs_tunable_lookup' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_tunable_lookup'>
- <parameter type-id='80f4b756' name='name'/>
- <return type-id='a27af98c'/>
- </function-decl>
- <function-decl name='zfs_tunable_iter' mangled-name='zfs_tunable_iter' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_tunable_iter'>
- <parameter type-id='d8d5f4ab' name='cb'/>
- <parameter type-id='eaa32e2f' name='arg'/>
- <return type-id='48b5725f'/>
- </function-decl>
- <function-decl name='zfs_tunable_set' mangled-name='zfs_tunable_set' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_tunable_set'>
- <parameter type-id='a27af98c' name='zt'/>
- <parameter type-id='80f4b756' name='val'/>
- <return type-id='95e97e5e'/>
- </function-decl>
- <function-decl name='zfs_tunable_get' mangled-name='zfs_tunable_get' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_tunable_get'>
- <parameter type-id='a27af98c' name='zt'/>
- <parameter type-id='26a90f95' name='val'/>
- <parameter type-id='b59d7dce' name='valsz'/>
- <return type-id='95e97e5e'/>
- </function-decl>
- <function-type size-in-bits='64' id='92f86508'>
- <parameter type-id='a27af98c'/>
- <parameter type-id='eaa32e2f'/>
- <return type-id='95e97e5e'/>
- </function-type>
</abi-instr>
<abi-instr address-size='64' path='lib/libuutil/uu_alloc.c' language='LANG_C99'>
<type-decl name='char' size-in-bits='8' id='a84c031d'/>
@@ -2437,10 +3270,6 @@
<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='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'/>
diff --git a/sys/contrib/openzfs/lib/libzfs/Makefile.am b/sys/contrib/openzfs/lib/libzfs/Makefile.am
index 5f8963dccd1a..e2cbca47b9a3 100644
--- a/sys/contrib/openzfs/lib/libzfs/Makefile.am
+++ b/sys/contrib/openzfs/lib/libzfs/Makefile.am
@@ -70,7 +70,7 @@ if BUILD_FREEBSD
libzfs_la_LIBADD += -lutil -lgeom
endif
-libzfs_la_LDFLAGS += -version-info 6:0:0
+libzfs_la_LDFLAGS += -version-info 7:0:0
pkgconfig_DATA += %D%/libzfs.pc
diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs.abi b/sys/contrib/openzfs/lib/libzfs/libzfs.abi
index ba161d1ef10f..f481b6221e4d 100644
--- a/sys/contrib/openzfs/lib/libzfs/libzfs.abi
+++ b/sys/contrib/openzfs/lib/libzfs/libzfs.abi
@@ -1,4 +1,4 @@
-<abi-corpus version='2.0' architecture='elf-amd-x86_64' soname='libzfs.so.6'>
+<abi-corpus version='2.0' architecture='elf-amd-x86_64' soname='libzfs.so.7'>
<elf-needed>
<dependency name='libzfs_core.so.3'/>
<dependency name='libnvpair.so.3'/>
@@ -15,6 +15,8 @@
</elf-needed>
<elf-function-symbols>
<elf-symbol name='_sol_getmntent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='_system_delay_taskq' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='_system_taskq' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='atomic_add_16' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='atomic_add_16_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='atomic_add_32' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
@@ -160,6 +162,19 @@
<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'/>
+ <elf-symbol name='crgetgid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='crgetgroups' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='crgetngroups' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='crgetruid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='crgetuid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='cv_broadcast' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='cv_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='cv_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='cv_signal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='cv_timedwait' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='cv_timedwait_hires' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='cv_wait' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='cv_wait_sig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='dataset_namecheck' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='dataset_nestcheck' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='efi_alloc_and_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
@@ -195,9 +210,22 @@
<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='kmem_asprintf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='kmem_cache_reap_active' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='kmem_scnprintf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='kmem_vasprintf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='ksid_lookupdomain' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='ksiddomain_rele' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='kstat_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='kstat_delete' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='kstat_install' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='kstat_set_raw_ops' 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_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='libspl_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='libspl_physmem' 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'/>
@@ -243,10 +271,32 @@
<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='mutex_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='mutex_enter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='mutex_enter_check_return' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='mutex_exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='mutex_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='mutex_tryenter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='p0' 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'/>
<elf-symbol name='pool_namecheck' 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='printf_color' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='procfs_list_add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='procfs_list_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='procfs_list_install' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='procfs_list_uninstall' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='random_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='random_force_pseudo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='random_get_bytes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='random_get_pseudo_bytes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='random_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='rw_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='rw_enter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='rw_exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='rw_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='rw_tryenter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='rw_tryupgrade' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='sa_commit_shares' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='sa_disable_share' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='sa_enable_share' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
@@ -254,10 +304,29 @@
<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='seq_printf' 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_fstrans_mark' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='spl_fstrans_unmark' 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='system_taskq_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='system_taskq_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_cancel_id' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_create_synced' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_dispatch' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_dispatch_delay' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_dispatch_ent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_empty_ent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_init_ent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_member' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_of_curthread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_wait' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_wait_id' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_wait_outstanding' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='tpool_abandon' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='tpool_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='tpool_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
@@ -270,6 +339,7 @@
<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='utsname' 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'/>
@@ -451,10 +521,6 @@
<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_tunable_get' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
- <elf-symbol name='zfs_tunable_iter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
- <elf-symbol name='zfs_tunable_lookup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
- <elf-symbol name='zfs_tunable_set' 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'/>
@@ -477,6 +543,7 @@
<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='zk_thread_create' 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'/>
@@ -571,6 +638,7 @@
<elf-symbol name='zpool_props_refresh' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='zpool_read_label' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='zpool_refresh_stats' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='zpool_refresh_stats_from_handle' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='zpool_reguid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='zpool_reopen_one' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='zpool_scan' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
@@ -641,7 +709,7 @@
<elf-symbol name='sa_protocol_names' size='16' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='spa_feature_table' size='2632' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='zfeature_checks_disable' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
- <elf-symbol name='zfs_deleg_perm_tab' size='528' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='zfs_deleg_perm_tab' size='544' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='zfs_history_event_names' size='328' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='zfs_max_dataset_nesting' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='zfs_userquota_prop_prefixes' size='96' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
@@ -1318,6 +1386,106 @@
</function-decl>
<type-decl name='unsigned short int' size-in-bits='16' id='8efea9e5'/>
</abi-instr>
+ <abi-instr address-size='64' path='lib/libspl/condvar.c' language='LANG_C99'>
+ <typedef-decl name='kcondvar_t' type-id='62fab762' id='29dbc0dd'/>
+ <class-decl name='kmutex' size-in-bits='384' is-struct='yes' visibility='default' id='f1cacfe1'>
+ <data-member access='public' layout-offset-in-bits='0'>
+ <var-decl name='m_lock' type-id='7a6844eb' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='320'>
+ <var-decl name='m_owner' type-id='4051f5e7' visibility='default'/>
+ </data-member>
+ </class-decl>
+ <typedef-decl name='kmutex_t' type-id='f1cacfe1' id='b9eccc8f'/>
+ <typedef-decl name='hrtime_t' type-id='1eb56b1e' id='cebdd548'/>
+ <typedef-decl name='__suseconds_t' type-id='bd54fe1a' id='5b102a54'/>
+ <typedef-decl name='clock_t' type-id='4d66c6d7' id='4c3a2c61'/>
+ <class-decl name='timeval' size-in-bits='128' is-struct='yes' visibility='default' id='2a693ac3'>
+ <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_usec' type-id='5b102a54' visibility='default'/>
+ </data-member>
+ </class-decl>
+ <pointer-type-def type-id='29dbc0dd' size-in-bits='64' id='068c4f7e'/>
+ <pointer-type-def type-id='b9eccc8f' size-in-bits='64' id='78830f38'/>
+ <pointer-type-def type-id='2a693ac3' size-in-bits='64' id='896f1b83'/>
+ <qualified-type-def type-id='896f1b83' restrict='yes' id='4bcf44c1'/>
+ <function-decl name='pthread_cond_destroy' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='db285b03'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='gettimeofday' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='4bcf44c1'/>
+ <parameter type-id='1b7446cd'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='cv_init' mangled-name='cv_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cv_init'>
+ <parameter type-id='068c4f7e' name='cv'/>
+ <parameter type-id='26a90f95' name='name'/>
+ <parameter type-id='95e97e5e' name='type'/>
+ <parameter type-id='eaa32e2f' name='arg'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='cv_destroy' mangled-name='cv_destroy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cv_destroy'>
+ <parameter type-id='068c4f7e' name='cv'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='cv_wait' mangled-name='cv_wait' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cv_wait'>
+ <parameter type-id='068c4f7e' name='cv'/>
+ <parameter type-id='78830f38' name='mp'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='cv_wait_sig' mangled-name='cv_wait_sig' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cv_wait_sig'>
+ <parameter type-id='068c4f7e' name='cv'/>
+ <parameter type-id='78830f38' name='mp'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='cv_timedwait' mangled-name='cv_timedwait' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cv_timedwait'>
+ <parameter type-id='068c4f7e' name='cv'/>
+ <parameter type-id='78830f38' name='mp'/>
+ <parameter type-id='4c3a2c61' name='abstime'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='cv_timedwait_hires' mangled-name='cv_timedwait_hires' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cv_timedwait_hires'>
+ <parameter type-id='068c4f7e' name='cv'/>
+ <parameter type-id='78830f38' name='mp'/>
+ <parameter type-id='cebdd548' name='tim'/>
+ <parameter type-id='cebdd548' name='res'/>
+ <parameter type-id='95e97e5e' name='flag'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='cv_signal' mangled-name='cv_signal' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cv_signal'>
+ <parameter type-id='068c4f7e' name='cv'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='cv_broadcast' mangled-name='cv_broadcast' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cv_broadcast'>
+ <parameter type-id='068c4f7e' name='cv'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <qualified-type-def type-id='eaa32e2f' restrict='yes' id='1b7446cd'/>
+ </abi-instr>
+ <abi-instr address-size='64' path='lib/libspl/cred.c' language='LANG_C99'>
+ <class-decl name='cred' is-struct='yes' visibility='default' is-declaration-only='yes' id='6739dd09'/>
+ <typedef-decl name='cred_t' type-id='6739dd09' id='a42f1a8f'/>
+ <typedef-decl name='gid_t' type-id='d94ec6d9' id='2bb2b96f'/>
+ <pointer-type-def type-id='a42f1a8f' size-in-bits='64' id='f89fcf80'/>
+ <pointer-type-def type-id='2bb2b96f' size-in-bits='64' id='b52814e6'/>
+ <class-decl name='cred' is-struct='yes' visibility='default' is-declaration-only='yes' id='6739dd09'/>
+ <function-decl name='crgetuid' mangled-name='crgetuid' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='crgetuid'>
+ <parameter type-id='f89fcf80' name='cr'/>
+ <return type-id='354978ed'/>
+ </function-decl>
+ <function-decl name='crgetngroups' mangled-name='crgetngroups' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='crgetngroups'>
+ <parameter type-id='f89fcf80' name='cr'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='crgetgroups' mangled-name='crgetgroups' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='crgetgroups'>
+ <parameter type-id='f89fcf80' name='cr'/>
+ <return type-id='b52814e6'/>
+ </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'/>
@@ -1327,6 +1495,160 @@
<return type-id='79a0948f'/>
</function-decl>
</abi-instr>
+ <abi-instr address-size='64' path='lib/libspl/kmem.c' language='LANG_C99'>
+ <typedef-decl name='fstrans_cookie_t' type-id='95e97e5e' id='059934c1'/>
+ <function-decl name='kmem_vasprintf' mangled-name='kmem_vasprintf' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kmem_vasprintf'>
+ <parameter type-id='80f4b756' name='fmt'/>
+ <parameter type-id='b7f2d5e6' name='adx'/>
+ <return type-id='26a90f95'/>
+ </function-decl>
+ <function-decl name='kmem_asprintf' mangled-name='kmem_asprintf' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kmem_asprintf'>
+ <parameter type-id='80f4b756' name='fmt'/>
+ <parameter is-variadic='yes'/>
+ <return type-id='26a90f95'/>
+ </function-decl>
+ <function-decl name='kmem_scnprintf' mangled-name='kmem_scnprintf' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kmem_scnprintf'>
+ <parameter type-id='266fe297' name='str'/>
+ <parameter type-id='b59d7dce' name='size'/>
+ <parameter type-id='9d26089a' name='fmt'/>
+ <parameter is-variadic='yes'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='spl_fstrans_unmark' mangled-name='spl_fstrans_unmark' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='spl_fstrans_unmark'>
+ <parameter type-id='059934c1' name='cookie'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='kmem_cache_reap_active' mangled-name='kmem_cache_reap_active' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kmem_cache_reap_active'>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ </abi-instr>
+ <abi-instr address-size='64' path='lib/libspl/kstat.c' language='LANG_C99'>
+ <class-decl name='kstat' size-in-bits='448' is-struct='yes' visibility='default' id='5f5c9d88'>
+ <data-member access='public' layout-offset-in-bits='0'>
+ <var-decl name='ks_flags' type-id='d8bf0010' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='64'>
+ <var-decl name='ks_data' type-id='eaa32e2f' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='128'>
+ <var-decl name='ks_ndata' type-id='3502e3ff' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='192'>
+ <var-decl name='ks_data_size' type-id='b59d7dce' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='256'>
+ <var-decl name='ks_update' type-id='8cf7b7e1' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='320'>
+ <var-decl name='ks_private' type-id='eaa32e2f' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='384'>
+ <var-decl name='ks_lock' type-id='eaa32e2f' visibility='default'/>
+ </data-member>
+ </class-decl>
+ <typedef-decl name='kstat_t' type-id='5f5c9d88' id='dd12e024'/>
+ <typedef-decl name='uchar_t' type-id='002ac4a6' id='d8bf0010'/>
+ <typedef-decl name='__loff_t' type-id='724e4de6' id='00c9d214'/>
+ <typedef-decl name='loff_t' type-id='00c9d214' id='69bf7bee'/>
+ <pointer-type-def type-id='9d5d322a' size-in-bits='64' id='bbe97414'/>
+ <pointer-type-def type-id='05b3c714' size-in-bits='64' id='27cc5c36'/>
+ <pointer-type-def type-id='7a9ace65' size-in-bits='64' id='8cf7b7e1'/>
+ <pointer-type-def type-id='5f5c9d88' size-in-bits='64' id='0e87f9be'/>
+ <pointer-type-def type-id='dd12e024' size-in-bits='64' id='46e5e463'/>
+ <pointer-type-def type-id='527a97c5' size-in-bits='64' id='673f2af9'/>
+ <function-decl name='kstat_create' mangled-name='kstat_create' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kstat_create'>
+ <parameter type-id='80f4b756' name='module'/>
+ <parameter type-id='95e97e5e' name='instance'/>
+ <parameter type-id='80f4b756' name='name'/>
+ <parameter type-id='80f4b756' name='class'/>
+ <parameter type-id='d8bf0010' name='type'/>
+ <parameter type-id='ee1f298e' name='ndata'/>
+ <parameter type-id='d8bf0010' name='ks_flag'/>
+ <return type-id='46e5e463'/>
+ </function-decl>
+ <function-decl name='kstat_install' mangled-name='kstat_install' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kstat_install'>
+ <parameter type-id='46e5e463' name='ksp'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='kstat_set_raw_ops' mangled-name='kstat_set_raw_ops' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kstat_set_raw_ops'>
+ <parameter type-id='46e5e463' name='ksp'/>
+ <parameter type-id='bbe97414' name='headers'/>
+ <parameter type-id='27cc5c36' name='data'/>
+ <parameter type-id='673f2af9' name='addr'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-type size-in-bits='64' id='9d5d322a'>
+ <parameter type-id='26a90f95'/>
+ <parameter type-id='b59d7dce'/>
+ <return type-id='95e97e5e'/>
+ </function-type>
+ <function-type size-in-bits='64' id='05b3c714'>
+ <parameter type-id='26a90f95'/>
+ <parameter type-id='b59d7dce'/>
+ <parameter type-id='eaa32e2f'/>
+ <return type-id='95e97e5e'/>
+ </function-type>
+ <function-type size-in-bits='64' id='7a9ace65'>
+ <parameter type-id='0e87f9be'/>
+ <parameter type-id='95e97e5e'/>
+ <return type-id='95e97e5e'/>
+ </function-type>
+ <function-type size-in-bits='64' id='527a97c5'>
+ <parameter type-id='46e5e463'/>
+ <parameter type-id='69bf7bee'/>
+ <return type-id='eaa32e2f'/>
+ </function-type>
+ </abi-instr>
+ <abi-instr address-size='64' path='lib/libspl/libspl.c' language='LANG_C99'>
+ <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='520' id='5ddd38d2'>
+ <subrange length='65' type-id='7359adad' id='b50e2e4a'/>
+ </array-type-def>
+ <typedef-decl name='utsname_t' type-id='414a2ac6' id='5278297a'/>
+ <class-decl name='utsname' size-in-bits='3120' is-struct='yes' visibility='default' id='414a2ac6'>
+ <data-member access='public' layout-offset-in-bits='0'>
+ <var-decl name='sysname' type-id='5ddd38d2' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='520'>
+ <var-decl name='nodename' type-id='5ddd38d2' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='1040'>
+ <var-decl name='release' type-id='5ddd38d2' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='1560'>
+ <var-decl name='version' type-id='5ddd38d2' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2080'>
+ <var-decl name='machine' type-id='5ddd38d2' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2600'>
+ <var-decl name='domainname' type-id='5ddd38d2' visibility='default'/>
+ </data-member>
+ </class-decl>
+ <pointer-type-def type-id='414a2ac6' size-in-bits='64' id='a6724cec'/>
+ <pointer-type-def type-id='5278297a' size-in-bits='64' id='5c7868ad'/>
+ <function-decl name='uname' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='a6724cec'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='libspl_physmem' mangled-name='libspl_physmem' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libspl_physmem'>
+ <return type-id='9c313c2d'/>
+ </function-decl>
+ <function-decl name='utsname' mangled-name='utsname' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='utsname'>
+ <return type-id='5c7868ad'/>
+ </function-decl>
+ <function-decl name='libspl_init' mangled-name='libspl_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libspl_init'>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='libspl_fini' mangled-name='libspl_fini' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libspl_fini'>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='random_init' mangled-name='random_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='random_init'>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='random_fini' mangled-name='random_fini' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='random_fini'>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ </abi-instr>
<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'/>
@@ -1457,123 +1779,533 @@
<return type-id='b59d7dce'/>
</function-decl>
</abi-instr>
+ <abi-instr address-size='64' path='lib/libspl/mutex.c' language='LANG_C99'>
+ <function-decl name='pthread_mutex_trylock' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='18c91f9e'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='mutex_init' mangled-name='mutex_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mutex_init'>
+ <parameter type-id='78830f38' name='mp'/>
+ <parameter type-id='26a90f95' name='name'/>
+ <parameter type-id='95e97e5e' name='type'/>
+ <parameter type-id='eaa32e2f' name='cookie'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='mutex_destroy' mangled-name='mutex_destroy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mutex_destroy'>
+ <parameter type-id='78830f38' name='mp'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='mutex_enter' mangled-name='mutex_enter' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mutex_enter'>
+ <parameter type-id='78830f38' name='mp'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='mutex_enter_check_return' mangled-name='mutex_enter_check_return' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mutex_enter_check_return'>
+ <parameter type-id='78830f38' name='mp'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='mutex_tryenter' mangled-name='mutex_tryenter' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mutex_tryenter'>
+ <parameter type-id='78830f38' name='mp'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='mutex_exit' mangled-name='mutex_exit' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mutex_exit'>
+ <parameter type-id='78830f38' name='mp'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ </abi-instr>
<abi-instr address-size='64' path='lib/libspl/os/linux/getmntany.c' language='LANG_C99'>
- <array-type-def dimensions='1' type-id='d315442e' size-in-bits='16' id='811205dc'>
- <subrange length='1' type-id='7359adad' id='52f813b4'/>
+ <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='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='lib/libspl/procfs_list.c' language='LANG_C99'>
+ <class-decl name='procfs_list' size-in-bits='768' is-struct='yes' visibility='default' id='0f4d3b87'>
+ <data-member access='public' layout-offset-in-bits='0'>
+ <var-decl name='pl_private' type-id='eaa32e2f' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='64'>
+ <var-decl name='pl_lock' type-id='b9eccc8f' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='448'>
+ <var-decl name='pl_list' type-id='0899125f' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='640'>
+ <var-decl name='pl_next_id' type-id='9c313c2d' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='704'>
+ <var-decl name='pl_node_offset' type-id='b59d7dce' visibility='default'/>
+ </data-member>
+ </class-decl>
+ <typedef-decl name='procfs_list_t' type-id='0f4d3b87' id='e5b5a21b'/>
+ <class-decl name='seq_file' is-struct='yes' visibility='default' id='f3415517'/>
+ <pointer-type-def type-id='be39c944' size-in-bits='64' id='b5c3ae96'/>
+ <pointer-type-def type-id='86932239' size-in-bits='64' id='6255c89d'/>
+ <pointer-type-def type-id='cf9ec29d' size-in-bits='64' id='0131eb61'/>
+ <pointer-type-def type-id='e5b5a21b' size-in-bits='64' id='7f432372'/>
+ <pointer-type-def type-id='f3415517' size-in-bits='64' id='f8dc9def'/>
+ <function-decl name='seq_printf' mangled-name='seq_printf' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='seq_printf'>
+ <parameter type-id='f8dc9def' name='m'/>
+ <parameter type-id='80f4b756' name='fmt'/>
+ <parameter is-variadic='yes'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='procfs_list_install' mangled-name='procfs_list_install' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='procfs_list_install'>
+ <parameter type-id='80f4b756' name='module'/>
+ <parameter type-id='80f4b756' name='submodule'/>
+ <parameter type-id='80f4b756' name='name'/>
+ <parameter type-id='d50d396c' name='mode'/>
+ <parameter type-id='7f432372' name='procfs_list'/>
+ <parameter type-id='0131eb61' name='show'/>
+ <parameter type-id='6255c89d' name='show_header'/>
+ <parameter type-id='b5c3ae96' name='clear'/>
+ <parameter type-id='b59d7dce' name='procfs_list_node_off'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='procfs_list_uninstall' mangled-name='procfs_list_uninstall' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='procfs_list_uninstall'>
+ <parameter type-id='7f432372' name='procfs_list'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='procfs_list_destroy' mangled-name='procfs_list_destroy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='procfs_list_destroy'>
+ <parameter type-id='7f432372' name='procfs_list'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='procfs_list_add' mangled-name='procfs_list_add' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='procfs_list_add'>
+ <parameter type-id='7f432372' name='procfs_list'/>
+ <parameter type-id='eaa32e2f' name='p'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-type size-in-bits='64' id='be39c944'>
+ <parameter type-id='7f432372'/>
+ <return type-id='95e97e5e'/>
+ </function-type>
+ <function-type size-in-bits='64' id='86932239'>
+ <parameter type-id='f8dc9def'/>
+ <return type-id='95e97e5e'/>
+ </function-type>
+ <function-type size-in-bits='64' id='cf9ec29d'>
+ <parameter type-id='f8dc9def'/>
+ <parameter type-id='eaa32e2f'/>
+ <return type-id='95e97e5e'/>
+ </function-type>
+ </abi-instr>
+ <abi-instr address-size='64' path='lib/libspl/random.c' language='LANG_C99'>
+ <function-decl name='random_force_pseudo' mangled-name='random_force_pseudo' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='random_force_pseudo'>
+ <parameter type-id='c19b74c3' name='onoff'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='random_get_bytes' mangled-name='random_get_bytes' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='random_get_bytes'>
+ <parameter type-id='ae3e8ca6' name='ptr'/>
+ <parameter type-id='b59d7dce' name='len'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='random_get_pseudo_bytes' mangled-name='random_get_pseudo_bytes' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='random_get_pseudo_bytes'>
+ <parameter type-id='ae3e8ca6' name='ptr'/>
+ <parameter type-id='b59d7dce' name='len'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ </abi-instr>
+ <abi-instr address-size='64' path='lib/libspl/rwlock.c' language='LANG_C99'>
+ <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='64' id='8e100159'>
+ <subrange length='8' type-id='7359adad' id='56e0c0b1'/>
</array-type-def>
- <array-type-def dimensions='1' type-id='d3130597' size-in-bits='768' id='f63f23b9'>
- <subrange length='12' type-id='7359adad' id='84827bdc'/>
+ <array-type-def dimensions='1' type-id='002ac4a6' size-in-bits='56' id='08f7ce77'>
+ <subrange length='7' type-id='7359adad' id='16fc326e'/>
</array-type-def>
- <typedef-decl name='__u16' type-id='8efea9e5' id='d315442e'/>
- <typedef-decl name='__s32' type-id='95e97e5e' id='3158a266'/>
- <typedef-decl name='__u32' type-id='f0981eeb' id='3f1a6b60'/>
- <typedef-decl name='__s64' type-id='1eb56b1e' id='49659421'/>
- <typedef-decl name='__u64' type-id='3a47d82b' id='d3130597'/>
- <class-decl name='statx_timestamp' size-in-bits='128' is-struct='yes' visibility='default' id='94101016'>
+ <class-decl name='krwlock' size-in-bits='576' is-struct='yes' visibility='default' id='4361e3b2'>
<data-member access='public' layout-offset-in-bits='0'>
- <var-decl name='tv_sec' type-id='49659421' visibility='default'/>
+ <var-decl name='rw_lock' type-id='3f680bc6' visibility='default'/>
</data-member>
- <data-member access='public' layout-offset-in-bits='64'>
- <var-decl name='tv_nsec' type-id='3f1a6b60' visibility='default'/>
+ <data-member access='public' layout-offset-in-bits='448'>
+ <var-decl name='rw_owner' type-id='4051f5e7' visibility='default'/>
</data-member>
- <data-member access='public' layout-offset-in-bits='96'>
- <var-decl name='__reserved' type-id='3158a266' visibility='default'/>
+ <data-member access='public' layout-offset-in-bits='512'>
+ <var-decl name='rw_readers' type-id='3502e3ff' visibility='default'/>
</data-member>
</class-decl>
- <class-decl name='statx' size-in-bits='2048' is-struct='yes' visibility='default' id='720b04c5'>
+ <typedef-decl name='krwlock_t' type-id='4361e3b2' id='477df69a'/>
+ <typedef-decl name='krw_t' type-id='95e97e5e' id='932eed5d'/>
+ <union-decl name='pthread_rwlock_t' size-in-bits='448' naming-typedef-id='3f680bc6' visibility='default' id='981886f6'>
+ <data-member access='public'>
+ <var-decl name='__data' type-id='afe414a4' visibility='default'/>
+ </data-member>
+ <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_rwlock_t' type-id='981886f6' id='3f680bc6'/>
+ <union-decl name='pthread_rwlockattr_t' size-in-bits='64' naming-typedef-id='1b1c4591' visibility='default' id='b8e57521'>
+ <data-member access='public'>
+ <var-decl name='__size' type-id='8e100159' 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_rwlockattr_t' type-id='b8e57521' id='1b1c4591'/>
+ <class-decl name='__pthread_rwlock_arch_t' size-in-bits='448' is-struct='yes' visibility='default' id='afe414a4'>
<data-member access='public' layout-offset-in-bits='0'>
- <var-decl name='stx_mask' type-id='3f1a6b60' visibility='default'/>
+ <var-decl name='__readers' type-id='f0981eeb' visibility='default'/>
</data-member>
<data-member access='public' layout-offset-in-bits='32'>
- <var-decl name='stx_blksize' type-id='3f1a6b60' visibility='default'/>
+ <var-decl name='__writers' type-id='f0981eeb' visibility='default'/>
</data-member>
<data-member access='public' layout-offset-in-bits='64'>
- <var-decl name='stx_attributes' type-id='d3130597' visibility='default'/>
+ <var-decl name='__wrphase_futex' type-id='f0981eeb' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='96'>
+ <var-decl name='__writers_futex' type-id='f0981eeb' visibility='default'/>
</data-member>
<data-member access='public' layout-offset-in-bits='128'>
- <var-decl name='stx_nlink' type-id='3f1a6b60' visibility='default'/>
+ <var-decl name='__pad3' type-id='f0981eeb' visibility='default'/>
</data-member>
<data-member access='public' layout-offset-in-bits='160'>
- <var-decl name='stx_uid' type-id='3f1a6b60' visibility='default'/>
+ <var-decl name='__pad4' type-id='f0981eeb' visibility='default'/>
</data-member>
<data-member access='public' layout-offset-in-bits='192'>
- <var-decl name='stx_gid' type-id='3f1a6b60' visibility='default'/>
+ <var-decl name='__cur_writer' type-id='95e97e5e' visibility='default'/>
</data-member>
<data-member access='public' layout-offset-in-bits='224'>
- <var-decl name='stx_mode' type-id='d315442e' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='240'>
- <var-decl name='__spare0' type-id='811205dc' visibility='default'/>
+ <var-decl name='__shared' type-id='95e97e5e' visibility='default'/>
</data-member>
<data-member access='public' layout-offset-in-bits='256'>
- <var-decl name='stx_ino' type-id='d3130597' visibility='default'/>
+ <var-decl name='__rwelision' type-id='28577a57' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='264'>
+ <var-decl name='__pad1' type-id='08f7ce77' visibility='default'/>
</data-member>
<data-member access='public' layout-offset-in-bits='320'>
- <var-decl name='stx_size' type-id='d3130597' visibility='default'/>
+ <var-decl name='__pad2' type-id='7359adad' visibility='default'/>
</data-member>
<data-member access='public' layout-offset-in-bits='384'>
- <var-decl name='stx_blocks' type-id='d3130597' visibility='default'/>
+ <var-decl name='__flags' type-id='f0981eeb' visibility='default'/>
</data-member>
- <data-member access='public' layout-offset-in-bits='448'>
- <var-decl name='stx_attributes_mask' type-id='d3130597' visibility='default'/>
+ </class-decl>
+ <qualified-type-def type-id='1b1c4591' const='yes' id='52c85581'/>
+ <pointer-type-def type-id='52c85581' size-in-bits='64' id='fc5edc31'/>
+ <qualified-type-def type-id='fc5edc31' restrict='yes' id='295e8f33'/>
+ <pointer-type-def type-id='477df69a' size-in-bits='64' id='0126db61'/>
+ <pointer-type-def type-id='3f680bc6' size-in-bits='64' id='a6210c87'/>
+ <qualified-type-def type-id='a6210c87' restrict='yes' id='27210b05'/>
+ <qualified-type-def type-id='3502e3ff' volatile='yes' id='d0290e74'/>
+ <pointer-type-def type-id='d0290e74' size-in-bits='64' id='0ea19dfa'/>
+ <function-decl name='atomic_inc_uint' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='0ea19dfa'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='atomic_dec_uint' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='0ea19dfa'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='pthread_rwlock_init' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='27210b05'/>
+ <parameter type-id='295e8f33'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='pthread_rwlock_destroy' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='a6210c87'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='pthread_rwlock_rdlock' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='a6210c87'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='pthread_rwlock_tryrdlock' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='a6210c87'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='pthread_rwlock_wrlock' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='a6210c87'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='pthread_rwlock_trywrlock' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='a6210c87'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='pthread_rwlock_unlock' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='a6210c87'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='rw_init' mangled-name='rw_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rw_init'>
+ <parameter type-id='0126db61' name='rwlp'/>
+ <parameter type-id='26a90f95' name='name'/>
+ <parameter type-id='95e97e5e' name='type'/>
+ <parameter type-id='eaa32e2f' name='arg'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='rw_destroy' mangled-name='rw_destroy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rw_destroy'>
+ <parameter type-id='0126db61' name='rwlp'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='rw_enter' mangled-name='rw_enter' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rw_enter'>
+ <parameter type-id='0126db61' name='rwlp'/>
+ <parameter type-id='932eed5d' name='rw'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='rw_exit' mangled-name='rw_exit' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rw_exit'>
+ <parameter type-id='0126db61' name='rwlp'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='rw_tryenter' mangled-name='rw_tryenter' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rw_tryenter'>
+ <parameter type-id='0126db61' name='rwlp'/>
+ <parameter type-id='932eed5d' name='rw'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='rw_tryupgrade' mangled-name='rw_tryupgrade' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rw_tryupgrade'>
+ <parameter type-id='0126db61' name='rwlp'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ </abi-instr>
+ <abi-instr address-size='64' path='lib/libspl/sid.c' language='LANG_C99'>
+ <class-decl name='ksiddomain' size-in-bits='128' is-struct='yes' visibility='default' id='b3a38f42'>
+ <data-member access='public' layout-offset-in-bits='0'>
+ <var-decl name='kd_ref' type-id='3502e3ff' visibility='default'/>
</data-member>
- <data-member access='public' layout-offset-in-bits='512'>
- <var-decl name='stx_atime' type-id='94101016' visibility='default'/>
+ <data-member access='public' layout-offset-in-bits='32'>
+ <var-decl name='kd_len' type-id='3502e3ff' visibility='default'/>
</data-member>
- <data-member access='public' layout-offset-in-bits='640'>
- <var-decl name='stx_btime' type-id='94101016' visibility='default'/>
+ <data-member access='public' layout-offset-in-bits='64'>
+ <var-decl name='kd_name' type-id='26a90f95' visibility='default'/>
</data-member>
- <data-member access='public' layout-offset-in-bits='768'>
- <var-decl name='stx_ctime' type-id='94101016' visibility='default'/>
+ </class-decl>
+ <typedef-decl name='ksiddomain_t' type-id='b3a38f42' id='db2eb030'/>
+ <pointer-type-def type-id='db2eb030' size-in-bits='64' id='3b684881'/>
+ <function-decl name='ksid_lookupdomain' mangled-name='ksid_lookupdomain' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='ksid_lookupdomain'>
+ <parameter type-id='80f4b756' name='dom'/>
+ <return type-id='3b684881'/>
+ </function-decl>
+ <function-decl name='ksiddomain_rele' mangled-name='ksiddomain_rele' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='ksiddomain_rele'>
+ <parameter type-id='3b684881' name='ksid'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ </abi-instr>
+ <abi-instr address-size='64' path='lib/libspl/taskq.c' language='LANG_C99'>
+ <typedef-decl name='pri_t' type-id='a2185560' id='c497180a'/>
+ <typedef-decl name='taskqid_t' type-id='e475ab95' id='de0ea20e'/>
+ <typedef-decl name='task_func_t' type-id='c5c76c9c' id='d8481e1f'/>
+ <class-decl name='taskq_ent' size-in-bits='320' is-struct='yes' visibility='default' id='cfda1b05'>
+ <data-member access='public' layout-offset-in-bits='0'>
+ <var-decl name='tqent_next' type-id='67918d75' visibility='default'/>
</data-member>
- <data-member access='public' layout-offset-in-bits='896'>
- <var-decl name='stx_mtime' type-id='94101016' visibility='default'/>
+ <data-member access='public' layout-offset-in-bits='64'>
+ <var-decl name='tqent_prev' type-id='67918d75' visibility='default'/>
</data-member>
- <data-member access='public' layout-offset-in-bits='1024'>
- <var-decl name='stx_rdev_major' type-id='3f1a6b60' visibility='default'/>
+ <data-member access='public' layout-offset-in-bits='128'>
+ <var-decl name='tqent_func' type-id='41cce5ce' visibility='default'/>
</data-member>
- <data-member access='public' layout-offset-in-bits='1056'>
- <var-decl name='stx_rdev_minor' type-id='3f1a6b60' visibility='default'/>
+ <data-member access='public' layout-offset-in-bits='192'>
+ <var-decl name='tqent_arg' type-id='eaa32e2f' visibility='default'/>
</data-member>
- <data-member access='public' layout-offset-in-bits='1088'>
- <var-decl name='stx_dev_major' type-id='3f1a6b60' visibility='default'/>
+ <data-member access='public' layout-offset-in-bits='256'>
+ <var-decl name='tqent_flags' type-id='e475ab95' visibility='default'/>
</data-member>
- <data-member access='public' layout-offset-in-bits='1120'>
- <var-decl name='stx_dev_minor' type-id='3f1a6b60' visibility='default'/>
+ </class-decl>
+ <typedef-decl name='taskq_ent_t' type-id='cfda1b05' id='65d297d1'/>
+ <class-decl name='taskq' size-in-bits='3072' is-struct='yes' visibility='default' id='1804594f'>
+ <data-member access='public' layout-offset-in-bits='0'>
+ <var-decl name='tq_name' type-id='16dc656a' visibility='default'/>
</data-member>
- <data-member access='public' layout-offset-in-bits='1152'>
- <var-decl name='stx_mnt_id' type-id='d3130597' visibility='default'/>
+ <data-member access='public' layout-offset-in-bits='256'>
+ <var-decl name='tq_lock' type-id='b9eccc8f' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='640'>
+ <var-decl name='tq_threadlock' type-id='477df69a' visibility='default'/>
</data-member>
<data-member access='public' layout-offset-in-bits='1216'>
- <var-decl name='__spare2' type-id='d3130597' visibility='default'/>
+ <var-decl name='tq_dispatch_cv' type-id='29dbc0dd' visibility='default'/>
</data-member>
- <data-member access='public' layout-offset-in-bits='1280'>
- <var-decl name='__spare3' type-id='f63f23b9' visibility='default'/>
+ <data-member access='public' layout-offset-in-bits='1600'>
+ <var-decl name='tq_wait_cv' type-id='29dbc0dd' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='1984'>
+ <var-decl name='tq_threadlist' type-id='6e87b565' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2048'>
+ <var-decl name='tq_flags' type-id='95e97e5e' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2080'>
+ <var-decl name='tq_active' type-id='95e97e5e' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2112'>
+ <var-decl name='tq_nthreads' type-id='95e97e5e' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2144'>
+ <var-decl name='tq_nalloc' type-id='95e97e5e' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2176'>
+ <var-decl name='tq_minalloc' type-id='95e97e5e' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2208'>
+ <var-decl name='tq_maxalloc' type-id='95e97e5e' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2240'>
+ <var-decl name='tq_maxalloc_cv' type-id='29dbc0dd' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2624'>
+ <var-decl name='tq_maxalloc_wait' type-id='95e97e5e' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2688'>
+ <var-decl name='tq_freelist' type-id='3a4f23d4' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2752'>
+ <var-decl name='tq_task' type-id='65d297d1' visibility='default'/>
</data-member>
</class-decl>
- <pointer-type-def type-id='56fe4a37' size-in-bits='64' id='b6b61d2f'/>
- <qualified-type-def type-id='b6b61d2f' restrict='yes' id='3cad23cd'/>
- <pointer-type-def type-id='720b04c5' size-in-bits='64' id='936b8e35'/>
- <qualified-type-def type-id='936b8e35' restrict='yes' id='31d265b7'/>
- <function-decl name='getmntent_r' visibility='default' binding='global' size-in-bits='64'>
- <parameter type-id='e75a27e9'/>
- <parameter type-id='3cad23cd'/>
- <parameter type-id='266fe297'/>
+ <typedef-decl name='taskq_t' type-id='1804594f' id='ef507f03'/>
+ <typedef-decl name='kthread_t' type-id='4051f5e7' id='9bccee1a'/>
+ <typedef-decl name='pthread_key_t' type-id='f0981eeb' id='2de5383b'/>
+ <pointer-type-def type-id='9bccee1a' size-in-bits='64' id='6ae5a80d'/>
+ <pointer-type-def type-id='6ae5a80d' size-in-bits='64' id='6e87b565'/>
+ <pointer-type-def type-id='6e87b565' size-in-bits='64' id='4ea26b5d'/>
+ <pointer-type-def type-id='2de5383b' size-in-bits='64' id='ce04b822'/>
+ <pointer-type-def type-id='d8481e1f' size-in-bits='64' id='41cce5ce'/>
+ <pointer-type-def type-id='cfda1b05' size-in-bits='64' id='67918d75'/>
+ <pointer-type-def type-id='65d297d1' size-in-bits='64' id='3a4f23d4'/>
+ <pointer-type-def type-id='ef507f03' size-in-bits='64' id='4f8ed29a'/>
+ <function-decl name='zk_thread_create' mangled-name='zk_thread_create' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zk_thread_create'>
+ <parameter type-id='80f4b756'/>
+ <parameter type-id='b7f9d8e6'/>
+ <parameter type-id='eaa32e2f'/>
+ <parameter type-id='b59d7dce'/>
<parameter type-id='95e97e5e'/>
- <return type-id='b6b61d2f'/>
+ <return type-id='6ae5a80d'/>
</function-decl>
- <function-decl name='feof' visibility='default' binding='global' size-in-bits='64'>
- <parameter type-id='822cd80b'/>
+ <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='statx' visibility='default' binding='global' size-in-bits='64'>
- <parameter type-id='95e97e5e'/>
- <parameter type-id='9d26089a'/>
- <parameter type-id='95e97e5e'/>
- <parameter type-id='f0981eeb'/>
- <parameter type-id='31d265b7'/>
+ <function-decl name='pthread_key_delete' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='2de5383b'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <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='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='_system_taskq' mangled-name='_system_taskq' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_system_taskq'>
+ <return type-id='4f8ed29a'/>
+ </function-decl>
+ <function-decl name='_system_delay_taskq' mangled-name='_system_delay_taskq' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_system_delay_taskq'>
+ <return type-id='4f8ed29a'/>
+ </function-decl>
+ <function-decl name='taskq_dispatch' mangled-name='taskq_dispatch' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_dispatch'>
+ <parameter type-id='4f8ed29a' name='tq'/>
+ <parameter type-id='41cce5ce' name='func'/>
+ <parameter type-id='eaa32e2f' name='arg'/>
+ <parameter type-id='3502e3ff' name='tqflags'/>
+ <return type-id='de0ea20e'/>
+ </function-decl>
+ <function-decl name='taskq_dispatch_delay' mangled-name='taskq_dispatch_delay' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_dispatch_delay'>
+ <parameter type-id='4f8ed29a' name='tq'/>
+ <parameter type-id='41cce5ce' name='func'/>
+ <parameter type-id='eaa32e2f' name='arg'/>
+ <parameter type-id='3502e3ff' name='tqflags'/>
+ <parameter type-id='4c3a2c61' name='expire_time'/>
+ <return type-id='de0ea20e'/>
+ </function-decl>
+ <function-decl name='taskq_empty_ent' mangled-name='taskq_empty_ent' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_empty_ent'>
+ <parameter type-id='3a4f23d4' name='t'/>
<return type-id='95e97e5e'/>
</function-decl>
+ <function-decl name='taskq_init_ent' mangled-name='taskq_init_ent' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_init_ent'>
+ <parameter type-id='3a4f23d4' name='t'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='taskq_dispatch_ent' mangled-name='taskq_dispatch_ent' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_dispatch_ent'>
+ <parameter type-id='4f8ed29a' name='tq'/>
+ <parameter type-id='41cce5ce' name='func'/>
+ <parameter type-id='eaa32e2f' name='arg'/>
+ <parameter type-id='3502e3ff' name='flags'/>
+ <parameter type-id='3a4f23d4' name='t'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='taskq_wait' mangled-name='taskq_wait' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_wait'>
+ <parameter type-id='4f8ed29a' name='tq'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='taskq_wait_id' mangled-name='taskq_wait_id' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_wait_id'>
+ <parameter type-id='4f8ed29a' name='tq'/>
+ <parameter type-id='de0ea20e' name='id'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='taskq_create' mangled-name='taskq_create' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_create'>
+ <parameter type-id='80f4b756' name='name'/>
+ <parameter type-id='95e97e5e' name='nthreads'/>
+ <parameter type-id='c497180a' name='pri'/>
+ <parameter type-id='95e97e5e' name='minalloc'/>
+ <parameter type-id='95e97e5e' name='maxalloc'/>
+ <parameter type-id='3502e3ff' name='flags'/>
+ <return type-id='4f8ed29a'/>
+ </function-decl>
+ <function-decl name='taskq_destroy' mangled-name='taskq_destroy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_destroy'>
+ <parameter type-id='4f8ed29a' name='tq'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='taskq_create_synced' mangled-name='taskq_create_synced' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_create_synced'>
+ <parameter type-id='80f4b756' name='name'/>
+ <parameter type-id='95e97e5e' name='nthreads'/>
+ <parameter type-id='c497180a' name='pri'/>
+ <parameter type-id='95e97e5e' name='minalloc'/>
+ <parameter type-id='95e97e5e' name='maxalloc'/>
+ <parameter type-id='3502e3ff' name='flags'/>
+ <parameter type-id='4ea26b5d' name='ktpp'/>
+ <return type-id='4f8ed29a'/>
+ </function-decl>
+ <function-decl name='taskq_member' mangled-name='taskq_member' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_member'>
+ <parameter type-id='4f8ed29a' name='tq'/>
+ <parameter type-id='6ae5a80d' name='t'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='taskq_of_curthread' mangled-name='taskq_of_curthread' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_of_curthread'>
+ <return type-id='4f8ed29a'/>
+ </function-decl>
+ <function-decl name='taskq_cancel_id' mangled-name='taskq_cancel_id' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_cancel_id'>
+ <parameter type-id='4f8ed29a' name='tq'/>
+ <parameter type-id='de0ea20e' name='id'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='system_taskq_init' mangled-name='system_taskq_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='system_taskq_init'>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='system_taskq_fini' mangled-name='system_taskq_fini' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='system_taskq_fini'>
+ <return type-id='48b5725f'/>
+ </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='lib/libspl/thread.c' language='LANG_C99'>
+ <function-decl name='pthread_attr_setstacksize' 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='pthread_setname_np' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='4051f5e7'/>
+ <parameter type-id='80f4b756'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='p0' mangled-name='p0' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='p0'>
+ <return type-id='48b5725f'/>
+ </function-decl>
</abi-instr>
<abi-instr address-size='64' path='lib/libspl/timestamp.c' language='LANG_C99'>
<typedef-decl name='nl_item' type-id='95e97e5e' id='03b79a94'/>
@@ -1599,50 +2331,10 @@
</function-decl>
</abi-instr>
<abi-instr address-size='64' path='lib/libspl/tunables.c' language='LANG_C99'>
- <enum-decl name='zfs_tunable_type_t' naming-typedef-id='f50b1525' id='56905369'>
- <underlying-type type-id='9cac1fee'/>
- <enumerator name='ZFS_TUNABLE_TYPE_INT' value='0'/>
- <enumerator name='ZFS_TUNABLE_TYPE_UINT' value='1'/>
- <enumerator name='ZFS_TUNABLE_TYPE_ULONG' value='2'/>
- <enumerator name='ZFS_TUNABLE_TYPE_U64' value='3'/>
- <enumerator name='ZFS_TUNABLE_TYPE_STRING' value='4'/>
- </enum-decl>
- <typedef-decl name='zfs_tunable_type_t' type-id='56905369' id='f50b1525'/>
- <enum-decl name='zfs_tunable_perm_t' naming-typedef-id='ada7336b' id='e80e6ebf'>
- <underlying-type type-id='9cac1fee'/>
- <enumerator name='ZFS_TUNABLE_PERM_ZMOD_RW' value='0'/>
- <enumerator name='ZFS_TUNABLE_PERM_ZMOD_RD' value='1'/>
- </enum-decl>
- <typedef-decl name='zfs_tunable_perm_t' type-id='e80e6ebf' id='ada7336b'/>
- <class-decl name='zfs_tunable' size-in-bits='320' is-struct='yes' visibility='default' id='1a97ee0e'>
- <data-member access='public' layout-offset-in-bits='0'>
- <var-decl name='zt_name' type-id='80f4b756' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='64'>
- <var-decl name='zt_varp' type-id='eaa32e2f' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='128'>
- <var-decl name='zt_varsz' type-id='b59d7dce' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='192'>
- <var-decl name='zt_type' type-id='f50b1525' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='224'>
- <var-decl name='zt_perm' type-id='ada7336b' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='256'>
- <var-decl name='zt_desc' type-id='80f4b756' visibility='default'/>
- </data-member>
- </class-decl>
- <typedef-decl name='zfs_tunable_t' type-id='1a97ee0e' id='12bf5c5e'/>
- <typedef-decl name='zfs_tunable_iter_t' type-id='7ef33f92' id='d8d5f4ab'/>
<typedef-decl name='intmax_t' type-id='5b475db0' id='e104d842'/>
<typedef-decl name='uintmax_t' type-id='04d82f4b' id='f8b828c9'/>
<typedef-decl name='__intmax_t' type-id='bd54fe1a' id='5b475db0'/>
<typedef-decl name='__uintmax_t' type-id='7359adad' id='04d82f4b'/>
- <qualified-type-def type-id='12bf5c5e' const='yes' id='180e47ee'/>
- <pointer-type-def type-id='180e47ee' size-in-bits='64' id='a27af98c'/>
- <pointer-type-def type-id='92f86508' size-in-bits='64' id='7ef33f92'/>
<function-decl name='strtoimax' visibility='default' binding='global' size-in-bits='64'>
<parameter type-id='9d26089a'/>
<parameter type-id='8c85230f'/>
@@ -1655,31 +2347,6 @@
<parameter type-id='95e97e5e'/>
<return type-id='f8b828c9'/>
</function-decl>
- <function-decl name='zfs_tunable_lookup' mangled-name='zfs_tunable_lookup' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_tunable_lookup'>
- <parameter type-id='80f4b756' name='name'/>
- <return type-id='a27af98c'/>
- </function-decl>
- <function-decl name='zfs_tunable_iter' mangled-name='zfs_tunable_iter' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_tunable_iter'>
- <parameter type-id='d8d5f4ab' name='cb'/>
- <parameter type-id='eaa32e2f' name='arg'/>
- <return type-id='48b5725f'/>
- </function-decl>
- <function-decl name='zfs_tunable_set' mangled-name='zfs_tunable_set' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_tunable_set'>
- <parameter type-id='a27af98c' name='zt'/>
- <parameter type-id='80f4b756' name='val'/>
- <return type-id='95e97e5e'/>
- </function-decl>
- <function-decl name='zfs_tunable_get' mangled-name='zfs_tunable_get' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_tunable_get'>
- <parameter type-id='a27af98c' name='zt'/>
- <parameter type-id='26a90f95' name='val'/>
- <parameter type-id='b59d7dce' name='valsz'/>
- <return type-id='95e97e5e'/>
- </function-decl>
- <function-type size-in-bits='64' id='92f86508'>
- <parameter type-id='a27af98c'/>
- <parameter type-id='eaa32e2f'/>
- <return type-id='95e97e5e'/>
- </function-type>
</abi-instr>
<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'>
@@ -1910,10 +2577,6 @@
<parameter type-id='7292109c'/>
<return type-id='95e97e5e'/>
</function-decl>
- <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-decl name='pthread_cond_init' visibility='default' binding='global' size-in-bits='64'>
<parameter type-id='2a468b41'/>
<parameter type-id='4c428e67'/>
@@ -2017,10 +2680,6 @@
<var-decl name='tp_idle' type-id='95e97e5e' visibility='default'/>
</data-member>
</class-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='lib/libzfs/libzfs_changelist.c' language='LANG_C99'>
<array-type-def dimensions='1' type-id='bf311473' size-in-bits='128' id='f0f65199'>
@@ -2741,9 +3400,6 @@
<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'/>
@@ -2760,6 +3416,9 @@
<parameter type-id='b59d7dce'/>
<return type-id='b59d7dce'/>
</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='free' visibility='default' binding='global' size-in-bits='64'>
<parameter type-id='eaa32e2f'/>
<return type-id='48b5725f'/>
@@ -3194,6 +3853,10 @@
<parameter type-id='dace003f'/>
<return type-id='80f4b756'/>
</function-decl>
+ <function-decl name='fnvlist_dup' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='22cce67b'/>
+ <return type-id='5ce45b60'/>
+ </function-decl>
<function-decl name='fnvpair_value_nvlist' visibility='default' binding='global' size-in-bits='64'>
<parameter type-id='3fa542f0'/>
<return type-id='5ce45b60'/>
@@ -3238,6 +3901,11 @@
<parameter type-id='37e3bd22' name='missing'/>
<return type-id='95e97e5e'/>
</function-decl>
+ <function-decl name='zpool_refresh_stats_from_handle' mangled-name='zpool_refresh_stats_from_handle' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_refresh_stats_from_handle'>
+ <parameter type-id='4c81de99' name='dzhp'/>
+ <parameter type-id='4c81de99' name='szhp'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
<function-decl name='zpool_skip_pool' mangled-name='zpool_skip_pool' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_skip_pool'>
<parameter type-id='80f4b756' name='poolname'/>
<return type-id='c19b74c3'/>
@@ -3379,7 +4047,6 @@
</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'/>
@@ -3681,6 +4348,7 @@
<var-decl name='_unused2' type-id='664ac0b7' visibility='default'/>
</data-member>
</class-decl>
+ <typedef-decl name='ssize_t' type-id='41060289' id='79a0948f'/>
<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'/>
@@ -6117,7 +6785,10 @@
<enumerator name='VDEV_PROP_TRIM_SUPPORT' value='49'/>
<enumerator name='VDEV_PROP_TRIM_ERRORS' value='50'/>
<enumerator name='VDEV_PROP_SLOW_IOS' value='51'/>
- <enumerator name='VDEV_NUM_PROPS' value='52'/>
+ <enumerator name='VDEV_PROP_SIT_OUT' value='52'/>
+ <enumerator name='VDEV_PROP_AUTOSIT' value='53'/>
+ <enumerator name='VDEV_PROP_SLOW_IO_EVENTS' value='54'/>
+ <enumerator name='VDEV_NUM_PROPS' value='55'/>
</enum-decl>
<typedef-decl name='vdev_prop_t' type-id='1573bec8' id='5aa5c90c'/>
<class-decl name='zpool_load_policy' size-in-bits='256' is-struct='yes' visibility='default' id='2f65b36f'>
@@ -6341,6 +7012,7 @@
<underlying-type type-id='9cac1fee'/>
<enumerator name='ZPOOL_PREFETCH_NONE' value='0'/>
<enumerator name='ZPOOL_PREFETCH_DDT' value='1'/>
+ <enumerator name='ZPOOL_PREFETCH_BRT' value='2'/>
</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'>
@@ -8079,6 +8751,10 @@
<parameter type-id='ba7c727c'/>
<return type-id='48b5725f'/>
</function-decl>
+ <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-decl name='__pthread_unwind_next' visibility='default' binding='global' size-in-bits='64'>
<parameter type-id='ba7c727c'/>
<return type-id='48b5725f'/>
@@ -9396,10 +10072,6 @@
<parameter type-id='5ce45b60'/>
<return type-id='48b5725f'/>
</function-decl>
- <function-decl name='fnvlist_dup' visibility='default' binding='global' size-in-bits='64'>
- <parameter type-id='22cce67b'/>
- <return type-id='5ce45b60'/>
- </function-decl>
<function-decl name='spl_pagesize' mangled-name='spl_pagesize' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='spl_pagesize'>
<return type-id='b59d7dce'/>
</function-decl>
@@ -9772,8 +10444,8 @@
</function-decl>
</abi-instr>
<abi-instr address-size='64' path='module/zcommon/zfs_deleg.c' language='LANG_C99'>
- <array-type-def dimensions='1' type-id='fa1870fd' size-in-bits='4224' id='55e705e7'>
- <subrange length='33' type-id='7359adad' id='6a5934df'/>
+ <array-type-def dimensions='1' type-id='fa1870fd' size-in-bits='4352' id='55f84f08'>
+ <subrange length='34' type-id='7359adad' id='6a6a7e00'/>
</array-type-def>
<array-type-def dimensions='1' type-id='fa1870fd' size-in-bits='infinite' id='7c00e69d'>
<subrange length='infinite' id='031f2035'/>
@@ -9803,30 +10475,31 @@
<enumerator name='ZFS_DELEG_NOTE_PROMOTE' value='5'/>
<enumerator name='ZFS_DELEG_NOTE_RENAME' value='6'/>
<enumerator name='ZFS_DELEG_NOTE_SEND' value='7'/>
- <enumerator name='ZFS_DELEG_NOTE_RECEIVE' value='8'/>
- <enumerator name='ZFS_DELEG_NOTE_ALLOW' value='9'/>
- <enumerator name='ZFS_DELEG_NOTE_USERPROP' value='10'/>
- <enumerator name='ZFS_DELEG_NOTE_MOUNT' value='11'/>
- <enumerator name='ZFS_DELEG_NOTE_SHARE' value='12'/>
- <enumerator name='ZFS_DELEG_NOTE_USERQUOTA' value='13'/>
- <enumerator name='ZFS_DELEG_NOTE_GROUPQUOTA' value='14'/>
- <enumerator name='ZFS_DELEG_NOTE_USERUSED' value='15'/>
- <enumerator name='ZFS_DELEG_NOTE_GROUPUSED' value='16'/>
- <enumerator name='ZFS_DELEG_NOTE_USEROBJQUOTA' value='17'/>
- <enumerator name='ZFS_DELEG_NOTE_GROUPOBJQUOTA' value='18'/>
- <enumerator name='ZFS_DELEG_NOTE_USEROBJUSED' value='19'/>
- <enumerator name='ZFS_DELEG_NOTE_GROUPOBJUSED' value='20'/>
- <enumerator name='ZFS_DELEG_NOTE_HOLD' value='21'/>
- <enumerator name='ZFS_DELEG_NOTE_RELEASE' value='22'/>
- <enumerator name='ZFS_DELEG_NOTE_DIFF' value='23'/>
- <enumerator name='ZFS_DELEG_NOTE_BOOKMARK' value='24'/>
- <enumerator name='ZFS_DELEG_NOTE_LOAD_KEY' value='25'/>
- <enumerator name='ZFS_DELEG_NOTE_CHANGE_KEY' value='26'/>
- <enumerator name='ZFS_DELEG_NOTE_PROJECTUSED' value='27'/>
- <enumerator name='ZFS_DELEG_NOTE_PROJECTQUOTA' value='28'/>
- <enumerator name='ZFS_DELEG_NOTE_PROJECTOBJUSED' value='29'/>
- <enumerator name='ZFS_DELEG_NOTE_PROJECTOBJQUOTA' value='30'/>
- <enumerator name='ZFS_DELEG_NOTE_NONE' value='31'/>
+ <enumerator name='ZFS_DELEG_NOTE_SEND_RAW' value='8'/>
+ <enumerator name='ZFS_DELEG_NOTE_RECEIVE' value='9'/>
+ <enumerator name='ZFS_DELEG_NOTE_ALLOW' value='10'/>
+ <enumerator name='ZFS_DELEG_NOTE_USERPROP' value='11'/>
+ <enumerator name='ZFS_DELEG_NOTE_MOUNT' value='12'/>
+ <enumerator name='ZFS_DELEG_NOTE_SHARE' value='13'/>
+ <enumerator name='ZFS_DELEG_NOTE_USERQUOTA' value='14'/>
+ <enumerator name='ZFS_DELEG_NOTE_GROUPQUOTA' value='15'/>
+ <enumerator name='ZFS_DELEG_NOTE_USERUSED' value='16'/>
+ <enumerator name='ZFS_DELEG_NOTE_GROUPUSED' value='17'/>
+ <enumerator name='ZFS_DELEG_NOTE_USEROBJQUOTA' value='18'/>
+ <enumerator name='ZFS_DELEG_NOTE_GROUPOBJQUOTA' value='19'/>
+ <enumerator name='ZFS_DELEG_NOTE_USEROBJUSED' value='20'/>
+ <enumerator name='ZFS_DELEG_NOTE_GROUPOBJUSED' value='21'/>
+ <enumerator name='ZFS_DELEG_NOTE_HOLD' value='22'/>
+ <enumerator name='ZFS_DELEG_NOTE_RELEASE' value='23'/>
+ <enumerator name='ZFS_DELEG_NOTE_DIFF' value='24'/>
+ <enumerator name='ZFS_DELEG_NOTE_BOOKMARK' value='25'/>
+ <enumerator name='ZFS_DELEG_NOTE_LOAD_KEY' value='26'/>
+ <enumerator name='ZFS_DELEG_NOTE_CHANGE_KEY' value='27'/>
+ <enumerator name='ZFS_DELEG_NOTE_PROJECTUSED' value='28'/>
+ <enumerator name='ZFS_DELEG_NOTE_PROJECTQUOTA' value='29'/>
+ <enumerator name='ZFS_DELEG_NOTE_PROJECTOBJUSED' value='30'/>
+ <enumerator name='ZFS_DELEG_NOTE_PROJECTOBJQUOTA' value='31'/>
+ <enumerator name='ZFS_DELEG_NOTE_NONE' value='32'/>
</enum-decl>
<typedef-decl name='zfs_deleg_note_t' type-id='729d4547' id='4613c173'/>
<class-decl name='zfs_deleg_perm_tab' size-in-bits='128' is-struct='yes' visibility='default' id='5aa05c1f'>
diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs_config.c b/sys/contrib/openzfs/lib/libzfs/libzfs_config.c
index 0d2102191389..9d704e4303ff 100644
--- a/sys/contrib/openzfs/lib/libzfs/libzfs_config.c
+++ b/sys/contrib/openzfs/lib/libzfs/libzfs_config.c
@@ -308,6 +308,23 @@ zpool_refresh_stats(zpool_handle_t *zhp, boolean_t *missing)
}
/*
+ * Copies the pool config and state from szhp to dzhp. szhp and dzhp must
+ * represent the same pool. Used by pool_list_refresh() to avoid another
+ * round-trip into the kernel to get stats already collected earlier in the
+ * function.
+ */
+void
+zpool_refresh_stats_from_handle(zpool_handle_t *dzhp, zpool_handle_t *szhp)
+{
+ VERIFY0(strcmp(dzhp->zpool_name, szhp->zpool_name));
+ nvlist_free(dzhp->zpool_old_config);
+ dzhp->zpool_old_config = dzhp->zpool_config;
+ dzhp->zpool_config = fnvlist_dup(szhp->zpool_config);
+ dzhp->zpool_config_size = szhp->zpool_config_size;
+ dzhp->zpool_state = szhp->zpool_state;
+}
+
+/*
* The following environment variables are undocumented
* and should be used for testing purposes only:
*
diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs_crypto.c b/sys/contrib/openzfs/lib/libzfs/libzfs_crypto.c
index b34a44c30eb4..f461ad41405b 100644
--- a/sys/contrib/openzfs/lib/libzfs/libzfs_crypto.c
+++ b/sys/contrib/openzfs/lib/libzfs/libzfs_crypto.c
@@ -19,7 +19,6 @@
* Copyright 2020 Joyent, Inc.
*/
-#include <sys/zfs_context.h>
#include <sys/fs/zfs.h>
#include <sys/dsl_crypt.h>
#include <libintl.h>
@@ -613,7 +612,9 @@ get_key_material_https(libzfs_handle_t *hdl, const char *uri,
(void) unlink(path);
free(path);
+#ifdef O_TMPFILE
kfdok:
+#endif
if ((key = fdopen(kfd, "r+")) == NULL) {
ret = errno;
(void) close(kfd);
diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs_pool.c b/sys/contrib/openzfs/lib/libzfs/libzfs_pool.c
index 10b42720e963..756d701e2d97 100644
--- a/sys/contrib/openzfs/lib/libzfs/libzfs_pool.c
+++ b/sys/contrib/openzfs/lib/libzfs/libzfs_pool.c
@@ -1745,9 +1745,13 @@ zpool_prefetch(zpool_handle_t *zhp, zpool_prefetch_type_t type)
error = lzc_pool_prefetch(zhp->zpool_name, type);
if (error != 0) {
+ const char *typename = "unknown";
+ if (type == ZPOOL_PREFETCH_DDT)
+ typename = "ddt";
+ else if (type == ZPOOL_PREFETCH_BRT)
+ typename = "brt";
(void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN,
- "cannot prefetch %s in '%s'"),
- type == ZPOOL_PREFETCH_DDT ? "ddt" : "", zhp->zpool_name);
+ "cannot prefetch %s in '%s'"), typename, zhp->zpool_name);
(void) zpool_standard_error(hdl, error, msg);
return (-1);
}
@@ -5549,6 +5553,8 @@ zpool_get_vdev_prop_value(nvlist_t *nvprop, vdev_prop_t prop, char *prop_name,
/* Only use if provided by the RAIDZ VDEV above */
if (prop == VDEV_PROP_RAIDZ_EXPANDING)
return (ENOENT);
+ if (prop == VDEV_PROP_SIT_OUT)
+ return (ENOENT);
}
if (vdev_prop_index_to_string(prop, intval,
(const char **)&strval) != 0)
@@ -5718,8 +5724,16 @@ zpool_set_vdev_prop(zpool_handle_t *zhp, const char *vdevname,
nvlist_free(nvl);
nvlist_free(outnvl);
- if (ret)
- (void) zpool_standard_error(zhp->zpool_hdl, errno, errbuf);
+ if (ret) {
+ if (errno == ENOTSUP) {
+ zfs_error_aux(zhp->zpool_hdl, dgettext(TEXT_DOMAIN,
+ "property not supported for this vdev"));
+ (void) zfs_error(zhp->zpool_hdl, EZFS_PROPTYPE, errbuf);
+ } else {
+ (void) zpool_standard_error(zhp->zpool_hdl, errno,
+ errbuf);
+ }
+ }
return (ret);
}
diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs_sendrecv.c b/sys/contrib/openzfs/lib/libzfs/libzfs_sendrecv.c
index 77134d197904..0e5cecc6cca9 100644
--- a/sys/contrib/openzfs/lib/libzfs/libzfs_sendrecv.c
+++ b/sys/contrib/openzfs/lib/libzfs/libzfs_sendrecv.c
@@ -1013,7 +1013,8 @@ send_progress_thread(void *arg)
&blocks)) != 0) {
if (err == EINTR || err == ENOENT)
err = 0;
- pthread_exit(((void *)(uintptr_t)err));
+ /* Use break to reach pthread_cleanup_pop() below. */
+ break;
}
(void) time(&t);
@@ -1055,7 +1056,7 @@ send_progress_thread(void *arg)
}
}
pthread_cleanup_pop(B_TRUE);
- return (NULL);
+ pthread_exit(((void *)(uintptr_t)err));
}
static boolean_t
diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs_status.c b/sys/contrib/openzfs/lib/libzfs/libzfs_status.c
index bdddefb92165..a589ca6896f0 100644
--- a/sys/contrib/openzfs/lib/libzfs/libzfs_status.c
+++ b/sys/contrib/openzfs/lib/libzfs/libzfs_status.c
@@ -98,57 +98,57 @@ static const char *const zfs_msgid_table[] = {
#define NMSGID (sizeof (zfs_msgid_table) / sizeof (zfs_msgid_table[0]))
static int
-vdev_missing(vdev_stat_t *vs, uint_t vsc)
+vdev_missing(vdev_stat_t *vs, uint_t vsc, void *arg)
{
- (void) vsc;
+ (void) vsc, (void) arg;
return (vs->vs_state == VDEV_STATE_CANT_OPEN &&
vs->vs_aux == VDEV_AUX_OPEN_FAILED);
}
static int
-vdev_faulted(vdev_stat_t *vs, uint_t vsc)
+vdev_faulted(vdev_stat_t *vs, uint_t vsc, void *arg)
{
- (void) vsc;
+ (void) vsc, (void) arg;
return (vs->vs_state == VDEV_STATE_FAULTED);
}
static int
-vdev_errors(vdev_stat_t *vs, uint_t vsc)
+vdev_errors(vdev_stat_t *vs, uint_t vsc, void *arg)
{
- (void) vsc;
+ (void) vsc, (void) arg;
return (vs->vs_state == VDEV_STATE_DEGRADED ||
vs->vs_read_errors != 0 || vs->vs_write_errors != 0 ||
vs->vs_checksum_errors != 0);
}
static int
-vdev_broken(vdev_stat_t *vs, uint_t vsc)
+vdev_broken(vdev_stat_t *vs, uint_t vsc, void *arg)
{
- (void) vsc;
+ (void) vsc, (void) arg;
return (vs->vs_state == VDEV_STATE_CANT_OPEN);
}
static int
-vdev_offlined(vdev_stat_t *vs, uint_t vsc)
+vdev_offlined(vdev_stat_t *vs, uint_t vsc, void *arg)
{
- (void) vsc;
+ (void) vsc, (void) arg;
return (vs->vs_state == VDEV_STATE_OFFLINE);
}
static int
-vdev_removed(vdev_stat_t *vs, uint_t vsc)
+vdev_removed(vdev_stat_t *vs, uint_t vsc, void *arg)
{
- (void) vsc;
+ (void) vsc, (void) arg;
return (vs->vs_state == VDEV_STATE_REMOVED);
}
static int
-vdev_non_native_ashift(vdev_stat_t *vs, uint_t vsc)
+vdev_non_native_ashift(vdev_stat_t *vs, uint_t vsc, void *arg)
{
- if (getenv("ZPOOL_STATUS_NON_NATIVE_ASHIFT_IGNORE") != NULL)
- return (0);
+ uint64_t ashift = *(uint64_t *)arg;
return (VDEV_STAT_VALID(vs_physical_ashift, vsc) &&
+ (ashift == 0 || vs->vs_configured_ashift < ashift) &&
vs->vs_configured_ashift < vs->vs_physical_ashift);
}
@@ -156,8 +156,8 @@ vdev_non_native_ashift(vdev_stat_t *vs, uint_t vsc)
* Detect if any leaf devices that have seen errors or could not be opened.
*/
static boolean_t
-find_vdev_problem(nvlist_t *vdev, int (*func)(vdev_stat_t *, uint_t),
- boolean_t ignore_replacing)
+find_vdev_problem(nvlist_t *vdev, int (*func)(vdev_stat_t *, uint_t, void *),
+ void *arg, boolean_t ignore_replacing)
{
nvlist_t **child;
uint_t c, children;
@@ -177,14 +177,16 @@ find_vdev_problem(nvlist_t *vdev, int (*func)(vdev_stat_t *, uint_t),
if (nvlist_lookup_nvlist_array(vdev, ZPOOL_CONFIG_CHILDREN, &child,
&children) == 0) {
- for (c = 0; c < children; c++)
- if (find_vdev_problem(child[c], func, ignore_replacing))
+ for (c = 0; c < children; c++) {
+ if (find_vdev_problem(child[c], func, arg,
+ ignore_replacing))
return (B_TRUE);
+ }
} else {
uint_t vsc;
vdev_stat_t *vs = (vdev_stat_t *)fnvlist_lookup_uint64_array(
vdev, ZPOOL_CONFIG_VDEV_STATS, &vsc);
- if (func(vs, vsc) != 0)
+ if (func(vs, vsc, arg) != 0)
return (B_TRUE);
}
@@ -193,9 +195,11 @@ find_vdev_problem(nvlist_t *vdev, int (*func)(vdev_stat_t *, uint_t),
*/
if (nvlist_lookup_nvlist_array(vdev, ZPOOL_CONFIG_L2CACHE, &child,
&children) == 0) {
- for (c = 0; c < children; c++)
- if (find_vdev_problem(child[c], func, ignore_replacing))
+ for (c = 0; c < children; c++) {
+ if (find_vdev_problem(child[c], func, arg,
+ ignore_replacing))
return (B_TRUE);
+ }
}
return (B_FALSE);
@@ -220,7 +224,7 @@ find_vdev_problem(nvlist_t *vdev, int (*func)(vdev_stat_t *, uint_t),
*/
static zpool_status_t
check_status(nvlist_t *config, boolean_t isimport,
- zpool_errata_t *erratap, const char *compat)
+ zpool_errata_t *erratap, const char *compat, uint64_t ashift)
{
pool_scan_stat_t *ps = NULL;
uint_t vsc, psc;
@@ -371,15 +375,15 @@ check_status(nvlist_t *config, boolean_t isimport,
* Bad devices in non-replicated config.
*/
if (vs->vs_state == VDEV_STATE_CANT_OPEN &&
- find_vdev_problem(nvroot, vdev_faulted, B_TRUE))
+ find_vdev_problem(nvroot, vdev_faulted, NULL, B_TRUE))
return (ZPOOL_STATUS_FAULTED_DEV_NR);
if (vs->vs_state == VDEV_STATE_CANT_OPEN &&
- find_vdev_problem(nvroot, vdev_missing, B_TRUE))
+ find_vdev_problem(nvroot, vdev_missing, NULL, B_TRUE))
return (ZPOOL_STATUS_MISSING_DEV_NR);
if (vs->vs_state == VDEV_STATE_CANT_OPEN &&
- find_vdev_problem(nvroot, vdev_broken, B_TRUE))
+ find_vdev_problem(nvroot, vdev_broken, NULL, B_TRUE))
return (ZPOOL_STATUS_CORRUPT_LABEL_NR);
/*
@@ -402,35 +406,37 @@ check_status(nvlist_t *config, boolean_t isimport,
/*
* Missing devices in a replicated config.
*/
- if (find_vdev_problem(nvroot, vdev_faulted, B_TRUE))
+ if (find_vdev_problem(nvroot, vdev_faulted, NULL, B_TRUE))
return (ZPOOL_STATUS_FAULTED_DEV_R);
- if (find_vdev_problem(nvroot, vdev_missing, B_TRUE))
+ if (find_vdev_problem(nvroot, vdev_missing, NULL, B_TRUE))
return (ZPOOL_STATUS_MISSING_DEV_R);
- if (find_vdev_problem(nvroot, vdev_broken, B_TRUE))
+ if (find_vdev_problem(nvroot, vdev_broken, NULL, B_TRUE))
return (ZPOOL_STATUS_CORRUPT_LABEL_R);
/*
* Devices with errors
*/
- if (!isimport && find_vdev_problem(nvroot, vdev_errors, B_TRUE))
+ if (!isimport && find_vdev_problem(nvroot, vdev_errors, NULL, B_TRUE))
return (ZPOOL_STATUS_FAILING_DEV);
/*
* Offlined devices
*/
- if (find_vdev_problem(nvroot, vdev_offlined, B_TRUE))
+ if (find_vdev_problem(nvroot, vdev_offlined, NULL, B_TRUE))
return (ZPOOL_STATUS_OFFLINE_DEV);
/*
* Removed device
*/
- if (find_vdev_problem(nvroot, vdev_removed, B_TRUE))
+ if (find_vdev_problem(nvroot, vdev_removed, NULL, B_TRUE))
return (ZPOOL_STATUS_REMOVED_DEV);
/*
* Suboptimal, but usable, ashift configuration.
*/
- if (find_vdev_problem(nvroot, vdev_non_native_ashift, B_FALSE))
+ if (!isimport &&
+ getenv("ZPOOL_STATUS_NON_NATIVE_ASHIFT_IGNORE") == NULL &&
+ find_vdev_problem(nvroot, vdev_non_native_ashift, &ashift, B_FALSE))
return (ZPOOL_STATUS_NON_NATIVE_ASHIFT);
/*
@@ -510,8 +516,10 @@ zpool_get_status(zpool_handle_t *zhp, const char **msgid,
ZFS_MAXPROPLEN, NULL, B_FALSE) != 0)
compatibility[0] = '\0';
+ uint64_t ashift = zpool_get_prop_int(zhp, ZPOOL_PROP_ASHIFT, NULL);
+
zpool_status_t ret = check_status(zhp->zpool_config, B_FALSE, errata,
- compatibility);
+ compatibility, ashift);
if (msgid != NULL) {
if (ret >= NMSGID)
@@ -526,7 +534,7 @@ zpool_status_t
zpool_import_status(nvlist_t *config, const char **msgid,
zpool_errata_t *errata)
{
- zpool_status_t ret = check_status(config, B_TRUE, errata, NULL);
+ zpool_status_t ret = check_status(config, B_TRUE, errata, NULL, 0);
if (ret >= NMSGID)
*msgid = NULL;
diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs_util.c b/sys/contrib/openzfs/lib/libzfs/libzfs_util.c
index 4edddc2a759b..26f5135dff62 100644
--- a/sys/contrib/openzfs/lib/libzfs/libzfs_util.c
+++ b/sys/contrib/openzfs/lib/libzfs/libzfs_util.c
@@ -776,6 +776,11 @@ zpool_standard_error_fmt(libzfs_handle_t *hdl, int error, const char *fmt, ...)
case ZFS_ERR_ASHIFT_MISMATCH:
zfs_verror(hdl, EZFS_ASHIFT_MISMATCH, fmt, ap);
break;
+ case ZFS_ERR_TOO_MANY_SITOUTS:
+ zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "too many disks "
+ "already sitting out"));
+ zfs_verror(hdl, EZFS_BUSY, fmt, ap);
+ break;
default:
zfs_error_aux(hdl, "%s", zfs_strerror(error));
zfs_verror(hdl, EZFS_UNKNOWN, fmt, ap);
diff --git a/sys/contrib/openzfs/lib/libzfs/os/linux/libzfs_util_os.c b/sys/contrib/openzfs/lib/libzfs/os/linux/libzfs_util_os.c
index 55dfdf3723bd..651d407b1884 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
@@ -78,6 +78,38 @@ libzfs_error_init(int error)
}
}
+static int
+in_container(void)
+{
+ char buffer[4096];
+ ssize_t count;
+ int fd;
+
+ if (access("/run/systemd/container", R_OK) == 0)
+ return (1);
+
+ fd = open("/proc/1/cgroup", O_RDONLY);
+ if (fd == -1)
+ return (0);
+
+ count = read(fd, buffer, sizeof (buffer) - 1);
+ close(fd);
+
+ if (count <= 0)
+ return (0);
+
+ buffer[count] = '\0';
+
+ if (strstr(buffer, "docker") ||
+ strstr(buffer, "containerd") ||
+ strstr(buffer, "kubepods") ||
+ strstr(buffer, "lxc")) {
+ return (1);
+ }
+
+ return (0);
+}
+
/*
* zfs(4) is loaded by udev if there's a fstype=zfs device present,
* but if there isn't, load them automatically;
@@ -104,6 +136,11 @@ libzfs_load_module(void)
const char *timeout_str = getenv("ZFS_MODULE_TIMEOUT");
int seconds = 10;
+
+ /* Set timeout to zero if inside of a container */
+ if (in_container())
+ seconds = 0;
+
if (timeout_str)
seconds = MIN(strtol(timeout_str, NULL, 0), 600);
struct itimerspec timeout = {.it_value.tv_sec = MAX(seconds, 0)};
diff --git a/sys/contrib/openzfs/lib/libzfs_core/libzfs_core.abi b/sys/contrib/openzfs/lib/libzfs_core/libzfs_core.abi
index 7464b3adb254..238151d432f1 100644
--- a/sys/contrib/openzfs/lib/libzfs_core/libzfs_core.abi
+++ b/sys/contrib/openzfs/lib/libzfs_core/libzfs_core.abi
@@ -7,6 +7,8 @@
</elf-needed>
<elf-function-symbols>
<elf-symbol name='_sol_getmntent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='_system_delay_taskq' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='_system_taskq' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='atomic_add_16' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='atomic_add_16_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='atomic_add_32' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
@@ -127,6 +129,19 @@
<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='crgetgid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='crgetgroups' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='crgetngroups' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='crgetruid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='crgetuid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='cv_broadcast' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='cv_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='cv_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='cv_signal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='cv_timedwait' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='cv_timedwait_hires' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='cv_wait' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='cv_wait_sig' 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'/>
@@ -134,8 +149,21 @@
<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='kmem_asprintf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='kmem_cache_reap_active' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='kmem_scnprintf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='kmem_vasprintf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='ksid_lookupdomain' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='ksiddomain_rele' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='kstat_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='kstat_delete' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='kstat_install' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='kstat_set_raw_ops' 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_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='libspl_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='libspl_physmem' 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'/>
@@ -218,32 +246,56 @@
<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='mutex_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='mutex_enter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='mutex_enter_check_return' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='mutex_exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='mutex_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='mutex_tryenter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='p0' 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='procfs_list_add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='procfs_list_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='procfs_list_install' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='procfs_list_uninstall' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='random_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='random_force_pseudo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='random_get_bytes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='random_get_pseudo_bytes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='random_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='rw_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='rw_enter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='rw_exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='rw_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='rw_tryenter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='rw_tryupgrade' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='seq_printf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='spl_fstrans_mark' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='spl_fstrans_unmark' 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='zfs_tunable_get' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
- <elf-symbol name='zfs_tunable_iter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
- <elf-symbol name='zfs_tunable_lookup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
- <elf-symbol name='zfs_tunable_set' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='system_taskq_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='system_taskq_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_cancel_id' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_create_synced' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_dispatch' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_dispatch_delay' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_dispatch_ent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_empty_ent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_init_ent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_member' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_of_curthread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_wait' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_wait_id' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='taskq_wait_outstanding' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='utsname' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='zk_thread_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-function-symbols>
<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'/>
@@ -797,6 +849,223 @@
<return type-id='95e97e5e'/>
</function-decl>
</abi-instr>
+ <abi-instr address-size='64' path='lib/libspl/condvar.c' language='LANG_C99'>
+ <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='32' id='8e0573fd'>
+ <subrange length='4' type-id='7359adad' id='16fe7105'/>
+ </array-type-def>
+ <type-decl name='long long int' size-in-bits='64' id='1eb56b1e'/>
+ <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='kcondvar_t' type-id='62fab762' id='29dbc0dd'/>
+ <class-decl name='kmutex' size-in-bits='384' is-struct='yes' visibility='default' id='f1cacfe1'>
+ <data-member access='public' layout-offset-in-bits='0'>
+ <var-decl name='m_lock' type-id='7a6844eb' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='320'>
+ <var-decl name='m_owner' type-id='4051f5e7' visibility='default'/>
+ </data-member>
+ </class-decl>
+ <typedef-decl name='kmutex_t' type-id='f1cacfe1' id='b9eccc8f'/>
+ <typedef-decl name='hrtime_t' type-id='1eb56b1e' id='cebdd548'/>
+ <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'>
+ <var-decl name='__value32' 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'>
+ <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'/>
+ </data-member>
+ </class-decl>
+ <typedef-decl name='__atomic_wide_counter' type-id='613ce450' id='f3b40860'/>
+ <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='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_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'/>
+ </data-member>
+ <data-member access='public'>
+ <var-decl name='__size' type-id='36d7f119' visibility='default'/>
+ </data-member>
+ <data-member access='public'>
+ <var-decl name='__align' type-id='1eb56b1e' visibility='default'/>
+ </data-member>
+ </union-decl>
+ <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='__wseq' type-id='f3b40860' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='64'>
+ <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'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='192'>
+ <var-decl name='__g_size' type-id='0d532ec1' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='256'>
+ <var-decl name='__g1_orig_size' type-id='f0981eeb' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='288'>
+ <var-decl name='__wrefs' type-id='f0981eeb' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='320'>
+ <var-decl name='__g_signals' type-id='0d532ec1' visibility='default'/>
+ </data-member>
+ </class-decl>
+ <typedef-decl name='__clock_t' type-id='bd54fe1a' id='4d66c6d7'/>
+ <typedef-decl name='__suseconds_t' type-id='bd54fe1a' id='5b102a54'/>
+ <typedef-decl name='__clockid_t' type-id='95e97e5e' id='08f9a87a'/>
+ <typedef-decl name='clock_t' type-id='4d66c6d7' id='4c3a2c61'/>
+ <typedef-decl name='clockid_t' type-id='08f9a87a' id='a1c3b834'/>
+ <class-decl name='timeval' size-in-bits='128' is-struct='yes' visibility='default' id='2a693ac3'>
+ <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_usec' type-id='5b102a54' visibility='default'/>
+ </data-member>
+ </class-decl>
+ <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='a9c79a1f' const='yes' id='cd087e36'/>
+ <pointer-type-def type-id='cd087e36' size-in-bits='64' id='e05e8614'/>
+ <qualified-type-def type-id='e05e8614' restrict='yes' id='0be2e71c'/>
+ <pointer-type-def type-id='29dbc0dd' size-in-bits='64' id='068c4f7e'/>
+ <pointer-type-def type-id='b9eccc8f' size-in-bits='64' id='78830f38'/>
+ <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='a9c79a1f' size-in-bits='64' id='3d83ba87'/>
+ <pointer-type-def type-id='2a693ac3' size-in-bits='64' id='896f1b83'/>
+ <qualified-type-def type-id='896f1b83' restrict='yes' id='4bcf44c1'/>
+ <function-decl name='pthread_self' visibility='default' binding='global' size-in-bits='64'>
+ <return type-id='4051f5e7'/>
+ </function-decl>
+ <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='pthread_cond_destroy' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='db285b03'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <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='pthread_cond_broadcast' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='db285b03'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <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='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='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='gettimeofday' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='4bcf44c1'/>
+ <parameter type-id='1b7446cd'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='cv_init' mangled-name='cv_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cv_init'>
+ <parameter type-id='068c4f7e' name='cv'/>
+ <parameter type-id='26a90f95' name='name'/>
+ <parameter type-id='95e97e5e' name='type'/>
+ <parameter type-id='eaa32e2f' name='arg'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='cv_destroy' mangled-name='cv_destroy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cv_destroy'>
+ <parameter type-id='068c4f7e' name='cv'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='cv_wait' mangled-name='cv_wait' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cv_wait'>
+ <parameter type-id='068c4f7e' name='cv'/>
+ <parameter type-id='78830f38' name='mp'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='cv_wait_sig' mangled-name='cv_wait_sig' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cv_wait_sig'>
+ <parameter type-id='068c4f7e' name='cv'/>
+ <parameter type-id='78830f38' name='mp'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='cv_timedwait' mangled-name='cv_timedwait' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cv_timedwait'>
+ <parameter type-id='068c4f7e' name='cv'/>
+ <parameter type-id='78830f38' name='mp'/>
+ <parameter type-id='4c3a2c61' name='abstime'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='cv_timedwait_hires' mangled-name='cv_timedwait_hires' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cv_timedwait_hires'>
+ <parameter type-id='068c4f7e' name='cv'/>
+ <parameter type-id='78830f38' name='mp'/>
+ <parameter type-id='cebdd548' name='tim'/>
+ <parameter type-id='cebdd548' name='res'/>
+ <parameter type-id='95e97e5e' name='flag'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='cv_signal' mangled-name='cv_signal' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cv_signal'>
+ <parameter type-id='068c4f7e' name='cv'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='cv_broadcast' mangled-name='cv_broadcast' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cv_broadcast'>
+ <parameter type-id='068c4f7e' name='cv'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ </abi-instr>
+ <abi-instr address-size='64' path='lib/libspl/cred.c' language='LANG_C99'>
+ <class-decl name='cred' is-struct='yes' visibility='default' is-declaration-only='yes' id='6739dd09'/>
+ <typedef-decl name='cred_t' type-id='6739dd09' id='a42f1a8f'/>
+ <typedef-decl name='gid_t' type-id='d94ec6d9' id='2bb2b96f'/>
+ <typedef-decl name='uid_t' type-id='cc5fcceb' id='354978ed'/>
+ <pointer-type-def type-id='a42f1a8f' size-in-bits='64' id='f89fcf80'/>
+ <pointer-type-def type-id='2bb2b96f' size-in-bits='64' id='b52814e6'/>
+ <class-decl name='cred' is-struct='yes' visibility='default' is-declaration-only='yes' id='6739dd09'/>
+ <function-decl name='crgetuid' mangled-name='crgetuid' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='crgetuid'>
+ <parameter type-id='f89fcf80' name='cr'/>
+ <return type-id='354978ed'/>
+ </function-decl>
+ <function-decl name='crgetngroups' mangled-name='crgetngroups' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='crgetngroups'>
+ <parameter type-id='f89fcf80' name='cr'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='crgetgroups' mangled-name='crgetgroups' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='crgetgroups'>
+ <parameter type-id='f89fcf80' name='cr'/>
+ <return type-id='b52814e6'/>
+ </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'/>
@@ -806,6 +1075,188 @@
<return type-id='79a0948f'/>
</function-decl>
</abi-instr>
+ <abi-instr address-size='64' path='lib/libspl/kmem.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='fstrans_cookie_t' type-id='95e97e5e' id='059934c1'/>
+ <pointer-type-def type-id='d5027220' size-in-bits='64' id='b7f2d5e6'/>
+ <qualified-type-def type-id='26a90f95' restrict='yes' id='266fe297'/>
+ <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='__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='kmem_vasprintf' mangled-name='kmem_vasprintf' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kmem_vasprintf'>
+ <parameter type-id='80f4b756' name='fmt'/>
+ <parameter type-id='b7f2d5e6' name='adx'/>
+ <return type-id='26a90f95'/>
+ </function-decl>
+ <function-decl name='kmem_asprintf' mangled-name='kmem_asprintf' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kmem_asprintf'>
+ <parameter type-id='80f4b756' name='fmt'/>
+ <parameter is-variadic='yes'/>
+ <return type-id='26a90f95'/>
+ </function-decl>
+ <function-decl name='kmem_scnprintf' mangled-name='kmem_scnprintf' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kmem_scnprintf'>
+ <parameter type-id='266fe297' name='str'/>
+ <parameter type-id='b59d7dce' name='size'/>
+ <parameter type-id='9d26089a' name='fmt'/>
+ <parameter is-variadic='yes'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='spl_fstrans_unmark' mangled-name='spl_fstrans_unmark' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='spl_fstrans_unmark'>
+ <parameter type-id='059934c1' name='cookie'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='kmem_cache_reap_active' mangled-name='kmem_cache_reap_active' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kmem_cache_reap_active'>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ </abi-instr>
+ <abi-instr address-size='64' path='lib/libspl/kstat.c' language='LANG_C99'>
+ <class-decl name='kstat' size-in-bits='448' is-struct='yes' visibility='default' id='5f5c9d88'>
+ <data-member access='public' layout-offset-in-bits='0'>
+ <var-decl name='ks_flags' type-id='d8bf0010' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='64'>
+ <var-decl name='ks_data' type-id='eaa32e2f' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='128'>
+ <var-decl name='ks_ndata' type-id='3502e3ff' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='192'>
+ <var-decl name='ks_data_size' type-id='b59d7dce' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='256'>
+ <var-decl name='ks_update' type-id='8cf7b7e1' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='320'>
+ <var-decl name='ks_private' type-id='eaa32e2f' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='384'>
+ <var-decl name='ks_lock' type-id='eaa32e2f' visibility='default'/>
+ </data-member>
+ </class-decl>
+ <typedef-decl name='kstat_t' type-id='5f5c9d88' id='dd12e024'/>
+ <typedef-decl name='__loff_t' type-id='724e4de6' id='00c9d214'/>
+ <typedef-decl name='loff_t' type-id='00c9d214' id='69bf7bee'/>
+ <pointer-type-def type-id='9d5d322a' size-in-bits='64' id='bbe97414'/>
+ <pointer-type-def type-id='05b3c714' size-in-bits='64' id='27cc5c36'/>
+ <pointer-type-def type-id='7a9ace65' size-in-bits='64' id='8cf7b7e1'/>
+ <pointer-type-def type-id='5f5c9d88' size-in-bits='64' id='0e87f9be'/>
+ <pointer-type-def type-id='dd12e024' size-in-bits='64' id='46e5e463'/>
+ <pointer-type-def type-id='527a97c5' size-in-bits='64' id='673f2af9'/>
+ <function-decl name='kstat_create' mangled-name='kstat_create' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kstat_create'>
+ <parameter type-id='80f4b756' name='module'/>
+ <parameter type-id='95e97e5e' name='instance'/>
+ <parameter type-id='80f4b756' name='name'/>
+ <parameter type-id='80f4b756' name='class'/>
+ <parameter type-id='d8bf0010' name='type'/>
+ <parameter type-id='ee1f298e' name='ndata'/>
+ <parameter type-id='d8bf0010' name='ks_flag'/>
+ <return type-id='46e5e463'/>
+ </function-decl>
+ <function-decl name='kstat_install' mangled-name='kstat_install' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kstat_install'>
+ <parameter type-id='46e5e463' name='ksp'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='kstat_set_raw_ops' mangled-name='kstat_set_raw_ops' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kstat_set_raw_ops'>
+ <parameter type-id='46e5e463' name='ksp'/>
+ <parameter type-id='bbe97414' name='headers'/>
+ <parameter type-id='27cc5c36' name='data'/>
+ <parameter type-id='673f2af9' name='addr'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-type size-in-bits='64' id='9d5d322a'>
+ <parameter type-id='26a90f95'/>
+ <parameter type-id='b59d7dce'/>
+ <return type-id='95e97e5e'/>
+ </function-type>
+ <function-type size-in-bits='64' id='05b3c714'>
+ <parameter type-id='26a90f95'/>
+ <parameter type-id='b59d7dce'/>
+ <parameter type-id='eaa32e2f'/>
+ <return type-id='95e97e5e'/>
+ </function-type>
+ <function-type size-in-bits='64' id='7a9ace65'>
+ <parameter type-id='0e87f9be'/>
+ <parameter type-id='95e97e5e'/>
+ <return type-id='95e97e5e'/>
+ </function-type>
+ <function-type size-in-bits='64' id='527a97c5'>
+ <parameter type-id='46e5e463'/>
+ <parameter type-id='69bf7bee'/>
+ <return type-id='eaa32e2f'/>
+ </function-type>
+ </abi-instr>
+ <abi-instr address-size='64' path='lib/libspl/libspl.c' language='LANG_C99'>
+ <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='520' id='5ddd38d2'>
+ <subrange length='65' type-id='7359adad' id='b50e2e4a'/>
+ </array-type-def>
+ <typedef-decl name='utsname_t' type-id='414a2ac6' id='5278297a'/>
+ <class-decl name='utsname' size-in-bits='3120' is-struct='yes' visibility='default' id='414a2ac6'>
+ <data-member access='public' layout-offset-in-bits='0'>
+ <var-decl name='sysname' type-id='5ddd38d2' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='520'>
+ <var-decl name='nodename' type-id='5ddd38d2' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='1040'>
+ <var-decl name='release' type-id='5ddd38d2' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='1560'>
+ <var-decl name='version' type-id='5ddd38d2' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2080'>
+ <var-decl name='machine' type-id='5ddd38d2' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2600'>
+ <var-decl name='domainname' type-id='5ddd38d2' visibility='default'/>
+ </data-member>
+ </class-decl>
+ <pointer-type-def type-id='414a2ac6' size-in-bits='64' id='a6724cec'/>
+ <pointer-type-def type-id='5278297a' size-in-bits='64' id='5c7868ad'/>
+ <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='uname' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='a6724cec'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='libspl_physmem' mangled-name='libspl_physmem' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libspl_physmem'>
+ <return type-id='9c313c2d'/>
+ </function-decl>
+ <function-decl name='utsname' mangled-name='utsname' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='utsname'>
+ <return type-id='5c7868ad'/>
+ </function-decl>
+ <function-decl name='libspl_init' mangled-name='libspl_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libspl_init'>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='libspl_fini' mangled-name='libspl_fini' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libspl_fini'>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='random_init' mangled-name='random_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='random_init'>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='random_fini' mangled-name='random_fini' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='random_fini'>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ </abi-instr>
<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'/>
@@ -917,7 +1368,6 @@
<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'/>
@@ -966,6 +1416,59 @@
<return type-id='95e97e5e'/>
</function-decl>
</abi-instr>
+ <abi-instr address-size='64' path='lib/libspl/mutex.c' language='LANG_C99'>
+ <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'/>
+ <qualified-type-def type-id='8afd6070' const='yes' id='1d853360'/>
+ <pointer-type-def type-id='1d853360' size-in-bits='64' id='c2afbd7e'/>
+ <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_trylock' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='18c91f9e'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='mutex_init' mangled-name='mutex_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mutex_init'>
+ <parameter type-id='78830f38' name='mp'/>
+ <parameter type-id='26a90f95' name='name'/>
+ <parameter type-id='95e97e5e' name='type'/>
+ <parameter type-id='eaa32e2f' name='cookie'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='mutex_destroy' mangled-name='mutex_destroy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mutex_destroy'>
+ <parameter type-id='78830f38' name='mp'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='mutex_enter' mangled-name='mutex_enter' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mutex_enter'>
+ <parameter type-id='78830f38' name='mp'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='mutex_enter_check_return' mangled-name='mutex_enter_check_return' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mutex_enter_check_return'>
+ <parameter type-id='78830f38' name='mp'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='mutex_tryenter' mangled-name='mutex_tryenter' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mutex_tryenter'>
+ <parameter type-id='78830f38' name='mp'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='mutex_exit' mangled-name='mutex_exit' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mutex_exit'>
+ <parameter type-id='78830f38' name='mp'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ </abi-instr>
<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'/>
@@ -976,7 +1479,6 @@
</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'/>
<function-decl name='strtoull' visibility='default' binding='global' size-in-bits='64'>
<parameter type-id='9d26089a'/>
<parameter type-id='8c85230f'/>
@@ -988,13 +1490,6 @@
</function-decl>
</abi-instr>
<abi-instr address-size='64' path='lib/libspl/os/linux/getmntany.c' language='LANG_C99'>
- <array-type-def dimensions='1' type-id='d315442e' size-in-bits='16' id='811205dc'>
- <subrange length='1' type-id='7359adad' id='52f813b4'/>
- </array-type-def>
- <array-type-def dimensions='1' type-id='d3130597' size-in-bits='768' id='f63f23b9'>
- <subrange length='12' type-id='7359adad' id='84827bdc'/>
- </array-type-def>
- <type-decl name='long long int' size-in-bits='64' id='1eb56b1e'/>
<class-decl name='mnttab' size-in-bits='256' is-struct='yes' visibility='default' id='1b055409'>
<data-member access='public' layout-offset-in-bits='0'>
<var-decl name='mnt_special' type-id='26a90f95' visibility='default'/>
@@ -1029,93 +1524,6 @@
<var-decl name='mnt_minor' type-id='3502e3ff' visibility='default'/>
</data-member>
</class-decl>
- <typedef-decl name='__u16' type-id='8efea9e5' id='d315442e'/>
- <typedef-decl name='__s32' type-id='95e97e5e' id='3158a266'/>
- <typedef-decl name='__u32' type-id='f0981eeb' id='3f1a6b60'/>
- <typedef-decl name='__s64' type-id='1eb56b1e' id='49659421'/>
- <typedef-decl name='__u64' type-id='3a47d82b' id='d3130597'/>
- <class-decl name='statx_timestamp' size-in-bits='128' is-struct='yes' visibility='default' id='94101016'>
- <data-member access='public' layout-offset-in-bits='0'>
- <var-decl name='tv_sec' type-id='49659421' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='64'>
- <var-decl name='tv_nsec' type-id='3f1a6b60' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='96'>
- <var-decl name='__reserved' type-id='3158a266' visibility='default'/>
- </data-member>
- </class-decl>
- <class-decl name='statx' size-in-bits='2048' is-struct='yes' visibility='default' id='720b04c5'>
- <data-member access='public' layout-offset-in-bits='0'>
- <var-decl name='stx_mask' type-id='3f1a6b60' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='32'>
- <var-decl name='stx_blksize' type-id='3f1a6b60' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='64'>
- <var-decl name='stx_attributes' type-id='d3130597' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='128'>
- <var-decl name='stx_nlink' type-id='3f1a6b60' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='160'>
- <var-decl name='stx_uid' type-id='3f1a6b60' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='192'>
- <var-decl name='stx_gid' type-id='3f1a6b60' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='224'>
- <var-decl name='stx_mode' type-id='d315442e' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='240'>
- <var-decl name='__spare0' type-id='811205dc' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='256'>
- <var-decl name='stx_ino' type-id='d3130597' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='320'>
- <var-decl name='stx_size' type-id='d3130597' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='384'>
- <var-decl name='stx_blocks' type-id='d3130597' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='448'>
- <var-decl name='stx_attributes_mask' type-id='d3130597' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='512'>
- <var-decl name='stx_atime' type-id='94101016' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='640'>
- <var-decl name='stx_btime' type-id='94101016' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='768'>
- <var-decl name='stx_ctime' type-id='94101016' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='896'>
- <var-decl name='stx_mtime' type-id='94101016' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='1024'>
- <var-decl name='stx_rdev_major' type-id='3f1a6b60' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='1056'>
- <var-decl name='stx_rdev_minor' type-id='3f1a6b60' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='1088'>
- <var-decl name='stx_dev_major' type-id='3f1a6b60' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='1120'>
- <var-decl name='stx_dev_minor' type-id='3f1a6b60' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='1152'>
- <var-decl name='stx_mnt_id' type-id='d3130597' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='1216'>
- <var-decl name='__spare2' type-id='d3130597' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='1280'>
- <var-decl name='__spare3' type-id='f63f23b9' visibility='default'/>
- </data-member>
- </class-decl>
<class-decl name='mntent' size-in-bits='320' is-struct='yes' visibility='default' id='56fe4a37'>
<data-member access='public' layout-offset-in-bits='0'>
<var-decl name='mnt_fsname' type-id='26a90f95' visibility='default'/>
@@ -1191,8 +1599,6 @@
<pointer-type-def type-id='1b055409' size-in-bits='64' id='9d424d31'/>
<pointer-type-def type-id='0bbec9cd' size-in-bits='64' id='62f7a03d'/>
<qualified-type-def type-id='62f7a03d' restrict='yes' id='f1cadedf'/>
- <pointer-type-def type-id='720b04c5' size-in-bits='64' id='936b8e35'/>
- <qualified-type-def type-id='936b8e35' restrict='yes' id='31d265b7'/>
<function-decl name='getmntent_r' visibility='default' binding='global' size-in-bits='64'>
<parameter type-id='e75a27e9'/>
<parameter type-id='3cad23cd'/>
@@ -1208,14 +1614,6 @@
<parameter type-id='95e97e5e'/>
<return type-id='26a90f95'/>
</function-decl>
- <function-decl name='statx' visibility='default' binding='global' size-in-bits='64'>
- <parameter type-id='95e97e5e'/>
- <parameter type-id='9d26089a'/>
- <parameter type-id='95e97e5e'/>
- <parameter type-id='f0981eeb'/>
- <parameter type-id='31d265b7'/>
- <return type-id='95e97e5e'/>
- </function-decl>
<function-decl name='stat64' visibility='default' binding='global' size-in-bits='64'>
<parameter type-id='9d26089a'/>
<parameter type-id='f1cadedf'/>
@@ -1252,14 +1650,273 @@
</function-decl>
</abi-instr>
<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='lib/libspl/procfs_list.c' language='LANG_C99'>
+ <class-decl name='procfs_list' size-in-bits='768' is-struct='yes' visibility='default' id='0f4d3b87'>
+ <data-member access='public' layout-offset-in-bits='0'>
+ <var-decl name='pl_private' type-id='eaa32e2f' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='64'>
+ <var-decl name='pl_lock' type-id='b9eccc8f' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='448'>
+ <var-decl name='pl_list' type-id='0899125f' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='640'>
+ <var-decl name='pl_next_id' type-id='9c313c2d' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='704'>
+ <var-decl name='pl_node_offset' type-id='b59d7dce' visibility='default'/>
+ </data-member>
+ </class-decl>
+ <typedef-decl name='procfs_list_t' type-id='0f4d3b87' id='e5b5a21b'/>
+ <class-decl name='seq_file' is-struct='yes' visibility='default' id='f3415517'/>
+ <pointer-type-def type-id='be39c944' size-in-bits='64' id='b5c3ae96'/>
+ <pointer-type-def type-id='86932239' size-in-bits='64' id='6255c89d'/>
+ <pointer-type-def type-id='cf9ec29d' size-in-bits='64' id='0131eb61'/>
+ <pointer-type-def type-id='e5b5a21b' size-in-bits='64' id='7f432372'/>
+ <pointer-type-def type-id='f3415517' size-in-bits='64' id='f8dc9def'/>
+ <function-decl name='seq_printf' mangled-name='seq_printf' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='seq_printf'>
+ <parameter type-id='f8dc9def' name='m'/>
+ <parameter type-id='80f4b756' name='fmt'/>
+ <parameter is-variadic='yes'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='procfs_list_install' mangled-name='procfs_list_install' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='procfs_list_install'>
+ <parameter type-id='80f4b756' name='module'/>
+ <parameter type-id='80f4b756' name='submodule'/>
+ <parameter type-id='80f4b756' name='name'/>
+ <parameter type-id='d50d396c' name='mode'/>
+ <parameter type-id='7f432372' name='procfs_list'/>
+ <parameter type-id='0131eb61' name='show'/>
+ <parameter type-id='6255c89d' name='show_header'/>
+ <parameter type-id='b5c3ae96' name='clear'/>
+ <parameter type-id='b59d7dce' name='procfs_list_node_off'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='procfs_list_uninstall' mangled-name='procfs_list_uninstall' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='procfs_list_uninstall'>
+ <parameter type-id='7f432372' name='procfs_list'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='procfs_list_destroy' mangled-name='procfs_list_destroy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='procfs_list_destroy'>
+ <parameter type-id='7f432372' name='procfs_list'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='procfs_list_add' mangled-name='procfs_list_add' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='procfs_list_add'>
+ <parameter type-id='7f432372' name='procfs_list'/>
+ <parameter type-id='eaa32e2f' name='p'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-type size-in-bits='64' id='be39c944'>
+ <parameter type-id='7f432372'/>
+ <return type-id='95e97e5e'/>
+ </function-type>
+ <function-type size-in-bits='64' id='86932239'>
+ <parameter type-id='f8dc9def'/>
+ <return type-id='95e97e5e'/>
+ </function-type>
+ <function-type size-in-bits='64' id='cf9ec29d'>
+ <parameter type-id='f8dc9def'/>
+ <parameter type-id='eaa32e2f'/>
+ <return type-id='95e97e5e'/>
+ </function-type>
+ </abi-instr>
+ <abi-instr address-size='64' path='lib/libspl/random.c' language='LANG_C99'>
+ <function-decl name='random_force_pseudo' mangled-name='random_force_pseudo' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='random_force_pseudo'>
+ <parameter type-id='c19b74c3' name='onoff'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='random_get_bytes' mangled-name='random_get_bytes' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='random_get_bytes'>
+ <parameter type-id='ae3e8ca6' name='ptr'/>
+ <parameter type-id='b59d7dce' name='len'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='random_get_pseudo_bytes' mangled-name='random_get_pseudo_bytes' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='random_get_pseudo_bytes'>
+ <parameter type-id='ae3e8ca6' name='ptr'/>
+ <parameter type-id='b59d7dce' name='len'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ </abi-instr>
+ <abi-instr address-size='64' path='lib/libspl/rwlock.c' language='LANG_C99'>
+ <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='64' id='8e100159'>
+ <subrange length='8' type-id='7359adad' id='56e0c0b1'/>
+ </array-type-def>
+ <array-type-def dimensions='1' type-id='002ac4a6' size-in-bits='56' id='08f7ce77'>
+ <subrange length='7' type-id='7359adad' id='16fc326e'/>
+ </array-type-def>
+ <class-decl name='krwlock' size-in-bits='576' is-struct='yes' visibility='default' id='4361e3b2'>
+ <data-member access='public' layout-offset-in-bits='0'>
+ <var-decl name='rw_lock' type-id='3f680bc6' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='448'>
+ <var-decl name='rw_owner' type-id='4051f5e7' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='512'>
+ <var-decl name='rw_readers' type-id='3502e3ff' visibility='default'/>
+ </data-member>
+ </class-decl>
+ <typedef-decl name='krwlock_t' type-id='4361e3b2' id='477df69a'/>
+ <typedef-decl name='krw_t' type-id='95e97e5e' id='932eed5d'/>
+ <union-decl name='pthread_rwlock_t' size-in-bits='448' naming-typedef-id='3f680bc6' visibility='default' id='981886f6'>
+ <data-member access='public'>
+ <var-decl name='__data' type-id='afe414a4' visibility='default'/>
+ </data-member>
+ <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_rwlock_t' type-id='981886f6' id='3f680bc6'/>
+ <union-decl name='pthread_rwlockattr_t' size-in-bits='64' naming-typedef-id='1b1c4591' visibility='default' id='b8e57521'>
+ <data-member access='public'>
+ <var-decl name='__size' type-id='8e100159' 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_rwlockattr_t' type-id='b8e57521' id='1b1c4591'/>
+ <class-decl name='__pthread_rwlock_arch_t' size-in-bits='448' is-struct='yes' visibility='default' id='afe414a4'>
+ <data-member access='public' layout-offset-in-bits='0'>
+ <var-decl name='__readers' type-id='f0981eeb' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='32'>
+ <var-decl name='__writers' type-id='f0981eeb' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='64'>
+ <var-decl name='__wrphase_futex' type-id='f0981eeb' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='96'>
+ <var-decl name='__writers_futex' type-id='f0981eeb' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='128'>
+ <var-decl name='__pad3' type-id='f0981eeb' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='160'>
+ <var-decl name='__pad4' type-id='f0981eeb' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='192'>
+ <var-decl name='__cur_writer' type-id='95e97e5e' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='224'>
+ <var-decl name='__shared' type-id='95e97e5e' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='256'>
+ <var-decl name='__rwelision' type-id='28577a57' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='264'>
+ <var-decl name='__pad1' type-id='08f7ce77' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='320'>
+ <var-decl name='__pad2' type-id='7359adad' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='384'>
+ <var-decl name='__flags' type-id='f0981eeb' visibility='default'/>
+ </data-member>
+ </class-decl>
+ <qualified-type-def type-id='1b1c4591' const='yes' id='52c85581'/>
+ <pointer-type-def type-id='52c85581' size-in-bits='64' id='fc5edc31'/>
+ <qualified-type-def type-id='fc5edc31' restrict='yes' id='295e8f33'/>
+ <pointer-type-def type-id='477df69a' size-in-bits='64' id='0126db61'/>
+ <pointer-type-def type-id='3f680bc6' size-in-bits='64' id='a6210c87'/>
+ <qualified-type-def type-id='a6210c87' restrict='yes' id='27210b05'/>
+ <qualified-type-def type-id='3502e3ff' volatile='yes' id='d0290e74'/>
+ <pointer-type-def type-id='d0290e74' size-in-bits='64' id='0ea19dfa'/>
+ <function-decl name='atomic_inc_uint' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='0ea19dfa'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='atomic_dec_uint' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='0ea19dfa'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='pthread_rwlock_init' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='27210b05'/>
+ <parameter type-id='295e8f33'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='pthread_rwlock_destroy' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='a6210c87'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='pthread_rwlock_rdlock' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='a6210c87'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='pthread_rwlock_tryrdlock' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='a6210c87'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='pthread_rwlock_wrlock' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='a6210c87'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='pthread_rwlock_trywrlock' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='a6210c87'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='pthread_rwlock_unlock' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='a6210c87'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='rw_init' mangled-name='rw_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rw_init'>
+ <parameter type-id='0126db61' name='rwlp'/>
+ <parameter type-id='26a90f95' name='name'/>
+ <parameter type-id='95e97e5e' name='type'/>
+ <parameter type-id='eaa32e2f' name='arg'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='rw_destroy' mangled-name='rw_destroy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rw_destroy'>
+ <parameter type-id='0126db61' name='rwlp'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='rw_enter' mangled-name='rw_enter' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rw_enter'>
+ <parameter type-id='0126db61' name='rwlp'/>
+ <parameter type-id='932eed5d' name='rw'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='rw_exit' mangled-name='rw_exit' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rw_exit'>
+ <parameter type-id='0126db61' name='rwlp'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='rw_tryenter' mangled-name='rw_tryenter' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rw_tryenter'>
+ <parameter type-id='0126db61' name='rwlp'/>
+ <parameter type-id='932eed5d' name='rw'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='rw_tryupgrade' mangled-name='rw_tryupgrade' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rw_tryupgrade'>
+ <parameter type-id='0126db61' name='rwlp'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ </abi-instr>
+ <abi-instr address-size='64' path='lib/libspl/sid.c' language='LANG_C99'>
+ <class-decl name='ksiddomain' size-in-bits='128' is-struct='yes' visibility='default' id='b3a38f42'>
+ <data-member access='public' layout-offset-in-bits='0'>
+ <var-decl name='kd_ref' type-id='3502e3ff' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='32'>
+ <var-decl name='kd_len' type-id='3502e3ff' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='64'>
+ <var-decl name='kd_name' type-id='26a90f95' visibility='default'/>
+ </data-member>
+ </class-decl>
+ <typedef-decl name='ksiddomain_t' type-id='b3a38f42' id='db2eb030'/>
+ <pointer-type-def type-id='db2eb030' size-in-bits='64' id='3b684881'/>
+ <function-decl name='ksid_lookupdomain' mangled-name='ksid_lookupdomain' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='ksid_lookupdomain'>
+ <parameter type-id='80f4b756' name='dom'/>
+ <return type-id='3b684881'/>
+ </function-decl>
+ <function-decl name='ksiddomain_rele' mangled-name='ksiddomain_rele' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='ksiddomain_rele'>
+ <parameter type-id='3b684881' name='ksid'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ </abi-instr>
<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'/>
@@ -1268,6 +1925,261 @@
<return type-id='b59d7dce'/>
</function-decl>
</abi-instr>
+ <abi-instr address-size='64' path='lib/libspl/taskq.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>
+ <typedef-decl name='pri_t' type-id='a2185560' id='c497180a'/>
+ <typedef-decl name='taskqid_t' type-id='e475ab95' id='de0ea20e'/>
+ <typedef-decl name='task_func_t' type-id='c5c76c9c' id='d8481e1f'/>
+ <class-decl name='taskq_ent' size-in-bits='320' is-struct='yes' visibility='default' id='cfda1b05'>
+ <data-member access='public' layout-offset-in-bits='0'>
+ <var-decl name='tqent_next' type-id='67918d75' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='64'>
+ <var-decl name='tqent_prev' type-id='67918d75' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='128'>
+ <var-decl name='tqent_func' type-id='41cce5ce' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='192'>
+ <var-decl name='tqent_arg' type-id='eaa32e2f' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='256'>
+ <var-decl name='tqent_flags' type-id='e475ab95' visibility='default'/>
+ </data-member>
+ </class-decl>
+ <typedef-decl name='taskq_ent_t' type-id='cfda1b05' id='65d297d1'/>
+ <class-decl name='taskq' size-in-bits='3072' is-struct='yes' visibility='default' id='1804594f'>
+ <data-member access='public' layout-offset-in-bits='0'>
+ <var-decl name='tq_name' type-id='16dc656a' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='256'>
+ <var-decl name='tq_lock' type-id='b9eccc8f' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='640'>
+ <var-decl name='tq_threadlock' type-id='477df69a' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='1216'>
+ <var-decl name='tq_dispatch_cv' type-id='29dbc0dd' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='1600'>
+ <var-decl name='tq_wait_cv' type-id='29dbc0dd' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='1984'>
+ <var-decl name='tq_threadlist' type-id='6e87b565' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2048'>
+ <var-decl name='tq_flags' type-id='95e97e5e' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2080'>
+ <var-decl name='tq_active' type-id='95e97e5e' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2112'>
+ <var-decl name='tq_nthreads' type-id='95e97e5e' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2144'>
+ <var-decl name='tq_nalloc' type-id='95e97e5e' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2176'>
+ <var-decl name='tq_minalloc' type-id='95e97e5e' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2208'>
+ <var-decl name='tq_maxalloc' type-id='95e97e5e' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2240'>
+ <var-decl name='tq_maxalloc_cv' type-id='29dbc0dd' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2624'>
+ <var-decl name='tq_maxalloc_wait' type-id='95e97e5e' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2688'>
+ <var-decl name='tq_freelist' type-id='3a4f23d4' visibility='default'/>
+ </data-member>
+ <data-member access='public' layout-offset-in-bits='2752'>
+ <var-decl name='tq_task' type-id='65d297d1' visibility='default'/>
+ </data-member>
+ </class-decl>
+ <typedef-decl name='taskq_t' type-id='1804594f' id='ef507f03'/>
+ <typedef-decl name='kthread_t' type-id='4051f5e7' id='9bccee1a'/>
+ <typedef-decl name='uintptr_t' type-id='7359adad' id='e475ab95'/>
+ <typedef-decl name='pthread_key_t' type-id='f0981eeb' id='2de5383b'/>
+ <pointer-type-def type-id='9bccee1a' size-in-bits='64' id='6ae5a80d'/>
+ <pointer-type-def type-id='6ae5a80d' size-in-bits='64' id='6e87b565'/>
+ <pointer-type-def type-id='6e87b565' size-in-bits='64' id='4ea26b5d'/>
+ <pointer-type-def type-id='2de5383b' size-in-bits='64' id='ce04b822'/>
+ <pointer-type-def type-id='d8481e1f' size-in-bits='64' id='41cce5ce'/>
+ <pointer-type-def type-id='cfda1b05' size-in-bits='64' id='67918d75'/>
+ <pointer-type-def type-id='65d297d1' size-in-bits='64' id='3a4f23d4'/>
+ <pointer-type-def type-id='ef507f03' size-in-bits='64' id='4f8ed29a'/>
+ <pointer-type-def type-id='c5c76c9c' size-in-bits='64' id='b7f9d8e6'/>
+ <function-decl name='zk_thread_create' mangled-name='zk_thread_create' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zk_thread_create'>
+ <parameter type-id='80f4b756'/>
+ <parameter type-id='b7f9d8e6'/>
+ <parameter type-id='eaa32e2f'/>
+ <parameter type-id='b59d7dce'/>
+ <parameter type-id='95e97e5e'/>
+ <return type-id='6ae5a80d'/>
+ </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_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='pthread_key_delete' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='2de5383b'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <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='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='_system_taskq' mangled-name='_system_taskq' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_system_taskq'>
+ <return type-id='4f8ed29a'/>
+ </function-decl>
+ <function-decl name='_system_delay_taskq' mangled-name='_system_delay_taskq' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_system_delay_taskq'>
+ <return type-id='4f8ed29a'/>
+ </function-decl>
+ <function-decl name='taskq_dispatch' mangled-name='taskq_dispatch' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_dispatch'>
+ <parameter type-id='4f8ed29a' name='tq'/>
+ <parameter type-id='41cce5ce' name='func'/>
+ <parameter type-id='eaa32e2f' name='arg'/>
+ <parameter type-id='3502e3ff' name='tqflags'/>
+ <return type-id='de0ea20e'/>
+ </function-decl>
+ <function-decl name='taskq_dispatch_delay' mangled-name='taskq_dispatch_delay' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_dispatch_delay'>
+ <parameter type-id='4f8ed29a' name='tq'/>
+ <parameter type-id='41cce5ce' name='func'/>
+ <parameter type-id='eaa32e2f' name='arg'/>
+ <parameter type-id='3502e3ff' name='tqflags'/>
+ <parameter type-id='4c3a2c61' name='expire_time'/>
+ <return type-id='de0ea20e'/>
+ </function-decl>
+ <function-decl name='taskq_empty_ent' mangled-name='taskq_empty_ent' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_empty_ent'>
+ <parameter type-id='3a4f23d4' name='t'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='taskq_init_ent' mangled-name='taskq_init_ent' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_init_ent'>
+ <parameter type-id='3a4f23d4' name='t'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='taskq_dispatch_ent' mangled-name='taskq_dispatch_ent' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_dispatch_ent'>
+ <parameter type-id='4f8ed29a' name='tq'/>
+ <parameter type-id='41cce5ce' name='func'/>
+ <parameter type-id='eaa32e2f' name='arg'/>
+ <parameter type-id='3502e3ff' name='flags'/>
+ <parameter type-id='3a4f23d4' name='t'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='taskq_wait' mangled-name='taskq_wait' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_wait'>
+ <parameter type-id='4f8ed29a' name='tq'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='taskq_wait_id' mangled-name='taskq_wait_id' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_wait_id'>
+ <parameter type-id='4f8ed29a' name='tq'/>
+ <parameter type-id='de0ea20e' name='id'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='taskq_create' mangled-name='taskq_create' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_create'>
+ <parameter type-id='80f4b756' name='name'/>
+ <parameter type-id='95e97e5e' name='nthreads'/>
+ <parameter type-id='c497180a' name='pri'/>
+ <parameter type-id='95e97e5e' name='minalloc'/>
+ <parameter type-id='95e97e5e' name='maxalloc'/>
+ <parameter type-id='3502e3ff' name='flags'/>
+ <return type-id='4f8ed29a'/>
+ </function-decl>
+ <function-decl name='taskq_destroy' mangled-name='taskq_destroy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_destroy'>
+ <parameter type-id='4f8ed29a' name='tq'/>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='taskq_create_synced' mangled-name='taskq_create_synced' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_create_synced'>
+ <parameter type-id='80f4b756' name='name'/>
+ <parameter type-id='95e97e5e' name='nthreads'/>
+ <parameter type-id='c497180a' name='pri'/>
+ <parameter type-id='95e97e5e' name='minalloc'/>
+ <parameter type-id='95e97e5e' name='maxalloc'/>
+ <parameter type-id='3502e3ff' name='flags'/>
+ <parameter type-id='4ea26b5d' name='ktpp'/>
+ <return type-id='4f8ed29a'/>
+ </function-decl>
+ <function-decl name='taskq_member' mangled-name='taskq_member' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_member'>
+ <parameter type-id='4f8ed29a' name='tq'/>
+ <parameter type-id='6ae5a80d' name='t'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='taskq_of_curthread' mangled-name='taskq_of_curthread' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_of_curthread'>
+ <return type-id='4f8ed29a'/>
+ </function-decl>
+ <function-decl name='taskq_cancel_id' mangled-name='taskq_cancel_id' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='taskq_cancel_id'>
+ <parameter type-id='4f8ed29a' name='tq'/>
+ <parameter type-id='de0ea20e' name='id'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <function-decl name='system_taskq_init' mangled-name='system_taskq_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='system_taskq_init'>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ <function-decl name='system_taskq_fini' mangled-name='system_taskq_fini' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='system_taskq_fini'>
+ <return type-id='48b5725f'/>
+ </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='lib/libspl/thread.c' language='LANG_C99'>
+ <pointer-type-def type-id='7d8569fd' size-in-bits='64' id='7347a39e'/>
+ <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='pthread_attr_destroy' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='7347a39e'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
+ <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='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='pthread_attr_setstacksize' 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='pthread_setname_np' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='4051f5e7'/>
+ <parameter type-id='80f4b756'/>
+ <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='__sysconf' visibility='default' binding='global' size-in-bits='64'>
+ <parameter type-id='95e97e5e'/>
+ <return type-id='bd54fe1a'/>
+ </function-decl>
+ <function-decl name='p0' mangled-name='p0' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='p0'>
+ <return type-id='48b5725f'/>
+ </function-decl>
+ </abi-instr>
<abi-instr address-size='64' path='lib/libspl/timestamp.c' language='LANG_C99'>
<typedef-decl name='nl_item' type-id='95e97e5e' id='03b79a94'/>
<class-decl name='tm' size-in-bits='448' is-struct='yes' visibility='default' id='dddf6ca2'>
@@ -1359,52 +2271,10 @@
</function-decl>
</abi-instr>
<abi-instr address-size='64' path='lib/libspl/tunables.c' language='LANG_C99'>
- <enum-decl name='zfs_tunable_type_t' naming-typedef-id='f50b1525' id='56905369'>
- <underlying-type type-id='9cac1fee'/>
- <enumerator name='ZFS_TUNABLE_TYPE_INT' value='0'/>
- <enumerator name='ZFS_TUNABLE_TYPE_UINT' value='1'/>
- <enumerator name='ZFS_TUNABLE_TYPE_ULONG' value='2'/>
- <enumerator name='ZFS_TUNABLE_TYPE_U64' value='3'/>
- <enumerator name='ZFS_TUNABLE_TYPE_STRING' value='4'/>
- </enum-decl>
- <typedef-decl name='zfs_tunable_type_t' type-id='56905369' id='f50b1525'/>
- <enum-decl name='zfs_tunable_perm_t' naming-typedef-id='ada7336b' id='e80e6ebf'>
- <underlying-type type-id='9cac1fee'/>
- <enumerator name='ZFS_TUNABLE_PERM_ZMOD_RW' value='0'/>
- <enumerator name='ZFS_TUNABLE_PERM_ZMOD_RD' value='1'/>
- </enum-decl>
- <typedef-decl name='zfs_tunable_perm_t' type-id='e80e6ebf' id='ada7336b'/>
- <class-decl name='zfs_tunable' size-in-bits='320' is-struct='yes' visibility='default' id='1a97ee0e'>
- <data-member access='public' layout-offset-in-bits='0'>
- <var-decl name='zt_name' type-id='80f4b756' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='64'>
- <var-decl name='zt_varp' type-id='eaa32e2f' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='128'>
- <var-decl name='zt_varsz' type-id='b59d7dce' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='192'>
- <var-decl name='zt_type' type-id='f50b1525' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='224'>
- <var-decl name='zt_perm' type-id='ada7336b' visibility='default'/>
- </data-member>
- <data-member access='public' layout-offset-in-bits='256'>
- <var-decl name='zt_desc' type-id='80f4b756' visibility='default'/>
- </data-member>
- </class-decl>
- <typedef-decl name='zfs_tunable_t' type-id='1a97ee0e' id='12bf5c5e'/>
- <typedef-decl name='zfs_tunable_iter_t' type-id='7ef33f92' id='d8d5f4ab'/>
<typedef-decl name='intmax_t' type-id='5b475db0' id='e104d842'/>
<typedef-decl name='uintmax_t' type-id='04d82f4b' id='f8b828c9'/>
<typedef-decl name='__intmax_t' type-id='bd54fe1a' id='5b475db0'/>
<typedef-decl name='__uintmax_t' type-id='7359adad' id='04d82f4b'/>
- <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='12bf5c5e' const='yes' id='180e47ee'/>
- <pointer-type-def type-id='180e47ee' size-in-bits='64' id='a27af98c'/>
- <pointer-type-def type-id='92f86508' size-in-bits='64' id='7ef33f92'/>
<function-decl name='strtoimax' visibility='default' binding='global' size-in-bits='64'>
<parameter type-id='9d26089a'/>
<parameter type-id='8c85230f'/>
@@ -1422,31 +2292,6 @@
<parameter type-id='80f4b756'/>
<return type-id='95e97e5e'/>
</function-decl>
- <function-decl name='zfs_tunable_lookup' mangled-name='zfs_tunable_lookup' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_tunable_lookup'>
- <parameter type-id='80f4b756' name='name'/>
- <return type-id='a27af98c'/>
- </function-decl>
- <function-decl name='zfs_tunable_iter' mangled-name='zfs_tunable_iter' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_tunable_iter'>
- <parameter type-id='d8d5f4ab' name='cb'/>
- <parameter type-id='eaa32e2f' name='arg'/>
- <return type-id='48b5725f'/>
- </function-decl>
- <function-decl name='zfs_tunable_set' mangled-name='zfs_tunable_set' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_tunable_set'>
- <parameter type-id='a27af98c' name='zt'/>
- <parameter type-id='80f4b756' name='val'/>
- <return type-id='95e97e5e'/>
- </function-decl>
- <function-decl name='zfs_tunable_get' mangled-name='zfs_tunable_get' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_tunable_get'>
- <parameter type-id='a27af98c' name='zt'/>
- <parameter type-id='26a90f95' name='val'/>
- <parameter type-id='b59d7dce' name='valsz'/>
- <return type-id='95e97e5e'/>
- </function-decl>
- <function-type size-in-bits='64' id='92f86508'>
- <parameter type-id='a27af98c'/>
- <parameter type-id='eaa32e2f'/>
- <return type-id='95e97e5e'/>
- </function-type>
</abi-instr>
<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'>
@@ -1812,6 +2657,7 @@
<underlying-type type-id='9cac1fee'/>
<enumerator name='ZPOOL_PREFETCH_NONE' value='0'/>
<enumerator name='ZPOOL_PREFETCH_DDT' value='1'/>
+ <enumerator name='ZPOOL_PREFETCH_BRT' value='2'/>
</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'>
@@ -2445,10 +3291,10 @@
<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'/>
+ <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='e7f43f72'>
+ <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='zc_pad1' type-id='514368c7' visibility='default'/>
</data-member>
diff --git a/sys/contrib/openzfs/lib/libzfsbootenv/libzfsbootenv.abi b/sys/contrib/openzfs/lib/libzfsbootenv/libzfsbootenv.abi
index bf866b0fa61b..e2b492a0780d 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.6'/>
+ <dependency name='libzfs.so.7'/>
<dependency name='libnvpair.so.3'/>
<dependency name='libc.so.6'/>
</elf-needed>
diff --git a/sys/contrib/openzfs/lib/libzpool/Makefile.am b/sys/contrib/openzfs/lib/libzpool/Makefile.am
index aeacc595b363..8340fe2efd71 100644
--- a/sys/contrib/openzfs/lib/libzpool/Makefile.am
+++ b/sys/contrib/openzfs/lib/libzpool/Makefile.am
@@ -1,8 +1,9 @@
+include $(srcdir)/%D%/include/Makefile.am
+
libzpool_la_CFLAGS = $(AM_CFLAGS) $(KERNEL_CFLAGS) $(LIBRARY_CFLAGS)
libzpool_la_CFLAGS += $(ZLIB_CFLAGS)
libzpool_la_CPPFLAGS = $(AM_CPPFLAGS) $(LIBZPOOL_CPPFLAGS)
-libzpool_la_CPPFLAGS += -I$(srcdir)/include/os/@ac_system_l@/zfs
libzpool_la_CPPFLAGS += -DLIB_ZPOOL_BUILD
lib_LTLIBRARIES += libzpool.la
@@ -12,7 +13,6 @@ dist_libzpool_la_SOURCES = \
%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 \
@@ -180,6 +180,7 @@ nodist_libzpool_la_SOURCES = \
module/zfs/zfs_crrd.c \
module/zfs/zfs_fm.c \
module/zfs/zfs_fuid.c \
+ module/zfs/zfs_impl.c \
module/zfs/zfs_ratelimit.c \
module/zfs/zfs_rlock.c \
module/zfs/zfs_sa.c \
@@ -212,7 +213,7 @@ if BUILD_FREEBSD
libzpool_la_LIBADD += -lgeom
endif
-libzpool_la_LDFLAGS += -version-info 6:0:0
+libzpool_la_LDFLAGS += -version-info 7:0:0
if TARGET_CPU_POWERPC
module/zfs/libzpool_la-vdev_raidz_math_powerpc_altivec.$(OBJEXT) : CFLAGS += -maltivec
diff --git a/sys/contrib/openzfs/lib/libzpool/include/Makefile.am b/sys/contrib/openzfs/lib/libzpool/include/Makefile.am
new file mode 100644
index 000000000000..6cfa2d5ce089
--- /dev/null
+++ b/sys/contrib/openzfs/lib/libzpool/include/Makefile.am
@@ -0,0 +1,8 @@
+libzpool_sysdir = $(includedir)/libzpool/sys
+libzpool_sys_HEADERS = \
+ %D%/sys/abd_os.h \
+ %D%/sys/abd_impl_os.h \
+ %D%/sys/trace_zfs.h \
+ %D%/sys/zfs_bootenv_os.h \
+ %D%/sys/zfs_context_os.h \
+ %D%/sys/zfs_debug_os.h
diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/abd_impl_os.h b/sys/contrib/openzfs/lib/libzpool/include/sys/abd_impl_os.h
index dee95652c71c..dee95652c71c 100644
--- a/sys/contrib/openzfs/lib/libspl/include/sys/abd_impl_os.h
+++ b/sys/contrib/openzfs/lib/libzpool/include/sys/abd_impl_os.h
diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/abd_os.h b/sys/contrib/openzfs/lib/libzpool/include/sys/abd_os.h
index 80ce46e99a8e..80ce46e99a8e 100644
--- a/sys/contrib/openzfs/lib/libspl/include/sys/abd_os.h
+++ b/sys/contrib/openzfs/lib/libzpool/include/sys/abd_os.h
diff --git a/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/sysmacros.h b/sys/contrib/openzfs/lib/libzpool/include/sys/trace_zfs.h
index d9639d27b60e..d9639d27b60e 100644
--- a/sys/contrib/openzfs/lib/libspl/include/os/freebsd/sys/sysmacros.h
+++ b/sys/contrib/openzfs/lib/libzpool/include/sys/trace_zfs.h
diff --git a/sys/contrib/openzfs/lib/libzpool/include/sys/zfs_bootenv_os.h b/sys/contrib/openzfs/lib/libzpool/include/sys/zfs_bootenv_os.h
new file mode 100644
index 000000000000..44afbb6f5b6b
--- /dev/null
+++ b/sys/contrib/openzfs/lib/libzpool/include/sys/zfs_bootenv_os.h
@@ -0,0 +1,39 @@
+// 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) 2025, Rob Norris <robn@despairlabs.com>
+ */
+
+#ifndef _ZFS_BOOTENV_OS_H
+#define _ZFS_BOOTENV_OS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define BOOTENV_OS BE_POSIX_VENDOR
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ZFS_BOOTENV_OS_H */
diff --git a/sys/contrib/openzfs/lib/libzpool/include/sys/zfs_context_os.h b/sys/contrib/openzfs/lib/libzpool/include/sys/zfs_context_os.h
new file mode 100644
index 000000000000..4dcf386e3351
--- /dev/null
+++ b/sys/contrib/openzfs/lib/libzpool/include/sys/zfs_context_os.h
@@ -0,0 +1,34 @@
+// 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 2011 Nexenta Systems, Inc. All rights reserved.
+ * Copyright (c) 2012, 2018 by Delphix. All rights reserved.
+ * Copyright (c) 2012, Joyent, Inc. All rights reserved.
+ */
+
+#ifndef ZFS_CONTEXT_OS_H_
+#define ZFS_CONTEXT_OS_H_
+
+#define HAVE_LARGE_STACKS 1
+
+#endif
diff --git a/sys/contrib/openzfs/lib/libzpool/include/sys/zfs_debug_os.h b/sys/contrib/openzfs/lib/libzpool/include/sys/zfs_debug_os.h
new file mode 100644
index 000000000000..b59165a6c903
--- /dev/null
+++ b/sys/contrib/openzfs/lib/libzpool/include/sys/zfs_debug_os.h
@@ -0,0 +1,29 @@
+// 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
+ */
+
+#ifndef _SYS_ZFS_DEBUG_OS_H
+#define _SYS_ZFS_DEBUG_OS_H
+
+#define SET_ERROR(err) \
+ (__set_error(__FILE__, __func__, __LINE__, err), err)
+
+#endif
diff --git a/sys/contrib/openzfs/lib/libzpool/kernel.c b/sys/contrib/openzfs/lib/libzpool/kernel.c
index e63153a03370..7e3ffec3b81d 100644
--- a/sys/contrib/openzfs/lib/libzpool/kernel.c
+++ b/sys/contrib/openzfs/lib/libzpool/kernel.c
@@ -23,6 +23,7 @@
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2018 by Delphix. All rights reserved.
* Copyright (c) 2016 Actifio, Inc. All rights reserved.
+ * Copyright (c) 2025, Klara, Inc.
*/
#include <assert.h>
@@ -38,10 +39,15 @@
#include <sys/processor.h>
#include <sys/rrwlock.h>
#include <sys/spa.h>
+#include <sys/spa_impl.h>
+#include <sys/sid.h>
#include <sys/stat.h>
#include <sys/systeminfo.h>
#include <sys/time.h>
-#include <sys/utsname.h>
+#include <sys/tsd.h>
+
+#include <libspl.h>
+#include <libzpool.h>
#include <sys/zfs_context.h>
#include <sys/zfs_onexit.h>
#include <sys/zfs_vfsops.h>
@@ -54,258 +60,11 @@
* Emulation of kernel services in userland.
*/
-uint64_t physmem;
uint32_t hostid;
-struct utsname hw_utsname;
/* If set, all blocks read will be copied to the specified directory. */
char *vn_dumpdir = NULL;
-/* this only exists to have its address taken */
-struct proc p0;
-
-/*
- * =========================================================================
- * threads
- * =========================================================================
- *
- * TS_STACK_MIN is dictated by the minimum allowed pthread stack size. While
- * TS_STACK_MAX is somewhat arbitrary, it was selected to be large enough for
- * the expected stack depth while small enough to avoid exhausting address
- * space with high thread counts.
- */
-#define TS_STACK_MIN MAX(PTHREAD_STACK_MIN, 32768)
-#define TS_STACK_MAX (256 * 1024)
-
-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(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));
-
- if (state & TS_JOINABLE)
- detachstate = PTHREAD_CREATE_JOINABLE;
-
- VERIFY0(pthread_attr_setdetachstate(&attr, detachstate));
-
- /*
- * We allow the default stack size in user space to be specified by
- * setting the ZFS_STACK_SIZE environment variable. This allows us
- * the convenience of observing and debugging stack overruns in
- * user space. Explicitly specified stack sizes will be honored.
- * The usage of ZFS_STACK_SIZE is discussed further in the
- * ENVIRONMENT VARIABLES sections of the ztest(1) man page.
- */
- if (stksize == 0) {
- stkstr = getenv("ZFS_STACK_SIZE");
-
- if (stkstr == NULL)
- stksize = TS_STACK_MAX;
- else
- stksize = MAX(atoi(stkstr), TS_STACK_MIN);
- }
-
- VERIFY3S(stksize, >, 0);
- stksize = P2ROUNDUP(MAX(stksize, TS_STACK_MIN), PAGESIZE);
-
- /*
- * If this ever fails, it may be because the stack size is not a
- * multiple of system page size.
- */
- VERIFY0(pthread_attr_setstacksize(&attr, stksize));
- VERIFY0(pthread_attr_setguardsize(&attr, PAGESIZE));
-
- 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);
-}
-
-/*
- * =========================================================================
- * kstats
- * =========================================================================
- */
-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);
-}
-
-void
-kstat_install(kstat_t *ksp)
-{
- (void) ksp;
-}
-
-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;
-}
-
-/*
- * =========================================================================
- * mutexes
- * =========================================================================
- */
-
-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));
-}
-
-void
-mutex_destroy(kmutex_t *mp)
-{
- VERIFY0(pthread_mutex_destroy(&mp->m_lock));
-}
-
-void
-mutex_enter(kmutex_t *mp)
-{
- VERIFY0(pthread_mutex_lock(&mp->m_lock));
- mp->m_owner = pthread_self();
-}
-
-int
-mutex_enter_check_return(kmutex_t *mp)
-{
- int error = pthread_mutex_lock(&mp->m_lock);
- if (error == 0)
- mp->m_owner = pthread_self();
- return (error);
-}
-
-int
-mutex_tryenter(kmutex_t *mp)
-{
- int error = pthread_mutex_trylock(&mp->m_lock);
- if (error == 0) {
- mp->m_owner = pthread_self();
- return (1);
- } else {
- VERIFY3S(error, ==, EBUSY);
- return (0);
- }
-}
-
-void
-mutex_exit(kmutex_t *mp)
-{
- memset(&mp->m_owner, 0, sizeof (pthread_t));
- VERIFY0(pthread_mutex_unlock(&mp->m_lock));
-}
-
-/*
- * =========================================================================
- * rwlocks
- * =========================================================================
- */
-
-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;
-}
-
-void
-rw_destroy(krwlock_t *rwlp)
-{
- VERIFY0(pthread_rwlock_destroy(&rwlp->rw_lock));
-}
-
-void
-rw_enter(krwlock_t *rwlp, krw_t rw)
-{
- if (rw == RW_READER) {
- VERIFY0(pthread_rwlock_rdlock(&rwlp->rw_lock));
- atomic_inc_uint(&rwlp->rw_readers);
- } else {
- VERIFY0(pthread_rwlock_wrlock(&rwlp->rw_lock));
- rwlp->rw_owner = pthread_self();
- }
-}
-
-void
-rw_exit(krwlock_t *rwlp)
-{
- if (RW_READ_HELD(rwlp))
- atomic_dec_uint(&rwlp->rw_readers);
- else
- rwlp->rw_owner = 0;
-
- VERIFY0(pthread_rwlock_unlock(&rwlp->rw_lock));
-}
-
-int
-rw_tryenter(krwlock_t *rwlp, krw_t rw)
-{
- int error;
-
- if (rw == RW_READER)
- error = pthread_rwlock_tryrdlock(&rwlp->rw_lock);
- else
- error = pthread_rwlock_trywrlock(&rwlp->rw_lock);
-
- if (error == 0) {
- if (rw == RW_READER)
- atomic_inc_uint(&rwlp->rw_readers);
- else
- rwlp->rw_owner = pthread_self();
-
- return (1);
- }
-
- VERIFY3S(error, ==, EBUSY);
-
- return (0);
-}
-
uint32_t
zone_get_hostid(void *zonep)
{
@@ -316,191 +75,6 @@ zone_get_hostid(void *zonep)
return (hostid);
}
-int
-rw_tryupgrade(krwlock_t *rwlp)
-{
- (void) rwlp;
- return (0);
-}
-
-/*
- * =========================================================================
- * condition variables
- * =========================================================================
- */
-
-void
-cv_init(kcondvar_t *cv, char *name, int type, void *arg)
-{
- (void) name, (void) type, (void) arg;
- VERIFY0(pthread_cond_init(cv, NULL));
-}
-
-void
-cv_destroy(kcondvar_t *cv)
-{
- VERIFY0(pthread_cond_destroy(cv));
-}
-
-void
-cv_wait(kcondvar_t *cv, kmutex_t *mp)
-{
- memset(&mp->m_owner, 0, sizeof (pthread_t));
- VERIFY0(pthread_cond_wait(cv, &mp->m_lock));
- mp->m_owner = pthread_self();
-}
-
-int
-cv_wait_sig(kcondvar_t *cv, kmutex_t *mp)
-{
- cv_wait(cv, mp);
- return (1);
-}
-
-int
-cv_timedwait(kcondvar_t *cv, kmutex_t *mp, clock_t abstime)
-{
- int error;
- struct timeval tv;
- struct timespec ts;
- clock_t delta;
-
- delta = abstime - ddi_get_lbolt();
- if (delta <= 0)
- return (-1);
-
- VERIFY0(gettimeofday(&tv, NULL));
-
- ts.tv_sec = tv.tv_sec + delta / hz;
- ts.tv_nsec = tv.tv_usec * NSEC_PER_USEC + (delta % hz) * (NANOSEC / hz);
- if (ts.tv_nsec >= NANOSEC) {
- ts.tv_sec++;
- ts.tv_nsec -= NANOSEC;
- }
-
- memset(&mp->m_owner, 0, sizeof (pthread_t));
- error = pthread_cond_timedwait(cv, &mp->m_lock, &ts);
- mp->m_owner = pthread_self();
-
- if (error == ETIMEDOUT)
- return (-1);
-
- VERIFY0(error);
-
- return (1);
-}
-
-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;
- hrtime_t delta;
-
- ASSERT(flag == 0 || flag == CALLOUT_FLAG_ABSOLUTE);
-
- delta = tim;
- if (flag & CALLOUT_FLAG_ABSOLUTE)
- delta -= gethrtime();
-
- if (delta <= 0)
- return (-1);
-
- VERIFY0(gettimeofday(&tv, NULL));
-
- ts.tv_sec = tv.tv_sec + delta / NANOSEC;
- ts.tv_nsec = tv.tv_usec * NSEC_PER_USEC + (delta % NANOSEC);
- if (ts.tv_nsec >= NANOSEC) {
- ts.tv_sec++;
- ts.tv_nsec -= NANOSEC;
- }
-
- memset(&mp->m_owner, 0, sizeof (pthread_t));
- error = pthread_cond_timedwait(cv, &mp->m_lock, &ts);
- mp->m_owner = pthread_self();
-
- if (error == ETIMEDOUT)
- return (-1);
-
- VERIFY0(error);
-
- return (1);
-}
-
-void
-cv_signal(kcondvar_t *cv)
-{
- VERIFY0(pthread_cond_signal(cv));
-}
-
-void
-cv_broadcast(kcondvar_t *cv)
-{
- VERIFY0(pthread_cond_broadcast(cv));
-}
-
-/*
- * =========================================================================
- * procfs list
- * =========================================================================
- */
-
-void
-seq_printf(struct seq_file *m, const char *fmt, ...)
-{
- (void) m, (void) fmt;
-}
-
-void
-procfs_list_install(const char *module,
- const char *submodule,
- const char *name,
- mode_t mode,
- procfs_list_t *procfs_list,
- int (*show)(struct seq_file *f, void *p),
- int (*show_header)(struct seq_file *f),
- 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),
- procfs_list_node_off + offsetof(procfs_list_node_t, pln_link));
- procfs_list->pl_next_id = 1;
- procfs_list->pl_node_offset = procfs_list_node_off;
-}
-
-void
-procfs_list_uninstall(procfs_list_t *procfs_list)
-{
- (void) procfs_list;
-}
-
-void
-procfs_list_destroy(procfs_list_t *procfs_list)
-{
- ASSERT(list_is_empty(&procfs_list->pl_list));
- list_destroy(&procfs_list->pl_list);
- mutex_destroy(&procfs_list->pl_lock);
-}
-
-#define NODE_ID(procfs_list, obj) \
- (((procfs_list_node_t *)(((char *)obj) + \
- (procfs_list)->pl_node_offset))->pln_id)
-
-void
-procfs_list_add(procfs_list_t *procfs_list, void *p)
-{
- ASSERT(MUTEX_HELD(&procfs_list->pl_lock));
- NODE_ID(procfs_list, p) = procfs_list->pl_next_id++;
- list_insert_tail(&procfs_list->pl_list, p);
-}
-
/*
* =========================================================================
* vnode operations
@@ -644,39 +218,60 @@ __dprintf(boolean_t dprint, const char *file, const char *func,
* cmn_err() and panic()
* =========================================================================
*/
-static char ce_prefix[CE_IGNORE][10] = { "", "NOTICE: ", "WARNING: ", "" };
-static char ce_suffix[CE_IGNORE][2] = { "", "\n", "\n", "" };
-__attribute__((noreturn)) void
-vpanic(const char *fmt, va_list adx)
+static __attribute__((noreturn)) void
+panic_stop_or_abort(void)
{
- (void) fprintf(stderr, "error: ");
- (void) vfprintf(stderr, fmt, adx);
- (void) fprintf(stderr, "\n");
+ const char *stopenv = getenv("LIBZPOOL_PANIC_STOP");
+ if (stopenv != NULL && atoi(stopenv)) {
+ fputs("libzpool: LIBZPOOL_PANIC_STOP is set, sending "
+ "SIGSTOP to process group\n", stderr);
+ fflush(stderr);
+
+ kill(0, SIGSTOP);
+
+ fputs("libzpool: continued after panic stop, "
+ "aborting\n", stderr);
+ }
abort(); /* think of it as a "user-level crash dump" */
}
-__attribute__((noreturn)) void
-panic(const char *fmt, ...)
-{
- va_list adx;
+static void
+vcmn_msg(int ce, const char *fmt, va_list adx)
+{
+ switch (ce) {
+ case CE_IGNORE:
+ return;
+ case CE_CONT:
+ break;
+ case CE_NOTE:
+ fputs("libzpool: NOTICE: ", stderr);
+ break;
+ case CE_WARN:
+ fputs("libzpool: WARNING: ", stderr);
+ break;
+ case CE_PANIC:
+ fputs("libzpool: PANIC: ", stderr);
+ break;
+ default:
+ fputs("libzpool: [unknown severity %d]: ", stderr);
+ break;
+ }
- va_start(adx, fmt);
- vpanic(fmt, adx);
- va_end(adx);
+ vfprintf(stderr, fmt, adx);
+ if (ce != CE_CONT)
+ fputc('\n', stderr);
+ fflush(stderr);
}
void
vcmn_err(int ce, const char *fmt, va_list adx)
{
+ vcmn_msg(ce, fmt, adx);
+
if (ce == CE_PANIC)
- vpanic(fmt, adx);
- if (ce != CE_NOTE) { /* suppress noise in userland stress testing */
- (void) fprintf(stderr, "%s", ce_prefix[ce]);
- (void) vfprintf(stderr, fmt, adx);
- (void) fprintf(stderr, "%s", ce_suffix[ce]);
- }
+ panic_stop_or_abort();
}
void
@@ -689,6 +284,25 @@ cmn_err(int ce, const char *fmt, ...)
va_end(adx);
}
+__attribute__((noreturn)) void
+panic(const char *fmt, ...)
+{
+ va_list adx;
+
+ va_start(adx, fmt);
+ vcmn_msg(CE_PANIC, fmt, adx);
+ va_end(adx);
+
+ panic_stop_or_abort();
+}
+
+__attribute__((noreturn)) void
+vpanic(const char *fmt, va_list adx)
+{
+ vcmn_msg(CE_PANIC, fmt, adx);
+ panic_stop_or_abort();
+}
+
/*
* =========================================================================
* misc routines
@@ -729,57 +343,6 @@ lowbit64(uint64_t i)
return (__builtin_ffsll(i));
}
-const char *random_path = "/dev/random";
-const char *urandom_path = "/dev/urandom";
-static int random_fd = -1, urandom_fd = -1;
-
-void
-random_init(void)
-{
- VERIFY((random_fd = open(random_path, O_RDONLY | O_CLOEXEC)) != -1);
- VERIFY((urandom_fd = open(urandom_path, O_RDONLY | O_CLOEXEC)) != -1);
-}
-
-void
-random_fini(void)
-{
- close(random_fd);
- close(urandom_fd);
-
- random_fd = -1;
- urandom_fd = -1;
-}
-
-static int
-random_get_bytes_common(uint8_t *ptr, size_t len, int fd)
-{
- size_t resid = len;
- ssize_t bytes;
-
- ASSERT(fd != -1);
-
- while (resid != 0) {
- bytes = read(fd, ptr, resid);
- ASSERT3S(bytes, >=, 0);
- ptr += bytes;
- resid -= bytes;
- }
-
- return (0);
-}
-
-int
-random_get_bytes(uint8_t *ptr, size_t len)
-{
- return (random_get_bytes_common(ptr, len, random_fd));
-}
-
-int
-random_get_pseudo_bytes(uint8_t *ptr, size_t len)
-{
- return (random_get_bytes_common(ptr, len, urandom_fd));
-}
-
int
ddi_strtoull(const char *str, char **nptr, int base, u_longlong_t *result)
{
@@ -790,12 +353,6 @@ ddi_strtoull(const char *str, char **nptr, int base, u_longlong_t *result)
return (0);
}
-utsname_t *
-utsname(void)
-{
- return (&hw_utsname);
-}
-
/*
* =========================================================================
* kernel emulation setup & teardown
@@ -811,183 +368,118 @@ umem_out_of_memory(void)
return (0);
}
-void
-kernel_init(int mode)
+static void
+spa_config_load(void)
{
- extern uint_t rrw_tsd_key;
+ void *buf = NULL;
+ nvlist_t *nvlist, *child;
+ nvpair_t *nvpair;
+ char *pathname;
+ zfs_file_t *fp;
+ zfs_file_attr_t zfa;
+ uint64_t fsize;
+ int err;
- umem_nofail_callback(umem_out_of_memory);
+ /*
+ * Open the configuration file.
+ */
+ pathname = kmem_alloc(MAXPATHLEN, KM_SLEEP);
- physmem = sysconf(_SC_PHYS_PAGES);
+ (void) snprintf(pathname, MAXPATHLEN, "%s", spa_config_path);
- dprintf("physmem = %llu pages (%.2f GB)\n", (u_longlong_t)physmem,
- (double)physmem * sysconf(_SC_PAGE_SIZE) / (1ULL << 30));
+ err = zfs_file_open(pathname, O_RDONLY, 0, &fp);
+ if (err)
+ err = zfs_file_open(ZPOOL_CACHE_BOOT, O_RDONLY, 0, &fp);
- hostid = (mode & SPA_MODE_WRITE) ? get_system_hostid() : 0;
+ kmem_free(pathname, MAXPATHLEN);
- random_init();
+ if (err)
+ return;
- VERIFY0(uname(&hw_utsname));
+ if (zfs_file_getattr(fp, &zfa))
+ goto out;
- system_taskq_init();
- icp_init();
+ fsize = zfa.zfa_size;
+ buf = kmem_alloc(fsize, KM_SLEEP);
- zstd_init();
-
- spa_init((spa_mode_t)mode);
+ /*
+ * Read the nvlist from the file.
+ */
+ if (zfs_file_read(fp, buf, fsize, NULL) < 0)
+ goto out;
- fletcher_4_init();
+ /*
+ * Unpack the nvlist.
+ */
+ if (nvlist_unpack(buf, fsize, &nvlist, KM_SLEEP) != 0)
+ goto out;
- tsd_create(&rrw_tsd_key, rrw_tsd_destroy);
-}
+ /*
+ * Iterate over all elements in the nvlist, creating a new spa_t for
+ * each one with the specified configuration.
+ */
+ spa_namespace_enter(FTAG);
+ nvpair = NULL;
+ while ((nvpair = nvlist_next_nvpair(nvlist, nvpair)) != NULL) {
+ if (nvpair_type(nvpair) != DATA_TYPE_NVLIST)
+ continue;
-void
-kernel_fini(void)
-{
- fletcher_4_fini();
- spa_fini();
+ child = fnvpair_value_nvlist(nvpair);
- zstd_fini();
+ if (spa_lookup(nvpair_name(nvpair)) != NULL)
+ continue;
+ (void) spa_add(nvpair_name(nvpair), child, NULL);
+ }
+ spa_namespace_exit(FTAG);
- icp_fini();
- system_taskq_fini();
+ nvlist_free(nvlist);
- random_fini();
-}
+out:
+ if (buf != NULL)
+ kmem_free(buf, fsize);
-uid_t
-crgetuid(cred_t *cr)
-{
- (void) cr;
- return (0);
+ zfs_file_close(fp);
}
-uid_t
-crgetruid(cred_t *cr)
+void
+kernel_init(int mode)
{
- (void) cr;
- return (0);
-}
+ extern uint_t rrw_tsd_key;
-gid_t
-crgetgid(cred_t *cr)
-{
- (void) cr;
- return (0);
-}
+ libspl_init();
-int
-crgetngroups(cred_t *cr)
-{
- (void) cr;
- return (0);
-}
+ umem_nofail_callback(umem_out_of_memory);
-gid_t *
-crgetgroups(cred_t *cr)
-{
- (void) cr;
- return (NULL);
-}
+ dprintf("physmem = %llu pages (%.2f GB)\n", (u_longlong_t)physmem,
+ (double)physmem * sysconf(_SC_PAGE_SIZE) / (1ULL << 30));
-int
-zfs_secpolicy_snapshot_perms(const char *name, cred_t *cr)
-{
- (void) name, (void) cr;
- return (0);
-}
+ hostid = (mode & SPA_MODE_WRITE) ? get_system_hostid() : 0;
-int
-zfs_secpolicy_rename_perms(const char *from, const char *to, cred_t *cr)
-{
- (void) from, (void) to, (void) cr;
- return (0);
-}
+ system_taskq_init();
+ icp_init();
-int
-zfs_secpolicy_destroy_perms(const char *name, cred_t *cr)
-{
- (void) name, (void) cr;
- return (0);
-}
+ zstd_init();
-int
-secpolicy_zfs(const cred_t *cr)
-{
- (void) cr;
- return (0);
-}
+ spa_init((spa_mode_t)mode);
+ spa_config_load();
-ksiddomain_t *
-ksid_lookupdomain(const char *dom)
-{
- ksiddomain_t *kd;
+ fletcher_4_init();
- kd = umem_zalloc(sizeof (ksiddomain_t), UMEM_NOFAIL);
- kd->kd_name = spa_strdup(dom);
- return (kd);
+ tsd_create(&rrw_tsd_key, rrw_tsd_destroy);
}
void
-ksiddomain_rele(ksiddomain_t *ksid)
-{
- spa_strfree(ksid->kd_name);
- umem_free(ksid, sizeof (ksiddomain_t));
-}
-
-char *
-kmem_vasprintf(const char *fmt, va_list adx)
-{
- char *buf = NULL;
- va_list adx_copy;
-
- va_copy(adx_copy, adx);
- VERIFY(vasprintf(&buf, fmt, adx_copy) != -1);
- va_end(adx_copy);
-
- return (buf);
-}
-
-char *
-kmem_asprintf(const char *fmt, ...)
-{
- char *buf = NULL;
- va_list adx;
-
- va_start(adx, fmt);
- VERIFY(vasprintf(&buf, fmt, adx) != -1);
- va_end(adx);
-
- return (buf);
-}
-
-/*
- * 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, ...)
+kernel_fini(void)
{
- int n;
- va_list ap;
-
- /* Make the 0 case a no-op so that we do not return -1 */
- if (size == 0)
- return (0);
+ fletcher_4_fini();
+ spa_fini();
- va_start(ap, fmt);
- n = vsnprintf(str, size, fmt, ap);
- va_end(ap);
+ zstd_fini();
- if (n >= size)
- n = size - 1;
+ icp_fini();
+ system_taskq_fini();
- return (n);
+ libspl_fini();
}
zfs_file_t *
@@ -1012,24 +504,6 @@ zfs_onexit_add_cb(minor_t minor, void (*func)(void *), void *data,
return (0);
}
-fstrans_cookie_t
-spl_fstrans_mark(void)
-{
- return ((fstrans_cookie_t)0);
-}
-
-void
-spl_fstrans_unmark(fstrans_cookie_t cookie)
-{
- (void) cookie;
-}
-
-int
-kmem_cache_reap_active(void)
-{
- return (0);
-}
-
void
zvol_create_minors(const char *name)
{
@@ -1163,7 +637,7 @@ zfs_file_write(zfs_file_t *fp, const void *buf, size_t count, ssize_t *resid)
*/
int
zfs_file_pwrite(zfs_file_t *fp, const void *buf,
- size_t count, loff_t pos, ssize_t *resid)
+ size_t count, loff_t pos, uint8_t ashift, ssize_t *resid)
{
ssize_t rc, split, done;
int sectors;
@@ -1173,8 +647,8 @@ zfs_file_pwrite(zfs_file_t *fp, const void *buf,
* system calls so that the process can be killed in between.
* This is used by ztest to simulate realistic failure modes.
*/
- sectors = count >> SPA_MINBLOCKSHIFT;
- split = (sectors > 0 ? rand() % sectors : 0) << SPA_MINBLOCKSHIFT;
+ sectors = count >> ashift;
+ split = (sectors > 0 ? rand() % sectors : 0) << ashift;
rc = pwrite64(fp->f_fd, buf, split, pos);
if (rc != -1) {
done = rc;
diff --git a/sys/contrib/openzfs/lib/libzpool/util.c b/sys/contrib/openzfs/lib/libzpool/util.c
index 66d6f43967d5..a0b4480c4bcf 100644
--- a/sys/contrib/openzfs/lib/libzpool/util.c
+++ b/sys/contrib/openzfs/lib/libzpool/util.c
@@ -38,6 +38,7 @@
#include <sys/zfs_ioctl.h>
#include <sys/tunables.h>
#include <libzutil.h>
+#include <libzpool.h>
/*
* Routines needed by more than one client of libzpool.
diff --git a/sys/contrib/openzfs/lib/libzutil/zutil_import.c b/sys/contrib/openzfs/lib/libzutil/zutil_import.c
index a4a6e76a1d09..08367f4c064d 100644
--- a/sys/contrib/openzfs/lib/libzutil/zutil_import.c
+++ b/sys/contrib/openzfs/lib/libzutil/zutil_import.c
@@ -1903,30 +1903,43 @@ zpool_find_config(libpc_handle_t *hdl, const char *target, nvlist_t **configp,
*sepp = '\0';
pools = zpool_search_import(hdl, args);
+ if (pools == NULL) {
+ zutil_error_aux(hdl, dgettext(TEXT_DOMAIN, "no pools found"));
+ (void) zutil_error_fmt(hdl, LPC_UNKNOWN, dgettext(TEXT_DOMAIN,
+ "failed to find config for pool '%s'"), targetdup);
+ free(targetdup);
+ return (ENOENT);
+ }
- if (pools != NULL) {
- nvpair_t *elem = NULL;
- while ((elem = nvlist_next_nvpair(pools, elem)) != NULL) {
- VERIFY0(nvpair_value_nvlist(elem, &config));
- if (pool_match(config, targetdup)) {
- count++;
- if (match != NULL) {
- /* multiple matches found */
- continue;
- } else {
- match = fnvlist_dup(config);
- }
+ nvpair_t *elem = NULL;
+ while ((elem = nvlist_next_nvpair(pools, elem)) != NULL) {
+ VERIFY0(nvpair_value_nvlist(elem, &config));
+ if (pool_match(config, targetdup)) {
+ count++;
+ if (match != NULL) {
+ /* multiple matches found */
+ continue;
+ } else {
+ match = fnvlist_dup(config);
}
}
- fnvlist_free(pools);
}
+ fnvlist_free(pools);
if (count == 0) {
+ zutil_error_aux(hdl, dgettext(TEXT_DOMAIN,
+ "no matching pools"));
+ (void) zutil_error_fmt(hdl, LPC_UNKNOWN, dgettext(TEXT_DOMAIN,
+ "failed to find config for pool '%s'"), targetdup);
free(targetdup);
return (ENOENT);
}
if (count > 1) {
+ zutil_error_aux(hdl, dgettext(TEXT_DOMAIN,
+ "more than one matching pool"));
+ (void) zutil_error_fmt(hdl, LPC_UNKNOWN, dgettext(TEXT_DOMAIN,
+ "failed to find config for pool '%s'"), targetdup);
free(targetdup);
fnvlist_free(match);
return (EINVAL);