diff options
| author | Martin Matuska <mm@FreeBSD.org> | 2025-12-07 21:38:13 +0000 |
|---|---|---|
| committer | Martin Matuska <mm@FreeBSD.org> | 2025-12-07 21:38:13 +0000 |
| commit | 66e85755595a451db490d2fe24267d85db4b09c2 (patch) | |
| tree | e639275796fb72bfc72dc557b62613d8f5554a60 | |
| parent | c51876a107310984ba3a31b088caebcfd86a9844 (diff) | |
| parent | 89f729dcca87425aadfa03d1764e96f285eb658d (diff) | |
zfs: merge openzfs/zfs@89f729dcc
Notable upstream pull request merges:
#17932 1f3444f2b zpool: fix special vdev -v -o conflict
#17934 -multiple Remove libuutil
#17941 88d012a1d Fix snapshot automount expiry cancellation deadlock
#17942 36e4f1888 Fix taskq NULL pointer dereference on timer race
#17946 39303feba chksum: run 256K benchmark on demand, preserve
chksum_stat_data
#17948 -multiple Remove libtpool
#17957 e37937f42 ztest: fix broken random call
#17960 928eccc5b DDT: Reduce global DDT lock scope during writes
#17961 48f33c1ef DDT: Make children writes inherit allocator
#17975 7f7d4934c FreeBSD: Fix uninitialized variable error
#17980 a5b665df3 DDT: Switch to using wmsums for lookup stats
#18004 ffaea0831 FreeBSD: Remove HAVE_INLINE_FLSL use
Obtained from: OpenZFS
OpenZFS commit: 89f729dcca87425aadfa03d1764e96f285eb658d
78 files changed, 1224 insertions, 8271 deletions
diff --git a/sys/contrib/openzfs/.github/workflows/scripts/qemu-4-build-vm.sh b/sys/contrib/openzfs/.github/workflows/scripts/qemu-4-build-vm.sh index 2807d9e77127..38255cf39966 100755 --- a/sys/contrib/openzfs/.github/workflows/scripts/qemu-4-build-vm.sh +++ b/sys/contrib/openzfs/.github/workflows/scripts/qemu-4-build-vm.sh @@ -181,7 +181,7 @@ function freebsd() { echo "##[endgroup]" echo "##[group]Build" - run gmake -j$(sysctl -n hw.ncpu) + run gmake -j$(nproc) echo "##[endgroup]" echo "##[group]Install" diff --git a/sys/contrib/openzfs/.github/workflows/scripts/qemu-test-repo-vm.sh b/sys/contrib/openzfs/.github/workflows/scripts/qemu-test-repo-vm.sh index e3cafcbb67cc..722ee3d4701e 100755 --- a/sys/contrib/openzfs/.github/workflows/scripts/qemu-test-repo-vm.sh +++ b/sys/contrib/openzfs/.github/workflows/scripts/qemu-test-repo-vm.sh @@ -42,7 +42,10 @@ function test_install { sudo sed -i "s;baseurl=http://download.zfsonlinux.org;baseurl=$host;g" /etc/yum.repos.d/zfs.repo fi - sudo dnf -y install $args zfs zfs-test + if ! sudo dnf -y install $args zfs zfs-test ; then + echo "$repo ${package}...[FAILED] $baseurl" >> $SUMMARY + return + fi # Load modules and create a simple pool as a sanity test. sudo /usr/share/zfs/zfs.sh -r @@ -70,16 +73,19 @@ almalinux*) name=$(curl -Ls $url | grep 'dnf install' | grep -Eo 'zfs-release-[0-9]+-[0-9]+') sudo dnf -y install https://zfsonlinux.org/epel/$name$(rpm --eval "%{dist}").noarch.rpm 2>&1 sudo rpm -qi zfs-release - test_install zfs $ALTHOST - test_install zfs-kmod $ALTHOST - test_install zfs-testing $ALTHOST - test_install zfs-testing-kmod $ALTHOST + for i in zfs zfs-kmod zfs-testing zfs-testing-kmod zfs-latest \ + zfs-latest-kmod zfs-legacy zfs-legacy-kmod zfs-2.2 \ + zfs-2.2-kmod zfs-2.3 zfs-2.3-kmod ; do + test_install $i $ALTHOST + done ;; fedora*) url='https://raw.githubusercontent.com/openzfs/openzfs-docs/refs/heads/master/docs/Getting%20Started/Fedora/index.rst' name=$(curl -Ls $url | grep 'dnf install' | grep -Eo 'zfs-release-[0-9]+-[0-9]+') sudo dnf -y install -y https://zfsonlinux.org/fedora/$name$(rpm --eval "%{dist}").noarch.rpm - test_install zfs $ALTHOST + for i in zfs zfs-latest zfs-legacy zfs-2.2 zfs-2.3 ; do + test_install $i $ALTHOST + done ;; esac echo "##[endgroup]" diff --git a/sys/contrib/openzfs/.github/workflows/smatch.yml b/sys/contrib/openzfs/.github/workflows/smatch.yml new file mode 100644 index 000000000000..ac6454244f93 --- /dev/null +++ b/sys/contrib/openzfs/.github/workflows/smatch.yml @@ -0,0 +1,52 @@ +name: smatch + +on: + push: + pull_request: + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + smatch: + runs-on: ubuntu-24.04 + steps: + - name: Checkout smatch + uses: actions/checkout@v4 + with: + repository: error27/smatch + ref: master + path: smatch + - name: Install smatch dependencies + run: | + sudo apt-get install -y llvm gcc make sqlite3 libsqlite3-dev libdbd-sqlite3-perl libssl-dev libtry-tiny-perl + - name: Make smatch + run: | + cd $GITHUB_WORKSPACE/smatch + make -j$(nproc) + - name: Checkout OpenZFS + uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.sha }} + path: zfs + - name: Install OpenZFS dependencies + run: | + cd $GITHUB_WORKSPACE/zfs + sudo apt-get purge -y snapd google-chrome-stable firefox + ONLY_DEPS=1 .github/workflows/scripts/qemu-3-deps-vm.sh ubuntu24 + - name: Autogen.sh OpenZFS + run: | + cd $GITHUB_WORKSPACE/zfs + ./autogen.sh + - name: Configure OpenZFS + run: | + cd $GITHUB_WORKSPACE/zfs + ./configure --enable-debug + - name: Make OpenZFS + run: | + cd $GITHUB_WORKSPACE/zfs + make -j$(nproc) CHECK="$GITHUB_WORKSPACE/smatch/smatch" CC=$GITHUB_WORKSPACE/smatch/cgcc | tee $GITHUB_WORKSPACE/smatch.log + - name: Smatch results log + run: | + grep -E 'error:|warn:|warning:' $GITHUB_WORKSPACE/smatch.log diff --git a/sys/contrib/openzfs/.github/workflows/zfs-qemu-packages.yml b/sys/contrib/openzfs/.github/workflows/zfs-qemu-packages.yml index 6367fb3a6ce2..86fd8258b9ac 100644 --- a/sys/contrib/openzfs/.github/workflows/zfs-qemu-packages.yml +++ b/sys/contrib/openzfs/.github/workflows/zfs-qemu-packages.yml @@ -73,7 +73,7 @@ jobs: .github/workflows/scripts/qemu-3-deps.sh ${{ matrix.os }} - name: Build modules or Test repo - timeout-minutes: 30 + timeout-minutes: 60 run: | set -e if [ "${{ github.event.inputs.test_type }}" == "Test repo" ] ; then diff --git a/sys/contrib/openzfs/cmd/raidz_test/raidz_test.c b/sys/contrib/openzfs/cmd/raidz_test/raidz_test.c index 4839e909e4f7..153e1f5f7405 100644 --- a/sys/contrib/openzfs/cmd/raidz_test/raidz_test.c +++ b/sys/contrib/openzfs/cmd/raidz_test/raidz_test.c @@ -266,8 +266,20 @@ cmp_data(raidz_test_opts_t *opts, raidz_map_t *rm) static int init_rand(void *data, size_t size, void *private) { + size_t *offsetp = (size_t *)private; + size_t offset = *offsetp; + + VERIFY3U(offset + size, <=, SPA_MAXBLOCKSIZE); + memcpy(data, (char *)rand_data + offset, size); + *offsetp = offset + size; + return (0); +} + +static int +corrupt_rand_fill(void *data, size_t size, void *private) +{ (void) private; - memcpy(data, rand_data, size); + memset(data, 0xAA, size); return (0); } @@ -279,7 +291,7 @@ corrupt_colums(raidz_map_t *rm, const int *tgts, const int cnt) for (int i = 0; i < cnt; i++) { raidz_col_t *col = &rr->rr_col[tgts[i]]; abd_iterate_func(col->rc_abd, 0, col->rc_size, - init_rand, NULL); + corrupt_rand_fill, NULL); } } } @@ -287,7 +299,8 @@ corrupt_colums(raidz_map_t *rm, const int *tgts, const int cnt) void init_zio_abd(zio_t *zio) { - abd_iterate_func(zio->io_abd, 0, zio->io_size, init_rand, NULL); + size_t offset = 0; + abd_iterate_func(zio->io_abd, 0, zio->io_size, init_rand, &offset); } static void @@ -374,7 +387,7 @@ init_raidz_map(raidz_test_opts_t *opts, zio_t **zio, const int parity) *zio = umem_zalloc(sizeof (zio_t), UMEM_NOFAIL); - (*zio)->io_offset = 0; + (*zio)->io_offset = opts->rto_offset; (*zio)->io_size = alloc_dsize; (*zio)->io_abd = raidz_alloc(alloc_dsize); init_zio_abd(*zio); @@ -835,6 +848,8 @@ main(int argc, char **argv) err = run_test(NULL); } + mprotect(rand_data, SPA_MAXBLOCKSIZE, PROT_READ | PROT_WRITE); + umem_free(rand_data, SPA_MAXBLOCKSIZE); kernel_fini(); diff --git a/sys/contrib/openzfs/cmd/raidz_test/raidz_test.h b/sys/contrib/openzfs/cmd/raidz_test/raidz_test.h index f0b854cefb5d..77f15e847c1a 100644 --- a/sys/contrib/openzfs/cmd/raidz_test/raidz_test.h +++ b/sys/contrib/openzfs/cmd/raidz_test/raidz_test.h @@ -72,7 +72,7 @@ typedef struct raidz_test_opts { static const raidz_test_opts_t rto_opts_defaults = { .rto_ashift = 9, - .rto_offset = 1ULL << 0, + .rto_offset = 0, .rto_dcols = 8, .rto_dsize = 1<<19, .rto_v = D_ALL, diff --git a/sys/contrib/openzfs/cmd/zed/Makefile.am b/sys/contrib/openzfs/cmd/zed/Makefile.am index c437ff51dd2b..2dcf99bf4a0f 100644 --- a/sys/contrib/openzfs/cmd/zed/Makefile.am +++ b/sys/contrib/openzfs/cmd/zed/Makefile.am @@ -37,8 +37,7 @@ zed_SOURCES = \ zed_LDADD = \ libzfs.la \ libzfs_core.la \ - libnvpair.la \ - libuutil.la + libnvpair.la zed_LDADD += -lrt $(LIBATOMIC_LIBS) $(LIBUDEV_LIBS) $(LIBUUID_LIBS) zed_LDFLAGS = -pthread diff --git a/sys/contrib/openzfs/cmd/zed/agents/zfs_diagnosis.c b/sys/contrib/openzfs/cmd/zed/agents/zfs_diagnosis.c index 453243b2f8ce..206caa16baa6 100644 --- a/sys/contrib/openzfs/cmd/zed/agents/zfs_diagnosis.c +++ b/sys/contrib/openzfs/cmd/zed/agents/zfs_diagnosis.c @@ -29,7 +29,6 @@ #include <stddef.h> #include <string.h> -#include <libuutil.h> #include <libzfs.h> #include <sys/types.h> #include <sys/time.h> @@ -96,7 +95,7 @@ typedef struct zfs_case { uint32_t zc_version; zfs_case_data_t zc_data; fmd_case_t *zc_case; - uu_list_node_t zc_node; + list_node_t zc_node; id_t zc_remove_timer; char *zc_fru; er_timeval_t zc_when; @@ -126,8 +125,7 @@ zfs_de_stats_t zfs_stats = { /* wait 15 seconds after a removal */ static hrtime_t zfs_remove_timeout = SEC2NSEC(15); -uu_list_pool_t *zfs_case_pool; -uu_list_t *zfs_cases; +static list_t zfs_cases; #define ZFS_MAKE_RSRC(type) \ FM_RSRC_CLASS "." ZFS_ERROR_CLASS "." type @@ -174,8 +172,8 @@ zfs_case_unserialize(fmd_hdl_t *hdl, fmd_case_t *cp) zcp->zc_remove_timer = fmd_timer_install(hdl, zcp, NULL, zfs_remove_timeout); - uu_list_node_init(zcp, &zcp->zc_node, zfs_case_pool); - (void) uu_list_insert_before(zfs_cases, NULL, zcp); + list_link_init(&zcp->zc_node); + list_insert_head(&zfs_cases, zcp); fmd_case_setspecific(hdl, cp, zcp); @@ -206,8 +204,8 @@ zfs_other_serd_cases(fmd_hdl_t *hdl, const zfs_case_data_t *zfs_case) next_check = gethrestime_sec() + CASE_GC_TIMEOUT_SECS; } - for (zcp = uu_list_first(zfs_cases); zcp != NULL; - zcp = uu_list_next(zfs_cases, zcp)) { + for (zcp = list_head(&zfs_cases); zcp != NULL; + zcp = list_next(&zfs_cases, zcp)) { zfs_case_data_t *zcd = &zcp->zc_data; /* @@ -257,8 +255,8 @@ zfs_mark_vdev(uint64_t pool_guid, nvlist_t *vd, er_timeval_t *loaded) /* * Mark any cases associated with this (pool, vdev) pair. */ - for (zcp = uu_list_first(zfs_cases); zcp != NULL; - zcp = uu_list_next(zfs_cases, zcp)) { + for (zcp = list_head(&zfs_cases); zcp != NULL; + zcp = list_next(&zfs_cases, zcp)) { if (zcp->zc_data.zc_pool_guid == pool_guid && zcp->zc_data.zc_vdev_guid == vdev_guid) { zcp->zc_present = B_TRUE; @@ -304,8 +302,8 @@ zfs_mark_pool(zpool_handle_t *zhp, void *unused) /* * Mark any cases associated with just this pool. */ - for (zcp = uu_list_first(zfs_cases); zcp != NULL; - zcp = uu_list_next(zfs_cases, zcp)) { + for (zcp = list_head(&zfs_cases); zcp != NULL; + zcp = list_next(&zfs_cases, zcp)) { if (zcp->zc_data.zc_pool_guid == pool_guid && zcp->zc_data.zc_vdev_guid == 0) zcp->zc_present = B_TRUE; @@ -321,8 +319,8 @@ zfs_mark_pool(zpool_handle_t *zhp, void *unused) if (nelem == 2) { loaded.ertv_sec = tod[0]; loaded.ertv_nsec = tod[1]; - for (zcp = uu_list_first(zfs_cases); zcp != NULL; - zcp = uu_list_next(zfs_cases, zcp)) { + for (zcp = list_head(&zfs_cases); zcp != NULL; + zcp = list_next(&zfs_cases, zcp)) { if (zcp->zc_data.zc_pool_guid == pool_guid && zcp->zc_data.zc_vdev_guid == 0) { zcp->zc_when = loaded; @@ -389,8 +387,7 @@ zpool_find_load_time(zpool_handle_t *zhp, void *arg) static void zfs_purge_cases(fmd_hdl_t *hdl) { - zfs_case_t *zcp; - uu_list_walk_t *walk; + zfs_case_t *zcp, *next; libzfs_handle_t *zhdl = fmd_hdl_getspecific(hdl); /* @@ -410,8 +407,8 @@ zfs_purge_cases(fmd_hdl_t *hdl) /* * Mark the cases as not present. */ - for (zcp = uu_list_first(zfs_cases); zcp != NULL; - zcp = uu_list_next(zfs_cases, zcp)) + for (zcp = list_head(&zfs_cases); zcp != NULL; + zcp = list_next(&zfs_cases, zcp)) zcp->zc_present = B_FALSE; /* @@ -425,12 +422,11 @@ zfs_purge_cases(fmd_hdl_t *hdl) /* * Remove those cases which were not found. */ - walk = uu_list_walk_start(zfs_cases, UU_WALK_ROBUST); - while ((zcp = uu_list_walk_next(walk)) != NULL) { + for (zcp = list_head(&zfs_cases); zcp != NULL; zcp = next) { + next = list_next(&zfs_cases, zcp); if (!zcp->zc_present) fmd_case_close(hdl, zcp->zc_case); } - uu_list_walk_end(walk); } /* @@ -660,8 +656,8 @@ zfs_fm_recv(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl, const char *class) zfs_ereport_when(hdl, nvl, &er_when); - for (zcp = uu_list_first(zfs_cases); zcp != NULL; - zcp = uu_list_next(zfs_cases, zcp)) { + for (zcp = list_head(&zfs_cases); zcp != NULL; + zcp = list_next(&zfs_cases, zcp)) { if (zcp->zc_data.zc_pool_guid == pool_guid) { pool_found = B_TRUE; pool_load = zcp->zc_when; @@ -867,8 +863,8 @@ zfs_fm_recv(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl, const char *class) * Pool level fault. Before solving the case, go through and * close any open device cases that may be pending. */ - for (dcp = uu_list_first(zfs_cases); dcp != NULL; - dcp = uu_list_next(zfs_cases, dcp)) { + for (dcp = list_head(&zfs_cases); dcp != NULL; + dcp = list_next(&zfs_cases, dcp)) { if (dcp->zc_data.zc_pool_guid == zcp->zc_data.zc_pool_guid && dcp->zc_data.zc_vdev_guid != 0) @@ -1088,8 +1084,7 @@ zfs_fm_close(fmd_hdl_t *hdl, fmd_case_t *cs) if (zcp->zc_data.zc_has_remove_timer) fmd_timer_remove(hdl, zcp->zc_remove_timer); - uu_list_remove(zfs_cases, zcp); - uu_list_node_fini(zcp, &zcp->zc_node, zfs_case_pool); + list_remove(&zfs_cases, zcp); fmd_hdl_free(hdl, zcp, sizeof (zfs_case_t)); } @@ -1117,23 +1112,11 @@ _zfs_diagnosis_init(fmd_hdl_t *hdl) if ((zhdl = libzfs_init()) == NULL) return; - if ((zfs_case_pool = uu_list_pool_create("zfs_case_pool", - sizeof (zfs_case_t), offsetof(zfs_case_t, zc_node), - NULL, UU_LIST_POOL_DEBUG)) == NULL) { - libzfs_fini(zhdl); - return; - } - - if ((zfs_cases = uu_list_create(zfs_case_pool, NULL, - UU_LIST_DEBUG)) == NULL) { - uu_list_pool_destroy(zfs_case_pool); - libzfs_fini(zhdl); - return; - } + list_create(&zfs_cases, + sizeof (zfs_case_t), offsetof(zfs_case_t, zc_node)); if (fmd_hdl_register(hdl, FMD_API_VERSION, &fmd_info) != 0) { - uu_list_destroy(zfs_cases); - uu_list_pool_destroy(zfs_case_pool); + list_destroy(&zfs_cases); libzfs_fini(zhdl); return; } @@ -1148,24 +1131,18 @@ void _zfs_diagnosis_fini(fmd_hdl_t *hdl) { zfs_case_t *zcp; - uu_list_walk_t *walk; libzfs_handle_t *zhdl; /* * Remove all active cases. */ - walk = uu_list_walk_start(zfs_cases, UU_WALK_ROBUST); - while ((zcp = uu_list_walk_next(walk)) != NULL) { + while ((zcp = list_remove_head(&zfs_cases)) != NULL) { fmd_hdl_debug(hdl, "removing case ena %llu", (long long unsigned)zcp->zc_data.zc_ena); - uu_list_remove(zfs_cases, zcp); - uu_list_node_fini(zcp, &zcp->zc_node, zfs_case_pool); fmd_hdl_free(hdl, zcp, sizeof (zfs_case_t)); } - uu_list_walk_end(walk); - uu_list_destroy(zfs_cases); - uu_list_pool_destroy(zfs_case_pool); + list_destroy(&zfs_cases); zhdl = fmd_hdl_getspecific(hdl); libzfs_fini(zhdl); diff --git a/sys/contrib/openzfs/cmd/zed/agents/zfs_mod.c b/sys/contrib/openzfs/cmd/zed/agents/zfs_mod.c index 57d6f34ba74a..76d2909c0ae6 100644 --- a/sys/contrib/openzfs/cmd/zed/agents/zfs_mod.c +++ b/sys/contrib/openzfs/cmd/zed/agents/zfs_mod.c @@ -82,7 +82,7 @@ #include <sys/sunddi.h> #include <sys/sysevent/eventdefs.h> #include <sys/sysevent/dev.h> -#include <thread_pool.h> +#include <sys/taskq.h> #include <pthread.h> #include <unistd.h> #include <errno.h> @@ -98,7 +98,7 @@ typedef void (*zfs_process_func_t)(zpool_handle_t *, nvlist_t *, boolean_t); libzfs_handle_t *g_zfshdl; list_t g_pool_list; /* list of unavailable pools at initialization */ list_t g_device_list; /* list of disks with asynchronous label request */ -tpool_t *g_tpool; +taskq_t *g_taskq; boolean_t g_enumeration_done; pthread_t g_zfs_tid; /* zfs_enum_pools() thread */ @@ -749,8 +749,8 @@ zfs_iter_pool(zpool_handle_t *zhp, void *data) continue; if (zfs_toplevel_state(zhp) >= VDEV_STATE_DEGRADED) { list_remove(&g_pool_list, pool); - (void) tpool_dispatch(g_tpool, zfs_enable_ds, - pool); + (void) taskq_dispatch(g_taskq, zfs_enable_ds, + pool, TQ_SLEEP); break; } } @@ -1347,9 +1347,9 @@ zfs_slm_fini(void) /* wait for zfs_enum_pools thread to complete */ (void) pthread_join(g_zfs_tid, NULL); /* destroy the thread pool */ - if (g_tpool != NULL) { - tpool_wait(g_tpool); - tpool_destroy(g_tpool); + if (g_taskq != NULL) { + taskq_wait(g_taskq); + taskq_destroy(g_taskq); } while ((pool = list_remove_head(&g_pool_list)) != NULL) { diff --git a/sys/contrib/openzfs/cmd/zfs/Makefile.am b/sys/contrib/openzfs/cmd/zfs/Makefile.am index 8a3c13a1fcfe..4df4f48821e7 100644 --- a/sys/contrib/openzfs/cmd/zfs/Makefile.am +++ b/sys/contrib/openzfs/cmd/zfs/Makefile.am @@ -12,8 +12,7 @@ zfs_SOURCES = \ zfs_LDADD = \ libzfs.la \ libzfs_core.la \ - libnvpair.la \ - libuutil.la + libnvpair.la zfs_LDADD += $(LTLIBINTL) diff --git a/sys/contrib/openzfs/cmd/zfs/zfs_iter.c b/sys/contrib/openzfs/cmd/zfs/zfs_iter.c index e50e77a69c8e..15d5e1633e6e 100644 --- a/sys/contrib/openzfs/cmd/zfs/zfs_iter.c +++ b/sys/contrib/openzfs/cmd/zfs/zfs_iter.c @@ -28,7 +28,6 @@ */ #include <libintl.h> -#include <libuutil.h> #include <stddef.h> #include <stdio.h> #include <stdlib.h> @@ -50,14 +49,16 @@ * When finished, we have an AVL tree of ZFS handles. We go through and execute * the provided callback for each one, passing whatever data the user supplied. */ +typedef struct callback_data callback_data_t; typedef struct zfs_node { zfs_handle_t *zn_handle; - uu_avl_node_t zn_avlnode; + callback_data_t *zn_callback; + avl_node_t zn_avlnode; } zfs_node_t; -typedef struct callback_data { - uu_avl_t *cb_avl; +struct callback_data { + avl_tree_t cb_avl; int cb_flags; zfs_type_t cb_types; zfs_sort_column_t *cb_sortcol; @@ -65,9 +66,7 @@ typedef struct callback_data { int cb_depth_limit; int cb_depth; uint8_t cb_props_table[ZFS_NUM_PROPS]; -} callback_data_t; - -uu_avl_pool_t *avl_pool; +}; /* * Include snaps if they were requested or if this a zfs list where types @@ -99,13 +98,12 @@ zfs_callback(zfs_handle_t *zhp, void *data) if ((zfs_get_type(zhp) & cb->cb_types) || ((zfs_get_type(zhp) == ZFS_TYPE_SNAPSHOT) && include_snaps)) { - uu_avl_index_t idx; + avl_index_t idx; zfs_node_t *node = safe_malloc(sizeof (zfs_node_t)); node->zn_handle = zhp; - uu_avl_node_init(node, &node->zn_avlnode, avl_pool); - if (uu_avl_find(cb->cb_avl, node, cb->cb_sortcol, - &idx) == NULL) { + node->zn_callback = cb; + if (avl_find(&cb->cb_avl, node, &idx) == NULL) { if (cb->cb_proplist) { if ((*cb->cb_proplist) && !(*cb->cb_proplist)->pl_all) @@ -120,7 +118,7 @@ zfs_callback(zfs_handle_t *zhp, void *data) return (-1); } } - uu_avl_insert(cb->cb_avl, node, idx); + avl_insert(&cb->cb_avl, node, idx); should_close = B_FALSE; } else { free(node); @@ -286,7 +284,7 @@ zfs_compare(const void *larg, const void *rarg) if (rat != NULL) *rat = '\0'; - ret = strcmp(lname, rname); + ret = TREE_ISIGN(strcmp(lname, rname)); if (ret == 0 && (lat != NULL || rat != NULL)) { /* * If we're comparing a dataset to one of its snapshots, we @@ -340,11 +338,11 @@ zfs_compare(const void *larg, const void *rarg) * with snapshots grouped under their parents. */ static int -zfs_sort(const void *larg, const void *rarg, void *data) +zfs_sort(const void *larg, const void *rarg) { zfs_handle_t *l = ((zfs_node_t *)larg)->zn_handle; zfs_handle_t *r = ((zfs_node_t *)rarg)->zn_handle; - zfs_sort_column_t *sc = (zfs_sort_column_t *)data; + zfs_sort_column_t *sc = ((zfs_node_t *)larg)->zn_callback->cb_sortcol; zfs_sort_column_t *psc; for (psc = sc; psc != NULL; psc = psc->sc_next) { @@ -414,7 +412,7 @@ zfs_sort(const void *larg, const void *rarg, void *data) return (-1); if (lstr) - ret = strcmp(lstr, rstr); + ret = TREE_ISIGN(strcmp(lstr, rstr)); else if (lnum < rnum) ret = -1; else if (lnum > rnum) @@ -438,13 +436,6 @@ zfs_for_each(int argc, char **argv, int flags, zfs_type_t types, callback_data_t cb = {0}; int ret = 0; zfs_node_t *node; - uu_avl_walk_t *walk; - - avl_pool = uu_avl_pool_create("zfs_pool", sizeof (zfs_node_t), - offsetof(zfs_node_t, zn_avlnode), zfs_sort, UU_DEFAULT); - - if (avl_pool == NULL) - nomem(); cb.cb_sortcol = sortcol; cb.cb_flags = flags; @@ -489,8 +480,8 @@ zfs_for_each(int argc, char **argv, int flags, zfs_type_t types, sizeof (cb.cb_props_table)); } - if ((cb.cb_avl = uu_avl_create(avl_pool, NULL, UU_DEFAULT)) == NULL) - nomem(); + avl_create(&cb.cb_avl, zfs_sort, + sizeof (zfs_node_t), offsetof(zfs_node_t, zn_avlnode)); if (argc == 0) { /* @@ -531,25 +522,20 @@ zfs_for_each(int argc, char **argv, int flags, zfs_type_t types, * At this point we've got our AVL tree full of zfs handles, so iterate * over each one and execute the real user callback. */ - for (node = uu_avl_first(cb.cb_avl); node != NULL; - node = uu_avl_next(cb.cb_avl, node)) + for (node = avl_first(&cb.cb_avl); node != NULL; + node = AVL_NEXT(&cb.cb_avl, node)) ret |= callback(node->zn_handle, data); /* * Finally, clean up the AVL tree. */ - if ((walk = uu_avl_walk_start(cb.cb_avl, UU_WALK_ROBUST)) == NULL) - nomem(); - - while ((node = uu_avl_walk_next(walk)) != NULL) { - uu_avl_remove(cb.cb_avl, node); + void *cookie = NULL; + while ((node = avl_destroy_nodes(&cb.cb_avl, &cookie)) != NULL) { zfs_close(node->zn_handle); free(node); } - uu_avl_walk_end(walk); - uu_avl_destroy(cb.cb_avl); - uu_avl_pool_destroy(avl_pool); + avl_destroy(&cb.cb_avl); return (ret); } diff --git a/sys/contrib/openzfs/cmd/zfs/zfs_main.c b/sys/contrib/openzfs/cmd/zfs/zfs_main.c index ccdd5ffef8e6..01d93ed92c5a 100644 --- a/sys/contrib/openzfs/cmd/zfs/zfs_main.c +++ b/sys/contrib/openzfs/cmd/zfs/zfs_main.c @@ -42,7 +42,6 @@ #include <getopt.h> #include <libgen.h> #include <libintl.h> -#include <libuutil.h> #include <libnvpair.h> #include <locale.h> #include <stddef.h> @@ -2846,31 +2845,27 @@ static int us_type_bits[] = { static const char *const us_type_names[] = { "posixgroup", "posixuser", "smbgroup", "smbuser", "all" }; +typedef struct us_cbdata us_cbdata_t; typedef struct us_node { nvlist_t *usn_nvl; - uu_avl_node_t usn_avlnode; - uu_list_node_t usn_listnode; + us_cbdata_t *usn_cbdata; + avl_node_t usn_avlnode; + list_node_t usn_listnode; } us_node_t; -typedef struct us_cbdata { +struct us_cbdata { nvlist_t **cb_nvlp; - uu_avl_pool_t *cb_avl_pool; - uu_avl_t *cb_avl; + avl_tree_t cb_avl; boolean_t cb_numname; boolean_t cb_nicenum; boolean_t cb_sid2posix; zfs_userquota_prop_t cb_prop; zfs_sort_column_t *cb_sortcol; size_t cb_width[USFIELD_LAST]; -} us_cbdata_t; +}; static boolean_t us_populated = B_FALSE; -typedef struct { - zfs_sort_column_t *si_sortcol; - boolean_t si_numname; -} us_sort_info_t; - static int us_field_index(const char *field) { @@ -2883,13 +2878,12 @@ us_field_index(const char *field) } static int -us_compare(const void *larg, const void *rarg, void *unused) +us_compare(const void *larg, const void *rarg) { const us_node_t *l = larg; const us_node_t *r = rarg; - us_sort_info_t *si = (us_sort_info_t *)unused; - zfs_sort_column_t *sortcol = si->si_sortcol; - boolean_t numname = si->si_numname; + zfs_sort_column_t *sortcol = l->usn_cbdata->cb_sortcol; + boolean_t numname = l->usn_cbdata->cb_numname; nvlist_t *lnvl = l->usn_nvl; nvlist_t *rnvl = r->usn_nvl; int rc = 0; @@ -3023,25 +3017,22 @@ userspace_cb(void *arg, const char *domain, uid_t rid, uint64_t space, const char *propname; char sizebuf[32]; us_node_t *node; - uu_avl_pool_t *avl_pool = cb->cb_avl_pool; - uu_avl_t *avl = cb->cb_avl; - uu_avl_index_t idx; + avl_tree_t *avl = &cb->cb_avl; + avl_index_t idx; nvlist_t *props; us_node_t *n; - zfs_sort_column_t *sortcol = cb->cb_sortcol; unsigned type = 0; const char *typestr; size_t namelen; size_t typelen; size_t sizelen; int typeidx, nameidx, sizeidx; - us_sort_info_t sortinfo = { sortcol, cb->cb_numname }; boolean_t smbentity = B_FALSE; if (nvlist_alloc(&props, NV_UNIQUE_NAME, 0) != 0) nomem(); node = safe_malloc(sizeof (us_node_t)); - uu_avl_node_init(node, &node->usn_avlnode, avl_pool); + node->usn_cbdata = cb; node->usn_nvl = props; if (domain != NULL && domain[0] != '\0') { @@ -3143,8 +3134,8 @@ userspace_cb(void *arg, const char *domain, uid_t rid, uint64_t space, * Check if this type/name combination is in the list and update it; * otherwise add new node to the list. */ - if ((n = uu_avl_find(avl, node, &sortinfo, &idx)) == NULL) { - uu_avl_insert(avl, node, idx); + if ((n = avl_find(avl, node, &idx)) == NULL) { + avl_insert(avl, node, idx); } else { nvlist_free(props); free(node); @@ -3318,7 +3309,7 @@ print_us_node(boolean_t scripted, boolean_t parsable, int *fields, int types, static void print_us(boolean_t scripted, boolean_t parsable, int *fields, int types, - size_t *width, boolean_t rmnode, uu_avl_t *avl) + size_t *width, boolean_t rmnode, avl_tree_t *avl) { us_node_t *node; const char *col; @@ -3343,7 +3334,7 @@ print_us(boolean_t scripted, boolean_t parsable, int *fields, int types, (void) printf("\n"); } - for (node = uu_avl_first(avl); node; node = uu_avl_next(avl, node)) { + for (node = avl_first(avl); node; node = AVL_NEXT(avl, node)) { print_us_node(scripted, parsable, fields, types, width, node); if (rmnode) nvlist_free(node->usn_nvl); @@ -3355,9 +3346,6 @@ zfs_do_userspace(int argc, char **argv) { zfs_handle_t *zhp; zfs_userquota_prop_t p; - uu_avl_pool_t *avl_pool; - uu_avl_t *avl_tree; - uu_avl_walk_t *walk; char *delim; char deffields[] = "type,name,used,quota,objused,objquota"; char *ofield = NULL; @@ -3376,10 +3364,8 @@ zfs_do_userspace(int argc, char **argv) us_cbdata_t cb; us_node_t *node; us_node_t *rmnode; - uu_list_pool_t *listpool; - uu_list_t *list; - uu_avl_index_t idx = 0; - uu_list_index_t idx2 = 0; + list_t list; + avl_index_t idx = 0; if (argc < 2) usage(B_FALSE); @@ -3513,12 +3499,6 @@ zfs_do_userspace(int argc, char **argv) return (1); } - if ((avl_pool = uu_avl_pool_create("us_avl_pool", sizeof (us_node_t), - offsetof(us_node_t, usn_avlnode), us_compare, UU_DEFAULT)) == NULL) - nomem(); - if ((avl_tree = uu_avl_create(avl_pool, NULL, UU_DEFAULT)) == NULL) - nomem(); - /* Always add default sorting columns */ (void) zfs_add_sort_column(&sortcol, "type", B_FALSE); (void) zfs_add_sort_column(&sortcol, "name", B_FALSE); @@ -3526,10 +3506,12 @@ zfs_do_userspace(int argc, char **argv) cb.cb_sortcol = sortcol; cb.cb_numname = prtnum; cb.cb_nicenum = !parsable; - cb.cb_avl_pool = avl_pool; - cb.cb_avl = avl_tree; cb.cb_sid2posix = sid2posix; + avl_create(&cb.cb_avl, us_compare, + sizeof (us_node_t), offsetof(us_node_t, usn_avlnode)); + + for (i = 0; i < USFIELD_LAST; i++) cb.cb_width[i] = strlen(gettext(us_field_hdr[i])); @@ -3544,59 +3526,52 @@ zfs_do_userspace(int argc, char **argv) cb.cb_prop = p; if ((ret = zfs_userspace(zhp, p, userspace_cb, &cb)) != 0) { zfs_close(zhp); + avl_destroy(&cb.cb_avl); return (ret); } } zfs_close(zhp); /* Sort the list */ - if ((node = uu_avl_first(avl_tree)) == NULL) + if ((node = avl_first(&cb.cb_avl)) == NULL) { + avl_destroy(&cb.cb_avl); return (0); + } us_populated = B_TRUE; - listpool = uu_list_pool_create("tmplist", sizeof (us_node_t), - offsetof(us_node_t, usn_listnode), NULL, UU_DEFAULT); - list = uu_list_create(listpool, NULL, UU_DEFAULT); - uu_list_node_init(node, &node->usn_listnode, listpool); + list_create(&list, sizeof (us_node_t), + offsetof(us_node_t, usn_listnode)); + list_link_init(&node->usn_listnode); while (node != NULL) { rmnode = node; - node = uu_avl_next(avl_tree, node); - uu_avl_remove(avl_tree, rmnode); - if (uu_list_find(list, rmnode, NULL, &idx2) == NULL) - uu_list_insert(list, rmnode, idx2); + node = AVL_NEXT(&cb.cb_avl, node); + avl_remove(&cb.cb_avl, rmnode); + list_insert_head(&list, rmnode); } - for (node = uu_list_first(list); node != NULL; - node = uu_list_next(list, node)) { - us_sort_info_t sortinfo = { sortcol, cb.cb_numname }; - - if (uu_avl_find(avl_tree, node, &sortinfo, &idx) == NULL) - uu_avl_insert(avl_tree, node, idx); + for (node = list_head(&list); node != NULL; + node = list_next(&list, node)) { + if (avl_find(&cb.cb_avl, node, &idx) == NULL) + avl_insert(&cb.cb_avl, node, idx); } - uu_list_destroy(list); - uu_list_pool_destroy(listpool); + while ((node = list_remove_head(&list)) != NULL) { } + list_destroy(&list); /* Print and free node nvlist memory */ print_us(scripted, parsable, fields, types, cb.cb_width, B_TRUE, - cb.cb_avl); + &cb.cb_avl); zfs_free_sort_columns(sortcol); /* Clean up the AVL tree */ - if ((walk = uu_avl_walk_start(cb.cb_avl, UU_WALK_ROBUST)) == NULL) - nomem(); - - while ((node = uu_avl_walk_next(walk)) != NULL) { - uu_avl_remove(cb.cb_avl, node); + void *cookie = NULL; + while ((node = avl_destroy_nodes(&cb.cb_avl, &cookie)) != NULL) { free(node); } - - uu_avl_walk_end(walk); - uu_avl_destroy(avl_tree); - uu_avl_pool_destroy(avl_pool); + avl_destroy(&cb.cb_avl); return (ret); } @@ -5401,7 +5376,7 @@ typedef struct deleg_perm { typedef struct deleg_perm_node { deleg_perm_t dpn_perm; - uu_avl_node_t dpn_avl_node; + avl_node_t dpn_avl_node; } deleg_perm_node_t; typedef struct fs_perm fs_perm_t; @@ -5413,13 +5388,13 @@ typedef struct who_perm { char who_ug_name[256]; /* user/group name */ fs_perm_t *who_fsperm; /* uplink */ - uu_avl_t *who_deleg_perm_avl; /* permissions */ + avl_tree_t who_deleg_perm_avl; /* permissions */ } who_perm_t; /* */ typedef struct who_perm_node { who_perm_t who_perm; - uu_avl_node_t who_avl_node; + avl_node_t who_avl_node; } who_perm_node_t; typedef struct fs_perm_set fs_perm_set_t; @@ -5427,8 +5402,8 @@ typedef struct fs_perm_set fs_perm_set_t; struct fs_perm { const char *fsp_name; - uu_avl_t *fsp_sc_avl; /* sets,create */ - uu_avl_t *fsp_uge_avl; /* user,group,everyone */ + avl_tree_t fsp_sc_avl; /* sets,create */ + avl_tree_t fsp_uge_avl; /* user,group,everyone */ fs_perm_set_t *fsp_set; /* uplink */ }; @@ -5436,19 +5411,14 @@ struct fs_perm { /* */ typedef struct fs_perm_node { fs_perm_t fspn_fsperm; - uu_avl_t *fspn_avl; + avl_tree_t fspn_avl; - uu_list_node_t fspn_list_node; + list_node_t fspn_list_node; } fs_perm_node_t; /* top level structure */ struct fs_perm_set { - uu_list_pool_t *fsps_list_pool; - uu_list_t *fsps_list; /* list of fs_perms */ - - uu_avl_pool_t *fsps_named_set_avl_pool; - uu_avl_pool_t *fsps_who_perm_avl_pool; - uu_avl_pool_t *fsps_deleg_perm_avl_pool; + list_t fsps_list; /* list of fs_perms */ }; static inline const char * @@ -5511,9 +5481,8 @@ who_type2weight(zfs_deleg_who_type_t who_type) } static int -who_perm_compare(const void *larg, const void *rarg, void *unused) +who_perm_compare(const void *larg, const void *rarg) { - (void) unused; const who_perm_node_t *l = larg; const who_perm_node_t *r = rarg; zfs_deleg_who_type_t ltype = l->who_perm.who_type; @@ -5524,63 +5493,24 @@ who_perm_compare(const void *larg, const void *rarg, void *unused) if (res == 0) res = strncmp(l->who_perm.who_name, r->who_perm.who_name, ZFS_MAX_DELEG_NAME-1); - - if (res == 0) - return (0); - if (res > 0) - return (1); - else - return (-1); + return (TREE_ISIGN(res)); } static int -deleg_perm_compare(const void *larg, const void *rarg, void *unused) +deleg_perm_compare(const void *larg, const void *rarg) { - (void) unused; const deleg_perm_node_t *l = larg; const deleg_perm_node_t *r = rarg; - int res = strncmp(l->dpn_perm.dp_name, r->dpn_perm.dp_name, - ZFS_MAX_DELEG_NAME-1); - - if (res == 0) - return (0); - - if (res > 0) - return (1); - else - return (-1); + return (TREE_ISIGN(strncmp(l->dpn_perm.dp_name, r->dpn_perm.dp_name, + ZFS_MAX_DELEG_NAME-1))); } static inline void fs_perm_set_init(fs_perm_set_t *fspset) { memset(fspset, 0, sizeof (fs_perm_set_t)); - - if ((fspset->fsps_list_pool = uu_list_pool_create("fsps_list_pool", - sizeof (fs_perm_node_t), offsetof(fs_perm_node_t, fspn_list_node), - NULL, UU_DEFAULT)) == NULL) - nomem(); - if ((fspset->fsps_list = uu_list_create(fspset->fsps_list_pool, NULL, - UU_DEFAULT)) == NULL) - nomem(); - - if ((fspset->fsps_named_set_avl_pool = uu_avl_pool_create( - "named_set_avl_pool", sizeof (who_perm_node_t), offsetof( - who_perm_node_t, who_avl_node), who_perm_compare, - UU_DEFAULT)) == NULL) - nomem(); - - if ((fspset->fsps_who_perm_avl_pool = uu_avl_pool_create( - "who_perm_avl_pool", sizeof (who_perm_node_t), offsetof( - who_perm_node_t, who_avl_node), who_perm_compare, - UU_DEFAULT)) == NULL) - nomem(); - - if ((fspset->fsps_deleg_perm_avl_pool = uu_avl_pool_create( - "deleg_perm_avl_pool", sizeof (deleg_perm_node_t), offsetof( - deleg_perm_node_t, dpn_avl_node), deleg_perm_compare, UU_DEFAULT)) - == NULL) - nomem(); + list_create(&fspset->fsps_list, sizeof (fs_perm_node_t), + offsetof(fs_perm_node_t, fspn_list_node)); } static inline void fs_perm_fini(fs_perm_t *); @@ -5589,21 +5519,13 @@ static inline void who_perm_fini(who_perm_t *); static inline void fs_perm_set_fini(fs_perm_set_t *fspset) { - fs_perm_node_t *node = uu_list_first(fspset->fsps_list); - - while (node != NULL) { - fs_perm_node_t *next_node = - uu_list_next(fspset->fsps_list, node); + fs_perm_node_t *node; + while ((node = list_remove_head(&fspset->fsps_list)) != NULL) { fs_perm_t *fsperm = &node->fspn_fsperm; fs_perm_fini(fsperm); - uu_list_remove(fspset->fsps_list, node); free(node); - node = next_node; } - - uu_avl_pool_destroy(fspset->fsps_named_set_avl_pool); - uu_avl_pool_destroy(fspset->fsps_who_perm_avl_pool); - uu_avl_pool_destroy(fspset->fsps_deleg_perm_avl_pool); + list_destroy(&fspset->fsps_list); } static inline void @@ -5618,14 +5540,11 @@ static inline void who_perm_init(who_perm_t *who_perm, fs_perm_t *fsperm, zfs_deleg_who_type_t type, const char *name) { - uu_avl_pool_t *pool; - pool = fsperm->fsp_set->fsps_deleg_perm_avl_pool; - memset(who_perm, 0, sizeof (who_perm_t)); - if ((who_perm->who_deleg_perm_avl = uu_avl_create(pool, NULL, - UU_DEFAULT)) == NULL) - nomem(); + avl_create(&who_perm->who_deleg_perm_avl, deleg_perm_compare, + sizeof (deleg_perm_node_t), + offsetof(deleg_perm_node_t, dpn_avl_node)); who_perm->who_type = type; who_perm->who_name = name; @@ -5635,35 +5554,26 @@ who_perm_init(who_perm_t *who_perm, fs_perm_t *fsperm, static inline void who_perm_fini(who_perm_t *who_perm) { - deleg_perm_node_t *node = uu_avl_first(who_perm->who_deleg_perm_avl); + deleg_perm_node_t *node; + void *cookie = NULL; - while (node != NULL) { - deleg_perm_node_t *next_node = - uu_avl_next(who_perm->who_deleg_perm_avl, node); - - uu_avl_remove(who_perm->who_deleg_perm_avl, node); + while ((node = avl_destroy_nodes(&who_perm->who_deleg_perm_avl, + &cookie)) != NULL) { free(node); - node = next_node; } - uu_avl_destroy(who_perm->who_deleg_perm_avl); + avl_destroy(&who_perm->who_deleg_perm_avl); } static inline void fs_perm_init(fs_perm_t *fsperm, fs_perm_set_t *fspset, const char *fsname) { - uu_avl_pool_t *nset_pool = fspset->fsps_named_set_avl_pool; - uu_avl_pool_t *who_pool = fspset->fsps_who_perm_avl_pool; - memset(fsperm, 0, sizeof (fs_perm_t)); - if ((fsperm->fsp_sc_avl = uu_avl_create(nset_pool, NULL, UU_DEFAULT)) - == NULL) - nomem(); - - if ((fsperm->fsp_uge_avl = uu_avl_create(who_pool, NULL, UU_DEFAULT)) - == NULL) - nomem(); + avl_create(&fsperm->fsp_sc_avl, who_perm_compare, + sizeof (who_perm_node_t), offsetof(who_perm_node_t, who_avl_node)); + avl_create(&fsperm->fsp_uge_avl, who_perm_compare, + sizeof (who_perm_node_t), offsetof(who_perm_node_t, who_avl_node)); fsperm->fsp_set = fspset; fsperm->fsp_name = fsname; @@ -5672,46 +5582,41 @@ fs_perm_init(fs_perm_t *fsperm, fs_perm_set_t *fspset, const char *fsname) static inline void fs_perm_fini(fs_perm_t *fsperm) { - who_perm_node_t *node = uu_avl_first(fsperm->fsp_sc_avl); - while (node != NULL) { - who_perm_node_t *next_node = uu_avl_next(fsperm->fsp_sc_avl, - node); + who_perm_node_t *node; + void *cookie = NULL; + + while ((node = avl_destroy_nodes(&fsperm->fsp_sc_avl, + &cookie)) != NULL) { who_perm_t *who_perm = &node->who_perm; who_perm_fini(who_perm); - uu_avl_remove(fsperm->fsp_sc_avl, node); free(node); - node = next_node; } - node = uu_avl_first(fsperm->fsp_uge_avl); - while (node != NULL) { - who_perm_node_t *next_node = uu_avl_next(fsperm->fsp_uge_avl, - node); + cookie = NULL; + while ((node = avl_destroy_nodes(&fsperm->fsp_uge_avl, + &cookie)) != NULL) { who_perm_t *who_perm = &node->who_perm; who_perm_fini(who_perm); - uu_avl_remove(fsperm->fsp_uge_avl, node); free(node); - node = next_node; } - uu_avl_destroy(fsperm->fsp_sc_avl); - uu_avl_destroy(fsperm->fsp_uge_avl); + avl_destroy(&fsperm->fsp_sc_avl); + avl_destroy(&fsperm->fsp_uge_avl); } static void -set_deleg_perm_node(uu_avl_t *avl, deleg_perm_node_t *node, +set_deleg_perm_node(avl_tree_t *avl, deleg_perm_node_t *node, zfs_deleg_who_type_t who_type, const char *name, char locality) { - uu_avl_index_t idx = 0; + avl_index_t idx = 0; deleg_perm_node_t *found_node = NULL; deleg_perm_t *deleg_perm = &node->dpn_perm; deleg_perm_init(deleg_perm, who_type, name); - if ((found_node = uu_avl_find(avl, node, NULL, &idx)) - == NULL) - uu_avl_insert(avl, node, idx); + if ((found_node = avl_find(avl, node, &idx)) == NULL) + avl_insert(avl, node, idx); else { node = found_node; deleg_perm = &node->dpn_perm; @@ -5736,20 +5641,17 @@ static inline int parse_who_perm(who_perm_t *who_perm, nvlist_t *nvl, char locality) { nvpair_t *nvp = NULL; - fs_perm_set_t *fspset = who_perm->who_fsperm->fsp_set; - uu_avl_t *avl = who_perm->who_deleg_perm_avl; + avl_tree_t *avl = &who_perm->who_deleg_perm_avl; zfs_deleg_who_type_t who_type = who_perm->who_type; while ((nvp = nvlist_next_nvpair(nvl, nvp)) != NULL) { const char *name = nvpair_name(nvp); data_type_t type = nvpair_type(nvp); - uu_avl_pool_t *avl_pool = fspset->fsps_deleg_perm_avl_pool; deleg_perm_node_t *node = safe_malloc(sizeof (deleg_perm_node_t)); VERIFY(type == DATA_TYPE_BOOLEAN); - uu_avl_node_init(node, &node->dpn_avl_node, avl_pool); set_deleg_perm_node(avl, node, who_type, name, locality); } @@ -5760,13 +5662,11 @@ static inline int parse_fs_perm(fs_perm_t *fsperm, nvlist_t *nvl) { nvpair_t *nvp = NULL; - fs_perm_set_t *fspset = fsperm->fsp_set; while ((nvp = nvlist_next_nvpair(nvl, nvp)) != NULL) { nvlist_t *nvl2 = NULL; const char *name = nvpair_name(nvp); - uu_avl_t *avl = NULL; - uu_avl_pool_t *avl_pool = NULL; + avl_tree_t *avl = NULL; zfs_deleg_who_type_t perm_type = name[0]; char perm_locality = name[1]; const char *perm_name = name + 3; @@ -5782,8 +5682,7 @@ parse_fs_perm(fs_perm_t *fsperm, nvlist_t *nvl) case ZFS_DELEG_CREATE_SETS: case ZFS_DELEG_NAMED_SET: case ZFS_DELEG_NAMED_SET_SETS: - avl_pool = fspset->fsps_named_set_avl_pool; - avl = fsperm->fsp_sc_avl; + avl = &fsperm->fsp_sc_avl; break; case ZFS_DELEG_USER: case ZFS_DELEG_USER_SETS: @@ -5791,8 +5690,7 @@ parse_fs_perm(fs_perm_t *fsperm, nvlist_t *nvl) case ZFS_DELEG_GROUP_SETS: case ZFS_DELEG_EVERYONE: case ZFS_DELEG_EVERYONE_SETS: - avl_pool = fspset->fsps_who_perm_avl_pool; - avl = fsperm->fsp_uge_avl; + avl = &fsperm->fsp_uge_avl; break; default: @@ -5803,14 +5701,12 @@ parse_fs_perm(fs_perm_t *fsperm, nvlist_t *nvl) who_perm_node_t *node = safe_malloc( sizeof (who_perm_node_t)); who_perm = &node->who_perm; - uu_avl_index_t idx = 0; + avl_index_t idx = 0; - uu_avl_node_init(node, &node->who_avl_node, avl_pool); who_perm_init(who_perm, fsperm, perm_type, perm_name); - if ((found_node = uu_avl_find(avl, node, NULL, &idx)) - == NULL) { - if (avl == fsperm->fsp_uge_avl) { + if ((found_node = avl_find(avl, node, &idx)) == NULL) { + if (avl == &fsperm->fsp_uge_avl) { uid_t rid = 0; struct passwd *p = NULL; struct group *g = NULL; @@ -5849,7 +5745,7 @@ parse_fs_perm(fs_perm_t *fsperm, nvlist_t *nvl) } } - uu_avl_insert(avl, node, idx); + avl_insert(avl, node, idx); } else { node = found_node; who_perm = &node->who_perm; @@ -5866,7 +5762,6 @@ static inline int parse_fs_perm_set(fs_perm_set_t *fspset, nvlist_t *nvl) { nvpair_t *nvp = NULL; - uu_avl_index_t idx = 0; while ((nvp = nvlist_next_nvpair(nvl, nvp)) != NULL) { nvlist_t *nvl2 = NULL; @@ -5879,10 +5774,6 @@ parse_fs_perm_set(fs_perm_set_t *fspset, nvlist_t *nvl) VERIFY(DATA_TYPE_NVLIST == type); - uu_list_node_init(node, &node->fspn_list_node, - fspset->fsps_list_pool); - - idx = uu_list_numnodes(fspset->fsps_list); fs_perm_init(fsperm, fspset, fsname); if (nvpair_value_nvlist(nvp, &nvl2) != 0) @@ -5890,7 +5781,7 @@ parse_fs_perm_set(fs_perm_set_t *fspset, nvlist_t *nvl) (void) parse_fs_perm(fsperm, nvl2); - uu_list_insert(fspset->fsps_list, node, idx); + list_insert_tail(&fspset->fsps_list, node); } return (0); @@ -6442,7 +6333,7 @@ construct_fsacl_list(boolean_t un, struct allow_opts *opts, nvlist_t **nvlp) } static void -print_set_creat_perms(uu_avl_t *who_avl) +print_set_creat_perms(avl_tree_t *who_avl) { const char *sc_title[] = { gettext("Permission sets:\n"), @@ -6452,9 +6343,9 @@ print_set_creat_perms(uu_avl_t *who_avl) who_perm_node_t *who_node = NULL; int prev_weight = -1; - for (who_node = uu_avl_first(who_avl); who_node != NULL; - who_node = uu_avl_next(who_avl, who_node)) { - uu_avl_t *avl = who_node->who_perm.who_deleg_perm_avl; + for (who_node = avl_first(who_avl); who_node != NULL; + who_node = AVL_NEXT(who_avl, who_node)) { + avl_tree_t *avl = &who_node->who_perm.who_deleg_perm_avl; zfs_deleg_who_type_t who_type = who_node->who_perm.who_type; const char *who_name = who_node->who_perm.who_name; int weight = who_type2weight(who_type); @@ -6471,8 +6362,8 @@ print_set_creat_perms(uu_avl_t *who_avl) else (void) printf("\t%s ", who_name); - for (deleg_node = uu_avl_first(avl); deleg_node != NULL; - deleg_node = uu_avl_next(avl, deleg_node)) { + for (deleg_node = avl_first(avl); deleg_node != NULL; + deleg_node = AVL_NEXT(avl, deleg_node)) { if (first) { (void) printf("%s", deleg_node->dpn_perm.dp_name); @@ -6487,28 +6378,24 @@ print_set_creat_perms(uu_avl_t *who_avl) } static void -print_uge_deleg_perms(uu_avl_t *who_avl, boolean_t local, boolean_t descend, +print_uge_deleg_perms(avl_tree_t *who_avl, boolean_t local, boolean_t descend, const char *title) { who_perm_node_t *who_node = NULL; boolean_t prt_title = B_TRUE; - uu_avl_walk_t *walk; - if ((walk = uu_avl_walk_start(who_avl, UU_WALK_ROBUST)) == NULL) - nomem(); - - while ((who_node = uu_avl_walk_next(walk)) != NULL) { + for (who_node = avl_first(who_avl); who_node != NULL; + who_node = AVL_NEXT(who_avl, who_node)) { const char *who_name = who_node->who_perm.who_name; const char *nice_who_name = who_node->who_perm.who_ug_name; - uu_avl_t *avl = who_node->who_perm.who_deleg_perm_avl; + avl_tree_t *avl = &who_node->who_perm.who_deleg_perm_avl; zfs_deleg_who_type_t who_type = who_node->who_perm.who_type; char delim = ' '; deleg_perm_node_t *deleg_node; boolean_t prt_who = B_TRUE; - for (deleg_node = uu_avl_first(avl); - deleg_node != NULL; - deleg_node = uu_avl_next(avl, deleg_node)) { + for (deleg_node = avl_first(avl); deleg_node != NULL; + deleg_node = AVL_NEXT(avl, deleg_node)) { if (local != deleg_node->dpn_perm.dp_local || descend != deleg_node->dpn_perm.dp_descend) continue; @@ -6558,8 +6445,6 @@ print_uge_deleg_perms(uu_avl_t *who_avl, boolean_t local, boolean_t descend, if (!prt_who) (void) printf("\n"); } - - uu_avl_walk_end(walk); } static void @@ -6569,10 +6454,10 @@ print_fs_perms(fs_perm_set_t *fspset) char buf[MAXNAMELEN + 32]; const char *dsname = buf; - for (node = uu_list_first(fspset->fsps_list); node != NULL; - node = uu_list_next(fspset->fsps_list, node)) { - uu_avl_t *sc_avl = node->fspn_fsperm.fsp_sc_avl; - uu_avl_t *uge_avl = node->fspn_fsperm.fsp_uge_avl; + for (node = list_head(&fspset->fsps_list); node != NULL; + node = list_next(&fspset->fsps_list, node)) { + avl_tree_t *sc_avl = &node->fspn_fsperm.fsp_sc_avl; + avl_tree_t *uge_avl = &node->fspn_fsperm.fsp_uge_avl; int left = 0; (void) snprintf(buf, sizeof (buf), @@ -6594,7 +6479,7 @@ print_fs_perms(fs_perm_set_t *fspset) } } -static fs_perm_set_t fs_perm_set = { NULL, NULL, NULL, NULL }; +static fs_perm_set_t fs_perm_set = {}; struct deleg_perms { boolean_t un; @@ -7726,17 +7611,16 @@ zfs_do_share(int argc, char **argv) typedef struct unshare_unmount_node { zfs_handle_t *un_zhp; char *un_mountp; - uu_avl_node_t un_avlnode; + avl_node_t un_avlnode; } unshare_unmount_node_t; static int -unshare_unmount_compare(const void *larg, const void *rarg, void *unused) +unshare_unmount_compare(const void *larg, const void *rarg) { - (void) unused; const unshare_unmount_node_t *l = larg; const unshare_unmount_node_t *r = rarg; - return (strcmp(l->un_mountp, r->un_mountp)); + return (TREE_ISIGN(strcmp(l->un_mountp, r->un_mountp))); } /* @@ -7918,11 +7802,9 @@ unshare_unmount(int op, int argc, char **argv) */ FILE *mnttab; struct mnttab entry; - uu_avl_pool_t *pool; - uu_avl_t *tree = NULL; + avl_tree_t tree; unshare_unmount_node_t *node; - uu_avl_index_t idx; - uu_avl_walk_t *walk; + avl_index_t idx; enum sa_protocol *protocol = NULL, single_protocol[] = {SA_NO_PROTOCOL, SA_NO_PROTOCOL}; @@ -7938,16 +7820,12 @@ unshare_unmount(int op, int argc, char **argv) usage(B_FALSE); } - if (((pool = uu_avl_pool_create("unmount_pool", + avl_create(&tree, unshare_unmount_compare, sizeof (unshare_unmount_node_t), - offsetof(unshare_unmount_node_t, un_avlnode), - unshare_unmount_compare, UU_DEFAULT)) == NULL) || - ((tree = uu_avl_create(pool, NULL, UU_DEFAULT)) == NULL)) - nomem(); + offsetof(unshare_unmount_node_t, un_avlnode)); if ((mnttab = fopen(MNTTAB, "re")) == NULL) { - uu_avl_destroy(tree); - uu_avl_pool_destroy(pool); + avl_destroy(&tree); return (ENOENT); } @@ -8012,10 +7890,8 @@ unshare_unmount(int op, int argc, char **argv) node->un_zhp = zhp; node->un_mountp = safe_strdup(entry.mnt_mountp); - uu_avl_node_init(node, &node->un_avlnode, pool); - - if (uu_avl_find(tree, node, NULL, &idx) == NULL) { - uu_avl_insert(tree, node, idx); + if (avl_find(&tree, node, &idx) == NULL) { + avl_insert(&tree, node, idx); } else { zfs_close(node->un_zhp); free(node->un_mountp); @@ -8028,14 +7904,10 @@ unshare_unmount(int op, int argc, char **argv) * Walk the AVL tree in reverse, unmounting each filesystem and * removing it from the AVL tree in the process. */ - if ((walk = uu_avl_walk_start(tree, - UU_WALK_REVERSE | UU_WALK_ROBUST)) == NULL) - nomem(); - - while ((node = uu_avl_walk_next(walk)) != NULL) { + while ((node = avl_last(&tree)) != NULL) { const char *mntarg = NULL; - uu_avl_remove(tree, node); + avl_remove(&tree, node); switch (op) { case OP_SHARE: if (zfs_unshare(node->un_zhp, @@ -8058,9 +7930,7 @@ unshare_unmount(int op, int argc, char **argv) if (op == OP_SHARE) zfs_commit_shares(protocol); - uu_avl_walk_end(walk); - uu_avl_destroy(tree); - uu_avl_pool_destroy(pool); + avl_destroy(&tree); } else { if (argc != 1) { diff --git a/sys/contrib/openzfs/cmd/zpool/Makefile.am b/sys/contrib/openzfs/cmd/zpool/Makefile.am index 5bb6d8160b18..43f056c97b6a 100644 --- a/sys/contrib/openzfs/cmd/zpool/Makefile.am +++ b/sys/contrib/openzfs/cmd/zpool/Makefile.am @@ -28,7 +28,6 @@ zpool_LDADD = \ libzfs.la \ libzfs_core.la \ libnvpair.la \ - libuutil.la \ libzutil.la zpool_LDADD += $(LTLIBINTL) diff --git a/sys/contrib/openzfs/cmd/zpool/zpool_iter.c b/sys/contrib/openzfs/cmd/zpool/zpool_iter.c index fef602736705..5a6e3e65a4d3 100644 --- a/sys/contrib/openzfs/cmd/zpool/zpool_iter.c +++ b/sys/contrib/openzfs/cmd/zpool/zpool_iter.c @@ -30,12 +30,10 @@ */ #include <libintl.h> -#include <libuutil.h> #include <stddef.h> #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <thread_pool.h> #include <libzfs.h> #include <libzutil.h> @@ -52,30 +50,28 @@ typedef struct zpool_node { zpool_handle_t *zn_handle; - uu_avl_node_t zn_avlnode; + avl_node_t zn_avlnode; hrtime_t zn_last_refresh; } zpool_node_t; struct zpool_list { boolean_t zl_findall; boolean_t zl_literal; - uu_avl_t *zl_avl; - uu_avl_pool_t *zl_pool; + avl_tree_t zl_avl; zprop_list_t **zl_proplist; zfs_type_t zl_type; hrtime_t zl_last_refresh; }; static int -zpool_compare(const void *larg, const void *rarg, void *unused) +zpool_compare(const void *larg, const void *rarg) { - (void) unused; zpool_handle_t *l = ((zpool_node_t *)larg)->zn_handle; zpool_handle_t *r = ((zpool_node_t *)rarg)->zn_handle; const char *lname = zpool_get_name(l); const char *rname = zpool_get_name(r); - return (strcmp(lname, rname)); + return (TREE_ISIGN(strcmp(lname, rname))); } /* @@ -86,12 +82,11 @@ static int add_pool(zpool_handle_t *zhp, zpool_list_t *zlp) { zpool_node_t *node, *new = safe_malloc(sizeof (zpool_node_t)); - uu_avl_index_t idx; + avl_index_t idx; new->zn_handle = zhp; - uu_avl_node_init(new, &new->zn_avlnode, zlp->zl_pool); - node = uu_avl_find(zlp->zl_avl, new, NULL, &idx); + node = avl_find(&zlp->zl_avl, new, &idx); if (node == NULL) { if (zlp->zl_proplist && zpool_expand_proplist(zhp, zlp->zl_proplist, @@ -101,7 +96,7 @@ add_pool(zpool_handle_t *zhp, zpool_list_t *zlp) return (-1); } new->zn_last_refresh = zlp->zl_last_refresh; - uu_avl_insert(zlp->zl_avl, new, idx); + avl_insert(&zlp->zl_avl, new, idx); } else { zpool_refresh_stats_from_handle(node->zn_handle, zhp); node->zn_last_refresh = zlp->zl_last_refresh; @@ -139,15 +134,8 @@ pool_list_get(int argc, char **argv, zprop_list_t **proplist, zfs_type_t type, zlp = safe_malloc(sizeof (zpool_list_t)); - zlp->zl_pool = uu_avl_pool_create("zfs_pool", sizeof (zpool_node_t), - offsetof(zpool_node_t, zn_avlnode), zpool_compare, UU_DEFAULT); - - if (zlp->zl_pool == NULL) - zpool_no_memory(); - - if ((zlp->zl_avl = uu_avl_create(zlp->zl_pool, NULL, - UU_DEFAULT)) == NULL) - zpool_no_memory(); + avl_create(&zlp->zl_avl, zpool_compare, + sizeof (zpool_node_t), offsetof(zpool_node_t, zn_avlnode)); zlp->zl_proplist = proplist; zlp->zl_type = type; @@ -194,8 +182,8 @@ pool_list_refresh(zpool_list_t *zlp) * state. */ int navail = 0; - for (zpool_node_t *node = uu_avl_first(zlp->zl_avl); - node != NULL; node = uu_avl_next(zlp->zl_avl, node)) { + for (zpool_node_t *node = avl_first(&zlp->zl_avl); + node != NULL; node = AVL_NEXT(&zlp->zl_avl, node)) { boolean_t missing; zpool_refresh_stats(node->zn_handle, &missing); navail += !missing; @@ -209,8 +197,8 @@ pool_list_refresh(zpool_list_t *zlp) /* Walk the list of existing pools, and update or remove them. */ zpool_node_t *node, *next; - for (node = uu_avl_first(zlp->zl_avl); node != NULL; node = next) { - next = uu_avl_next(zlp->zl_avl, node); + for (node = avl_first(&zlp->zl_avl); node != NULL; node = next) { + next = AVL_NEXT(&zlp->zl_avl, node); /* * Skip any that were refreshed and are online; they were added @@ -224,7 +212,7 @@ pool_list_refresh(zpool_list_t *zlp) boolean_t missing; zpool_refresh_stats(node->zn_handle, &missing); if (missing) { - uu_avl_remove(zlp->zl_avl, node); + avl_remove(&zlp->zl_avl, node); zpool_close(node->zn_handle); free(node); } else { @@ -232,7 +220,7 @@ pool_list_refresh(zpool_list_t *zlp) } } - return (uu_avl_numnodes(zlp->zl_avl)); + return (avl_numnodes(&zlp->zl_avl)); } /* @@ -245,8 +233,8 @@ pool_list_iter(zpool_list_t *zlp, int unavail, zpool_iter_f func, zpool_node_t *node, *next_node; int ret = 0; - for (node = uu_avl_first(zlp->zl_avl); node != NULL; node = next_node) { - next_node = uu_avl_next(zlp->zl_avl, node); + for (node = avl_first(&zlp->zl_avl); node != NULL; node = next_node) { + next_node = AVL_NEXT(&zlp->zl_avl, node); if (zpool_get_state(node->zn_handle) != POOL_STATE_UNAVAIL || unavail) ret |= func(node->zn_handle, data); @@ -261,25 +249,15 @@ pool_list_iter(zpool_list_t *zlp, int unavail, zpool_iter_f func, void pool_list_free(zpool_list_t *zlp) { - uu_avl_walk_t *walk; zpool_node_t *node; + void *cookie = NULL; - if ((walk = uu_avl_walk_start(zlp->zl_avl, UU_WALK_ROBUST)) == NULL) { - (void) fprintf(stderr, - gettext("internal error: out of memory")); - exit(1); - } - - while ((node = uu_avl_walk_next(walk)) != NULL) { - uu_avl_remove(zlp->zl_avl, node); + while ((node = avl_destroy_nodes(&zlp->zl_avl, &cookie)) != NULL) { zpool_close(node->zn_handle); free(node); } - uu_avl_walk_end(walk); - uu_avl_destroy(zlp->zl_avl); - uu_avl_pool_destroy(zlp->zl_pool); - + avl_destroy(&zlp->zl_avl); free(zlp); } @@ -289,7 +267,7 @@ pool_list_free(zpool_list_t *zlp) int pool_list_count(zpool_list_t *zlp) { - return (uu_avl_numnodes(zlp->zl_avl)); + return (avl_numnodes(&zlp->zl_avl)); } /* @@ -674,21 +652,21 @@ all_pools_for_each_vdev_gather_cb(zpool_handle_t *zhp, void *cb_vcdl) static void all_pools_for_each_vdev_run_vcdl(vdev_cmd_data_list_t *vcdl) { - tpool_t *t; - - t = tpool_create(1, 5 * sysconf(_SC_NPROCESSORS_ONLN), 0, NULL); - if (t == NULL) + taskq_t *tq = taskq_create("vdev_run_cmd", + 5 * sysconf(_SC_NPROCESSORS_ONLN), minclsyspri, 1, INT_MAX, + TASKQ_DYNAMIC); + if (tq == NULL) return; /* Spawn off the command for each vdev */ for (int i = 0; i < vcdl->count; i++) { - (void) tpool_dispatch(t, vdev_run_cmd_thread, - (void *) &vcdl->data[i]); + (void) taskq_dispatch(tq, vdev_run_cmd_thread, + (void *) &vcdl->data[i], TQ_SLEEP); } /* Wait for threads to finish */ - tpool_wait(t); - tpool_destroy(t); + taskq_wait(tq); + taskq_destroy(tq); } /* diff --git a/sys/contrib/openzfs/cmd/zpool/zpool_main.c b/sys/contrib/openzfs/cmd/zpool/zpool_main.c index b0e05aa2776a..bec3f94d9602 100644 --- a/sys/contrib/openzfs/cmd/zpool/zpool_main.c +++ b/sys/contrib/openzfs/cmd/zpool/zpool_main.c @@ -46,14 +46,12 @@ #include <inttypes.h> #include <libgen.h> #include <libintl.h> -#include <libuutil.h> #include <locale.h> #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <termios.h> -#include <thread_pool.h> #include <time.h> #include <unistd.h> #include <pwd.h> @@ -2390,7 +2388,7 @@ zpool_do_destroy(int argc, char **argv) } typedef struct export_cbdata { - tpool_t *tpool; + taskq_t *taskq; pthread_mutex_t mnttab_lock; boolean_t force; boolean_t hardforce; @@ -2415,12 +2413,12 @@ zpool_export_one(zpool_handle_t *zhp, void *data) * zpool_disable_datasets() is not thread-safe for mnttab access. * So we serialize access here for 'zpool export -a' parallel case. */ - if (cb->tpool != NULL) + if (cb->taskq != NULL) (void) pthread_mutex_lock(&cb->mnttab_lock); int retval = zpool_disable_datasets(zhp, cb->force); - if (cb->tpool != NULL) + if (cb->taskq != NULL) (void) pthread_mutex_unlock(&cb->mnttab_lock); if (retval) @@ -2464,7 +2462,7 @@ zpool_export_task(void *arg) static int zpool_export_one_async(zpool_handle_t *zhp, void *data) { - tpool_t *tpool = ((export_cbdata_t *)data)->tpool; + taskq_t *tq = ((export_cbdata_t *)data)->taskq; async_export_args_t *aea = safe_malloc(sizeof (async_export_args_t)); /* save pool name since zhp will go out of scope */ @@ -2472,7 +2470,8 @@ zpool_export_one_async(zpool_handle_t *zhp, void *data) aea->aea_cbdata = data; /* ship off actual export to another thread */ - if (tpool_dispatch(tpool, zpool_export_task, (void *)aea) != 0) + if (taskq_dispatch(tq, zpool_export_task, (void *)aea, + TQ_SLEEP) == TASKQID_INVALID) return (errno); /* unlikely */ else return (0); @@ -2518,7 +2517,7 @@ zpool_do_export(int argc, char **argv) cb.force = force; cb.hardforce = hardforce; - cb.tpool = NULL; + cb.taskq = NULL; cb.retval = 0; argc -= optind; argv += optind; @@ -2532,16 +2531,17 @@ zpool_do_export(int argc, char **argv) usage(B_FALSE); } - cb.tpool = tpool_create(1, 5 * sysconf(_SC_NPROCESSORS_ONLN), - 0, NULL); + cb.taskq = taskq_create("zpool_export", + 5 * sysconf(_SC_NPROCESSORS_ONLN), minclsyspri, 1, INT_MAX, + TASKQ_DYNAMIC); (void) pthread_mutex_init(&cb.mnttab_lock, NULL); /* Asynchronously call zpool_export_one using thread pool */ ret = for_each_pool(argc, argv, B_TRUE, NULL, ZFS_TYPE_POOL, B_FALSE, zpool_export_one_async, &cb); - tpool_wait(cb.tpool); - tpool_destroy(cb.tpool); + taskq_wait(cb.taskq); + taskq_destroy(cb.taskq); (void) pthread_mutex_destroy(&cb.mnttab_lock); return (ret | cb.retval); @@ -3946,10 +3946,11 @@ import_pools(nvlist_t *pools, nvlist_t *props, char *mntopts, int flags, uint_t npools = 0; - tpool_t *tp = NULL; + taskq_t *tq = NULL; if (import->do_all) { - tp = tpool_create(1, 5 * sysconf(_SC_NPROCESSORS_ONLN), - 0, NULL); + tq = taskq_create("zpool_import_all", + 5 * sysconf(_SC_NPROCESSORS_ONLN), minclsyspri, 1, INT_MAX, + TASKQ_DYNAMIC); } /* @@ -3998,8 +3999,8 @@ import_pools(nvlist_t *pools, nvlist_t *props, char *mntopts, int flags, ip->ip_mntthreads = mount_tp_nthr / npools; ip->ip_err = &err; - (void) tpool_dispatch(tp, do_import_task, - (void *)ip); + (void) taskq_dispatch(tq, do_import_task, + (void *)ip, TQ_SLEEP); } else { /* * If we're importing from cachefile, then @@ -4048,8 +4049,8 @@ import_pools(nvlist_t *pools, nvlist_t *props, char *mntopts, int flags, } } if (import->do_all) { - tpool_wait(tp); - tpool_destroy(tp); + taskq_wait(tq); + taskq_destroy(tq); } /* @@ -6746,10 +6747,12 @@ typedef struct list_cbdata { /* - * Given a list of columns to display, output appropriate headers for each one. + * Given a list of columns to display, print an appropriate line. If + * `vdev_name` is not NULL, we print `vdev_name` followed by a line of dashes. + * If `vdev_name` is NULL, we print a line of the headers. */ static void -print_header(list_cbdata_t *cb) +print_line(list_cbdata_t *cb, const char *vdev_name) { zprop_list_t *pl = cb->cb_proplist; char headerbuf[ZPOOL_MAXPROPLEN]; @@ -6758,6 +6761,8 @@ print_header(list_cbdata_t *cb) boolean_t right_justify; size_t width = 0; + boolean_t print_header = (vdev_name == NULL); + for (; pl != NULL; pl = pl->pl_next) { width = pl->pl_width; if (first && cb->cb_verbose) { @@ -6770,20 +6775,36 @@ print_header(list_cbdata_t *cb) if (!first) (void) fputs(" ", stdout); - else - first = B_FALSE; - right_justify = B_FALSE; - if (pl->pl_prop != ZPROP_USERPROP) { - header = zpool_prop_column_name(pl->pl_prop); - right_justify = zpool_prop_align_right(pl->pl_prop); - } else { - int i; + if (print_header) { + right_justify = B_FALSE; + if (pl->pl_prop != ZPROP_USERPROP) { + header = zpool_prop_column_name(pl->pl_prop); + right_justify = zpool_prop_align_right( + pl->pl_prop); + } else { + int i; + + for (i = 0; pl->pl_user_prop[i] != '\0'; i++) + headerbuf[i] = toupper( + pl->pl_user_prop[i]); + headerbuf[i] = '\0'; + header = headerbuf; + } - for (i = 0; pl->pl_user_prop[i] != '\0'; i++) - headerbuf[i] = toupper(pl->pl_user_prop[i]); - headerbuf[i] = '\0'; - header = headerbuf; + } + /* + * If `print_header` is false, we want to print a line of + * dashes. + */ + else { + if (first) { + header = vdev_name; + right_justify = B_FALSE; + } else { + header = "-"; + right_justify = B_TRUE; + } } if (pl->pl_next == NULL && !right_justify) @@ -6792,6 +6813,9 @@ print_header(list_cbdata_t *cb) (void) printf("%*s", (int)width, header); else (void) printf("%-*s", (int)width, header); + + if (first) + first = B_FALSE; } (void) fputc('\n', stdout); @@ -6995,8 +7019,6 @@ collect_list_stats(zpool_handle_t *zhp, const char *name, nvlist_t *nv, uint64_t islog = B_FALSE; nvlist_t *props, *ent, *ch, *obj, *l2c, *sp; props = ent = ch = obj = sp = l2c = NULL; - const char *dashes = "%-*s - - - - " - "- - - - -\n"; verify(nvlist_lookup_uint64_array(nv, ZPOOL_CONFIG_VDEV_STATS, (uint64_t **)&vs, &c) == 0); @@ -7208,9 +7230,7 @@ collect_list_stats(zpool_handle_t *zhp, const char *name, nvlist_t *nv, continue; if (!printed && !cb->cb_json) { - /* LINTED E_SEC_PRINTF_VAR_FMT */ - (void) printf(dashes, cb->cb_namewidth, - class_name[n]); + print_line(cb, class_name[n]); printed = B_TRUE; } vname = zpool_vdev_name(g_zfs, zhp, child[c], @@ -7231,8 +7251,7 @@ collect_list_stats(zpool_handle_t *zhp, const char *name, nvlist_t *nv, if (cb->cb_json) { l2c = fnvlist_alloc(); } else { - /* LINTED E_SEC_PRINTF_VAR_FMT */ - (void) printf(dashes, cb->cb_namewidth, "cache"); + print_line(cb, "cache"); } for (c = 0; c < children; c++) { vname = zpool_vdev_name(g_zfs, zhp, child[c], @@ -7253,8 +7272,7 @@ collect_list_stats(zpool_handle_t *zhp, const char *name, nvlist_t *nv, if (cb->cb_json) { sp = fnvlist_alloc(); } else { - /* LINTED E_SEC_PRINTF_VAR_FMT */ - (void) printf(dashes, cb->cb_namewidth, "spare"); + print_line(cb, "spare"); } for (c = 0; c < children; c++) { vname = zpool_vdev_name(g_zfs, zhp, child[c], @@ -7497,7 +7515,7 @@ zpool_do_list(int argc, char **argv) if (!cb.cb_scripted && (first || cb.cb_verbose) && !cb.cb_json) { - print_header(&cb); + print_line(&cb, NULL); first = B_FALSE; } ret = pool_list_iter(list, B_TRUE, list_callback, &cb); diff --git a/sys/contrib/openzfs/cmd/ztest.c b/sys/contrib/openzfs/cmd/ztest.c index dc8ac85b6991..35929cbcfffb 100644 --- a/sys/contrib/openzfs/cmd/ztest.c +++ b/sys/contrib/openzfs/cmd/ztest.c @@ -8143,7 +8143,7 @@ ztest_raidz_expand_run(ztest_shared_t *zs, spa_t *spa) /* Setup a 1 MiB buffer of random data */ uint64_t bufsize = 1024 * 1024; void *buffer = umem_alloc(bufsize, UMEM_NOFAIL); - random_get_pseudo_bytes((uint8_t *)&buffer, bufsize); + random_get_pseudo_bytes((uint8_t *)buffer, bufsize); /* * Put some data in the pool and then attach a vdev to initiate diff --git a/sys/contrib/openzfs/config/deb.am b/sys/contrib/openzfs/config/deb.am index 3e9a9379712e..33e2520224ef 100644 --- a/sys/contrib/openzfs/config/deb.am +++ b/sys/contrib/openzfs/config/deb.am @@ -57,22 +57,21 @@ deb-utils: deb-local rpm-utils-initramfs debarch=`$(DPKG) --print-architecture`; \ pkg1=$${name}-$${version}.$${arch}.rpm; \ pkg2=libnvpair3-$${version}.$${arch}.rpm; \ - pkg3=libuutil3-$${version}.$${arch}.rpm; \ - pkg4=libzfs7-$${version}.$${arch}.rpm; \ - pkg5=libzpool7-$${version}.$${arch}.rpm; \ - pkg6=libzfs7-devel-$${version}.$${arch}.rpm; \ - pkg7=$${name}-test-$${version}.$${arch}.rpm; \ - pkg8=$${name}-dracut-$${version}.noarch.rpm; \ - pkg9=$${name}-initramfs-$${version}.$${arch}.rpm; \ - pkg10=`ls python3-pyzfs-$${version}.noarch.rpm 2>/dev/null`; \ - pkg11=`ls pam_zfs_key-$${version}.$${arch}.rpm 2>/dev/null`; \ + pkg3=libzfs7-$${version}.$${arch}.rpm; \ + pkg4=libzpool7-$${version}.$${arch}.rpm; \ + pkg5=libzfs7-devel-$${version}.$${arch}.rpm; \ + pkg6=$${name}-test-$${version}.$${arch}.rpm; \ + pkg7=$${name}-dracut-$${version}.noarch.rpm; \ + pkg8=$${name}-initramfs-$${version}.$${arch}.rpm; \ + pkg9=`ls python3-pyzfs-$${version}.noarch.rpm 2>/dev/null`; \ + pkg10=`ls pam_zfs_key-$${version}.$${arch}.rpm 2>/dev/null`; \ ## Arguments need to be passed to dh_shlibdeps. Alien provides no mechanism ## to do this, so we install a shim onto the path which calls the real ## dh_shlibdeps with the required arguments. path_prepend=`mktemp -d /tmp/intercept.XXXXXX`; \ echo "#!$(SHELL)" > $${path_prepend}/dh_shlibdeps; \ echo "`which dh_shlibdeps` -- \ - -xlibuutil3linux -xlibnvpair3linux -xlibzfs7linux -xlibzpool7linux" \ + -xlibnvpair3linux -xlibzfs7linux -xlibzpool7linux" \ >> $${path_prepend}/dh_shlibdeps; \ ## These -x arguments are passed to dpkg-shlibdeps, which exclude the ## Debianized packages from the auto-generated dependencies of the new debs, diff --git a/sys/contrib/openzfs/config/kernel-kmap-atomic-args.m4 b/sys/contrib/openzfs/config/kernel-kmap-atomic-args.m4 index 1172505afc68..cedadf3b3d8b 100644 --- a/sys/contrib/openzfs/config/kernel-kmap-atomic-args.m4 +++ b/sys/contrib/openzfs/config/kernel-kmap-atomic-args.m4 @@ -7,7 +7,7 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_KMAP_ATOMIC_ARGS], [ ZFS_LINUX_TEST_SRC([kmap_atomic], [ #include <linux/pagemap.h> ],[ - struct page page; + struct page page = {}; kmap_atomic(&page); ]) ]) diff --git a/sys/contrib/openzfs/contrib/debian/Makefile.am b/sys/contrib/openzfs/contrib/debian/Makefile.am index 3c219856005e..6dafc90fd4e1 100644 --- a/sys/contrib/openzfs/contrib/debian/Makefile.am +++ b/sys/contrib/openzfs/contrib/debian/Makefile.am @@ -10,8 +10,6 @@ dist_noinst_DATA += %D%/openzfs-libnvpair3.install.in dist_noinst_DATA += %D%/openzfs-libpam-zfs.install dist_noinst_DATA += %D%/openzfs-libpam-zfs.postinst dist_noinst_DATA += %D%/openzfs-libpam-zfs.prerm -dist_noinst_DATA += %D%/openzfs-libuutil3.docs -dist_noinst_DATA += %D%/openzfs-libuutil3.install.in dist_noinst_DATA += %D%/openzfs-libzfs7.docs dist_noinst_DATA += %D%/openzfs-libzfs7.install.in dist_noinst_DATA += %D%/openzfs-libzfsbootenv1.docs diff --git a/sys/contrib/openzfs/contrib/debian/clean b/sys/contrib/openzfs/contrib/debian/clean index caabcd30c62a..65c0680c5e1c 100644 --- a/sys/contrib/openzfs/contrib/debian/clean +++ b/sys/contrib/openzfs/contrib/debian/clean @@ -5,7 +5,6 @@ contrib/pyzfs/libzfs_core/__pycache__/ contrib/pyzfs/libzfs_core/bindings/__pycache__/ contrib/pyzfs/pyzfs.egg-info/ debian/openzfs-libnvpair3.install -debian/openzfs-libuutil3.install debian/openzfs-libzfs7.install debian/openzfs-libzfs-dev.install debian/openzfs-libzpool7.install diff --git a/sys/contrib/openzfs/contrib/debian/control b/sys/contrib/openzfs/contrib/debian/control index a886c2e86cc5..3274217a8461 100644 --- a/sys/contrib/openzfs/contrib/debian/control +++ b/sys/contrib/openzfs/contrib/debian/control @@ -55,42 +55,23 @@ Description: PAM module for managing encryption keys for ZFS This provides a Pluggable Authentication Module (PAM) that automatically unlocks encrypted ZFS datasets upon login. -Package: openzfs-libuutil3 -Section: contrib/libs -Architecture: linux-any -Depends: ${misc:Depends}, ${shlibs:Depends} -Breaks: libuutil1, libuutil3 -Replaces: libuutil1, libuutil3, libuutil3linux -Conflicts: libuutil3linux -Description: Solaris userland utility library for Linux - This library provides a variety of glue functions for ZFS on Linux: - * libspl: The Solaris Porting Layer userland library, which provides APIs - that make it possible to run Solaris user code in a Linux environment - with relatively minimal modification. - * libavl: The Adelson-Velskii Landis balanced binary tree manipulation - library. - * libefi: The Extensible Firmware Interface library for GUID disk - partitioning. - * libshare: NFS, SMB, and iSCSI service integration for ZFS. - Package: openzfs-libzfs-dev Section: contrib/libdevel Architecture: linux-any Depends: libssl-dev | libssl1.0-dev, openzfs-libnvpair3 (= ${binary:Version}), - openzfs-libuutil3 (= ${binary:Version}), openzfs-libzfs7 (= ${binary:Version}), openzfs-libzfsbootenv1 (= ${binary:Version}), openzfs-libzpool7 (= ${binary:Version}), ${misc:Depends} Replaces: libzfslinux-dev Conflicts: libzfslinux-dev -Provides: libnvpair-dev, libuutil-dev +Provides: libnvpair-dev Description: OpenZFS filesystem development files for Linux Header files and static libraries for compiling software against libraries of OpenZFS filesystem. . - This package includes the development files of libnvpair3, libuutil3, + This package includes the development files of libnvpair3, libzpool7 and libzfs7. Package: openzfs-libzfs7 @@ -246,7 +227,6 @@ Section: contrib/admin Architecture: linux-any Pre-Depends: ${misc:Pre-Depends} Depends: openzfs-libnvpair3 (= ${binary:Version}), - openzfs-libuutil3 (= ${binary:Version}), openzfs-libzfs7 (= ${binary:Version}), openzfs-libzpool7 (= ${binary:Version}), python3, diff --git a/sys/contrib/openzfs/contrib/debian/openzfs-libuutil3.docs b/sys/contrib/openzfs/contrib/debian/openzfs-libuutil3.docs deleted file mode 100644 index 4302f1b2ab6a..000000000000 --- a/sys/contrib/openzfs/contrib/debian/openzfs-libuutil3.docs +++ /dev/null @@ -1,2 +0,0 @@ -COPYRIGHT -LICENSE diff --git a/sys/contrib/openzfs/contrib/debian/openzfs-libuutil3.install.in b/sys/contrib/openzfs/contrib/debian/openzfs-libuutil3.install.in deleted file mode 100644 index bb33386791e1..000000000000 --- a/sys/contrib/openzfs/contrib/debian/openzfs-libuutil3.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/libuutil.so.* diff --git a/sys/contrib/openzfs/contrib/pam_zfs_key/Makefile.am b/sys/contrib/openzfs/contrib/pam_zfs_key/Makefile.am index aaa608b7da2b..8111f101a657 100644 --- a/sys/contrib/openzfs/contrib/pam_zfs_key/Makefile.am +++ b/sys/contrib/openzfs/contrib/pam_zfs_key/Makefile.am @@ -7,7 +7,6 @@ pammodule_LTLIBRARIES = %D%/pam_zfs_key.la %C%_pam_zfs_key_la_LIBADD = \ libnvpair.la \ - libuutil.la \ libzfs.la \ libzfs_core.la diff --git a/sys/contrib/openzfs/include/Makefile.am b/sys/contrib/openzfs/include/Makefile.am index 42457519e746..cc79c1a3ddb2 100644 --- a/sys/contrib/openzfs/include/Makefile.am +++ b/sys/contrib/openzfs/include/Makefile.am @@ -184,16 +184,12 @@ KERNEL_H = \ USER_H = \ libnvpair.h \ - libuutil.h \ - libuutil_common.h \ - libuutil_impl.h \ libzdb.h \ libzfs.h \ libzfs_core.h \ libzfsbootenv.h \ libzpool.h \ - libzutil.h \ - thread_pool.h + libzutil.h if CONFIG_USER diff --git a/sys/contrib/openzfs/include/libuutil.h b/sys/contrib/openzfs/include/libuutil.h deleted file mode 100644 index 0ef6f4cfbadc..000000000000 --- a/sys/contrib/openzfs/include/libuutil.h +++ /dev/null @@ -1,327 +0,0 @@ -// 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) 2004, 2010, Oracle and/or its affiliates. All rights reserved. - */ - -#ifndef _LIBUUTIL_H -#define _LIBUUTIL_H - -#include <sys/types.h> -#include <stdarg.h> -#include <stdio.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Standard flags codes. - */ -#define UU_DEFAULT 0 - -/* - * Standard error codes. - */ -#define UU_ERROR_NONE 0 /* no error */ -#define UU_ERROR_INVALID_ARGUMENT 1 /* invalid argument */ -#define UU_ERROR_UNKNOWN_FLAG 2 /* passed flag invalid */ -#define UU_ERROR_NO_MEMORY 3 /* out of memory */ -#define UU_ERROR_CALLBACK_FAILED 4 /* callback-initiated error */ -#define UU_ERROR_NOT_SUPPORTED 5 /* operation not supported */ -#define UU_ERROR_EMPTY 6 /* no value provided */ -#define UU_ERROR_UNDERFLOW 7 /* value is too small */ -#define UU_ERROR_OVERFLOW 8 /* value is too value */ -#define UU_ERROR_INVALID_CHAR 9 /* value contains unexpected char */ -#define UU_ERROR_INVALID_DIGIT 10 /* value contains digit not in base */ - -#define UU_ERROR_SYSTEM 99 /* underlying system error */ -#define UU_ERROR_UNKNOWN 100 /* error status not known */ - -/* - * Exit status profiles. - */ -#define UU_PROFILE_DEFAULT 0 -#define UU_PROFILE_LAUNCHER 1 - -/* - * Error reporting functions. - */ -uint32_t uu_error(void); -const char *uu_strerror(uint32_t); - -/* - * Identifier test flags and function. - */ -#define UU_NAME_DOMAIN 0x1 /* allow SUNW, or com.sun, prefix */ -#define UU_NAME_PATH 0x2 /* allow '/'-delimited paths */ - -int uu_check_name(const char *, uint_t); - -/* - * Convenience functions. - */ -#define UU_NELEM(a) (sizeof (a) / sizeof ((a)[0])) - -extern char *uu_msprintf(const char *format, ...) - __attribute__((format(printf, 1, 2))); -extern void *uu_zalloc(size_t); -extern char *uu_strdup(const char *); -extern void uu_free(void *); - -extern boolean_t uu_strcaseeq(const char *a, const char *b); -extern boolean_t uu_streq(const char *a, const char *b); -extern char *uu_strndup(const char *s, size_t n); -extern boolean_t uu_strbw(const char *a, const char *b); -extern void *uu_memdup(const void *buf, size_t sz); - -/* - * Comparison function type definition. - * Developers should be careful in their use of the _private argument. If you - * break interface guarantees, you get undefined behavior. - */ -typedef int uu_compare_fn_t(const void *__left, const void *__right, - void *__private); - -/* - * Walk variant flags. - * A data structure need not provide support for all variants and - * combinations. Refer to the appropriate documentation. - */ -#define UU_WALK_ROBUST 0x00000001 /* walk can survive removes */ -#define UU_WALK_REVERSE 0x00000002 /* reverse walk order */ - -#define UU_WALK_PREORDER 0x00000010 /* walk tree in pre-order */ -#define UU_WALK_POSTORDER 0x00000020 /* walk tree in post-order */ - -/* - * Walk callback function return codes. - */ -#define UU_WALK_ERROR -1 -#define UU_WALK_NEXT 0 -#define UU_WALK_DONE 1 - -/* - * Walk callback function type definition. - */ -typedef int uu_walk_fn_t(void *_elem, void *_private); - -/* - * lists: opaque structures - */ -typedef struct uu_list_pool uu_list_pool_t; -typedef struct uu_list uu_list_t; - -typedef struct uu_list_node { - uintptr_t uln_opaque[2]; -} uu_list_node_t; - -typedef struct uu_list_walk uu_list_walk_t; - -typedef uintptr_t uu_list_index_t; - -/* - * lists: interface - * - * basic usage: - * typedef struct foo { - * ... - * uu_list_node_t foo_node; - * ... - * } foo_t; - * - * static int - * foo_compare(void *l_arg, void *r_arg, void *private) - * { - * foo_t *l = l_arg; - * foo_t *r = r_arg; - * - * if (... l greater than r ...) - * return (1); - * if (... l less than r ...) - * return (-1); - * return (0); - * } - * - * ... - * // at initialization time - * foo_pool = uu_list_pool_create("foo_pool", - * sizeof (foo_t), offsetof(foo_t, foo_node), foo_compare, - * debugging? 0 : UU_AVL_POOL_DEBUG); - * ... - */ -uu_list_pool_t *uu_list_pool_create(const char *, size_t, size_t, - uu_compare_fn_t *, uint32_t); -#define UU_LIST_POOL_DEBUG 0x00000001 - -void uu_list_pool_destroy(uu_list_pool_t *); - -/* - * usage: - * - * foo_t *a; - * a = malloc(sizeof (*a)); - * uu_list_node_init(a, &a->foo_list, pool); - * ... - * uu_list_node_fini(a, &a->foo_list, pool); - * free(a); - */ -void uu_list_node_init(void *, uu_list_node_t *, uu_list_pool_t *); -void uu_list_node_fini(void *, uu_list_node_t *, uu_list_pool_t *); - -uu_list_t *uu_list_create(uu_list_pool_t *, void *_parent, uint32_t); -#define UU_LIST_DEBUG 0x00000001 -#define UU_LIST_SORTED 0x00000002 /* list is sorted */ - -void uu_list_destroy(uu_list_t *); /* list must be empty */ - -size_t uu_list_numnodes(uu_list_t *); - -void *uu_list_first(uu_list_t *); -void *uu_list_last(uu_list_t *); - -void *uu_list_next(uu_list_t *, void *); -void *uu_list_prev(uu_list_t *, void *); - -int uu_list_walk(uu_list_t *, uu_walk_fn_t *, void *, uint32_t); - -uu_list_walk_t *uu_list_walk_start(uu_list_t *, uint32_t); -void *uu_list_walk_next(uu_list_walk_t *); -void uu_list_walk_end(uu_list_walk_t *); - -void *uu_list_find(uu_list_t *, void *, void *, uu_list_index_t *); -void uu_list_insert(uu_list_t *, void *, uu_list_index_t); - -void *uu_list_nearest_next(uu_list_t *, uu_list_index_t); -void *uu_list_nearest_prev(uu_list_t *, uu_list_index_t); - -void *uu_list_teardown(uu_list_t *, void **); - -void uu_list_remove(uu_list_t *, void *); - -/* - * lists: interfaces for non-sorted lists only - */ -int uu_list_insert_before(uu_list_t *, void *_target, void *_elem); -int uu_list_insert_after(uu_list_t *, void *_target, void *_elem); - -/* - * avl trees: opaque structures - */ -typedef struct uu_avl_pool uu_avl_pool_t; -typedef struct uu_avl uu_avl_t; - -typedef struct uu_avl_node { -#ifdef _LP64 - uintptr_t uan_opaque[3]; -#else - uintptr_t uan_opaque[4]; -#endif -} uu_avl_node_t; - -typedef struct uu_avl_walk uu_avl_walk_t; - -typedef uintptr_t uu_avl_index_t; - -/* - * avl trees: interface - * - * basic usage: - * typedef struct foo { - * ... - * uu_avl_node_t foo_node; - * ... - * } foo_t; - * - * static int - * foo_compare(void *l_arg, void *r_arg, void *private) - * { - * foo_t *l = l_arg; - * foo_t *r = r_arg; - * - * if (... l greater than r ...) - * return (1); - * if (... l less than r ...) - * return (-1); - * return (0); - * } - * - * ... - * // at initialization time - * foo_pool = uu_avl_pool_create("foo_pool", - * sizeof (foo_t), offsetof(foo_t, foo_node), foo_compare, - * debugging? 0 : UU_AVL_POOL_DEBUG); - * ... - */ -uu_avl_pool_t *uu_avl_pool_create(const char *, size_t, size_t, - uu_compare_fn_t *, uint32_t); -#define UU_AVL_POOL_DEBUG 0x00000001 - -void uu_avl_pool_destroy(uu_avl_pool_t *); - -/* - * usage: - * - * foo_t *a; - * a = malloc(sizeof (*a)); - * uu_avl_node_init(a, &a->foo_avl, pool); - * ... - * uu_avl_node_fini(a, &a->foo_avl, pool); - * free(a); - */ -void uu_avl_node_init(void *, uu_avl_node_t *, uu_avl_pool_t *); -void uu_avl_node_fini(void *, uu_avl_node_t *, uu_avl_pool_t *); - -uu_avl_t *uu_avl_create(uu_avl_pool_t *, void *_parent, uint32_t); -#define UU_AVL_DEBUG 0x00000001 - -void uu_avl_destroy(uu_avl_t *); /* list must be empty */ - -size_t uu_avl_numnodes(uu_avl_t *); - -void *uu_avl_first(uu_avl_t *); -void *uu_avl_last(uu_avl_t *); - -void *uu_avl_next(uu_avl_t *, void *); -void *uu_avl_prev(uu_avl_t *, void *); - -int uu_avl_walk(uu_avl_t *, uu_walk_fn_t *, void *, uint32_t); - -uu_avl_walk_t *uu_avl_walk_start(uu_avl_t *, uint32_t); -void *uu_avl_walk_next(uu_avl_walk_t *); -void uu_avl_walk_end(uu_avl_walk_t *); - -void *uu_avl_find(uu_avl_t *, void *, void *, uu_avl_index_t *); -void uu_avl_insert(uu_avl_t *, void *, uu_avl_index_t); - -void *uu_avl_nearest_next(uu_avl_t *, uu_avl_index_t); -void *uu_avl_nearest_prev(uu_avl_t *, uu_avl_index_t); - -void *uu_avl_teardown(uu_avl_t *, void **); - -void uu_avl_remove(uu_avl_t *, void *); - -#ifdef __cplusplus -} -#endif - -#endif /* _LIBUUTIL_H */ diff --git a/sys/contrib/openzfs/include/libuutil_common.h b/sys/contrib/openzfs/include/libuutil_common.h deleted file mode 100644 index 4fb0e3c54f6e..000000000000 --- a/sys/contrib/openzfs/include/libuutil_common.h +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: CDDL-1.0 -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or https://opensource.org/licenses/CDDL-1.0. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ - -/* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#ifndef _LIBUUTIL_COMMON_H -#define _LIBUUTIL_COMMON_H - - - -#include <libuutil.h> -#include <libuutil_impl.h> - -#endif /* _LIBUUTIL_COMMON_H */ diff --git a/sys/contrib/openzfs/include/libuutil_impl.h b/sys/contrib/openzfs/include/libuutil_impl.h deleted file mode 100644 index 92ba0e68ade4..000000000000 --- a/sys/contrib/openzfs/include/libuutil_impl.h +++ /dev/null @@ -1,157 +0,0 @@ -// 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 2005 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#ifndef _LIBUUTIL_IMPL_H -#define _LIBUUTIL_IMPL_H - - - -#include <libuutil.h> -#include <pthread.h> - -#include <sys/avl_impl.h> -#include <sys/byteorder.h> - -#ifdef __cplusplus -extern "C" { -#endif - -void uu_set_error(uint_t); - - -__attribute__((format(printf, 1, 2), __noreturn__)) -void uu_panic(const char *format, ...); - - -/* - * uu_list structures - */ -typedef struct uu_list_node_impl { - struct uu_list_node_impl *uln_next; - struct uu_list_node_impl *uln_prev; -} uu_list_node_impl_t; - -struct uu_list_walk { - uu_list_walk_t *ulw_next; - uu_list_walk_t *ulw_prev; - - uu_list_t *ulw_list; - int8_t ulw_dir; - uint8_t ulw_robust; - uu_list_node_impl_t *ulw_next_result; -}; - -struct uu_list { - uu_list_t *ul_next; - uu_list_t *ul_prev; - - uu_list_pool_t *ul_pool; - void *ul_parent; - size_t ul_offset; - size_t ul_numnodes; - uint8_t ul_debug; - uint8_t ul_sorted; - uint8_t ul_index; /* mark for uu_list_index_ts */ - - uu_list_node_impl_t ul_null_node; - uu_list_walk_t ul_null_walk; /* for robust walkers */ -}; - -#define UU_LIST_POOL_MAXNAME 64 - -struct uu_list_pool { - uu_list_pool_t *ulp_next; - uu_list_pool_t *ulp_prev; - - char ulp_name[UU_LIST_POOL_MAXNAME]; - size_t ulp_nodeoffset; - size_t ulp_objsize; - uu_compare_fn_t *ulp_cmp; - uint8_t ulp_debug; - uint8_t ulp_last_index; - pthread_mutex_t ulp_lock; /* protects null_list */ - uu_list_t ulp_null_list; -}; - -/* - * uu_avl structures - */ -typedef struct avl_node uu_avl_node_impl_t; - -struct uu_avl_walk { - uu_avl_walk_t *uaw_next; - uu_avl_walk_t *uaw_prev; - - uu_avl_t *uaw_avl; - void *uaw_next_result; - int8_t uaw_dir; - uint8_t uaw_robust; -}; - -struct uu_avl { - uu_avl_t *ua_next; - uu_avl_t *ua_prev; - - uu_avl_pool_t *ua_pool; - void *ua_parent; - uint8_t ua_debug; - uint8_t ua_index; /* mark for uu_avl_index_ts */ - - struct avl_tree ua_tree; - uu_avl_walk_t ua_null_walk; -}; - -#define UU_AVL_POOL_MAXNAME 64 - -struct uu_avl_pool { - uu_avl_pool_t *uap_next; - uu_avl_pool_t *uap_prev; - - char uap_name[UU_AVL_POOL_MAXNAME]; - size_t uap_nodeoffset; - size_t uap_objsize; - uu_compare_fn_t *uap_cmp; - uint8_t uap_debug; - uint8_t uap_last_index; - pthread_mutex_t uap_lock; /* protects null_avl */ - uu_avl_t uap_null_avl; -}; - -/* - * atfork() handlers - */ -void uu_avl_lockup(void); -void uu_avl_release(void); - -void uu_list_lockup(void); -void uu_list_release(void); - -#ifdef __cplusplus -} -#endif - -#endif /* _LIBUUTIL_IMPL_H */ diff --git a/sys/contrib/openzfs/include/os/freebsd/spl/sys/sysmacros.h b/sys/contrib/openzfs/include/os/freebsd/spl/sys/sysmacros.h index 93c98ef03afd..f92d7ccac411 100644 --- a/sys/contrib/openzfs/include/os/freebsd/spl/sys/sysmacros.h +++ b/sys/contrib/openzfs/include/os/freebsd/spl/sys/sysmacros.h @@ -290,80 +290,11 @@ extern unsigned char bcd_to_byte[256]; #define offsetof(type, field) __offsetof(type, field) #endif -/* - * Find highest one bit set. - * Returns bit number + 1 of highest bit that is set, otherwise returns 0. - * High order bit is 31 (or 63 in _LP64 kernel). - */ -static __inline int -highbit(ulong_t i) -{ -#if defined(HAVE_INLINE_FLSL) - return (flsl(i)); -#else - int h = 1; +#define highbit(x) flsl(x) +#define lowbit(x) ffsl(x) - if (i == 0) - return (0); -#ifdef _LP64 - if (i & 0xffffffff00000000ul) { - h += 32; i >>= 32; - } -#endif - if (i & 0xffff0000) { - h += 16; i >>= 16; - } - if (i & 0xff00) { - h += 8; i >>= 8; - } - if (i & 0xf0) { - h += 4; i >>= 4; - } - if (i & 0xc) { - h += 2; i >>= 2; - } - if (i & 0x2) { - h += 1; - } - return (h); -#endif -} - -/* - * Find highest one bit set. - * Returns bit number + 1 of highest bit that is set, otherwise returns 0. - */ -static __inline int -highbit64(uint64_t i) -{ -#if defined(HAVE_INLINE_FLSLL) - return (flsll(i)); -#else - int h = 1; - - if (i == 0) - return (0); - if (i & 0xffffffff00000000ULL) { - h += 32; i >>= 32; - } - if (i & 0xffff0000) { - h += 16; i >>= 16; - } - if (i & 0xff00) { - h += 8; i >>= 8; - } - if (i & 0xf0) { - h += 4; i >>= 4; - } - if (i & 0xc) { - h += 2; i >>= 2; - } - if (i & 0x2) { - h += 1; - } - return (h); -#endif -} +#define highbit64(x) flsll(x) +#define lowbit64(x) ffsll(x) #ifdef __cplusplus } diff --git a/sys/contrib/openzfs/include/os/freebsd/spl/sys/taskq.h b/sys/contrib/openzfs/include/os/freebsd/spl/sys/taskq.h index 40f1a8ec2c57..949ea4dfaba1 100644 --- a/sys/contrib/openzfs/include/os/freebsd/spl/sys/taskq.h +++ b/sys/contrib/openzfs/include/os/freebsd/spl/sys/taskq.h @@ -107,7 +107,7 @@ extern void taskq_destroy(taskq_t *); extern void taskq_wait_id(taskq_t *, taskqid_t); extern void taskq_wait_outstanding(taskq_t *, taskqid_t); extern void taskq_wait(taskq_t *); -extern int taskq_cancel_id(taskq_t *, taskqid_t); +extern int taskq_cancel_id(taskq_t *, taskqid_t, boolean_t); extern int taskq_member(taskq_t *, kthread_t *); extern taskq_t *taskq_of_curthread(void); void taskq_suspend(taskq_t *); diff --git a/sys/contrib/openzfs/include/os/linux/spl/sys/taskq.h b/sys/contrib/openzfs/include/os/linux/spl/sys/taskq.h index c9b2bc994c8c..108b4fbeec8d 100644 --- a/sys/contrib/openzfs/include/os/linux/spl/sys/taskq.h +++ b/sys/contrib/openzfs/include/os/linux/spl/sys/taskq.h @@ -198,7 +198,7 @@ extern void taskq_destroy(taskq_t *); extern void taskq_wait_id(taskq_t *, taskqid_t); extern void taskq_wait_outstanding(taskq_t *, taskqid_t); extern void taskq_wait(taskq_t *); -extern int taskq_cancel_id(taskq_t *, taskqid_t); +extern int taskq_cancel_id(taskq_t *, taskqid_t, boolean_t); extern int taskq_member(taskq_t *, kthread_t *); extern taskq_t *taskq_of_curthread(void); diff --git a/sys/contrib/openzfs/include/sys/ddt.h b/sys/contrib/openzfs/include/sys/ddt.h index f1687d471a0a..75f0216364f2 100644 --- a/sys/contrib/openzfs/include/sys/ddt.h +++ b/sys/contrib/openzfs/include/sys/ddt.h @@ -33,6 +33,7 @@ #include <sys/fs/zfs.h> #include <sys/zio.h> #include <sys/dmu.h> +#include <sys/wmsum.h> #ifdef __cplusplus extern "C" { @@ -218,6 +219,9 @@ typedef enum { * because its relatively rarely used. */ typedef struct { + /* protects dde_phys, dde_orig_phys and dde_lead_zio during I/O */ + kmutex_t dde_io_lock; + /* copy of data after a repair read, to be rewritten */ abd_t *dde_repair_abd; @@ -296,6 +300,20 @@ typedef struct { kstat_t *ddt_ksp; /* kstats context */ + /* wmsums for hot-path lookup counters */ + wmsum_t ddt_kstat_dds_lookup; + wmsum_t ddt_kstat_dds_lookup_live_hit; + wmsum_t ddt_kstat_dds_lookup_live_wait; + wmsum_t ddt_kstat_dds_lookup_live_miss; + wmsum_t ddt_kstat_dds_lookup_existing; + wmsum_t ddt_kstat_dds_lookup_new; + wmsum_t ddt_kstat_dds_lookup_log_hit; + wmsum_t ddt_kstat_dds_lookup_log_active_hit; + wmsum_t ddt_kstat_dds_lookup_log_flushing_hit; + wmsum_t ddt_kstat_dds_lookup_log_miss; + wmsum_t ddt_kstat_dds_lookup_stored_hit; + wmsum_t ddt_kstat_dds_lookup_stored_miss; + enum zio_checksum ddt_checksum; /* checksum algorithm in use */ spa_t *ddt_spa; /* pool this ddt is on */ objset_t *ddt_os; /* ddt objset (always MOS) */ diff --git a/sys/contrib/openzfs/include/thread_pool.h b/sys/contrib/openzfs/include/thread_pool.h deleted file mode 100644 index b5ef5114641d..000000000000 --- a/sys/contrib/openzfs/include/thread_pool.h +++ /dev/null @@ -1,56 +0,0 @@ -// 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 2006 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#ifndef _THREAD_POOL_H_ -#define _THREAD_POOL_H_ extern __attribute__((visibility("default"))) - -#include <sys/types.h> -#include <pthread.h> - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct tpool tpool_t; /* opaque thread pool descriptor */ - -_THREAD_POOL_H_ tpool_t *tpool_create(uint_t min_threads, uint_t max_threads, - uint_t linger, pthread_attr_t *attr); -_THREAD_POOL_H_ int tpool_dispatch(tpool_t *tpool, - void (*func)(void *), void *arg); -_THREAD_POOL_H_ void tpool_destroy(tpool_t *tpool); -_THREAD_POOL_H_ void tpool_abandon(tpool_t *tpool); -_THREAD_POOL_H_ void tpool_wait(tpool_t *tpool); -_THREAD_POOL_H_ void tpool_suspend(tpool_t *tpool); -_THREAD_POOL_H_ int tpool_suspended(tpool_t *tpool); -_THREAD_POOL_H_ void tpool_resume(tpool_t *tpool); -_THREAD_POOL_H_ int tpool_member(tpool_t *tpool); - -#ifdef __cplusplus -} -#endif - -#endif /* _THREAD_POOL_H_ */ diff --git a/sys/contrib/openzfs/lib/Makefile.am b/sys/contrib/openzfs/lib/Makefile.am index 050a6cac0a37..bb7e4ada4fc7 100644 --- a/sys/contrib/openzfs/lib/Makefile.am +++ b/sys/contrib/openzfs/lib/Makefile.am @@ -16,18 +16,18 @@ # |--libzdb--zdb | | # | | | # libzpool libzfs* ----------------+ -# | | | \ / | | | -# libicp --/ | | \ / | | \------- libshare -# | | \ / | | -# libzstd ---/ | \ / | \--------- libuutil -# | \ / \ | | -# libunicode --/ \ / \ | | -# \ / \ | | +# | | | \ / | | |\ +# libicp --/ | | \ / | \ | \----- libshare +# | | \ / | \ \ +# libzstd ---/ | \ / | \ \-------\ +# | \ / \ \ \ +# libunicode --/ \ / \ \-------\ \ +# \ / \ \ | # libzutil libzfs_core* | | -# | | | | \ | | | | -# | | | | | | | | | -# | | | | | | | | | -# libtpool -------------/ | | | \---- libnvpair* | | | +# | | | \ | | | | +# | | | | | | | | +# | | | | | | | | +# | | | \---- libnvpair* | | | # | | | | | | # libefi -----------------/ | \------ libavl* --------/ | # | | | @@ -41,8 +41,7 @@ # when performing an ABI check the following options are applied: # # --no-unreferenced-symbols: Exclude symbols which are not referenced by -# any debug information. Without this _init() and _fini() are incorrectly -# reported on CentOS7 for libuutil.so. +# any debug information. # # --headers-dir1: Limit ABI checks to public OpenZFS headers, otherwise # changes in public system headers are also reported. @@ -59,9 +58,7 @@ include $(srcdir)/%D%/libicp/Makefile.am include $(srcdir)/%D%/libnvpair/Makefile.am include $(srcdir)/%D%/libshare/Makefile.am include $(srcdir)/%D%/libspl/Makefile.am -include $(srcdir)/%D%/libtpool/Makefile.am include $(srcdir)/%D%/libunicode/Makefile.am -include $(srcdir)/%D%/libuutil/Makefile.am include $(srcdir)/%D%/libzdb/Makefile.am include $(srcdir)/%D%/libzfs_core/Makefile.am include $(srcdir)/%D%/libzfs/Makefile.am diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/taskq.h b/sys/contrib/openzfs/lib/libspl/include/sys/taskq.h index fbe3f388c05f..fddc833b92d2 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/taskq.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/taskq.h @@ -31,6 +31,8 @@ #include <pthread.h> #include <stdint.h> +#include <sys/kmem.h> +#include <sys/thread.h> #include <sys/mutex.h> #include <sys/rwlock.h> #include <sys/condvar.h> @@ -112,7 +114,7 @@ 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 int taskq_cancel_id(taskq_t *, taskqid_t, boolean_t); extern void system_taskq_init(void); extern void system_taskq_fini(void); diff --git a/sys/contrib/openzfs/lib/libspl/include/sys/types.h b/sys/contrib/openzfs/lib/libspl/include/sys/types.h index 9af20d781674..37cf1d241d6d 100644 --- a/sys/contrib/openzfs/lib/libspl/include/sys/types.h +++ b/sys/contrib/openzfs/lib/libspl/include/sys/types.h @@ -54,4 +54,15 @@ typedef int projid_t; typedef off_t loff_t; #endif +/* + * On musl, loff_t is a macro within fcntl.h when _GNU_SOURCE is defined. + * If no macro is defined, a typedef fallback is provided. + */ +#if defined(__linux__) && !defined(__GLIBC__) +#include <fcntl.h> +#ifndef loff_t +typedef off_t loff_t; +#endif +#endif + #endif diff --git a/sys/contrib/openzfs/lib/libspl/taskq.c b/sys/contrib/openzfs/lib/libspl/taskq.c index 043f70225551..3d1a4f277f27 100644 --- a/sys/contrib/openzfs/lib/libspl/taskq.c +++ b/sys/contrib/openzfs/lib/libspl/taskq.c @@ -35,6 +35,10 @@ #include <sys/thread.h> #include <sys/taskq.h> #include <sys/kmem.h> +#include <pthread.h> + +static pthread_key_t taskq_tsd; +static pthread_once_t taskq_tsd_once = PTHREAD_ONCE_INIT; static taskq_t *__system_taskq = NULL; static taskq_t *__system_delay_taskq = NULL; @@ -51,8 +55,6 @@ taskq_t return (__system_delay_taskq); } -static pthread_key_t taskq_tsd; - #define TASKQ_ACTIVE 0x00010000 static taskq_ent_t * @@ -223,6 +225,12 @@ taskq_wait_outstanding(taskq_t *tq, taskqid_t id) taskq_wait(tq); } +static void +taskq_tsd_init(void) +{ + VERIFY0(pthread_key_create(&taskq_tsd, NULL)); +} + static __attribute__((noreturn)) void taskq_thread(void *arg) { @@ -230,6 +238,7 @@ taskq_thread(void *arg) taskq_ent_t *t; boolean_t prealloc; + pthread_once(&taskq_tsd_once, taskq_tsd_init); VERIFY0(pthread_setspecific(taskq_tsd, tq)); mutex_enter(&tq->tq_lock); @@ -398,16 +407,15 @@ taskq_of_curthread(void) } int -taskq_cancel_id(taskq_t *tq, taskqid_t id) +taskq_cancel_id(taskq_t *tq, taskqid_t id, boolean_t wait) { - (void) tq, (void) id; + (void) tq, (void) id, (void) wait; return (ENOENT); } void system_taskq_init(void) { - VERIFY0(pthread_key_create(&taskq_tsd, NULL)); __system_taskq = taskq_create("system_taskq", 64, maxclsyspri, 4, 512, TASKQ_DYNAMIC | TASKQ_PREPOPULATE); __system_delay_taskq = taskq_create("delay_taskq", 4, maxclsyspri, 4, @@ -421,5 +429,4 @@ system_taskq_fini(void) __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/tunables.c b/sys/contrib/openzfs/lib/libspl/tunables.c index 67dc9710dee8..2e4b43d99259 100644 --- a/sys/contrib/openzfs/lib/libspl/tunables.c +++ b/sys/contrib/openzfs/lib/libspl/tunables.c @@ -124,10 +124,12 @@ zfs_tunable_parse_int(const char *val, intmax_t *np, { intmax_t n; char *end; + int err; + errno = 0; n = strtoimax(val, &end, 0); - if (errno != 0) - return (errno); + if ((err = errno) != 0) + return (err); if (*end != '\0') return (EINVAL); if (n < min || n > max) @@ -142,10 +144,12 @@ zfs_tunable_parse_uint(const char *val, uintmax_t *np, { uintmax_t n; char *end; + int err; + errno = 0; n = strtoumax(val, &end, 0); - if (errno != 0) - return (errno); + if ((err = errno) != 0) + return (err); if (*end != '\0') return (EINVAL); if (strchr(val, '-')) diff --git a/sys/contrib/openzfs/lib/libtpool/Makefile.am b/sys/contrib/openzfs/lib/libtpool/Makefile.am deleted file mode 100644 index 5a2b8a5701da..000000000000 --- a/sys/contrib/openzfs/lib/libtpool/Makefile.am +++ /dev/null @@ -1,11 +0,0 @@ -libtpool_la_CFLAGS = $(AM_CFLAGS) $(LIBRARY_CFLAGS) -libtpool_la_CFLAGS += -fvisibility=hidden -# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61118 -libtpool_la_CFLAGS += $(NO_CLOBBERED) - -noinst_LTLIBRARIES += libtpool.la -CPPCHECKTARGETS += libtpool.la - -libtpool_la_SOURCES = \ - %D%/thread_pool.c \ - %D%/thread_pool_impl.h diff --git a/sys/contrib/openzfs/lib/libtpool/thread_pool.c b/sys/contrib/openzfs/lib/libtpool/thread_pool.c deleted file mode 100644 index 39b92ae81166..000000000000 --- a/sys/contrib/openzfs/lib/libtpool/thread_pool.c +++ /dev/null @@ -1,612 +0,0 @@ -// SPDX-License-Identifier: CDDL-1.0 -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or https://opensource.org/licenses/CDDL-1.0. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ - -/* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#include <stdlib.h> -#include <signal.h> -#include <errno.h> -#include <assert.h> -#include <limits.h> -#include "thread_pool_impl.h" - -static pthread_mutex_t thread_pool_lock = PTHREAD_MUTEX_INITIALIZER; -static tpool_t *thread_pools = NULL; - -static void -delete_pool(tpool_t *tpool) -{ - tpool_job_t *job; - - ASSERT(tpool->tp_current == 0 && tpool->tp_active == NULL); - - /* - * Unlink the pool from the global list of all pools. - */ - (void) pthread_mutex_lock(&thread_pool_lock); - if (thread_pools == tpool) - thread_pools = tpool->tp_forw; - if (thread_pools == tpool) - thread_pools = NULL; - else { - tpool->tp_back->tp_forw = tpool->tp_forw; - tpool->tp_forw->tp_back = tpool->tp_back; - } - pthread_mutex_unlock(&thread_pool_lock); - - /* - * There should be no pending jobs, but just in case... - */ - for (job = tpool->tp_head; job != NULL; job = tpool->tp_head) { - tpool->tp_head = job->tpj_next; - free(job); - } - (void) pthread_attr_destroy(&tpool->tp_attr); - free(tpool); -} - -/* - * Worker thread is terminating. - */ -static void -worker_cleanup(void *arg) -{ - tpool_t *tpool = (tpool_t *)arg; - - if (--tpool->tp_current == 0 && - (tpool->tp_flags & (TP_DESTROY | TP_ABANDON))) { - if (tpool->tp_flags & TP_ABANDON) { - pthread_mutex_unlock(&tpool->tp_mutex); - delete_pool(tpool); - return; - } - if (tpool->tp_flags & TP_DESTROY) - (void) pthread_cond_broadcast(&tpool->tp_busycv); - } - pthread_mutex_unlock(&tpool->tp_mutex); -} - -static void -notify_waiters(tpool_t *tpool) -{ - if (tpool->tp_head == NULL && tpool->tp_active == NULL) { - tpool->tp_flags &= ~TP_WAIT; - (void) pthread_cond_broadcast(&tpool->tp_waitcv); - } -} - -/* - * Called by a worker thread on return from a tpool_dispatch()d job. - */ -static void -job_cleanup(void *arg) -{ - tpool_t *tpool = (tpool_t *)arg; - - pthread_t my_tid = pthread_self(); - tpool_active_t *activep; - tpool_active_t **activepp; - - pthread_mutex_lock(&tpool->tp_mutex); - for (activepp = &tpool->tp_active; ; activepp = &activep->tpa_next) { - activep = *activepp; - if (activep->tpa_tid == my_tid) { - *activepp = activep->tpa_next; - break; - } - } - if (tpool->tp_flags & TP_WAIT) - notify_waiters(tpool); -} - -static void * -tpool_worker(void *arg) -{ - tpool_t *tpool = (tpool_t *)arg; - int elapsed; - tpool_job_t *job; - void (*func)(void *); - tpool_active_t active; - - pthread_mutex_lock(&tpool->tp_mutex); - pthread_cleanup_push(worker_cleanup, tpool); - - /* - * This is the worker's main loop. - * It will only be left if a timeout or an error has occurred. - */ - active.tpa_tid = pthread_self(); - for (;;) { - elapsed = 0; - tpool->tp_idle++; - if (tpool->tp_flags & TP_WAIT) - notify_waiters(tpool); - while ((tpool->tp_head == NULL || - (tpool->tp_flags & TP_SUSPEND)) && - !(tpool->tp_flags & (TP_DESTROY | TP_ABANDON))) { - if (tpool->tp_current <= tpool->tp_minimum || - tpool->tp_linger == 0) { - (void) pthread_cond_wait(&tpool->tp_workcv, - &tpool->tp_mutex); - } else { - struct timespec ts; - - clock_gettime(CLOCK_REALTIME, &ts); - ts.tv_sec += tpool->tp_linger; - - if (pthread_cond_timedwait(&tpool->tp_workcv, - &tpool->tp_mutex, &ts) != 0) { - elapsed = 1; - break; - } - } - } - tpool->tp_idle--; - if (tpool->tp_flags & TP_DESTROY) - break; - if (tpool->tp_flags & TP_ABANDON) { - /* can't abandon a suspended pool */ - if (tpool->tp_flags & TP_SUSPEND) { - tpool->tp_flags &= ~TP_SUSPEND; - (void) pthread_cond_broadcast( - &tpool->tp_workcv); - } - if (tpool->tp_head == NULL) - break; - } - if ((job = tpool->tp_head) != NULL && - !(tpool->tp_flags & TP_SUSPEND)) { - elapsed = 0; - func = job->tpj_func; - arg = job->tpj_arg; - tpool->tp_head = job->tpj_next; - if (job == tpool->tp_tail) - tpool->tp_tail = NULL; - tpool->tp_njobs--; - active.tpa_next = tpool->tp_active; - tpool->tp_active = &active; - pthread_mutex_unlock(&tpool->tp_mutex); - pthread_cleanup_push(job_cleanup, tpool); - free(job); - - sigset_t maskset; - (void) pthread_sigmask(SIG_SETMASK, NULL, &maskset); - - /* - * Call the specified function. - */ - func(arg); - /* - * We don't know what this thread has been doing, - * so we reset its signal mask and cancellation - * state back to the values prior to calling func(). - */ - (void) pthread_sigmask(SIG_SETMASK, &maskset, NULL); - (void) pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, - NULL); - (void) pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, - NULL); - pthread_cleanup_pop(1); - } - if (elapsed && tpool->tp_current > tpool->tp_minimum) { - /* - * We timed out and there is no work to be done - * and the number of workers exceeds the minimum. - * Exit now to reduce the size of the pool. - */ - break; - } - } - pthread_cleanup_pop(1); - return (arg); -} - -/* - * Create a worker thread, with default signals blocked. - */ -static int -create_worker(tpool_t *tpool) -{ - pthread_t thread; - sigset_t oset; - int error; - - (void) pthread_sigmask(SIG_SETMASK, NULL, &oset); - error = pthread_create(&thread, &tpool->tp_attr, tpool_worker, tpool); - (void) pthread_sigmask(SIG_SETMASK, &oset, NULL); - return (error); -} - - -/* - * pthread_attr_clone: make a copy of a pthread_attr_t. When old_attr - * is NULL initialize the cloned attr using default values. - */ -static int -pthread_attr_clone(pthread_attr_t *attr, const pthread_attr_t *old_attr) -{ - int error; - - error = pthread_attr_init(attr); - if (error || (old_attr == NULL)) - return (error); - -#ifdef __GLIBC__ - cpu_set_t cpuset; - size_t cpusetsize = sizeof (cpuset); - error = pthread_attr_getaffinity_np(old_attr, cpusetsize, &cpuset); - if (error == 0) - error = pthread_attr_setaffinity_np(attr, cpusetsize, &cpuset); - if (error) - goto error; -#endif /* __GLIBC__ */ - - int detachstate; - error = pthread_attr_getdetachstate(old_attr, &detachstate); - if (error == 0) - error = pthread_attr_setdetachstate(attr, detachstate); - if (error) - goto error; - - size_t guardsize; - error = pthread_attr_getguardsize(old_attr, &guardsize); - if (error == 0) - error = pthread_attr_setguardsize(attr, guardsize); - if (error) - goto error; - - int inheritsched; - error = pthread_attr_getinheritsched(old_attr, &inheritsched); - if (error == 0) - error = pthread_attr_setinheritsched(attr, inheritsched); - if (error) - goto error; - - struct sched_param param; - error = pthread_attr_getschedparam(old_attr, ¶m); - if (error == 0) - error = pthread_attr_setschedparam(attr, ¶m); - if (error) - goto error; - - int policy; - error = pthread_attr_getschedpolicy(old_attr, &policy); - if (error == 0) - error = pthread_attr_setschedpolicy(attr, policy); - if (error) - goto error; - - int scope; - error = pthread_attr_getscope(old_attr, &scope); - if (error == 0) - error = pthread_attr_setscope(attr, scope); - if (error) - goto error; - - void *stackaddr; - size_t stacksize; - error = pthread_attr_getstack(old_attr, &stackaddr, &stacksize); - if (error == 0) - error = pthread_attr_setstack(attr, stackaddr, stacksize); - if (error) - goto error; - - return (0); -error: - pthread_attr_destroy(attr); - return (error); -} - -tpool_t * -tpool_create(uint_t min_threads, uint_t max_threads, uint_t linger, - pthread_attr_t *attr) -{ - tpool_t *tpool; - void *stackaddr; - size_t stacksize; - size_t minstack; - int error; - - if (min_threads > max_threads || max_threads < 1) { - errno = EINVAL; - return (NULL); - } - if (attr != NULL) { - if (pthread_attr_getstack(attr, &stackaddr, &stacksize) != 0) { - errno = EINVAL; - return (NULL); - } - /* - * Allow only one thread in the pool with a specified stack. - * Require threads to have at least the minimum stack size. - */ - minstack = PTHREAD_STACK_MIN; - if (stackaddr != NULL) { - if (stacksize < minstack || max_threads != 1) { - errno = EINVAL; - return (NULL); - } - } else if (stacksize != 0 && stacksize < minstack) { - errno = EINVAL; - return (NULL); - } - } - - tpool = calloc(1, sizeof (*tpool)); - if (tpool == NULL) { - errno = ENOMEM; - return (NULL); - } - (void) pthread_mutex_init(&tpool->tp_mutex, NULL); - (void) pthread_cond_init(&tpool->tp_busycv, NULL); - (void) pthread_cond_init(&tpool->tp_workcv, NULL); - (void) pthread_cond_init(&tpool->tp_waitcv, NULL); - tpool->tp_minimum = min_threads; - tpool->tp_maximum = max_threads; - tpool->tp_linger = linger; - - /* - * We cannot just copy the attribute pointer. - * We need to initialize a new pthread_attr_t structure - * with the values from the user-supplied pthread_attr_t. - * If the attribute pointer is NULL, we need to initialize - * the new pthread_attr_t structure with default values. - */ - error = pthread_attr_clone(&tpool->tp_attr, attr); - if (error) { - free(tpool); - errno = error; - return (NULL); - } - - /* make all pool threads be detached daemon threads */ - (void) pthread_attr_setdetachstate(&tpool->tp_attr, - PTHREAD_CREATE_DETACHED); - - /* insert into the global list of all thread pools */ - pthread_mutex_lock(&thread_pool_lock); - if (thread_pools == NULL) { - tpool->tp_forw = tpool; - tpool->tp_back = tpool; - thread_pools = tpool; - } else { - thread_pools->tp_back->tp_forw = tpool; - tpool->tp_forw = thread_pools; - tpool->tp_back = thread_pools->tp_back; - thread_pools->tp_back = tpool; - } - pthread_mutex_unlock(&thread_pool_lock); - - return (tpool); -} - -/* - * Dispatch a work request to the thread pool. - * If there are idle workers, awaken one. - * Else, if the maximum number of workers has - * not been reached, spawn a new worker thread. - * Else just return with the job added to the queue. - */ -int -tpool_dispatch(tpool_t *tpool, void (*func)(void *), void *arg) -{ - tpool_job_t *job; - - ASSERT(!(tpool->tp_flags & (TP_DESTROY | TP_ABANDON))); - - if ((job = calloc(1, sizeof (*job))) == NULL) - return (-1); - job->tpj_next = NULL; - job->tpj_func = func; - job->tpj_arg = arg; - - pthread_mutex_lock(&tpool->tp_mutex); - - if (!(tpool->tp_flags & TP_SUSPEND)) { - if (tpool->tp_idle > 0) - (void) pthread_cond_signal(&tpool->tp_workcv); - else if (tpool->tp_current >= tpool->tp_maximum) { - /* At worker limit. Leave task on queue */ - } else { - if (create_worker(tpool) == 0) { - /* Started a new worker thread */ - tpool->tp_current++; - } else if (tpool->tp_current > 0) { - /* Leave task on queue */ - } else { - /* Cannot start a single worker! */ - pthread_mutex_unlock(&tpool->tp_mutex); - free(job); - return (-1); - } - } - } - - if (tpool->tp_head == NULL) - tpool->tp_head = job; - else - tpool->tp_tail->tpj_next = job; - tpool->tp_tail = job; - tpool->tp_njobs++; - - pthread_mutex_unlock(&tpool->tp_mutex); - return (0); -} - -static void -tpool_cleanup(void *arg) -{ - tpool_t *tpool = (tpool_t *)arg; - - pthread_mutex_unlock(&tpool->tp_mutex); -} - -/* - * Assumes: by the time tpool_destroy() is called no one will use this - * thread pool in any way and no one will try to dispatch entries to it. - * Calling tpool_destroy() from a job in the pool will cause deadlock. - */ -void -tpool_destroy(tpool_t *tpool) -{ - tpool_active_t *activep; - - ASSERT(!tpool_member(tpool)); - ASSERT(!(tpool->tp_flags & (TP_DESTROY | TP_ABANDON))); - - pthread_mutex_lock(&tpool->tp_mutex); - pthread_cleanup_push(tpool_cleanup, tpool); - - /* mark the pool as being destroyed; wakeup idle workers */ - tpool->tp_flags |= TP_DESTROY; - tpool->tp_flags &= ~TP_SUSPEND; - (void) pthread_cond_broadcast(&tpool->tp_workcv); - - /* cancel all active workers */ - for (activep = tpool->tp_active; activep; activep = activep->tpa_next) - (void) pthread_cancel(activep->tpa_tid); - - /* wait for all active workers to finish */ - while (tpool->tp_active != NULL) { - tpool->tp_flags |= TP_WAIT; - (void) pthread_cond_wait(&tpool->tp_waitcv, &tpool->tp_mutex); - } - - /* the last worker to terminate will wake us up */ - while (tpool->tp_current != 0) - (void) pthread_cond_wait(&tpool->tp_busycv, &tpool->tp_mutex); - - pthread_cleanup_pop(1); /* pthread_mutex_unlock(&tpool->tp_mutex); */ - delete_pool(tpool); -} - -/* - * Like tpool_destroy(), but don't cancel workers or wait for them to finish. - * The last worker to terminate will delete the pool. - */ -void -tpool_abandon(tpool_t *tpool) -{ - ASSERT(!(tpool->tp_flags & (TP_DESTROY | TP_ABANDON))); - - pthread_mutex_lock(&tpool->tp_mutex); - if (tpool->tp_current == 0) { - /* no workers, just delete the pool */ - pthread_mutex_unlock(&tpool->tp_mutex); - delete_pool(tpool); - } else { - /* wake up all workers, last one will delete the pool */ - tpool->tp_flags |= TP_ABANDON; - tpool->tp_flags &= ~TP_SUSPEND; - (void) pthread_cond_broadcast(&tpool->tp_workcv); - pthread_mutex_unlock(&tpool->tp_mutex); - } -} - -/* - * Wait for all jobs to complete. - * Calling tpool_wait() from a job in the pool will cause deadlock. - */ -void -tpool_wait(tpool_t *tpool) -{ - ASSERT(!tpool_member(tpool)); - ASSERT(!(tpool->tp_flags & (TP_DESTROY | TP_ABANDON))); - - pthread_mutex_lock(&tpool->tp_mutex); - pthread_cleanup_push(tpool_cleanup, tpool); - while (tpool->tp_head != NULL || tpool->tp_active != NULL) { - tpool->tp_flags |= TP_WAIT; - (void) pthread_cond_wait(&tpool->tp_waitcv, &tpool->tp_mutex); - ASSERT(!(tpool->tp_flags & (TP_DESTROY | TP_ABANDON))); - } - pthread_cleanup_pop(1); /* pthread_mutex_unlock(&tpool->tp_mutex); */ -} - -void -tpool_suspend(tpool_t *tpool) -{ - ASSERT(!(tpool->tp_flags & (TP_DESTROY | TP_ABANDON))); - - pthread_mutex_lock(&tpool->tp_mutex); - tpool->tp_flags |= TP_SUSPEND; - pthread_mutex_unlock(&tpool->tp_mutex); -} - -int -tpool_suspended(tpool_t *tpool) -{ - int suspended; - - ASSERT(!(tpool->tp_flags & (TP_DESTROY | TP_ABANDON))); - - pthread_mutex_lock(&tpool->tp_mutex); - suspended = (tpool->tp_flags & TP_SUSPEND) != 0; - pthread_mutex_unlock(&tpool->tp_mutex); - - return (suspended); -} - -void -tpool_resume(tpool_t *tpool) -{ - int excess; - - ASSERT(!(tpool->tp_flags & (TP_DESTROY | TP_ABANDON))); - - pthread_mutex_lock(&tpool->tp_mutex); - if (!(tpool->tp_flags & TP_SUSPEND)) { - pthread_mutex_unlock(&tpool->tp_mutex); - return; - } - tpool->tp_flags &= ~TP_SUSPEND; - (void) pthread_cond_broadcast(&tpool->tp_workcv); - excess = tpool->tp_njobs - tpool->tp_idle; - while (excess-- > 0 && tpool->tp_current < tpool->tp_maximum) { - if (create_worker(tpool) != 0) - break; /* pthread_create() failed */ - tpool->tp_current++; - } - pthread_mutex_unlock(&tpool->tp_mutex); -} - -int -tpool_member(tpool_t *tpool) -{ - pthread_t my_tid = pthread_self(); - tpool_active_t *activep; - - ASSERT(!(tpool->tp_flags & (TP_DESTROY | TP_ABANDON))); - - pthread_mutex_lock(&tpool->tp_mutex); - for (activep = tpool->tp_active; activep; activep = activep->tpa_next) { - if (activep->tpa_tid == my_tid) { - pthread_mutex_unlock(&tpool->tp_mutex); - return (1); - } - } - pthread_mutex_unlock(&tpool->tp_mutex); - return (0); -} diff --git a/sys/contrib/openzfs/lib/libtpool/thread_pool_impl.h b/sys/contrib/openzfs/lib/libtpool/thread_pool_impl.h deleted file mode 100644 index e2bffd37d522..000000000000 --- a/sys/contrib/openzfs/lib/libtpool/thread_pool_impl.h +++ /dev/null @@ -1,94 +0,0 @@ -// SPDX-License-Identifier: CDDL-1.0 -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or https://opensource.org/licenses/CDDL-1.0. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ - -/* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#ifndef _THREAD_POOL_IMPL_H -#define _THREAD_POOL_IMPL_H - -#include <thread_pool.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Thread pool implementation definitions. - * See <thread_pool.h> for interface declarations. - */ - -/* - * FIFO queued job - */ -typedef struct tpool_job tpool_job_t; -struct tpool_job { - tpool_job_t *tpj_next; /* list of jobs */ - void (*tpj_func)(void *); /* function to call */ - void *tpj_arg; /* its argument */ -}; - -/* - * List of active threads, linked through their stacks. - */ -typedef struct tpool_active tpool_active_t; -struct tpool_active { - tpool_active_t *tpa_next; /* list of active threads */ - pthread_t tpa_tid; /* active thread id */ -}; - -/* - * The thread pool. - */ -struct tpool { - tpool_t *tp_forw; /* circular list of all thread pools */ - tpool_t *tp_back; - pthread_mutex_t tp_mutex; /* protects the pool data */ - pthread_cond_t tp_busycv; /* synchronization in tpool_dispatch */ - pthread_cond_t tp_workcv; /* synchronization with workers */ - pthread_cond_t tp_waitcv; /* synchronization in tpool_wait() */ - tpool_active_t *tp_active; /* threads performing work */ - tpool_job_t *tp_head; /* FIFO job queue */ - tpool_job_t *tp_tail; - pthread_attr_t tp_attr; /* attributes of the workers */ - int tp_flags; /* see below */ - uint_t tp_linger; /* seconds before idle workers exit */ - int tp_njobs; /* number of jobs in job queue */ - int tp_minimum; /* minimum number of worker threads */ - int tp_maximum; /* maximum number of worker threads */ - int tp_current; /* current number of worker threads */ - int tp_idle; /* number of idle workers */ -}; - -/* tp_flags */ -#define TP_WAIT 0x01 /* waiting in tpool_wait() */ -#define TP_SUSPEND 0x02 /* pool is being suspended */ -#define TP_DESTROY 0x04 /* pool is being destroyed */ -#define TP_ABANDON 0x08 /* pool is abandoned (auto-destroy) */ - -#ifdef __cplusplus -} -#endif - -#endif /* _THREAD_POOL_IMPL_H */ diff --git a/sys/contrib/openzfs/lib/libuutil/Makefile.am b/sys/contrib/openzfs/lib/libuutil/Makefile.am deleted file mode 100644 index b973ce3cca4c..000000000000 --- a/sys/contrib/openzfs/lib/libuutil/Makefile.am +++ /dev/null @@ -1,28 +0,0 @@ -libuutil_la_CFLAGS = $(AM_CFLAGS) $(LIBRARY_CFLAGS) $(LIBRARY_CFLAGS) - -lib_LTLIBRARIES += libuutil.la -CPPCHECKTARGETS += libuutil.la - -libuutil_la_SOURCES = \ - %D%/uu_alloc.c \ - %D%/uu_avl.c \ - %D%/uu_ident.c \ - %D%/uu_list.c \ - %D%/uu_misc.c \ - %D%/uu_string.c - -libuutil_la_LIBADD = \ - libavl.la \ - libspl.la - -libuutil_la_LIBADD += $(LTLIBINTL) - -libuutil_la_LDFLAGS = -pthread - -if !ASAN_ENABLED -libuutil_la_LDFLAGS += -Wl,-z,defs -endif - -libuutil_la_LDFLAGS += -version-info 3:0:0 - -dist_noinst_DATA += %D%/libuutil.abi %D%/libuutil.suppr diff --git a/sys/contrib/openzfs/lib/libuutil/libuutil.abi b/sys/contrib/openzfs/lib/libuutil/libuutil.abi deleted file mode 100644 index ca2bcdb57dbf..000000000000 --- a/sys/contrib/openzfs/lib/libuutil/libuutil.abi +++ /dev/null @@ -1,3360 +0,0 @@ -<abi-corpus version='2.0' architecture='elf-amd-x86_64' soname='libuutil.so.3'> - <elf-needed> - <dependency name='libunwind.so.8'/> - <dependency name='libc.so.6'/> - <dependency name='ld-linux-x86-64.so.2'/> - </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'/> - <elf-symbol name='atomic_add_32_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_add_64' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_add_64_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_add_8' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_add_8_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_add_char' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_add_char_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_add_int' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_add_int_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_add_long' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_add_long_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_add_ptr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_add_ptr_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_add_short' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_add_short_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_and_16' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_and_16_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_and_32' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_and_32_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_and_64' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_and_64_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_and_8' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_and_8_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_and_uchar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_and_uchar_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_and_uint' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_and_uint_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_and_ulong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_and_ulong_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_and_ushort' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_and_ushort_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_cas_16' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_cas_32' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_cas_64' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_cas_8' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_cas_ptr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_cas_uchar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_cas_uint' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_cas_ulong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_cas_ushort' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_clear_long_excl' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_dec_16' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_dec_16_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_dec_32' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_dec_32_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_dec_64' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_dec_64_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_dec_8' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_dec_8_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_dec_uchar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_dec_uchar_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_dec_uint' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_dec_uint_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_dec_ulong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_dec_ulong_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_dec_ushort' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_dec_ushort_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_inc_16' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_inc_16_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_inc_32' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_inc_32_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_inc_64' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_inc_64_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_inc_8' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_inc_8_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_inc_uchar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_inc_uchar_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_inc_uint' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_inc_uint_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_inc_ulong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_inc_ulong_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_inc_ushort' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_inc_ushort_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_or_16' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_or_16_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_or_32' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_or_32_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_or_64' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_or_64_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_or_8' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_or_8_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_or_uchar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_or_uchar_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_or_uint' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_or_uint_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_or_ulong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_or_ulong_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_or_ushort' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_or_ushort_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_set_long_excl' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_sub_16' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_sub_16_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_sub_32' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_sub_32_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_sub_64' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_sub_64_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_sub_8' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_sub_8_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_sub_char' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_sub_char_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_sub_int' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_sub_int_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_sub_long' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_sub_long_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_sub_ptr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_sub_ptr_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_sub_short' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_sub_short_nv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_swap_16' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_swap_32' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_swap_64' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_swap_8' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_swap_ptr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='atomic_swap_uchar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <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='avl_add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='avl_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='avl_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='avl_destroy_nodes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='avl_find' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='avl_first' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='avl_insert' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='avl_insert_here' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='avl_is_empty' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='avl_last' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='avl_nearest' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='avl_numnodes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='avl_remove' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='avl_swap' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='avl_update' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <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'/> - <elf-symbol name='getexecname' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='getextmntent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='getmntany' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='getzoneid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='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'/> - <elf-symbol name='list_head' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='list_insert_after' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='list_insert_before' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='list_insert_head' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='list_insert_tail' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='list_is_empty' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='list_link_active' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='list_link_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='list_link_replace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='list_move_tail' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='list_next' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='list_prev' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='list_remove' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='list_remove_head' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='list_remove_tail' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='list_tail' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='membar_consumer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='membar_enter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='membar_exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='membar_producer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='membar_sync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='mkdirp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='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'/> - <elf-symbol name='uu_avl_first' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_avl_insert' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_avl_last' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_avl_lockup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_avl_nearest_next' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_avl_nearest_prev' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_avl_next' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_avl_node_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_avl_node_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_avl_numnodes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_avl_pool_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_avl_pool_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_avl_prev' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_avl_release' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_avl_remove' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_avl_teardown' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_avl_walk' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_avl_walk_end' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_avl_walk_next' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_avl_walk_start' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_check_name' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_error' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_list_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_list_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_list_find' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_list_first' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_list_insert' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_list_insert_after' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_list_insert_before' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_list_last' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_list_lockup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_list_nearest_next' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_list_nearest_prev' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_list_next' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_list_node_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_list_node_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_list_numnodes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_list_pool_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_list_pool_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_list_prev' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_list_release' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_list_remove' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_list_teardown' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_list_walk' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_list_walk_end' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_list_walk_next' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_list_walk_start' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_memdup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_msprintf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_panic' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_set_error' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_strbw' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_strcaseeq' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_strdup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_streq' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_strerror' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_strndup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='uu_zalloc' 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'/> - <function-decl name='libspl_backtrace' mangled-name='libspl_backtrace' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libspl_backtrace'> - <parameter type-id='95e97e5e'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='getpid' visibility='default' binding='global' size-in-bits='64'> - <return type-id='3629bad8'/> - </function-decl> - <function-decl name='gettid' visibility='default' binding='global' size-in-bits='64'> - <return type-id='3629bad8'/> - </function-decl> - <function-decl name='prctl' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='95e97e5e'/> - <parameter is-variadic='yes'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='libspl_set_assert_ok' mangled-name='libspl_set_assert_ok' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libspl_set_assert_ok'> - <parameter type-id='c19b74c3' name='val'/> - <return type-id='48b5725f'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='lib/libspl/atomic.c' language='LANG_C99'> - <typedef-decl name='int16_t' type-id='03896e23' id='23bd8cb5'/> - <typedef-decl name='int32_t' type-id='33f57a65' id='3ff5601b'/> - <typedef-decl name='uint16_t' type-id='253c2d2a' id='149c6638'/> - <typedef-decl name='__int16_t' type-id='a2185560' id='03896e23'/> - <typedef-decl name='__uint16_t' type-id='8efea9e5' id='253c2d2a'/> - <typedef-decl name='__int32_t' type-id='95e97e5e' id='33f57a65'/> - <typedef-decl name='__ssize_t' type-id='bd54fe1a' id='41060289'/> - <typedef-decl name='ssize_t' type-id='41060289' id='79a0948f'/> - <qualified-type-def type-id='149c6638' volatile='yes' id='5120c5f7'/> - <pointer-type-def type-id='5120c5f7' size-in-bits='64' id='93977ae7'/> - <qualified-type-def type-id='8f92235e' volatile='yes' id='430e0681'/> - <pointer-type-def type-id='430e0681' size-in-bits='64' id='3a147f31'/> - <qualified-type-def type-id='b96825af' volatile='yes' id='84ff7d66'/> - <pointer-type-def type-id='84ff7d66' size-in-bits='64' id='aa323ea4'/> - <qualified-type-def type-id='ee1f298e' volatile='yes' id='6f7e09cb'/> - <pointer-type-def type-id='6f7e09cb' size-in-bits='64' id='64698d33'/> - <qualified-type-def type-id='48b5725f' volatile='yes' id='b0b3cbf9'/> - <pointer-type-def type-id='b0b3cbf9' size-in-bits='64' id='fe09dd29'/> - <function-decl name='atomic_inc_8' mangled-name='atomic_inc_8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_inc_8'> - <parameter type-id='aa323ea4' name='target'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='atomic_inc_16' mangled-name='atomic_inc_16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_inc_16'> - <parameter type-id='93977ae7' name='target'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='atomic_inc_32' mangled-name='atomic_inc_32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_inc_32'> - <parameter type-id='3a147f31' name='target'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='atomic_inc_ulong' mangled-name='atomic_inc_ulong' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_inc_ulong'> - <parameter type-id='64698d33' name='target'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='atomic_dec_8' mangled-name='atomic_dec_8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_dec_8'> - <parameter type-id='aa323ea4' name='target'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='atomic_dec_16' mangled-name='atomic_dec_16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_dec_16'> - <parameter type-id='93977ae7' name='target'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='atomic_dec_32' mangled-name='atomic_dec_32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_dec_32'> - <parameter type-id='3a147f31' name='target'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='atomic_dec_ulong' mangled-name='atomic_dec_ulong' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_dec_ulong'> - <parameter type-id='64698d33' name='target'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='atomic_add_ptr' mangled-name='atomic_add_ptr' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_add_ptr'> - <parameter type-id='fe09dd29' name='target'/> - <parameter type-id='79a0948f' name='bits'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='atomic_add_8' mangled-name='atomic_add_8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_add_8'> - <parameter type-id='aa323ea4' name='target'/> - <parameter type-id='ee31ee44' name='bits'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='atomic_add_16' mangled-name='atomic_add_16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_add_16'> - <parameter type-id='93977ae7' name='target'/> - <parameter type-id='23bd8cb5' name='bits'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='atomic_add_32' mangled-name='atomic_add_32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_add_32'> - <parameter type-id='3a147f31' name='target'/> - <parameter type-id='3ff5601b' name='bits'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='atomic_sub_ptr' mangled-name='atomic_sub_ptr' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_sub_ptr'> - <parameter type-id='fe09dd29' name='target'/> - <parameter type-id='79a0948f' name='bits'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='atomic_sub_8' mangled-name='atomic_sub_8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_sub_8'> - <parameter type-id='aa323ea4' name='target'/> - <parameter type-id='ee31ee44' name='bits'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='atomic_sub_16' mangled-name='atomic_sub_16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_sub_16'> - <parameter type-id='93977ae7' name='target'/> - <parameter type-id='23bd8cb5' name='bits'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='atomic_sub_32' mangled-name='atomic_sub_32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_sub_32'> - <parameter type-id='3a147f31' name='target'/> - <parameter type-id='3ff5601b' name='bits'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='atomic_or_8' mangled-name='atomic_or_8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_or_8'> - <parameter type-id='aa323ea4' name='target'/> - <parameter type-id='b96825af' name='bits'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='atomic_or_16' mangled-name='atomic_or_16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_or_16'> - <parameter type-id='93977ae7' name='target'/> - <parameter type-id='149c6638' name='bits'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='atomic_or_32' mangled-name='atomic_or_32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_or_32'> - <parameter type-id='3a147f31' name='target'/> - <parameter type-id='8f92235e' name='bits'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='atomic_or_ulong' mangled-name='atomic_or_ulong' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_or_ulong'> - <parameter type-id='64698d33' name='target'/> - <parameter type-id='ee1f298e' name='bits'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='atomic_and_8' mangled-name='atomic_and_8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_and_8'> - <parameter type-id='aa323ea4' name='target'/> - <parameter type-id='b96825af' name='bits'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='atomic_and_16' mangled-name='atomic_and_16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_and_16'> - <parameter type-id='93977ae7' name='target'/> - <parameter type-id='149c6638' name='bits'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='atomic_and_32' mangled-name='atomic_and_32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_and_32'> - <parameter type-id='3a147f31' name='target'/> - <parameter type-id='8f92235e' name='bits'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='atomic_and_ulong' mangled-name='atomic_and_ulong' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_and_ulong'> - <parameter type-id='64698d33' name='target'/> - <parameter type-id='ee1f298e' name='bits'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='atomic_inc_8_nv' mangled-name='atomic_inc_8_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_inc_8_nv'> - <parameter type-id='aa323ea4' name='target'/> - <return type-id='b96825af'/> - </function-decl> - <function-decl name='atomic_inc_16_nv' mangled-name='atomic_inc_16_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_inc_16_nv'> - <parameter type-id='93977ae7' name='target'/> - <return type-id='149c6638'/> - </function-decl> - <function-decl name='atomic_inc_32_nv' mangled-name='atomic_inc_32_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_inc_32_nv'> - <parameter type-id='3a147f31' name='target'/> - <return type-id='8f92235e'/> - </function-decl> - <function-decl name='atomic_inc_ulong_nv' mangled-name='atomic_inc_ulong_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_inc_ulong_nv'> - <parameter type-id='64698d33' name='target'/> - <return type-id='ee1f298e'/> - </function-decl> - <function-decl name='atomic_dec_8_nv' mangled-name='atomic_dec_8_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_dec_8_nv'> - <parameter type-id='aa323ea4' name='target'/> - <return type-id='b96825af'/> - </function-decl> - <function-decl name='atomic_dec_16_nv' mangled-name='atomic_dec_16_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_dec_16_nv'> - <parameter type-id='93977ae7' name='target'/> - <return type-id='149c6638'/> - </function-decl> - <function-decl name='atomic_dec_32_nv' mangled-name='atomic_dec_32_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_dec_32_nv'> - <parameter type-id='3a147f31' name='target'/> - <return type-id='8f92235e'/> - </function-decl> - <function-decl name='atomic_dec_ulong_nv' mangled-name='atomic_dec_ulong_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_dec_ulong_nv'> - <parameter type-id='64698d33' name='target'/> - <return type-id='ee1f298e'/> - </function-decl> - <function-decl name='atomic_add_ptr_nv' mangled-name='atomic_add_ptr_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_add_ptr_nv'> - <parameter type-id='fe09dd29' name='target'/> - <parameter type-id='79a0948f' name='bits'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='atomic_add_8_nv' mangled-name='atomic_add_8_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_add_8_nv'> - <parameter type-id='aa323ea4' name='target'/> - <parameter type-id='ee31ee44' name='bits'/> - <return type-id='b96825af'/> - </function-decl> - <function-decl name='atomic_add_16_nv' mangled-name='atomic_add_16_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_add_16_nv'> - <parameter type-id='93977ae7' name='target'/> - <parameter type-id='23bd8cb5' name='bits'/> - <return type-id='149c6638'/> - </function-decl> - <function-decl name='atomic_add_32_nv' mangled-name='atomic_add_32_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_add_32_nv'> - <parameter type-id='3a147f31' name='target'/> - <parameter type-id='3ff5601b' name='bits'/> - <return type-id='8f92235e'/> - </function-decl> - <function-decl name='atomic_add_long_nv' mangled-name='atomic_add_long_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_add_long_nv'> - <parameter type-id='64698d33' name='target'/> - <parameter type-id='bd54fe1a' name='bits'/> - <return type-id='ee1f298e'/> - </function-decl> - <function-decl name='atomic_sub_ptr_nv' mangled-name='atomic_sub_ptr_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_sub_ptr_nv'> - <parameter type-id='fe09dd29' name='target'/> - <parameter type-id='79a0948f' name='bits'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='atomic_sub_8_nv' mangled-name='atomic_sub_8_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_sub_8_nv'> - <parameter type-id='aa323ea4' name='target'/> - <parameter type-id='ee31ee44' name='bits'/> - <return type-id='b96825af'/> - </function-decl> - <function-decl name='atomic_sub_16_nv' mangled-name='atomic_sub_16_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_sub_16_nv'> - <parameter type-id='93977ae7' name='target'/> - <parameter type-id='23bd8cb5' name='bits'/> - <return type-id='149c6638'/> - </function-decl> - <function-decl name='atomic_sub_32_nv' mangled-name='atomic_sub_32_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_sub_32_nv'> - <parameter type-id='3a147f31' name='target'/> - <parameter type-id='3ff5601b' name='bits'/> - <return type-id='8f92235e'/> - </function-decl> - <function-decl name='atomic_sub_long_nv' mangled-name='atomic_sub_long_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_sub_long_nv'> - <parameter type-id='64698d33' name='target'/> - <parameter type-id='bd54fe1a' name='bits'/> - <return type-id='ee1f298e'/> - </function-decl> - <function-decl name='atomic_or_8_nv' mangled-name='atomic_or_8_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_or_8_nv'> - <parameter type-id='aa323ea4' name='target'/> - <parameter type-id='b96825af' name='bits'/> - <return type-id='b96825af'/> - </function-decl> - <function-decl name='atomic_or_16_nv' mangled-name='atomic_or_16_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_or_16_nv'> - <parameter type-id='93977ae7' name='target'/> - <parameter type-id='149c6638' name='bits'/> - <return type-id='149c6638'/> - </function-decl> - <function-decl name='atomic_or_32_nv' mangled-name='atomic_or_32_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_or_32_nv'> - <parameter type-id='3a147f31' name='target'/> - <parameter type-id='8f92235e' name='bits'/> - <return type-id='8f92235e'/> - </function-decl> - <function-decl name='atomic_or_ulong_nv' mangled-name='atomic_or_ulong_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_or_ulong_nv'> - <parameter type-id='64698d33' name='target'/> - <parameter type-id='ee1f298e' name='bits'/> - <return type-id='ee1f298e'/> - </function-decl> - <function-decl name='atomic_and_8_nv' mangled-name='atomic_and_8_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_and_8_nv'> - <parameter type-id='aa323ea4' name='target'/> - <parameter type-id='b96825af' name='bits'/> - <return type-id='b96825af'/> - </function-decl> - <function-decl name='atomic_and_16_nv' mangled-name='atomic_and_16_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_and_16_nv'> - <parameter type-id='93977ae7' name='target'/> - <parameter type-id='149c6638' name='bits'/> - <return type-id='149c6638'/> - </function-decl> - <function-decl name='atomic_and_32_nv' mangled-name='atomic_and_32_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_and_32_nv'> - <parameter type-id='3a147f31' name='target'/> - <parameter type-id='8f92235e' name='bits'/> - <return type-id='8f92235e'/> - </function-decl> - <function-decl name='atomic_and_ulong_nv' mangled-name='atomic_and_ulong_nv' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_and_ulong_nv'> - <parameter type-id='64698d33' name='target'/> - <parameter type-id='ee1f298e' name='bits'/> - <return type-id='ee1f298e'/> - </function-decl> - <function-decl name='atomic_cas_ptr' mangled-name='atomic_cas_ptr' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_cas_ptr'> - <parameter type-id='fe09dd29' name='target'/> - <parameter type-id='eaa32e2f' name='exp'/> - <parameter type-id='eaa32e2f' name='des'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='atomic_cas_8' mangled-name='atomic_cas_8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_cas_8'> - <parameter type-id='aa323ea4' name='target'/> - <parameter type-id='b96825af' name='exp'/> - <parameter type-id='b96825af' name='des'/> - <return type-id='b96825af'/> - </function-decl> - <function-decl name='atomic_cas_16' mangled-name='atomic_cas_16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_cas_16'> - <parameter type-id='93977ae7' name='target'/> - <parameter type-id='149c6638' name='exp'/> - <parameter type-id='149c6638' name='des'/> - <return type-id='149c6638'/> - </function-decl> - <function-decl name='atomic_cas_32' mangled-name='atomic_cas_32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_cas_32'> - <parameter type-id='3a147f31' name='target'/> - <parameter type-id='8f92235e' name='exp'/> - <parameter type-id='8f92235e' name='des'/> - <return type-id='8f92235e'/> - </function-decl> - <function-decl name='atomic_cas_ulong' mangled-name='atomic_cas_ulong' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_cas_ulong'> - <parameter type-id='64698d33' name='target'/> - <parameter type-id='ee1f298e' name='exp'/> - <parameter type-id='ee1f298e' name='des'/> - <return type-id='ee1f298e'/> - </function-decl> - <function-decl name='atomic_swap_8' mangled-name='atomic_swap_8' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_swap_8'> - <parameter type-id='aa323ea4' name='target'/> - <parameter type-id='b96825af' name='bits'/> - <return type-id='b96825af'/> - </function-decl> - <function-decl name='atomic_swap_16' mangled-name='atomic_swap_16' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_swap_16'> - <parameter type-id='93977ae7' name='target'/> - <parameter type-id='149c6638' name='bits'/> - <return type-id='149c6638'/> - </function-decl> - <function-decl name='atomic_swap_32' mangled-name='atomic_swap_32' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_swap_32'> - <parameter type-id='3a147f31' name='target'/> - <parameter type-id='8f92235e' name='bits'/> - <return type-id='8f92235e'/> - </function-decl> - <function-decl name='atomic_swap_ulong' mangled-name='atomic_swap_ulong' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_swap_ulong'> - <parameter type-id='64698d33' name='target'/> - <parameter type-id='ee1f298e' name='bits'/> - <return type-id='ee1f298e'/> - </function-decl> - <function-decl name='atomic_swap_ptr' mangled-name='atomic_swap_ptr' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_swap_ptr'> - <parameter type-id='fe09dd29' name='target'/> - <parameter type-id='eaa32e2f' name='bits'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='atomic_set_long_excl' mangled-name='atomic_set_long_excl' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_set_long_excl'> - <parameter type-id='64698d33' name='target'/> - <parameter type-id='3502e3ff' name='value'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='atomic_clear_long_excl' mangled-name='atomic_clear_long_excl' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='atomic_clear_long_excl'> - <parameter type-id='64698d33' name='target'/> - <parameter type-id='3502e3ff' name='value'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='membar_enter' mangled-name='membar_enter' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='membar_enter'> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='membar_producer' mangled-name='membar_producer' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='membar_producer'> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='membar_consumer' mangled-name='membar_consumer' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='membar_consumer'> - <return type-id='48b5725f'/> - </function-decl> - <type-decl name='unsigned short int' size-in-bits='16' id='8efea9e5'/> - </abi-instr> - <abi-instr address-size='64' path='lib/libspl/backtrace.c' language='LANG_C99'> - <array-type-def dimensions='1' type-id='62f1140c' size-in-bits='768' id='b80f3d9b'> - <subrange length='24' type-id='7359adad' id='fdd3342b'/> - </array-type-def> - <array-type-def dimensions='1' type-id='62f1140c' size-in-bits='128' id='bc19e735'> - <subrange length='4' type-id='7359adad' id='16fe7105'/> - </array-type-def> - <array-type-def dimensions='1' type-id='22c546af' size-in-bits='1024' id='498c040b'> - <subrange length='8' type-id='7359adad' id='56e0c0b1'/> - </array-type-def> - <array-type-def dimensions='1' type-id='4ea07cdb' size-in-bits='2048' id='4811c35e'> - <subrange length='16' type-id='7359adad' id='848d0938'/> - </array-type-def> - <array-type-def dimensions='1' type-id='de572c22' size-in-bits='1472' id='6d3c2f42'> - <subrange length='23' type-id='7359adad' id='fdd0f594'/> - </array-type-def> - <array-type-def dimensions='1' type-id='3a47d82b' size-in-bits='256' id='a133ec23'> - <subrange length='4' type-id='7359adad' id='16fe7105'/> - </array-type-def> - <array-type-def dimensions='1' type-id='3a47d82b' size-in-bits='512' id='a13e797f'> - <subrange length='8' type-id='7359adad' id='56e0c0b1'/> - </array-type-def> - <array-type-def dimensions='1' type-id='7359adad' size-in-bits='1024' id='d2baa450'> - <subrange length='16' type-id='7359adad' id='848d0938'/> - </array-type-def> - <array-type-def dimensions='1' type-id='8efea9e5' size-in-bits='48' id='ff2536e2'> - <subrange length='3' type-id='7359adad' id='56f209d2'/> - </array-type-def> - <array-type-def dimensions='1' type-id='8efea9e5' size-in-bits='64' id='3f30d495'> - <subrange length='4' type-id='7359adad' id='16fe7105'/> - </array-type-def> - <array-type-def dimensions='1' type-id='73d941c6' size-in-bits='8128' id='dc70ec0b'> - <subrange length='127' type-id='7359adad' id='5ed08de5'/> - </array-type-def> - <class-decl name='__sigset_t' size-in-bits='1024' is-struct='yes' naming-typedef-id='b9c97942' visibility='default' id='2616147f'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='__val' type-id='d2baa450' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='__sigset_t' type-id='2616147f' id='b9c97942'/> - <typedef-decl name='sigset_t' type-id='b9c97942' id='daf33c64'/> - <class-decl name='stack_t' size-in-bits='192' is-struct='yes' naming-typedef-id='ac5e685f' visibility='default' id='380f9954'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ss_sp' type-id='eaa32e2f' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='ss_flags' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='ss_size' type-id='b59d7dce' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='stack_t' type-id='380f9954' id='ac5e685f'/> - <typedef-decl name='unw_regnum_t' type-id='95e97e5e' id='c53620f0'/> - <class-decl name='unw_cursor' size-in-bits='8128' is-struct='yes' visibility='default' id='384a1f22'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='opaque' type-id='dc70ec0b' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='unw_cursor_t' type-id='384a1f22' id='1203d35c'/> - <typedef-decl name='unw_context_t' type-id='190d09ef' id='8f527367'/> - <typedef-decl name='unw_word_t' type-id='9c313c2d' id='73d941c6'/> - <typedef-decl name='unw_tdep_context_t' type-id='c4daa689' id='190d09ef'/> - <typedef-decl name='greg_t' type-id='1eb56b1e' id='de572c22'/> - <typedef-decl name='gregset_t' type-id='6d3c2f42' id='a66f139c'/> - <class-decl name='_libc_fpxreg' size-in-bits='128' is-struct='yes' visibility='default' id='22c546af'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='significand' type-id='3f30d495' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='exponent' type-id='8efea9e5' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='80'> - <var-decl name='__glibc_reserved1' type-id='ff2536e2' visibility='default'/> - </data-member> - </class-decl> - <class-decl name='_libc_xmmreg' size-in-bits='128' is-struct='yes' visibility='default' id='4ea07cdb'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='element' type-id='bc19e735' visibility='default'/> - </data-member> - </class-decl> - <class-decl name='_libc_fpstate' size-in-bits='4096' is-struct='yes' visibility='default' id='81cbe5ca'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='cwd' type-id='253c2d2a' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='16'> - <var-decl name='swd' type-id='253c2d2a' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='ftw' type-id='253c2d2a' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='48'> - <var-decl name='fop' type-id='253c2d2a' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='rip' type-id='8910171f' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='rdp' type-id='8910171f' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='mxcsr' type-id='62f1140c' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='224'> - <var-decl name='mxcr_mask' type-id='62f1140c' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='_st' type-id='498c040b' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1280'> - <var-decl name='_xmm' type-id='4811c35e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3328'> - <var-decl name='__glibc_reserved1' type-id='b80f3d9b' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='fpregset_t' type-id='5b1ab9a8' id='6e5851bb'/> - <class-decl name='mcontext_t' size-in-bits='2048' is-struct='yes' naming-typedef-id='bacab071' visibility='default' id='76fab990'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='gregs' type-id='a66f139c' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1472'> - <var-decl name='fpregs' type-id='6e5851bb' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1536'> - <var-decl name='__reserved1' type-id='a13e797f' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='mcontext_t' type-id='76fab990' id='bacab071'/> - <class-decl name='ucontext_t' size-in-bits='7744' is-struct='yes' visibility='default' id='1ba65dc8'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='uc_flags' type-id='7359adad' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='uc_link' type-id='4ed508de' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='uc_stack' type-id='ac5e685f' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='uc_mcontext' type-id='bacab071' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2368'> - <var-decl name='uc_sigmask' type-id='daf33c64' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3392'> - <var-decl name='__fpregs_mem' type-id='81cbe5ca' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='7488'> - <var-decl name='__ssp' type-id='a133ec23' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='ucontext_t' type-id='1ba65dc8' id='c4daa689'/> - <pointer-type-def type-id='81cbe5ca' size-in-bits='64' id='5b1ab9a8'/> - <pointer-type-def type-id='1ba65dc8' size-in-bits='64' id='4ed508de'/> - <pointer-type-def type-id='8f527367' size-in-bits='64' id='2e408b96'/> - <pointer-type-def type-id='1203d35c' size-in-bits='64' id='3946e4d1'/> - <pointer-type-def type-id='190d09ef' size-in-bits='64' id='3e0601f0'/> - <pointer-type-def type-id='73d941c6' size-in-bits='64' id='42f5faab'/> - <function-decl name='write' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='95e97e5e'/> - <parameter type-id='eaa32e2f'/> - <parameter type-id='b59d7dce'/> - <return type-id='79a0948f'/> - </function-decl> - <function-decl name='_Ux86_64_regname' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='c53620f0'/> - <return type-id='80f4b756'/> - </function-decl> - <function-decl name='_ULx86_64_init_local' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='3946e4d1'/> - <parameter type-id='2e408b96'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='_ULx86_64_step' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='3946e4d1'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='_ULx86_64_get_reg' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='3946e4d1'/> - <parameter type-id='95e97e5e'/> - <parameter type-id='42f5faab'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='_ULx86_64_get_proc_name' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='3946e4d1'/> - <parameter type-id='26a90f95'/> - <parameter type-id='b59d7dce'/> - <parameter type-id='42f5faab'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='_Ux86_64_getcontext' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='3e0601f0'/> - <return type-id='95e97e5e'/> - </function-decl> - <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'/> - </function-decl> - <function-decl name='getexecname_impl' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='26a90f95'/> - <return type-id='79a0948f'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='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'/> - <class-decl name='list_node' size-in-bits='128' is-struct='yes' visibility='default' id='b0b5e45e'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='next' type-id='b03eadb4' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='prev' type-id='b03eadb4' visibility='default'/> - </data-member> - </class-decl> - <class-decl name='list' size-in-bits='192' is-struct='yes' visibility='default' id='e824dae9'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='list_offset' type-id='b59d7dce' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='list_head' type-id='b0b5e45e' visibility='default'/> - </data-member> - </class-decl> - <pointer-type-def type-id='b0b5e45e' size-in-bits='64' id='b03eadb4'/> - <pointer-type-def type-id='b21843b2' size-in-bits='64' id='ccc38265'/> - <pointer-type-def type-id='0899125f' size-in-bits='64' id='352ec160'/> - <function-decl name='list_create' mangled-name='list_create' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='list_create'> - <parameter type-id='352ec160' name='list'/> - <parameter type-id='b59d7dce' name='size'/> - <parameter type-id='b59d7dce' name='offset'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='list_destroy' mangled-name='list_destroy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='list_destroy'> - <parameter type-id='352ec160' name='list'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='list_insert_after' mangled-name='list_insert_after' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='list_insert_after'> - <parameter type-id='352ec160' name='list'/> - <parameter type-id='eaa32e2f' name='object'/> - <parameter type-id='eaa32e2f' name='nobject'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='list_insert_before' mangled-name='list_insert_before' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='list_insert_before'> - <parameter type-id='352ec160' name='list'/> - <parameter type-id='eaa32e2f' name='object'/> - <parameter type-id='eaa32e2f' name='nobject'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='list_insert_head' mangled-name='list_insert_head' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='list_insert_head'> - <parameter type-id='352ec160' name='list'/> - <parameter type-id='eaa32e2f' name='object'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='list_insert_tail' mangled-name='list_insert_tail' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='list_insert_tail'> - <parameter type-id='352ec160' name='list'/> - <parameter type-id='eaa32e2f' name='object'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='list_remove' mangled-name='list_remove' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='list_remove'> - <parameter type-id='352ec160' name='list'/> - <parameter type-id='eaa32e2f' name='object'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='list_remove_head' mangled-name='list_remove_head' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='list_remove_head'> - <parameter type-id='352ec160' name='list'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='list_remove_tail' mangled-name='list_remove_tail' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='list_remove_tail'> - <parameter type-id='352ec160' name='list'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='list_head' mangled-name='list_head' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='list_head'> - <parameter type-id='352ec160' name='list'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='list_tail' mangled-name='list_tail' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='list_tail'> - <parameter type-id='352ec160' name='list'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='list_next' mangled-name='list_next' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='list_next'> - <parameter type-id='352ec160' name='list'/> - <parameter type-id='eaa32e2f' name='object'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='list_prev' mangled-name='list_prev' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='list_prev'> - <parameter type-id='352ec160' name='list'/> - <parameter type-id='eaa32e2f' name='object'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='list_move_tail' mangled-name='list_move_tail' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='list_move_tail'> - <parameter type-id='352ec160' name='dst'/> - <parameter type-id='352ec160' name='src'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='list_link_replace' mangled-name='list_link_replace' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='list_link_replace'> - <parameter type-id='ccc38265' name='lold'/> - <parameter type-id='ccc38265' name='lnew'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='list_link_init' mangled-name='list_link_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='list_link_init'> - <parameter type-id='ccc38265' name='ln'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='list_link_active' mangled-name='list_link_active' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='list_link_active'> - <parameter type-id='ccc38265' name='ln'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='list_is_empty' mangled-name='list_is_empty' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='list_is_empty'> - <parameter type-id='352ec160' name='list'/> - <return type-id='95e97e5e'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='lib/libspl/mkdirp.c' language='LANG_C99'> - <typedef-decl name='__mode_t' type-id='f0981eeb' id='e1c52942'/> - <typedef-decl name='mode_t' type-id='e1c52942' id='d50d396c'/> - <typedef-decl name='wchar_t' type-id='95e97e5e' id='928221d2'/> - <qualified-type-def type-id='928221d2' const='yes' id='effb3702'/> - <pointer-type-def type-id='effb3702' size-in-bits='64' id='f077d3f8'/> - <qualified-type-def type-id='f077d3f8' restrict='yes' id='598aab80'/> - <pointer-type-def type-id='928221d2' size-in-bits='64' id='323d93c1'/> - <qualified-type-def type-id='323d93c1' restrict='yes' id='f1358bc3'/> - <function-decl name='calloc' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='b59d7dce'/> - <parameter type-id='b59d7dce'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='strdup' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='80f4b756'/> - <return type-id='26a90f95'/> - </function-decl> - <function-decl name='strrchr' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='80f4b756'/> - <parameter type-id='95e97e5e'/> - <return type-id='26a90f95'/> - </function-decl> - <function-decl name='access' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='80f4b756'/> - <parameter type-id='95e97e5e'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='__mbstowcs_chk' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='f1358bc3'/> - <parameter type-id='9d26089a'/> - <parameter type-id='b59d7dce'/> - <parameter type-id='b59d7dce'/> - <return type-id='b59d7dce'/> - </function-decl> - <function-decl name='__wcstombs_chk' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='266fe297'/> - <parameter type-id='598aab80'/> - <parameter type-id='b59d7dce'/> - <parameter type-id='b59d7dce'/> - <return type-id='b59d7dce'/> - </function-decl> - <function-decl name='mkdir' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='80f4b756'/> - <parameter type-id='e1c52942'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='mkdirp' mangled-name='mkdirp' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mkdirp'> - <parameter type-id='80f4b756' name='d'/> - <parameter type-id='d50d396c' name='mode'/> - <return type-id='95e97e5e'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='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'/> - <parameter type-id='266fe297'/> - <parameter type-id='b59d7dce'/> - <parameter type-id='b59d7dce'/> - <return type-id='79a0948f'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='lib/libspl/os/linux/gethostid.c' language='LANG_C99'> - <function-decl name='fclose' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='822cd80b'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='strtoull' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='9d26089a'/> - <parameter type-id='8c85230f'/> - <parameter type-id='95e97e5e'/> - <return type-id='3a47d82b'/> - </function-decl> - <function-decl name='get_system_hostid' mangled-name='get_system_hostid' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_system_hostid'> - <return type-id='7359adad'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='lib/libspl/os/linux/getmntany.c' language='LANG_C99'> - <array-type-def dimensions='1' type-id='03085adc' size-in-bits='192' id='083f8d58'> - <subrange length='3' type-id='7359adad' id='56f209d2'/> - </array-type-def> - <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'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='mnt_mountp' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='mnt_fstype' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='mnt_mntopts' type-id='26a90f95' visibility='default'/> - </data-member> - </class-decl> - <class-decl name='extmnttab' size-in-bits='320' is-struct='yes' visibility='default' id='0c544dc0'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='mnt_special' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='mnt_mountp' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='mnt_fstype' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='mnt_mntopts' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='mnt_major' type-id='3502e3ff' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='288'> - <var-decl name='mnt_minor' type-id='3502e3ff' visibility='default'/> - </data-member> - </class-decl> - <class-decl name='mntent' size-in-bits='320' is-struct='yes' visibility='default' id='56fe4a37'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='mnt_fsname' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='mnt_dir' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='mnt_type' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='mnt_opts' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='mnt_freq' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='288'> - <var-decl name='mnt_passno' type-id='95e97e5e' visibility='default'/> - </data-member> - </class-decl> - <class-decl name='stat64' size-in-bits='1152' is-struct='yes' visibility='default' id='0bbec9cd'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='st_dev' type-id='35ed8932' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='st_ino' type-id='71288a47' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='st_nlink' type-id='80f0b9df' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='st_mode' type-id='e1c52942' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='224'> - <var-decl name='st_uid' type-id='cc5fcceb' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='st_gid' type-id='d94ec6d9' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='288'> - <var-decl name='__pad0' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='st_rdev' type-id='35ed8932' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='st_size' type-id='79989e9c' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='st_blksize' type-id='d3f10a7f' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='st_blocks' type-id='4e711bf1' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='st_atim' type-id='a9c79a1f' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='st_mtim' type-id='a9c79a1f' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='st_ctim' type-id='a9c79a1f' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='960'> - <var-decl name='__glibc_reserved' type-id='083f8d58' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='__dev_t' type-id='7359adad' id='35ed8932'/> - <typedef-decl name='__ino64_t' type-id='7359adad' id='71288a47'/> - <typedef-decl name='__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'/> - <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'/> - <function-decl name='getmntent_r' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='e75a27e9'/> - <parameter type-id='3cad23cd'/> - <parameter type-id='266fe297'/> - <parameter type-id='95e97e5e'/> - <return type-id='b6b61d2f'/> - </function-decl> - <function-decl name='feof' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='822cd80b'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='strerror' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='95e97e5e'/> - <return type-id='26a90f95'/> - </function-decl> - <function-decl name='__fprintf_chk' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='e75a27e9'/> - <parameter type-id='95e97e5e'/> - <parameter type-id='9d26089a'/> - <parameter is-variadic='yes'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='stat64' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='9d26089a'/> - <parameter type-id='f1cadedf'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='getmntany' mangled-name='getmntany' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='getmntany'> - <parameter type-id='822cd80b' name='fp'/> - <parameter type-id='9d424d31' name='mgetp'/> - <parameter type-id='9d424d31' name='mrefp'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='_sol_getmntent' mangled-name='_sol_getmntent' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_sol_getmntent'> - <parameter type-id='822cd80b' name='fp'/> - <parameter type-id='9d424d31' name='mgetp'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='getextmntent' mangled-name='getextmntent' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='getextmntent'> - <parameter type-id='80f4b756' name='path'/> - <parameter type-id='394fc496' name='entry'/> - <parameter type-id='62f7a03d' name='statbuf'/> - <return type-id='95e97e5e'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='lib/libspl/os/linux/zone.c' language='LANG_C99'> - <typedef-decl name='zoneid_t' type-id='3502e3ff' id='4da03624'/> - <function-decl name='strtoul' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='9d26089a'/> - <parameter type-id='8c85230f'/> - <parameter type-id='95e97e5e'/> - <return type-id='7359adad'/> - </function-decl> - <function-decl name='getzoneid' mangled-name='getzoneid' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='getzoneid'> - <return type-id='4da03624'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='lib/libspl/page.c' language='LANG_C99'> - <function-decl name='spl_pagesize' mangled-name='spl_pagesize' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='spl_pagesize'> - <return type-id='b59d7dce'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='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'/> - <parameter type-id='80f4b756' name='src'/> - <parameter type-id='b59d7dce' name='dstsize'/> - <return type-id='b59d7dce'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='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'/> - <class-decl name='tm' size-in-bits='448' is-struct='yes' visibility='default' id='dddf6ca2'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='tm_sec' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='tm_min' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='tm_hour' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='tm_mday' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='tm_mon' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='160'> - <var-decl name='tm_year' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='tm_wday' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='224'> - <var-decl name='tm_yday' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='tm_isdst' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='tm_gmtoff' type-id='bd54fe1a' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='tm_zone' type-id='80f4b756' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='time_t' type-id='65eda9c0' id='c9d12d66'/> - <qualified-type-def type-id='c9d12d66' const='yes' id='588b3216'/> - <pointer-type-def type-id='588b3216' size-in-bits='64' id='9f201474'/> - <qualified-type-def type-id='9f201474' restrict='yes' id='d6e2847c'/> - <qualified-type-def type-id='dddf6ca2' const='yes' id='e824a34f'/> - <pointer-type-def type-id='e824a34f' size-in-bits='64' id='d6ad37ff'/> - <qualified-type-def type-id='d6ad37ff' restrict='yes' id='f8c6051d'/> - <pointer-type-def type-id='c9d12d66' size-in-bits='64' id='b2eb2c3f'/> - <pointer-type-def type-id='dddf6ca2' size-in-bits='64' id='d915a820'/> - <qualified-type-def type-id='d915a820' restrict='yes' id='f099ad08'/> - <function-decl name='nl_langinfo' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='03b79a94'/> - <return type-id='26a90f95'/> - </function-decl> - <function-decl name='time' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='b2eb2c3f'/> - <return type-id='c9d12d66'/> - </function-decl> - <function-decl name='strftime' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='266fe297'/> - <parameter type-id='b59d7dce'/> - <parameter type-id='9d26089a'/> - <parameter type-id='f8c6051d'/> - <return type-id='b59d7dce'/> - </function-decl> - <function-decl name='localtime_r' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='d6e2847c'/> - <parameter type-id='f099ad08'/> - <return type-id='d915a820'/> - </function-decl> - <function-decl name='__printf_chk' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='95e97e5e'/> - <parameter type-id='80f4b756'/> - <parameter is-variadic='yes'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='print_timestamp' mangled-name='print_timestamp' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='print_timestamp'> - <parameter type-id='3502e3ff' name='timestamp_fmt'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='get_timestamp' mangled-name='get_timestamp' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_timestamp'> - <parameter type-id='3502e3ff' name='timestamp_fmt'/> - <parameter type-id='26a90f95' name='buf'/> - <parameter type-id='95e97e5e' name='len'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='format_timestamp' mangled-name='format_timestamp' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='format_timestamp'> - <parameter type-id='c9d12d66' name='t'/> - <parameter type-id='26a90f95' name='buf'/> - <parameter type-id='95e97e5e' name='len'/> - <return type-id='48b5725f'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='lib/libspl/tunables.c' language='LANG_C99'> - <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'/> - <function-decl name='strtoimax' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='9d26089a'/> - <parameter type-id='8c85230f'/> - <parameter type-id='95e97e5e'/> - <return type-id='e104d842'/> - </function-decl> - <function-decl name='strtoumax' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='9d26089a'/> - <parameter type-id='8c85230f'/> - <parameter type-id='95e97e5e'/> - <return type-id='f8b828c9'/> - </function-decl> - </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'/> - <type-decl name='unsigned int' size-in-bits='32' id='f0981eeb'/> - <type-decl name='unsigned long int' size-in-bits='64' id='7359adad'/> - <type-decl name='variadic parameter type' id='2c1145c5'/> - <type-decl name='void' id='48b5725f'/> - <typedef-decl name='uint_t' type-id='f0981eeb' id='3502e3ff'/> - <typedef-decl name='size_t' type-id='7359adad' id='b59d7dce'/> - <pointer-type-def type-id='a84c031d' size-in-bits='64' id='26a90f95'/> - <qualified-type-def type-id='a84c031d' const='yes' id='9b45d938'/> - <pointer-type-def type-id='9b45d938' size-in-bits='64' id='80f4b756'/> - <pointer-type-def type-id='48b5725f' size-in-bits='64' id='eaa32e2f'/> - <function-decl name='uu_set_error' mangled-name='uu_set_error' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_set_error'> - <parameter type-id='3502e3ff'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='malloc' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='b59d7dce'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='free' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='eaa32e2f'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='strlen' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='80f4b756'/> - <return type-id='b59d7dce'/> - </function-decl> - <function-decl name='strnlen' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='80f4b756'/> - <parameter type-id='b59d7dce'/> - <return type-id='b59d7dce'/> - </function-decl> - <function-decl name='uu_zalloc' mangled-name='uu_zalloc' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_zalloc'> - <parameter type-id='b59d7dce' name='n'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='uu_free' mangled-name='uu_free' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_free'> - <parameter type-id='eaa32e2f' name='p'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='uu_strdup' mangled-name='uu_strdup' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_strdup'> - <parameter type-id='80f4b756' name='str'/> - <return type-id='26a90f95'/> - </function-decl> - <function-decl name='uu_strndup' mangled-name='uu_strndup' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_strndup'> - <parameter type-id='80f4b756' name='s'/> - <parameter type-id='b59d7dce' name='n'/> - <return type-id='26a90f95'/> - </function-decl> - <function-decl name='uu_memdup' mangled-name='uu_memdup' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_memdup'> - <parameter type-id='eaa32e2f' name='buf'/> - <parameter type-id='b59d7dce' name='sz'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='uu_msprintf' mangled-name='uu_msprintf' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_msprintf'> - <parameter type-id='80f4b756' name='format'/> - <parameter is-variadic='yes'/> - <return type-id='26a90f95'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='lib/libuutil/uu_avl.c' language='LANG_C99'> - <array-type-def dimensions='1' type-id='bf311473' size-in-bits='128' id='f0f65199'> - <subrange length='2' type-id='7359adad' id='52efc4ef'/> - </array-type-def> - <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='320' id='36c46961'> - <subrange length='40' type-id='7359adad' id='8f80b239'/> - </array-type-def> - <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='32' id='8e0573fd'> - <subrange length='4' type-id='7359adad' id='16fe7105'/> - </array-type-def> - <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='512' id='59daf3ef'> - <subrange length='64' type-id='7359adad' id='b10be967'/> - </array-type-def> - <type-decl name='int' size-in-bits='32' id='95e97e5e'/> - <type-decl name='long int' size-in-bits='64' id='bd54fe1a'/> - <type-decl name='short int' size-in-bits='16' id='a2185560'/> - <type-decl name='signed char' size-in-bits='8' id='28577a57'/> - <array-type-def dimensions='1' type-id='e475ab95' size-in-bits='192' id='0ce65a8b'> - <subrange length='3' type-id='7359adad' id='56f209d2'/> - </array-type-def> - <type-decl name='unsigned char' size-in-bits='8' id='002ac4a6'/> - <typedef-decl name='uu_compare_fn_t' type-id='add6e811' id='40f93560'/> - <typedef-decl name='uu_walk_fn_t' type-id='96ee24a5' id='9d1aa0dc'/> - <typedef-decl name='uu_avl_pool_t' type-id='12a530a8' id='7f84e390'/> - <typedef-decl name='uu_avl_t' type-id='4af029d1' id='bb7f0973'/> - <class-decl name='uu_avl_node' size-in-bits='192' is-struct='yes' visibility='default' id='f65f4326'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='uan_opaque' type-id='0ce65a8b' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='uu_avl_node_t' type-id='f65f4326' id='73a65116'/> - <typedef-decl name='uu_avl_walk_t' type-id='e70a39e3' id='edd8457b'/> - <typedef-decl name='uu_avl_index_t' type-id='e475ab95' id='5d7f5fc8'/> - <class-decl name='uu_avl_walk' size-in-bits='320' is-struct='yes' visibility='default' id='e70a39e3'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='uaw_next' type-id='5842d146' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='uaw_prev' type-id='5842d146' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='uaw_avl' type-id='a5c21a38' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='uaw_next_result' type-id='eaa32e2f' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='uaw_dir' type-id='ee31ee44' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='264'> - <var-decl name='uaw_robust' type-id='b96825af' visibility='default'/> - </data-member> - </class-decl> - <class-decl name='uu_avl' size-in-bits='960' is-struct='yes' visibility='default' id='4af029d1'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ua_next' type-id='a5c21a38' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='ua_prev' type-id='a5c21a38' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='ua_pool' type-id='de82c773' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='ua_parent' type-id='eaa32e2f' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='ua_debug' type-id='b96825af' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='264'> - <var-decl name='ua_index' type-id='b96825af' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='ua_tree' type-id='b351119f' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='ua_null_walk' type-id='edd8457b' visibility='default'/> - </data-member> - </class-decl> - <class-decl name='uu_avl_pool' size-in-bits='2176' is-struct='yes' visibility='default' id='12a530a8'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='uap_next' type-id='de82c773' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='uap_prev' type-id='de82c773' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='uap_name' type-id='59daf3ef' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='uap_nodeoffset' type-id='b59d7dce' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='uap_objsize' type-id='b59d7dce' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='uap_cmp' type-id='d502b39f' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='uap_debug' type-id='b96825af' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='840'> - <var-decl name='uap_last_index' type-id='b96825af' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='uap_lock' type-id='7a6844eb' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1216'> - <var-decl name='uap_null_avl' type-id='bb7f0973' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='avl_tree_t' type-id='b351119f' id='f20fbd51'/> - <typedef-decl name='avl_index_t' type-id='e475ab95' id='fba6cb51'/> - <class-decl name='avl_node' size-in-bits='192' is-struct='yes' visibility='default' id='428b67b3'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='avl_child' type-id='f0f65199' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='avl_pcb' type-id='e475ab95' visibility='default'/> - </data-member> - </class-decl> - <class-decl name='avl_tree' size-in-bits='320' is-struct='yes' visibility='default' id='b351119f'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='avl_root' type-id='bf311473' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='avl_compar' type-id='585e1de9' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='avl_offset' type-id='b59d7dce' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='avl_numnodes' type-id='ee1f298e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='avl_pad' type-id='b59d7dce' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='ulong_t' type-id='7359adad' id='ee1f298e'/> - <typedef-decl name='uintptr_t' type-id='7359adad' id='e475ab95'/> - <union-decl name='pthread_mutexattr_t' size-in-bits='32' naming-typedef-id='8afd6070' visibility='default' id='7300eb00'> - <data-member access='public'> - <var-decl name='__size' type-id='8e0573fd' visibility='default'/> - </data-member> - <data-member access='public'> - <var-decl name='__align' type-id='95e97e5e' visibility='default'/> - </data-member> - </union-decl> - <typedef-decl name='pthread_mutexattr_t' type-id='7300eb00' id='8afd6070'/> - <union-decl name='pthread_mutex_t' size-in-bits='320' naming-typedef-id='7a6844eb' visibility='default' id='70681f9b'> - <data-member access='public'> - <var-decl name='__data' type-id='4c734837' visibility='default'/> - </data-member> - <data-member access='public'> - <var-decl name='__size' type-id='36c46961' visibility='default'/> - </data-member> - <data-member access='public'> - <var-decl name='__align' type-id='bd54fe1a' visibility='default'/> - </data-member> - </union-decl> - <typedef-decl name='pthread_mutex_t' type-id='70681f9b' id='7a6844eb'/> - <typedef-decl name='int8_t' type-id='2171a512' id='ee31ee44'/> - <typedef-decl name='uint8_t' type-id='c51d6389' id='b96825af'/> - <typedef-decl name='uint32_t' type-id='62f1140c' id='8f92235e'/> - <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' id='4c734837'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='__lock' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='__count' type-id='f0981eeb' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='__owner' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='__nusers' type-id='f0981eeb' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='__kind' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='160'> - <var-decl name='__spins' type-id='a2185560' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='176'> - <var-decl name='__elision' type-id='a2185560' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='__list' type-id='518fb49c' visibility='default'/> - </data-member> - </class-decl> - <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' id='0e01899c'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='__prev' type-id='4d98cd5a' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='__next' type-id='4d98cd5a' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='__pthread_list_t' type-id='0e01899c' id='518fb49c'/> - <typedef-decl name='__int8_t' type-id='28577a57' id='2171a512'/> - <typedef-decl name='__uint8_t' type-id='002ac4a6' id='c51d6389'/> - <typedef-decl name='__uint32_t' type-id='f0981eeb' id='62f1140c'/> - <pointer-type-def type-id='0e01899c' size-in-bits='64' id='4d98cd5a'/> - <pointer-type-def type-id='fba6cb51' size-in-bits='64' id='32adbf30'/> - <pointer-type-def type-id='428b67b3' size-in-bits='64' id='bf311473'/> - <pointer-type-def type-id='b351119f' size-in-bits='64' id='716943c7'/> - <pointer-type-def type-id='f20fbd51' size-in-bits='64' id='a3681dea'/> - <qualified-type-def type-id='8afd6070' const='yes' id='1d853360'/> - <pointer-type-def type-id='1d853360' size-in-bits='64' id='c2afbd7e'/> - <pointer-type-def type-id='96ee24a5' size-in-bits='64' id='585e1de9'/> - <pointer-type-def type-id='7a6844eb' size-in-bits='64' id='18c91f9e'/> - <pointer-type-def type-id='5d7f5fc8' size-in-bits='64' id='813a2225'/> - <pointer-type-def type-id='73a65116' size-in-bits='64' id='2dc35b9d'/> - <pointer-type-def type-id='7f84e390' size-in-bits='64' id='de82c773'/> - <pointer-type-def type-id='bb7f0973' size-in-bits='64' id='a5c21a38'/> - <pointer-type-def type-id='edd8457b' size-in-bits='64' id='5842d146'/> - <pointer-type-def type-id='40f93560' size-in-bits='64' id='d502b39f'/> - <pointer-type-def type-id='9d1aa0dc' size-in-bits='64' id='30a42b6d'/> - <pointer-type-def type-id='eaa32e2f' size-in-bits='64' id='63e171df'/> - <function-decl name='uu_check_name' mangled-name='uu_check_name' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_check_name'> - <parameter type-id='80f4b756'/> - <parameter type-id='3502e3ff'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='uu_panic' mangled-name='uu_panic' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_panic'> - <parameter type-id='80f4b756'/> - <parameter is-variadic='yes'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='avl_create' mangled-name='avl_create' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_create'> - <parameter type-id='a3681dea'/> - <parameter type-id='585e1de9'/> - <parameter type-id='b59d7dce'/> - <parameter type-id='b59d7dce'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='avl_find' mangled-name='avl_find' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_find'> - <parameter type-id='a3681dea'/> - <parameter type-id='eaa32e2f'/> - <parameter type-id='32adbf30'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='avl_insert' mangled-name='avl_insert' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_insert'> - <parameter type-id='a3681dea'/> - <parameter type-id='eaa32e2f'/> - <parameter type-id='fba6cb51'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='avl_first' mangled-name='avl_first' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_first'> - <parameter type-id='a3681dea'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='avl_last' mangled-name='avl_last' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_last'> - <parameter type-id='a3681dea'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='avl_nearest' mangled-name='avl_nearest' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_nearest'> - <parameter type-id='a3681dea'/> - <parameter type-id='fba6cb51'/> - <parameter type-id='95e97e5e'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='avl_remove' mangled-name='avl_remove' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_remove'> - <parameter type-id='a3681dea'/> - <parameter type-id='eaa32e2f'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='avl_numnodes' mangled-name='avl_numnodes' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_numnodes'> - <parameter type-id='a3681dea'/> - <return type-id='ee1f298e'/> - </function-decl> - <function-decl name='avl_destroy_nodes' mangled-name='avl_destroy_nodes' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_destroy_nodes'> - <parameter type-id='a3681dea'/> - <parameter type-id='63e171df'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='avl_destroy' mangled-name='avl_destroy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_destroy'> - <parameter type-id='a3681dea'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='avl_walk' mangled-name='avl_walk' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_walk'> - <parameter type-id='716943c7'/> - <parameter type-id='eaa32e2f'/> - <parameter type-id='95e97e5e'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='strlcpy' mangled-name='strlcpy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='strlcpy'> - <parameter type-id='26a90f95'/> - <parameter type-id='80f4b756'/> - <parameter type-id='b59d7dce'/> - <return type-id='b59d7dce'/> - </function-decl> - <function-decl name='pthread_mutex_init' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='18c91f9e'/> - <parameter type-id='c2afbd7e'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='pthread_mutex_destroy' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='18c91f9e'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='pthread_mutex_lock' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='18c91f9e'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='pthread_mutex_unlock' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='18c91f9e'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='uu_avl_pool_create' mangled-name='uu_avl_pool_create' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_avl_pool_create'> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='b59d7dce' name='objsize'/> - <parameter type-id='b59d7dce' name='nodeoffset'/> - <parameter type-id='d502b39f' name='compare_func'/> - <parameter type-id='8f92235e' name='flags'/> - <return type-id='de82c773'/> - </function-decl> - <function-decl name='uu_avl_pool_destroy' mangled-name='uu_avl_pool_destroy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_avl_pool_destroy'> - <parameter type-id='de82c773' name='pp'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='uu_avl_node_init' mangled-name='uu_avl_node_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_avl_node_init'> - <parameter type-id='eaa32e2f' name='base'/> - <parameter type-id='2dc35b9d' name='np'/> - <parameter type-id='de82c773' name='pp'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='uu_avl_node_fini' mangled-name='uu_avl_node_fini' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_avl_node_fini'> - <parameter type-id='eaa32e2f' name='base'/> - <parameter type-id='2dc35b9d' name='np'/> - <parameter type-id='de82c773' name='pp'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='uu_avl_create' mangled-name='uu_avl_create' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_avl_create'> - <parameter type-id='de82c773' name='pp'/> - <parameter type-id='eaa32e2f' name='parent'/> - <parameter type-id='8f92235e' name='flags'/> - <return type-id='a5c21a38'/> - </function-decl> - <function-decl name='uu_avl_destroy' mangled-name='uu_avl_destroy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_avl_destroy'> - <parameter type-id='a5c21a38' name='ap'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='uu_avl_numnodes' mangled-name='uu_avl_numnodes' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_avl_numnodes'> - <parameter type-id='a5c21a38' name='ap'/> - <return type-id='b59d7dce'/> - </function-decl> - <function-decl name='uu_avl_first' mangled-name='uu_avl_first' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_avl_first'> - <parameter type-id='a5c21a38' name='ap'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='uu_avl_last' mangled-name='uu_avl_last' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_avl_last'> - <parameter type-id='a5c21a38' name='ap'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='uu_avl_next' mangled-name='uu_avl_next' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_avl_next'> - <parameter type-id='a5c21a38' name='ap'/> - <parameter type-id='eaa32e2f' name='node'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='uu_avl_prev' mangled-name='uu_avl_prev' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_avl_prev'> - <parameter type-id='a5c21a38' name='ap'/> - <parameter type-id='eaa32e2f' name='node'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='uu_avl_walk_start' mangled-name='uu_avl_walk_start' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_avl_walk_start'> - <parameter type-id='a5c21a38' name='ap'/> - <parameter type-id='8f92235e' name='flags'/> - <return type-id='5842d146'/> - </function-decl> - <function-decl name='uu_avl_walk_next' mangled-name='uu_avl_walk_next' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_avl_walk_next'> - <parameter type-id='5842d146' name='wp'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='uu_avl_walk_end' mangled-name='uu_avl_walk_end' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_avl_walk_end'> - <parameter type-id='5842d146' name='wp'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='uu_avl_walk' mangled-name='uu_avl_walk' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_avl_walk'> - <parameter type-id='a5c21a38' name='ap'/> - <parameter type-id='30a42b6d' name='func'/> - <parameter type-id='eaa32e2f' name='private'/> - <parameter type-id='8f92235e' name='flags'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='uu_avl_remove' mangled-name='uu_avl_remove' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_avl_remove'> - <parameter type-id='a5c21a38' name='ap'/> - <parameter type-id='eaa32e2f' name='elem'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='uu_avl_teardown' mangled-name='uu_avl_teardown' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_avl_teardown'> - <parameter type-id='a5c21a38' name='ap'/> - <parameter type-id='63e171df' name='cookie'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='uu_avl_find' mangled-name='uu_avl_find' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_avl_find'> - <parameter type-id='a5c21a38' name='ap'/> - <parameter type-id='eaa32e2f' name='elem'/> - <parameter type-id='eaa32e2f' name='private'/> - <parameter type-id='813a2225' name='out'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='uu_avl_insert' mangled-name='uu_avl_insert' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_avl_insert'> - <parameter type-id='a5c21a38' name='ap'/> - <parameter type-id='eaa32e2f' name='elem'/> - <parameter type-id='5d7f5fc8' name='idx'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='uu_avl_nearest_next' mangled-name='uu_avl_nearest_next' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_avl_nearest_next'> - <parameter type-id='a5c21a38' name='ap'/> - <parameter type-id='5d7f5fc8' name='idx'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='uu_avl_nearest_prev' mangled-name='uu_avl_nearest_prev' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_avl_nearest_prev'> - <parameter type-id='a5c21a38' name='ap'/> - <parameter type-id='5d7f5fc8' name='idx'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='uu_avl_lockup' mangled-name='uu_avl_lockup' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_avl_lockup'> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='uu_avl_release' mangled-name='uu_avl_release' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_avl_release'> - <return type-id='48b5725f'/> - </function-decl> - <function-type size-in-bits='64' id='96ee24a5'> - <parameter type-id='eaa32e2f'/> - <parameter type-id='eaa32e2f'/> - <return type-id='95e97e5e'/> - </function-type> - <function-type size-in-bits='64' id='add6e811'> - <parameter type-id='eaa32e2f'/> - <parameter type-id='eaa32e2f'/> - <parameter type-id='eaa32e2f'/> - <return type-id='95e97e5e'/> - </function-type> - </abi-instr> - <abi-instr address-size='64' path='lib/libuutil/uu_ident.c' language='LANG_C99'> - <function-decl name='strchr' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='80f4b756'/> - <parameter type-id='95e97e5e'/> - <return type-id='26a90f95'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='lib/libuutil/uu_list.c' language='LANG_C99'> - <array-type-def dimensions='1' type-id='e475ab95' size-in-bits='128' id='d0e9cdae'> - <subrange length='2' type-id='7359adad' id='52efc4ef'/> - </array-type-def> - <typedef-decl name='uu_list_pool_t' type-id='55168cab' id='38a2549d'/> - <typedef-decl name='uu_list_t' type-id='1d04bdf0' id='82e88484'/> - <class-decl name='uu_list_node' size-in-bits='128' is-struct='yes' visibility='default' id='f8f3cec5'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='uln_opaque' type-id='d0e9cdae' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='uu_list_node_t' type-id='f8f3cec5' id='c4dc472f'/> - <typedef-decl name='uu_list_walk_t' type-id='b80e3208' id='9fed32d2'/> - <typedef-decl name='uu_list_index_t' type-id='e475ab95' id='f0dd35ff'/> - <class-decl name='uu_list_node_impl' size-in-bits='128' is-struct='yes' visibility='default' id='700a795c'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='uln_next' type-id='5af1298a' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='uln_prev' type-id='5af1298a' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='uu_list_node_impl_t' type-id='700a795c' id='8e5864b0'/> - <class-decl name='uu_list_walk' size-in-bits='320' is-struct='yes' visibility='default' id='b80e3208'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ulw_next' type-id='4d848103' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='ulw_prev' type-id='4d848103' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='ulw_list' type-id='0c0b229b' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='ulw_dir' type-id='ee31ee44' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='200'> - <var-decl name='ulw_robust' type-id='b96825af' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='ulw_next_result' type-id='a085247f' visibility='default'/> - </data-member> - </class-decl> - <class-decl name='uu_list' size-in-bits='896' is-struct='yes' visibility='default' id='1d04bdf0'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ul_next' type-id='0c0b229b' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='ul_prev' type-id='0c0b229b' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='ul_pool' type-id='0941e04e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='ul_parent' type-id='eaa32e2f' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='ul_offset' type-id='b59d7dce' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='ul_numnodes' type-id='b59d7dce' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='ul_debug' type-id='b96825af' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='392'> - <var-decl name='ul_sorted' type-id='b96825af' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='400'> - <var-decl name='ul_index' type-id='b96825af' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='ul_null_node' type-id='8e5864b0' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='ul_null_walk' type-id='9fed32d2' visibility='default'/> - </data-member> - </class-decl> - <class-decl name='uu_list_pool' size-in-bits='2112' is-struct='yes' visibility='default' id='55168cab'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ulp_next' type-id='0941e04e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='ulp_prev' type-id='0941e04e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='ulp_name' type-id='59daf3ef' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='ulp_nodeoffset' type-id='b59d7dce' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='ulp_objsize' type-id='b59d7dce' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='ulp_cmp' type-id='d502b39f' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='ulp_debug' type-id='b96825af' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='840'> - <var-decl name='ulp_last_index' type-id='b96825af' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='ulp_lock' type-id='7a6844eb' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1216'> - <var-decl name='ulp_null_list' type-id='82e88484' visibility='default'/> - </data-member> - </class-decl> - <pointer-type-def type-id='f0dd35ff' size-in-bits='64' id='ecbc0046'/> - <pointer-type-def type-id='700a795c' size-in-bits='64' id='5af1298a'/> - <pointer-type-def type-id='8e5864b0' size-in-bits='64' id='a085247f'/> - <pointer-type-def type-id='c4dc472f' size-in-bits='64' id='dbe143f4'/> - <pointer-type-def type-id='38a2549d' size-in-bits='64' id='0941e04e'/> - <pointer-type-def type-id='82e88484' size-in-bits='64' id='0c0b229b'/> - <pointer-type-def type-id='9fed32d2' size-in-bits='64' id='4d848103'/> - <function-decl name='uu_list_pool_create' mangled-name='uu_list_pool_create' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_list_pool_create'> - <parameter type-id='80f4b756' name='name'/> - <parameter type-id='b59d7dce' name='objsize'/> - <parameter type-id='b59d7dce' name='nodeoffset'/> - <parameter type-id='d502b39f' name='compare_func'/> - <parameter type-id='8f92235e' name='flags'/> - <return type-id='0941e04e'/> - </function-decl> - <function-decl name='uu_list_pool_destroy' mangled-name='uu_list_pool_destroy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_list_pool_destroy'> - <parameter type-id='0941e04e' name='pp'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='uu_list_node_init' mangled-name='uu_list_node_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_list_node_init'> - <parameter type-id='eaa32e2f' name='base'/> - <parameter type-id='dbe143f4' name='np_arg'/> - <parameter type-id='0941e04e' name='pp'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='uu_list_node_fini' mangled-name='uu_list_node_fini' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_list_node_fini'> - <parameter type-id='eaa32e2f' name='base'/> - <parameter type-id='dbe143f4' name='np_arg'/> - <parameter type-id='0941e04e' name='pp'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='uu_list_create' mangled-name='uu_list_create' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_list_create'> - <parameter type-id='0941e04e' name='pp'/> - <parameter type-id='eaa32e2f' name='parent'/> - <parameter type-id='8f92235e' name='flags'/> - <return type-id='0c0b229b'/> - </function-decl> - <function-decl name='uu_list_destroy' mangled-name='uu_list_destroy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_list_destroy'> - <parameter type-id='0c0b229b' name='lp'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='uu_list_insert' mangled-name='uu_list_insert' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_list_insert'> - <parameter type-id='0c0b229b' name='lp'/> - <parameter type-id='eaa32e2f' name='elem'/> - <parameter type-id='f0dd35ff' name='idx'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='uu_list_find' mangled-name='uu_list_find' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_list_find'> - <parameter type-id='0c0b229b' name='lp'/> - <parameter type-id='eaa32e2f' name='elem'/> - <parameter type-id='eaa32e2f' name='private'/> - <parameter type-id='ecbc0046' name='out'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='uu_list_nearest_next' mangled-name='uu_list_nearest_next' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_list_nearest_next'> - <parameter type-id='0c0b229b' name='lp'/> - <parameter type-id='f0dd35ff' name='idx'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='uu_list_nearest_prev' mangled-name='uu_list_nearest_prev' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_list_nearest_prev'> - <parameter type-id='0c0b229b' name='lp'/> - <parameter type-id='f0dd35ff' name='idx'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='uu_list_walk_start' mangled-name='uu_list_walk_start' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_list_walk_start'> - <parameter type-id='0c0b229b' name='lp'/> - <parameter type-id='8f92235e' name='flags'/> - <return type-id='4d848103'/> - </function-decl> - <function-decl name='uu_list_walk_next' mangled-name='uu_list_walk_next' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_list_walk_next'> - <parameter type-id='4d848103' name='wp'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='uu_list_walk_end' mangled-name='uu_list_walk_end' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_list_walk_end'> - <parameter type-id='4d848103' name='wp'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='uu_list_walk' mangled-name='uu_list_walk' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_list_walk'> - <parameter type-id='0c0b229b' name='lp'/> - <parameter type-id='30a42b6d' name='func'/> - <parameter type-id='eaa32e2f' name='private'/> - <parameter type-id='8f92235e' name='flags'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='uu_list_remove' mangled-name='uu_list_remove' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_list_remove'> - <parameter type-id='0c0b229b' name='lp'/> - <parameter type-id='eaa32e2f' name='elem'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='uu_list_teardown' mangled-name='uu_list_teardown' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_list_teardown'> - <parameter type-id='0c0b229b' name='lp'/> - <parameter type-id='63e171df' name='cookie'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='uu_list_insert_before' mangled-name='uu_list_insert_before' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_list_insert_before'> - <parameter type-id='0c0b229b' name='lp'/> - <parameter type-id='eaa32e2f' name='target'/> - <parameter type-id='eaa32e2f' name='elem'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='uu_list_insert_after' mangled-name='uu_list_insert_after' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_list_insert_after'> - <parameter type-id='0c0b229b' name='lp'/> - <parameter type-id='eaa32e2f' name='target'/> - <parameter type-id='eaa32e2f' name='elem'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='uu_list_numnodes' mangled-name='uu_list_numnodes' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_list_numnodes'> - <parameter type-id='0c0b229b' name='lp'/> - <return type-id='b59d7dce'/> - </function-decl> - <function-decl name='uu_list_first' mangled-name='uu_list_first' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_list_first'> - <parameter type-id='0c0b229b' name='lp'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='uu_list_last' mangled-name='uu_list_last' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_list_last'> - <parameter type-id='0c0b229b' name='lp'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='uu_list_next' mangled-name='uu_list_next' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_list_next'> - <parameter type-id='0c0b229b' name='lp'/> - <parameter type-id='eaa32e2f' name='elem'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='uu_list_prev' mangled-name='uu_list_prev' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_list_prev'> - <parameter type-id='0c0b229b' name='lp'/> - <parameter type-id='eaa32e2f' name='elem'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='uu_list_lockup' mangled-name='uu_list_lockup' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_list_lockup'> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='uu_list_release' mangled-name='uu_list_release' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_list_release'> - <return type-id='48b5725f'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='lib/libuutil/uu_misc.c' language='LANG_C99'> - <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='8' id='89feb1ec'> - <subrange length='1' type-id='7359adad' id='52f813b4'/> - </array-type-def> - <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='160' id='664ac0b7'> - <subrange length='20' type-id='7359adad' id='fdca39cf'/> - </array-type-def> - <class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='a4036571'/> - <class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='010ae0b9'/> - <class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='79bd3751'/> - <class-decl name='__va_list_tag' size-in-bits='192' is-struct='yes' visibility='default' id='d5027220'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='gp_offset' type-id='f0981eeb' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='fp_offset' type-id='f0981eeb' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='overflow_arg_area' type-id='eaa32e2f' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='reg_save_area' type-id='eaa32e2f' visibility='default'/> - </data-member> - </class-decl> - <type-decl name='unsigned short int' size-in-bits='16' id='8efea9e5'/> - <typedef-decl name='pthread_t' type-id='7359adad' id='4051f5e7'/> - <typedef-decl name='pthread_key_t' type-id='f0981eeb' id='2de5383b'/> - <typedef-decl name='__off_t' type-id='bd54fe1a' id='79989e9c'/> - <typedef-decl name='__off64_t' type-id='bd54fe1a' id='724e4de6'/> - <typedef-decl name='FILE' type-id='ec1ed955' id='aa12d1ba'/> - <typedef-decl name='_IO_lock_t' type-id='48b5725f' id='bb4788fa'/> - <class-decl name='_IO_FILE' size-in-bits='1728' is-struct='yes' visibility='default' id='ec1ed955'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_flags' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='_IO_read_ptr' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='_IO_read_end' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='_IO_read_base' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='_IO_write_base' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_IO_write_ptr' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='_IO_write_end' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='_IO_buf_base' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='_IO_buf_end' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='_IO_save_base' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='_IO_backup_base' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='_IO_save_end' type-id='26a90f95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='_markers' type-id='e4c6fa61' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='_chain' type-id='dca988a5' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='_fileno' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='928'> - <var-decl name='_flags2' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='960'> - <var-decl name='_old_offset' type-id='79989e9c' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1024'> - <var-decl name='_cur_column' type-id='8efea9e5' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1040'> - <var-decl name='_vtable_offset' type-id='28577a57' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1048'> - <var-decl name='_shortbuf' type-id='89feb1ec' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1088'> - <var-decl name='_lock' type-id='cecf4ea7' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1152'> - <var-decl name='_offset' type-id='724e4de6' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1216'> - <var-decl name='_codecvt' type-id='570f8c59' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1280'> - <var-decl name='_wide_data' type-id='c65a1f29' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1344'> - <var-decl name='_freeres_list' type-id='dca988a5' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1408'> - <var-decl name='_freeres_buf' type-id='eaa32e2f' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1472'> - <var-decl name='__pad5' type-id='b59d7dce' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1536'> - <var-decl name='_mode' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1568'> - <var-decl name='_unused2' type-id='664ac0b7' visibility='default'/> - </data-member> - </class-decl> - <pointer-type-def type-id='aa12d1ba' size-in-bits='64' id='822cd80b'/> - <qualified-type-def type-id='822cd80b' restrict='yes' id='e75a27e9'/> - <pointer-type-def type-id='ec1ed955' size-in-bits='64' id='dca988a5'/> - <pointer-type-def type-id='a4036571' size-in-bits='64' id='570f8c59'/> - <pointer-type-def type-id='bb4788fa' size-in-bits='64' id='cecf4ea7'/> - <pointer-type-def type-id='010ae0b9' size-in-bits='64' id='e4c6fa61'/> - <pointer-type-def type-id='79bd3751' size-in-bits='64' id='c65a1f29'/> - <pointer-type-def type-id='d5027220' size-in-bits='64' id='b7f2d5e6'/> - <qualified-type-def type-id='80f4b756' restrict='yes' id='9d26089a'/> - <pointer-type-def type-id='95e97e5e' size-in-bits='64' id='7292109c'/> - <pointer-type-def type-id='2de5383b' size-in-bits='64' id='ce04b822'/> - <pointer-type-def type-id='ee076206' size-in-bits='64' id='953b12f8'/> - <pointer-type-def type-id='c5c76c9c' size-in-bits='64' id='b7f9d8e6'/> - <class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='a4036571'/> - <class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='010ae0b9'/> - <class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='79bd3751'/> - <function-decl name='__errno_location' visibility='default' binding='global' size-in-bits='64'> - <return type-id='7292109c'/> - </function-decl> - <function-decl name='dcgettext' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='80f4b756'/> - <parameter type-id='80f4b756'/> - <parameter type-id='95e97e5e'/> - <return type-id='26a90f95'/> - </function-decl> - <function-decl name='pthread_self' visibility='default' binding='global' size-in-bits='64'> - <return type-id='4051f5e7'/> - </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_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='pthread_atfork' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='953b12f8'/> - <parameter type-id='953b12f8'/> - <parameter type-id='953b12f8'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='abort' visibility='default' binding='global' size-in-bits='64'> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='pause' visibility='default' binding='global' size-in-bits='64'> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='__vfprintf_chk' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='e75a27e9'/> - <parameter type-id='95e97e5e'/> - <parameter type-id='9d26089a'/> - <parameter type-id='b7f2d5e6'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='uu_error' mangled-name='uu_error' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_error'> - <return type-id='8f92235e'/> - </function-decl> - <function-decl name='uu_strerror' mangled-name='uu_strerror' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_strerror'> - <parameter type-id='8f92235e' name='code'/> - <return type-id='80f4b756'/> - </function-decl> - <function-type size-in-bits='64' id='ee076206'> - <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'/> - <enum-decl name='boolean_t' naming-typedef-id='c19b74c3' id='f58c8277'> - <underlying-type type-id='9cac1fee'/> - <enumerator name='B_FALSE' value='0'/> - <enumerator name='B_TRUE' value='1'/> - </enum-decl> - <typedef-decl name='boolean_t' type-id='f58c8277' id='c19b74c3'/> - <function-decl name='strcmp' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='80f4b756'/> - <parameter type-id='80f4b756'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='strncmp' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='80f4b756'/> - <parameter type-id='80f4b756'/> - <parameter type-id='b59d7dce'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='strcasecmp' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='80f4b756'/> - <parameter type-id='80f4b756'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='uu_streq' mangled-name='uu_streq' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_streq'> - <parameter type-id='80f4b756' name='a'/> - <parameter type-id='80f4b756' name='b'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='uu_strcaseeq' mangled-name='uu_strcaseeq' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_strcaseeq'> - <parameter type-id='80f4b756' name='a'/> - <parameter type-id='80f4b756' name='b'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='uu_strbw' mangled-name='uu_strbw' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='uu_strbw'> - <parameter type-id='80f4b756' name='a'/> - <parameter type-id='80f4b756' name='b'/> - <return type-id='c19b74c3'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='module/avl/avl.c' language='LANG_C99'> - <function-decl name='libspl_assertf' mangled-name='libspl_assertf' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libspl_assertf'> - <parameter type-id='80f4b756'/> - <parameter type-id='80f4b756'/> - <parameter type-id='95e97e5e'/> - <parameter type-id='80f4b756'/> - <parameter is-variadic='yes'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='avl_insert_here' mangled-name='avl_insert_here' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_insert_here'> - <parameter type-id='a3681dea' name='tree'/> - <parameter type-id='eaa32e2f' name='new_data'/> - <parameter type-id='eaa32e2f' name='here'/> - <parameter type-id='95e97e5e' name='direction'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='avl_add' mangled-name='avl_add' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_add'> - <parameter type-id='a3681dea' name='tree'/> - <parameter type-id='eaa32e2f' name='new_node'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='avl_update_lt' mangled-name='avl_update_lt' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_update_lt'> - <parameter type-id='a3681dea' name='t'/> - <parameter type-id='eaa32e2f' name='obj'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='avl_update_gt' mangled-name='avl_update_gt' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_update_gt'> - <parameter type-id='a3681dea' name='t'/> - <parameter type-id='eaa32e2f' name='obj'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='avl_update' mangled-name='avl_update' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_update'> - <parameter type-id='a3681dea' name='t'/> - <parameter type-id='eaa32e2f' name='obj'/> - <return type-id='c19b74c3'/> - </function-decl> - <function-decl name='avl_swap' mangled-name='avl_swap' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_swap'> - <parameter type-id='a3681dea' name='tree1'/> - <parameter type-id='a3681dea' name='tree2'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='avl_is_empty' mangled-name='avl_is_empty' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_is_empty'> - <parameter type-id='a3681dea' name='tree'/> - <return type-id='c19b74c3'/> - </function-decl> - </abi-instr> -</abi-corpus> diff --git a/sys/contrib/openzfs/lib/libuutil/libuutil.suppr b/sys/contrib/openzfs/lib/libuutil/libuutil.suppr deleted file mode 100644 index f4db8a49e4f2..000000000000 --- a/sys/contrib/openzfs/lib/libuutil/libuutil.suppr +++ /dev/null @@ -1,2 +0,0 @@ -[suppress_type] - name = FILE* diff --git a/sys/contrib/openzfs/lib/libuutil/uu_alloc.c b/sys/contrib/openzfs/lib/libuutil/uu_alloc.c deleted file mode 100644 index dc2276e3d8b0..000000000000 --- a/sys/contrib/openzfs/lib/libuutil/uu_alloc.c +++ /dev/null @@ -1,136 +0,0 @@ -// 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) 2004, 2010, Oracle and/or its affiliates. All rights reserved. - */ - -#include "libuutil_common.h" - -#include <stdarg.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -void * -uu_zalloc(size_t n) -{ - void *p = malloc(n); - - if (p == NULL) { - uu_set_error(UU_ERROR_SYSTEM); - return (NULL); - } - - (void) memset(p, 0, n); - - return (p); -} - -void -uu_free(void *p) -{ - free(p); -} - -char * -uu_strdup(const char *str) -{ - char *buf = NULL; - - if (str != NULL) { - size_t sz; - - sz = strlen(str) + 1; - buf = uu_zalloc(sz); - if (buf != NULL) - (void) memcpy(buf, str, sz); - } - return (buf); -} - -/* - * Duplicate up to n bytes of a string. Kind of sort of like - * strdup(strlcpy(s, n)). - */ -char * -uu_strndup(const char *s, size_t n) -{ - size_t len; - char *p; - - len = strnlen(s, n); - p = uu_zalloc(len + 1); - if (p == NULL) - return (NULL); - - if (len > 0) - (void) memcpy(p, s, len); - p[len] = '\0'; - - return (p); -} - -/* - * Duplicate a block of memory. Combines malloc with memcpy, much as - * strdup combines malloc, strlen, and strcpy. - */ -void * -uu_memdup(const void *buf, size_t sz) -{ - void *p; - - p = uu_zalloc(sz); - if (p == NULL) - return (NULL); - (void) memcpy(p, buf, sz); - return (p); -} - -char * -uu_msprintf(const char *format, ...) -{ - va_list args; - char attic[1]; - uint_t M, m; - char *b; - - va_start(args, format); - M = vsnprintf(attic, 1, format, args); - va_end(args); - - for (;;) { - m = M; - if ((b = uu_zalloc(m + 1)) == NULL) - return (NULL); - - va_start(args, format); - M = vsnprintf(b, m + 1, format, args); - va_end(args); - - if (M == m) - break; /* sizes match */ - - uu_free(b); - } - - return (b); -} diff --git a/sys/contrib/openzfs/lib/libuutil/uu_avl.c b/sys/contrib/openzfs/lib/libuutil/uu_avl.c deleted file mode 100644 index a741bfa0fc94..000000000000 --- a/sys/contrib/openzfs/lib/libuutil/uu_avl.c +++ /dev/null @@ -1,569 +0,0 @@ -// SPDX-License-Identifier: CDDL-1.0 -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or https://opensource.org/licenses/CDDL-1.0. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - - - -#include "libuutil_common.h" - -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/avl.h> - -static uu_avl_pool_t uu_null_apool = { &uu_null_apool, &uu_null_apool }; -static pthread_mutex_t uu_apool_list_lock = PTHREAD_MUTEX_INITIALIZER; - -/* - * The index mark change on every insert and delete, to catch stale - * references. - * - * We leave the low bit alone, since the avl code uses it. - */ -#define INDEX_MAX (sizeof (uintptr_t) - 2) -#define INDEX_NEXT(m) (((m) == INDEX_MAX)? 2 : ((m) + 2) & INDEX_MAX) - -#define INDEX_DECODE(i) ((i) & ~INDEX_MAX) -#define INDEX_ENCODE(p, n) (((n) & ~INDEX_MAX) | (p)->ua_index) -#define INDEX_VALID(p, i) (((i) & INDEX_MAX) == (p)->ua_index) -#define INDEX_CHECK(i) (((i) & INDEX_MAX) != 0) - -/* - * When an element is inactive (not in a tree), we keep a marked pointer to - * its containing pool in its first word, and a NULL pointer in its second. - * - * On insert, we use these to verify that it comes from the correct pool. - */ -#define NODE_ARRAY(p, n) ((uintptr_t *)((uintptr_t)(n) + \ - (pp)->uap_nodeoffset)) - -#define POOL_TO_MARKER(pp) (((uintptr_t)(pp) | 1)) - -#define DEAD_MARKER 0xc4 - -uu_avl_pool_t * -uu_avl_pool_create(const char *name, size_t objsize, size_t nodeoffset, - uu_compare_fn_t *compare_func, uint32_t flags) -{ - uu_avl_pool_t *pp, *next, *prev; - - if (name == NULL || - uu_check_name(name, UU_NAME_DOMAIN) == -1 || - nodeoffset + sizeof (uu_avl_node_t) > objsize || - compare_func == NULL) { - uu_set_error(UU_ERROR_INVALID_ARGUMENT); - return (NULL); - } - - if (flags & ~UU_AVL_POOL_DEBUG) { - uu_set_error(UU_ERROR_UNKNOWN_FLAG); - return (NULL); - } - - pp = uu_zalloc(sizeof (uu_avl_pool_t)); - if (pp == NULL) { - uu_set_error(UU_ERROR_NO_MEMORY); - return (NULL); - } - - (void) strlcpy(pp->uap_name, name, sizeof (pp->uap_name)); - pp->uap_nodeoffset = nodeoffset; - pp->uap_objsize = objsize; - pp->uap_cmp = compare_func; - if (flags & UU_AVL_POOL_DEBUG) - pp->uap_debug = 1; - pp->uap_last_index = 0; - - (void) pthread_mutex_init(&pp->uap_lock, NULL); - - pp->uap_null_avl.ua_next = &pp->uap_null_avl; - pp->uap_null_avl.ua_prev = &pp->uap_null_avl; - - (void) pthread_mutex_lock(&uu_apool_list_lock); - pp->uap_next = next = &uu_null_apool; - pp->uap_prev = prev = next->uap_prev; - next->uap_prev = pp; - prev->uap_next = pp; - (void) pthread_mutex_unlock(&uu_apool_list_lock); - - return (pp); -} - -void -uu_avl_pool_destroy(uu_avl_pool_t *pp) -{ - if (pp->uap_debug) { - if (pp->uap_null_avl.ua_next != &pp->uap_null_avl || - pp->uap_null_avl.ua_prev != &pp->uap_null_avl) { - uu_panic("uu_avl_pool_destroy: Pool \"%.*s\" (%p) has " - "outstanding avls, or is corrupt.\n", - (int)sizeof (pp->uap_name), pp->uap_name, - (void *)pp); - } - } - (void) pthread_mutex_lock(&uu_apool_list_lock); - pp->uap_next->uap_prev = pp->uap_prev; - pp->uap_prev->uap_next = pp->uap_next; - (void) pthread_mutex_unlock(&uu_apool_list_lock); - (void) pthread_mutex_destroy(&pp->uap_lock); - pp->uap_prev = NULL; - pp->uap_next = NULL; - uu_free(pp); -} - -void -uu_avl_node_init(void *base, uu_avl_node_t *np, uu_avl_pool_t *pp) -{ - uintptr_t *na = (uintptr_t *)np; - - if (pp->uap_debug) { - uintptr_t offset = (uintptr_t)np - (uintptr_t)base; - if (offset + sizeof (*np) > pp->uap_objsize) { - uu_panic("uu_avl_node_init(%p, %p, %p (\"%s\")): " - "offset %ld doesn't fit in object (size %ld)\n", - base, (void *)np, (void *)pp, pp->uap_name, - (long)offset, (long)pp->uap_objsize); - } - if (offset != pp->uap_nodeoffset) { - uu_panic("uu_avl_node_init(%p, %p, %p (\"%s\")): " - "offset %ld doesn't match pool's offset (%ld)\n", - base, (void *)np, (void *)pp, pp->uap_name, - (long)offset, (long)pp->uap_objsize); - } - } - - na[0] = POOL_TO_MARKER(pp); - na[1] = 0; -} - -void -uu_avl_node_fini(void *base, uu_avl_node_t *np, uu_avl_pool_t *pp) -{ - uintptr_t *na = (uintptr_t *)np; - - if (pp->uap_debug) { - if (na[0] == DEAD_MARKER && na[1] == DEAD_MARKER) { - uu_panic("uu_avl_node_fini(%p, %p, %p (\"%s\")): " - "node already finied\n", - base, (void *)np, (void *)pp, pp->uap_name); - } - if (na[0] != POOL_TO_MARKER(pp) || na[1] != 0) { - uu_panic("uu_avl_node_fini(%p, %p, %p (\"%s\")): " - "node corrupt, in tree, or in different pool\n", - base, (void *)np, (void *)pp, pp->uap_name); - } - } - - na[0] = DEAD_MARKER; - na[1] = DEAD_MARKER; - na[2] = DEAD_MARKER; -} - -struct uu_avl_node_compare_info { - uu_compare_fn_t *ac_compare; - void *ac_private; - void *ac_right; - void *ac_found; -}; - -static int -uu_avl_node_compare(const void *l, const void *r) -{ - struct uu_avl_node_compare_info *info = - (struct uu_avl_node_compare_info *)l; - - int res = info->ac_compare(r, info->ac_right, info->ac_private); - - if (res == 0) { - if (info->ac_found == NULL) - info->ac_found = (void *)r; - return (-1); - } - if (res < 0) - return (1); - return (-1); -} - -uu_avl_t * -uu_avl_create(uu_avl_pool_t *pp, void *parent, uint32_t flags) -{ - uu_avl_t *ap, *next, *prev; - - if (flags & ~UU_AVL_DEBUG) { - uu_set_error(UU_ERROR_UNKNOWN_FLAG); - return (NULL); - } - - ap = uu_zalloc(sizeof (*ap)); - if (ap == NULL) { - uu_set_error(UU_ERROR_NO_MEMORY); - return (NULL); - } - - ap->ua_pool = pp; - ap->ua_parent = parent; - ap->ua_debug = pp->uap_debug || (flags & UU_AVL_DEBUG); - ap->ua_index = (pp->uap_last_index = INDEX_NEXT(pp->uap_last_index)); - - avl_create(&ap->ua_tree, &uu_avl_node_compare, pp->uap_objsize, - pp->uap_nodeoffset); - - ap->ua_null_walk.uaw_next = &ap->ua_null_walk; - ap->ua_null_walk.uaw_prev = &ap->ua_null_walk; - - (void) pthread_mutex_lock(&pp->uap_lock); - next = &pp->uap_null_avl; - prev = next->ua_prev; - ap->ua_next = next; - ap->ua_prev = prev; - next->ua_prev = ap; - prev->ua_next = ap; - (void) pthread_mutex_unlock(&pp->uap_lock); - - return (ap); -} - -void -uu_avl_destroy(uu_avl_t *ap) -{ - uu_avl_pool_t *pp = ap->ua_pool; - - if (ap->ua_debug) { - if (avl_numnodes(&ap->ua_tree) != 0) { - uu_panic("uu_avl_destroy(%p): tree not empty\n", - (void *)ap); - } - if (ap->ua_null_walk.uaw_next != &ap->ua_null_walk || - ap->ua_null_walk.uaw_prev != &ap->ua_null_walk) { - uu_panic("uu_avl_destroy(%p): outstanding walkers\n", - (void *)ap); - } - } - (void) pthread_mutex_lock(&pp->uap_lock); - ap->ua_next->ua_prev = ap->ua_prev; - ap->ua_prev->ua_next = ap->ua_next; - (void) pthread_mutex_unlock(&pp->uap_lock); - ap->ua_prev = NULL; - ap->ua_next = NULL; - - ap->ua_pool = NULL; - avl_destroy(&ap->ua_tree); - - uu_free(ap); -} - -size_t -uu_avl_numnodes(uu_avl_t *ap) -{ - return (avl_numnodes(&ap->ua_tree)); -} - -void * -uu_avl_first(uu_avl_t *ap) -{ - return (avl_first(&ap->ua_tree)); -} - -void * -uu_avl_last(uu_avl_t *ap) -{ - return (avl_last(&ap->ua_tree)); -} - -void * -uu_avl_next(uu_avl_t *ap, void *node) -{ - return (AVL_NEXT(&ap->ua_tree, node)); -} - -void * -uu_avl_prev(uu_avl_t *ap, void *node) -{ - return (AVL_PREV(&ap->ua_tree, node)); -} - -static void -_avl_walk_init(uu_avl_walk_t *wp, uu_avl_t *ap, uint32_t flags) -{ - uu_avl_walk_t *next, *prev; - - int robust = (flags & UU_WALK_ROBUST); - int direction = (flags & UU_WALK_REVERSE)? -1 : 1; - - (void) memset(wp, 0, sizeof (*wp)); - wp->uaw_avl = ap; - wp->uaw_robust = robust; - wp->uaw_dir = direction; - - if (direction > 0) - wp->uaw_next_result = avl_first(&ap->ua_tree); - else - wp->uaw_next_result = avl_last(&ap->ua_tree); - - if (ap->ua_debug || robust) { - wp->uaw_next = next = &ap->ua_null_walk; - wp->uaw_prev = prev = next->uaw_prev; - next->uaw_prev = wp; - prev->uaw_next = wp; - } -} - -static void * -_avl_walk_advance(uu_avl_walk_t *wp, uu_avl_t *ap) -{ - void *np = wp->uaw_next_result; - - avl_tree_t *t = &ap->ua_tree; - - if (np == NULL) - return (NULL); - - wp->uaw_next_result = (wp->uaw_dir > 0)? AVL_NEXT(t, np) : - AVL_PREV(t, np); - - return (np); -} - -static void -_avl_walk_fini(uu_avl_walk_t *wp) -{ - if (wp->uaw_next != NULL) { - wp->uaw_next->uaw_prev = wp->uaw_prev; - wp->uaw_prev->uaw_next = wp->uaw_next; - wp->uaw_next = NULL; - wp->uaw_prev = NULL; - } - wp->uaw_avl = NULL; - wp->uaw_next_result = NULL; -} - -uu_avl_walk_t * -uu_avl_walk_start(uu_avl_t *ap, uint32_t flags) -{ - uu_avl_walk_t *wp; - - if (flags & ~(UU_WALK_ROBUST | UU_WALK_REVERSE)) { - uu_set_error(UU_ERROR_UNKNOWN_FLAG); - return (NULL); - } - - wp = uu_zalloc(sizeof (*wp)); - if (wp == NULL) { - uu_set_error(UU_ERROR_NO_MEMORY); - return (NULL); - } - - _avl_walk_init(wp, ap, flags); - return (wp); -} - -void * -uu_avl_walk_next(uu_avl_walk_t *wp) -{ - return (_avl_walk_advance(wp, wp->uaw_avl)); -} - -void -uu_avl_walk_end(uu_avl_walk_t *wp) -{ - _avl_walk_fini(wp); - uu_free(wp); -} - -int -uu_avl_walk(uu_avl_t *ap, uu_walk_fn_t *func, void *private, uint32_t flags) -{ - void *e; - uu_avl_walk_t my_walk; - - int status = UU_WALK_NEXT; - - if (flags & ~(UU_WALK_ROBUST | UU_WALK_REVERSE)) { - uu_set_error(UU_ERROR_UNKNOWN_FLAG); - return (-1); - } - - _avl_walk_init(&my_walk, ap, flags); - while (status == UU_WALK_NEXT && - (e = _avl_walk_advance(&my_walk, ap)) != NULL) - status = (*func)(e, private); - _avl_walk_fini(&my_walk); - - if (status >= 0) - return (0); - uu_set_error(UU_ERROR_CALLBACK_FAILED); - return (-1); -} - -void -uu_avl_remove(uu_avl_t *ap, void *elem) -{ - uu_avl_walk_t *wp; - uu_avl_pool_t *pp = ap->ua_pool; - uintptr_t *na = NODE_ARRAY(pp, elem); - - if (ap->ua_debug) { - /* - * invalidate outstanding uu_avl_index_ts. - */ - ap->ua_index = INDEX_NEXT(ap->ua_index); - } - - /* - * Robust walkers most be advanced, if we are removing the node - * they are currently using. In debug mode, non-robust walkers - * are also on the walker list. - */ - for (wp = ap->ua_null_walk.uaw_next; wp != &ap->ua_null_walk; - wp = wp->uaw_next) { - if (wp->uaw_robust) { - if (elem == wp->uaw_next_result) - (void) _avl_walk_advance(wp, ap); - } else if (wp->uaw_next_result != NULL) { - uu_panic("uu_avl_remove(%p, %p): active non-robust " - "walker\n", (void *)ap, elem); - } - } - - avl_remove(&ap->ua_tree, elem); - - na[0] = POOL_TO_MARKER(pp); - na[1] = 0; -} - -void * -uu_avl_teardown(uu_avl_t *ap, void **cookie) -{ - void *elem = avl_destroy_nodes(&ap->ua_tree, cookie); - - if (elem != NULL) { - uu_avl_pool_t *pp = ap->ua_pool; - uintptr_t *na = NODE_ARRAY(pp, elem); - - na[0] = POOL_TO_MARKER(pp); - na[1] = 0; - } - return (elem); -} - -void * -uu_avl_find(uu_avl_t *ap, void *elem, void *private, uu_avl_index_t *out) -{ - struct uu_avl_node_compare_info info; - void *result; - - info.ac_compare = ap->ua_pool->uap_cmp; - info.ac_private = private; - info.ac_right = elem; - info.ac_found = NULL; - - result = avl_find(&ap->ua_tree, &info, out); - if (out != NULL) - *out = INDEX_ENCODE(ap, *out); - - if (ap->ua_debug && result != NULL) - uu_panic("uu_avl_find: internal error: avl_find succeeded\n"); - - return (info.ac_found); -} - -void -uu_avl_insert(uu_avl_t *ap, void *elem, uu_avl_index_t idx) -{ - if (ap->ua_debug) { - uu_avl_pool_t *pp = ap->ua_pool; - uintptr_t *na = NODE_ARRAY(pp, elem); - - if (na[1] != 0) - uu_panic("uu_avl_insert(%p, %p, %p): node already " - "in tree, or corrupt\n", - (void *)ap, elem, (void *)idx); - if (na[0] == 0) - uu_panic("uu_avl_insert(%p, %p, %p): node not " - "initialized\n", - (void *)ap, elem, (void *)idx); - if (na[0] != POOL_TO_MARKER(pp)) - uu_panic("uu_avl_insert(%p, %p, %p): node from " - "other pool, or corrupt\n", - (void *)ap, elem, (void *)idx); - - if (!INDEX_VALID(ap, idx)) - uu_panic("uu_avl_insert(%p, %p, %p): %s\n", - (void *)ap, elem, (void *)idx, - INDEX_CHECK(idx)? "outdated index" : - "invalid index"); - - /* - * invalidate outstanding uu_avl_index_ts. - */ - ap->ua_index = INDEX_NEXT(ap->ua_index); - } - avl_insert(&ap->ua_tree, elem, INDEX_DECODE(idx)); -} - -void * -uu_avl_nearest_next(uu_avl_t *ap, uu_avl_index_t idx) -{ - if (ap->ua_debug && !INDEX_VALID(ap, idx)) - uu_panic("uu_avl_nearest_next(%p, %p): %s\n", - (void *)ap, (void *)idx, INDEX_CHECK(idx)? - "outdated index" : "invalid index"); - return (avl_nearest(&ap->ua_tree, INDEX_DECODE(idx), AVL_AFTER)); -} - -void * -uu_avl_nearest_prev(uu_avl_t *ap, uu_avl_index_t idx) -{ - if (ap->ua_debug && !INDEX_VALID(ap, idx)) - uu_panic("uu_avl_nearest_prev(%p, %p): %s\n", - (void *)ap, (void *)idx, INDEX_CHECK(idx)? - "outdated index" : "invalid index"); - return (avl_nearest(&ap->ua_tree, INDEX_DECODE(idx), AVL_BEFORE)); -} - -/* - * called from uu_lockup() and uu_release(), as part of our fork1()-safety. - */ -void -uu_avl_lockup(void) -{ - uu_avl_pool_t *pp; - - (void) pthread_mutex_lock(&uu_apool_list_lock); - for (pp = uu_null_apool.uap_next; pp != &uu_null_apool; - pp = pp->uap_next) - (void) pthread_mutex_lock(&pp->uap_lock); -} - -void -uu_avl_release(void) -{ - uu_avl_pool_t *pp; - - for (pp = uu_null_apool.uap_next; pp != &uu_null_apool; - pp = pp->uap_next) - (void) pthread_mutex_unlock(&pp->uap_lock); - (void) pthread_mutex_unlock(&uu_apool_list_lock); -} diff --git a/sys/contrib/openzfs/lib/libuutil/uu_ident.c b/sys/contrib/openzfs/lib/libuutil/uu_ident.c deleted file mode 100644 index 87fde4d98086..000000000000 --- a/sys/contrib/openzfs/lib/libuutil/uu_ident.c +++ /dev/null @@ -1,123 +0,0 @@ -// 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 2004 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - - - -#include "libuutil_common.h" - -#include <string.h> - -/* - * We require names of the form: - * [provider,]identifier[/[provider,]identifier]... - * - * Where provider is either a stock symbol (SUNW) or a java-style reversed - * domain name (com.sun). - * - * Both providers and identifiers must start with a letter, and may - * only contain alphanumerics, dashes, and underlines. Providers - * may also contain periods. - * - * Note that we do _not_ use the macros in <ctype.h>, since they are affected - * by the current locale settings. - */ - -#define IS_ALPHA(c) \ - (((c) >= 'a' && (c) <= 'z') || ((c) >= 'A' && (c) <= 'Z')) - -#define IS_DIGIT(c) \ - ((c) >= '0' && (c) <= '9') - -static int -is_valid_ident(const char *s, const char *e, int allowdot) -{ - char c; - - if (s >= e) - return (0); /* name is empty */ - - c = *s++; - if (!IS_ALPHA(c)) - return (0); /* does not start with letter */ - - while (s < e && (c = *s++) != 0) { - if (IS_ALPHA(c) || IS_DIGIT(c) || c == '-' || c == '_' || - (allowdot && c == '.')) - continue; - return (0); /* invalid character */ - } - return (1); -} - -static int -is_valid_component(const char *b, const char *e, uint_t flags) -{ - char *sp; - - if (flags & UU_NAME_DOMAIN) { - sp = strchr(b, ','); - if (sp != NULL && sp < e) { - if (!is_valid_ident(b, sp, 1)) - return (0); - b = sp + 1; - } - } - - return (is_valid_ident(b, e, 0)); -} - -int -uu_check_name(const char *name, uint_t flags) -{ - const char *end = name + strlen(name); - const char *p; - - if (flags & ~(UU_NAME_DOMAIN | UU_NAME_PATH)) { - uu_set_error(UU_ERROR_UNKNOWN_FLAG); - return (-1); - } - - if (!(flags & UU_NAME_PATH)) { - if (!is_valid_component(name, end, flags)) - goto bad; - return (0); - } - - while ((p = strchr(name, '/')) != NULL) { - if (!is_valid_component(name, p - 1, flags)) - goto bad; - name = p + 1; - } - if (!is_valid_component(name, end, flags)) - goto bad; - - return (0); - -bad: - uu_set_error(UU_ERROR_INVALID_ARGUMENT); - return (-1); -} diff --git a/sys/contrib/openzfs/lib/libuutil/uu_list.c b/sys/contrib/openzfs/lib/libuutil/uu_list.c deleted file mode 100644 index 6c303bde9c81..000000000000 --- a/sys/contrib/openzfs/lib/libuutil/uu_list.c +++ /dev/null @@ -1,723 +0,0 @@ -// SPDX-License-Identifier: CDDL-1.0 -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or https://opensource.org/licenses/CDDL-1.0. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - - - -#include "libuutil_common.h" - -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/time.h> - -#define ELEM_TO_NODE(lp, e) \ - ((uu_list_node_impl_t *)((uintptr_t)(e) + (lp)->ul_offset)) - -#define NODE_TO_ELEM(lp, n) \ - ((void *)((uintptr_t)(n) - (lp)->ul_offset)) - -/* - * uu_list_index_ts define a location for insertion. They are simply a - * pointer to the object after the insertion point. We store a mark - * in the low-bits of the index, to help prevent mistakes. - * - * When debugging, the index mark changes on every insert and delete, to - * catch stale references. - */ -#define INDEX_MAX (sizeof (uintptr_t) - 1) -#define INDEX_NEXT(m) (((m) == INDEX_MAX)? 1 : ((m) + 1) & INDEX_MAX) - -#define INDEX_TO_NODE(i) ((uu_list_node_impl_t *)((i) & ~INDEX_MAX)) -#define NODE_TO_INDEX(p, n) (((uintptr_t)(n) & ~INDEX_MAX) | (p)->ul_index) -#define INDEX_VALID(p, i) (((i) & INDEX_MAX) == (p)->ul_index) -#define INDEX_CHECK(i) (((i) & INDEX_MAX) != 0) - -#define POOL_TO_MARKER(pp) ((void *)((uintptr_t)(pp) | 1)) - -static uu_list_pool_t uu_null_lpool = { &uu_null_lpool, &uu_null_lpool }; -static pthread_mutex_t uu_lpool_list_lock = PTHREAD_MUTEX_INITIALIZER; - -uu_list_pool_t * -uu_list_pool_create(const char *name, size_t objsize, - size_t nodeoffset, uu_compare_fn_t *compare_func, uint32_t flags) -{ - uu_list_pool_t *pp, *next, *prev; - - if (name == NULL || - uu_check_name(name, UU_NAME_DOMAIN) == -1 || - nodeoffset + sizeof (uu_list_node_t) > objsize) { - uu_set_error(UU_ERROR_INVALID_ARGUMENT); - return (NULL); - } - - if (flags & ~UU_LIST_POOL_DEBUG) { - uu_set_error(UU_ERROR_UNKNOWN_FLAG); - return (NULL); - } - - pp = uu_zalloc(sizeof (uu_list_pool_t)); - if (pp == NULL) { - uu_set_error(UU_ERROR_NO_MEMORY); - return (NULL); - } - - (void) strlcpy(pp->ulp_name, name, sizeof (pp->ulp_name)); - pp->ulp_nodeoffset = nodeoffset; - pp->ulp_objsize = objsize; - pp->ulp_cmp = compare_func; - if (flags & UU_LIST_POOL_DEBUG) - pp->ulp_debug = 1; - pp->ulp_last_index = 0; - - (void) pthread_mutex_init(&pp->ulp_lock, NULL); - - pp->ulp_null_list.ul_next = &pp->ulp_null_list; - pp->ulp_null_list.ul_prev = &pp->ulp_null_list; - - (void) pthread_mutex_lock(&uu_lpool_list_lock); - pp->ulp_next = next = &uu_null_lpool; - pp->ulp_prev = prev = next->ulp_prev; - next->ulp_prev = pp; - prev->ulp_next = pp; - (void) pthread_mutex_unlock(&uu_lpool_list_lock); - - return (pp); -} - -void -uu_list_pool_destroy(uu_list_pool_t *pp) -{ - if (pp->ulp_debug) { - if (pp->ulp_null_list.ul_next != &pp->ulp_null_list || - pp->ulp_null_list.ul_prev != &pp->ulp_null_list) { - uu_panic("uu_list_pool_destroy: Pool \"%.*s\" (%p) has " - "outstanding lists, or is corrupt.\n", - (int)sizeof (pp->ulp_name), pp->ulp_name, - (void *)pp); - } - } - (void) pthread_mutex_lock(&uu_lpool_list_lock); - pp->ulp_next->ulp_prev = pp->ulp_prev; - pp->ulp_prev->ulp_next = pp->ulp_next; - (void) pthread_mutex_unlock(&uu_lpool_list_lock); - pp->ulp_prev = NULL; - pp->ulp_next = NULL; - uu_free(pp); -} - -void -uu_list_node_init(void *base, uu_list_node_t *np_arg, uu_list_pool_t *pp) -{ - uu_list_node_impl_t *np = (uu_list_node_impl_t *)np_arg; - - if (pp->ulp_debug) { - uintptr_t offset = (uintptr_t)np - (uintptr_t)base; - if (offset + sizeof (*np) > pp->ulp_objsize) { - uu_panic("uu_list_node_init(%p, %p, %p (\"%s\")): " - "offset %ld doesn't fit in object (size %ld)\n", - base, (void *)np, (void *)pp, pp->ulp_name, - (long)offset, (long)pp->ulp_objsize); - } - if (offset != pp->ulp_nodeoffset) { - uu_panic("uu_list_node_init(%p, %p, %p (\"%s\")): " - "offset %ld doesn't match pool's offset (%ld)\n", - base, (void *)np, (void *)pp, pp->ulp_name, - (long)offset, (long)pp->ulp_objsize); - } - } - np->uln_next = POOL_TO_MARKER(pp); - np->uln_prev = NULL; -} - -void -uu_list_node_fini(void *base, uu_list_node_t *np_arg, uu_list_pool_t *pp) -{ - uu_list_node_impl_t *np = (uu_list_node_impl_t *)np_arg; - - if (pp->ulp_debug) { - if (np->uln_next == NULL && - np->uln_prev == NULL) { - uu_panic("uu_list_node_fini(%p, %p, %p (\"%s\")): " - "node already finied\n", - base, (void *)np_arg, (void *)pp, pp->ulp_name); - } - if (np->uln_next != POOL_TO_MARKER(pp) || - np->uln_prev != NULL) { - uu_panic("uu_list_node_fini(%p, %p, %p (\"%s\")): " - "node corrupt or on list\n", - base, (void *)np_arg, (void *)pp, pp->ulp_name); - } - } - np->uln_next = NULL; - np->uln_prev = NULL; -} - -uu_list_t * -uu_list_create(uu_list_pool_t *pp, void *parent, uint32_t flags) -{ - uu_list_t *lp, *next, *prev; - - if (flags & ~(UU_LIST_DEBUG | UU_LIST_SORTED)) { - uu_set_error(UU_ERROR_UNKNOWN_FLAG); - return (NULL); - } - - if ((flags & UU_LIST_SORTED) && pp->ulp_cmp == NULL) { - if (pp->ulp_debug) - uu_panic("uu_list_create(%p, ...): requested " - "UU_LIST_SORTED, but pool has no comparison func\n", - (void *)pp); - uu_set_error(UU_ERROR_NOT_SUPPORTED); - return (NULL); - } - - lp = uu_zalloc(sizeof (*lp)); - if (lp == NULL) { - uu_set_error(UU_ERROR_NO_MEMORY); - return (NULL); - } - - lp->ul_pool = pp; - lp->ul_parent = parent; - lp->ul_offset = pp->ulp_nodeoffset; - lp->ul_debug = pp->ulp_debug || (flags & UU_LIST_DEBUG); - lp->ul_sorted = (flags & UU_LIST_SORTED); - lp->ul_numnodes = 0; - lp->ul_index = (pp->ulp_last_index = INDEX_NEXT(pp->ulp_last_index)); - - lp->ul_null_node.uln_next = &lp->ul_null_node; - lp->ul_null_node.uln_prev = &lp->ul_null_node; - - lp->ul_null_walk.ulw_next = &lp->ul_null_walk; - lp->ul_null_walk.ulw_prev = &lp->ul_null_walk; - - (void) pthread_mutex_lock(&pp->ulp_lock); - next = &pp->ulp_null_list; - prev = next->ul_prev; - lp->ul_next = next; - lp->ul_prev = prev; - next->ul_prev = lp; - prev->ul_next = lp; - (void) pthread_mutex_unlock(&pp->ulp_lock); - - return (lp); -} - -void -uu_list_destroy(uu_list_t *lp) -{ - uu_list_pool_t *pp = lp->ul_pool; - - if (lp->ul_debug) { - if (lp->ul_null_node.uln_next != &lp->ul_null_node || - lp->ul_null_node.uln_prev != &lp->ul_null_node) { - uu_panic("uu_list_destroy(%p): list not empty\n", - (void *)lp); - } - if (lp->ul_numnodes != 0) { - uu_panic("uu_list_destroy(%p): numnodes is nonzero, " - "but list is empty\n", (void *)lp); - } - if (lp->ul_null_walk.ulw_next != &lp->ul_null_walk || - lp->ul_null_walk.ulw_prev != &lp->ul_null_walk) { - uu_panic("uu_list_destroy(%p): outstanding walkers\n", - (void *)lp); - } - } - - (void) pthread_mutex_lock(&pp->ulp_lock); - lp->ul_next->ul_prev = lp->ul_prev; - lp->ul_prev->ul_next = lp->ul_next; - (void) pthread_mutex_unlock(&pp->ulp_lock); - lp->ul_prev = NULL; - lp->ul_next = NULL; - lp->ul_pool = NULL; - uu_free(lp); -} - -static void -list_insert(uu_list_t *lp, uu_list_node_impl_t *np, uu_list_node_impl_t *prev, - uu_list_node_impl_t *next) -{ - if (lp->ul_debug) { - if (next->uln_prev != prev || prev->uln_next != next) - uu_panic("insert(%p): internal error: %p and %p not " - "neighbors\n", (void *)lp, (void *)next, - (void *)prev); - - if (np->uln_next != POOL_TO_MARKER(lp->ul_pool) || - np->uln_prev != NULL) { - uu_panic("insert(%p): elem %p node %p corrupt, " - "not initialized, or already in a list.\n", - (void *)lp, NODE_TO_ELEM(lp, np), (void *)np); - } - /* - * invalidate outstanding uu_list_index_ts. - */ - lp->ul_index = INDEX_NEXT(lp->ul_index); - } - np->uln_next = next; - np->uln_prev = prev; - next->uln_prev = np; - prev->uln_next = np; - - lp->ul_numnodes++; -} - -void -uu_list_insert(uu_list_t *lp, void *elem, uu_list_index_t idx) -{ - uu_list_node_impl_t *np; - - np = INDEX_TO_NODE(idx); - if (np == NULL) - np = &lp->ul_null_node; - - if (lp->ul_debug) { - if (!INDEX_VALID(lp, idx)) - uu_panic("uu_list_insert(%p, %p, %p): %s\n", - (void *)lp, elem, (void *)idx, - INDEX_CHECK(idx)? "outdated index" : - "invalid index"); - if (np->uln_prev == NULL) - uu_panic("uu_list_insert(%p, %p, %p): out-of-date " - "index\n", (void *)lp, elem, (void *)idx); - } - - list_insert(lp, ELEM_TO_NODE(lp, elem), np->uln_prev, np); -} - -void * -uu_list_find(uu_list_t *lp, void *elem, void *private, uu_list_index_t *out) -{ - int sorted = lp->ul_sorted; - uu_compare_fn_t *func = lp->ul_pool->ulp_cmp; - uu_list_node_impl_t *np; - - if (func == NULL) { - if (out != NULL) - *out = 0; - uu_set_error(UU_ERROR_NOT_SUPPORTED); - return (NULL); - } - for (np = lp->ul_null_node.uln_next; np != &lp->ul_null_node; - np = np->uln_next) { - void *ep = NODE_TO_ELEM(lp, np); - int cmp = func(ep, elem, private); - if (cmp == 0) { - if (out != NULL) - *out = NODE_TO_INDEX(lp, np); - return (ep); - } - if (sorted && cmp > 0) { - if (out != NULL) - *out = NODE_TO_INDEX(lp, np); - return (NULL); - } - } - if (out != NULL) - *out = NODE_TO_INDEX(lp, 0); - return (NULL); -} - -void * -uu_list_nearest_next(uu_list_t *lp, uu_list_index_t idx) -{ - uu_list_node_impl_t *np = INDEX_TO_NODE(idx); - - if (np == NULL) - np = &lp->ul_null_node; - - if (lp->ul_debug) { - if (!INDEX_VALID(lp, idx)) - uu_panic("uu_list_nearest_next(%p, %p): %s\n", - (void *)lp, (void *)idx, - INDEX_CHECK(idx)? "outdated index" : - "invalid index"); - if (np->uln_prev == NULL) - uu_panic("uu_list_nearest_next(%p, %p): out-of-date " - "index\n", (void *)lp, (void *)idx); - } - - if (np == &lp->ul_null_node) - return (NULL); - else - return (NODE_TO_ELEM(lp, np)); -} - -void * -uu_list_nearest_prev(uu_list_t *lp, uu_list_index_t idx) -{ - uu_list_node_impl_t *np = INDEX_TO_NODE(idx); - - if (np == NULL) - np = &lp->ul_null_node; - - if (lp->ul_debug) { - if (!INDEX_VALID(lp, idx)) - uu_panic("uu_list_nearest_prev(%p, %p): %s\n", - (void *)lp, (void *)idx, INDEX_CHECK(idx)? - "outdated index" : "invalid index"); - if (np->uln_prev == NULL) - uu_panic("uu_list_nearest_prev(%p, %p): out-of-date " - "index\n", (void *)lp, (void *)idx); - } - - if ((np = np->uln_prev) == &lp->ul_null_node) - return (NULL); - else - return (NODE_TO_ELEM(lp, np)); -} - -static void -list_walk_init(uu_list_walk_t *wp, uu_list_t *lp, uint32_t flags) -{ - uu_list_walk_t *next, *prev; - - int robust = (flags & UU_WALK_ROBUST); - int direction = (flags & UU_WALK_REVERSE)? -1 : 1; - - (void) memset(wp, 0, sizeof (*wp)); - wp->ulw_list = lp; - wp->ulw_robust = robust; - wp->ulw_dir = direction; - if (direction > 0) - wp->ulw_next_result = lp->ul_null_node.uln_next; - else - wp->ulw_next_result = lp->ul_null_node.uln_prev; - - if (lp->ul_debug || robust) { - /* - * Add this walker to the list's list of walkers so - * uu_list_remove() can advance us if somebody tries to - * remove ulw_next_result. - */ - wp->ulw_next = next = &lp->ul_null_walk; - wp->ulw_prev = prev = next->ulw_prev; - next->ulw_prev = wp; - prev->ulw_next = wp; - } -} - -static uu_list_node_impl_t * -list_walk_advance(uu_list_walk_t *wp, uu_list_t *lp) -{ - uu_list_node_impl_t *np = wp->ulw_next_result; - uu_list_node_impl_t *next; - - if (np == &lp->ul_null_node) - return (NULL); - - next = (wp->ulw_dir > 0)? np->uln_next : np->uln_prev; - - wp->ulw_next_result = next; - return (np); -} - -static void -list_walk_fini(uu_list_walk_t *wp) -{ - /* GLXXX debugging? */ - if (wp->ulw_next != NULL) { - wp->ulw_next->ulw_prev = wp->ulw_prev; - wp->ulw_prev->ulw_next = wp->ulw_next; - wp->ulw_next = NULL; - wp->ulw_prev = NULL; - } - wp->ulw_list = NULL; - wp->ulw_next_result = NULL; -} - -uu_list_walk_t * -uu_list_walk_start(uu_list_t *lp, uint32_t flags) -{ - uu_list_walk_t *wp; - - if (flags & ~(UU_WALK_ROBUST | UU_WALK_REVERSE)) { - uu_set_error(UU_ERROR_UNKNOWN_FLAG); - return (NULL); - } - - wp = uu_zalloc(sizeof (*wp)); - if (wp == NULL) { - uu_set_error(UU_ERROR_NO_MEMORY); - return (NULL); - } - - list_walk_init(wp, lp, flags); - return (wp); -} - -void * -uu_list_walk_next(uu_list_walk_t *wp) -{ - uu_list_t *lp = wp->ulw_list; - uu_list_node_impl_t *np = list_walk_advance(wp, lp); - - if (np == NULL) - return (NULL); - - return (NODE_TO_ELEM(lp, np)); -} - -void -uu_list_walk_end(uu_list_walk_t *wp) -{ - list_walk_fini(wp); - uu_free(wp); -} - -int -uu_list_walk(uu_list_t *lp, uu_walk_fn_t *func, void *private, uint32_t flags) -{ - uu_list_node_impl_t *np; - - int status = UU_WALK_NEXT; - - int robust = (flags & UU_WALK_ROBUST); - int reverse = (flags & UU_WALK_REVERSE); - - if (flags & ~(UU_WALK_ROBUST | UU_WALK_REVERSE)) { - uu_set_error(UU_ERROR_UNKNOWN_FLAG); - return (-1); - } - - if (lp->ul_debug || robust) { - uu_list_walk_t *my_walk; - void *e; - - my_walk = uu_zalloc(sizeof (*my_walk)); - if (my_walk == NULL) - return (-1); - - list_walk_init(my_walk, lp, flags); - while (status == UU_WALK_NEXT && - (e = uu_list_walk_next(my_walk)) != NULL) - status = (*func)(e, private); - list_walk_fini(my_walk); - - uu_free(my_walk); - } else { - if (!reverse) { - for (np = lp->ul_null_node.uln_next; - status == UU_WALK_NEXT && np != &lp->ul_null_node; - np = np->uln_next) { - status = (*func)(NODE_TO_ELEM(lp, np), private); - } - } else { - for (np = lp->ul_null_node.uln_prev; - status == UU_WALK_NEXT && np != &lp->ul_null_node; - np = np->uln_prev) { - status = (*func)(NODE_TO_ELEM(lp, np), private); - } - } - } - if (status >= 0) - return (0); - uu_set_error(UU_ERROR_CALLBACK_FAILED); - return (-1); -} - -void -uu_list_remove(uu_list_t *lp, void *elem) -{ - uu_list_node_impl_t *np = ELEM_TO_NODE(lp, elem); - uu_list_walk_t *wp; - - if (lp->ul_debug) { - if (np->uln_prev == NULL) - uu_panic("uu_list_remove(%p, %p): elem not on list\n", - (void *)lp, elem); - /* - * invalidate outstanding uu_list_index_ts. - */ - lp->ul_index = INDEX_NEXT(lp->ul_index); - } - - /* - * robust walkers must be advanced. In debug mode, non-robust - * walkers are also on the list. If there are any, it's an error. - */ - for (wp = lp->ul_null_walk.ulw_next; wp != &lp->ul_null_walk; - wp = wp->ulw_next) { - if (wp->ulw_robust) { - if (np == wp->ulw_next_result) - (void) list_walk_advance(wp, lp); - } else if (wp->ulw_next_result != NULL) { - uu_panic("uu_list_remove(%p, %p): active non-robust " - "walker\n", (void *)lp, elem); - } - } - - np->uln_next->uln_prev = np->uln_prev; - np->uln_prev->uln_next = np->uln_next; - - lp->ul_numnodes--; - - np->uln_next = POOL_TO_MARKER(lp->ul_pool); - np->uln_prev = NULL; -} - -void * -uu_list_teardown(uu_list_t *lp, void **cookie) -{ - void *ep; - - /* - * XXX: disable list modification until list is empty - */ - if (lp->ul_debug && *cookie != NULL) - uu_panic("uu_list_teardown(%p, %p): unexpected cookie\n", - (void *)lp, (void *)cookie); - - ep = uu_list_first(lp); - if (ep) - uu_list_remove(lp, ep); - return (ep); -} - -int -uu_list_insert_before(uu_list_t *lp, void *target, void *elem) -{ - uu_list_node_impl_t *np = ELEM_TO_NODE(lp, target); - - if (target == NULL) - np = &lp->ul_null_node; - - if (lp->ul_debug) { - if (np->uln_prev == NULL) - uu_panic("uu_list_insert_before(%p, %p, %p): %p is " - "not currently on a list\n", - (void *)lp, target, elem, target); - } - if (lp->ul_sorted) { - if (lp->ul_debug) - uu_panic("uu_list_insert_before(%p, ...): list is " - "UU_LIST_SORTED\n", (void *)lp); - uu_set_error(UU_ERROR_NOT_SUPPORTED); - return (-1); - } - - list_insert(lp, ELEM_TO_NODE(lp, elem), np->uln_prev, np); - return (0); -} - -int -uu_list_insert_after(uu_list_t *lp, void *target, void *elem) -{ - uu_list_node_impl_t *np = ELEM_TO_NODE(lp, target); - - if (target == NULL) - np = &lp->ul_null_node; - - if (lp->ul_debug) { - if (np->uln_prev == NULL) - uu_panic("uu_list_insert_after(%p, %p, %p): %p is " - "not currently on a list\n", - (void *)lp, target, elem, target); - } - if (lp->ul_sorted) { - if (lp->ul_debug) - uu_panic("uu_list_insert_after(%p, ...): list is " - "UU_LIST_SORTED\n", (void *)lp); - uu_set_error(UU_ERROR_NOT_SUPPORTED); - return (-1); - } - - list_insert(lp, ELEM_TO_NODE(lp, elem), np, np->uln_next); - return (0); -} - -size_t -uu_list_numnodes(uu_list_t *lp) -{ - return (lp->ul_numnodes); -} - -void * -uu_list_first(uu_list_t *lp) -{ - uu_list_node_impl_t *n = lp->ul_null_node.uln_next; - if (n == &lp->ul_null_node) - return (NULL); - return (NODE_TO_ELEM(lp, n)); -} - -void * -uu_list_last(uu_list_t *lp) -{ - uu_list_node_impl_t *n = lp->ul_null_node.uln_prev; - if (n == &lp->ul_null_node) - return (NULL); - return (NODE_TO_ELEM(lp, n)); -} - -void * -uu_list_next(uu_list_t *lp, void *elem) -{ - uu_list_node_impl_t *n = ELEM_TO_NODE(lp, elem); - - n = n->uln_next; - if (n == &lp->ul_null_node) - return (NULL); - return (NODE_TO_ELEM(lp, n)); -} - -void * -uu_list_prev(uu_list_t *lp, void *elem) -{ - uu_list_node_impl_t *n = ELEM_TO_NODE(lp, elem); - - n = n->uln_prev; - if (n == &lp->ul_null_node) - return (NULL); - return (NODE_TO_ELEM(lp, n)); -} - -/* - * called from uu_lockup() and uu_release(), as part of our fork1()-safety. - */ -void -uu_list_lockup(void) -{ - uu_list_pool_t *pp; - - (void) pthread_mutex_lock(&uu_lpool_list_lock); - for (pp = uu_null_lpool.ulp_next; pp != &uu_null_lpool; - pp = pp->ulp_next) - (void) pthread_mutex_lock(&pp->ulp_lock); -} - -void -uu_list_release(void) -{ - uu_list_pool_t *pp; - - for (pp = uu_null_lpool.ulp_next; pp != &uu_null_lpool; - pp = pp->ulp_next) - (void) pthread_mutex_unlock(&pp->ulp_lock); - (void) pthread_mutex_unlock(&uu_lpool_list_lock); -} diff --git a/sys/contrib/openzfs/lib/libuutil/uu_misc.c b/sys/contrib/openzfs/lib/libuutil/uu_misc.c deleted file mode 100644 index 1166fdfb2231..000000000000 --- a/sys/contrib/openzfs/lib/libuutil/uu_misc.c +++ /dev/null @@ -1,255 +0,0 @@ -// 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) 2004, 2010, Oracle and/or its affiliates. All rights reserved. - */ - -#include "libuutil_common.h" - -#include <assert.h> -#include <errno.h> -#include <libintl.h> -#include <pthread.h> -#include <stdarg.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/debug.h> -#include <unistd.h> -#include <ctype.h> - -#if !defined(TEXT_DOMAIN) -#define TEXT_DOMAIN "SYS_TEST" -#endif - -/* - * All of the old code under !defined(PTHREAD_ONCE_KEY_NP) - * is here to enable the building of a native version of - * libuutil.so when the build machine has not yet been upgraded - * to a version of libc that provides pthread_key_create_once_np(). - * It should all be deleted when solaris_nevada ships. - * The code is not MT-safe in a relaxed memory model. - */ - -#if defined(PTHREAD_ONCE_KEY_NP) -static pthread_key_t uu_error_key = PTHREAD_ONCE_KEY_NP; -#else /* PTHREAD_ONCE_KEY_NP */ -static pthread_key_t uu_error_key = 0; -static pthread_mutex_t uu_key_lock = PTHREAD_MUTEX_INITIALIZER; -#endif /* PTHREAD_ONCE_KEY_NP */ - -static int uu_error_key_setup = 0; - -static pthread_mutex_t uu_panic_lock = PTHREAD_MUTEX_INITIALIZER; -/* LINTED static unused */ -static const char *uu_panic_format; -/* LINTED static unused */ -static va_list uu_panic_args; -static pthread_t uu_panic_thread; - -static uint32_t _uu_main_error; -static __thread int _uu_main_thread = 0; - -void -uu_set_error(uint_t code) -{ - if (_uu_main_thread) { - _uu_main_error = code; - return; - } -#if defined(PTHREAD_ONCE_KEY_NP) - if (pthread_key_create_once_np(&uu_error_key, NULL) != 0) - uu_error_key_setup = -1; - else - uu_error_key_setup = 1; -#else /* PTHREAD_ONCE_KEY_NP */ - if (uu_error_key_setup == 0) { - (void) pthread_mutex_lock(&uu_key_lock); - if (uu_error_key_setup == 0) { - if (pthread_key_create(&uu_error_key, NULL) != 0) - uu_error_key_setup = -1; - else - uu_error_key_setup = 1; - } - (void) pthread_mutex_unlock(&uu_key_lock); - } -#endif /* PTHREAD_ONCE_KEY_NP */ - if (uu_error_key_setup > 0) - (void) pthread_setspecific(uu_error_key, - (void *)(uintptr_t)code); -} - -uint32_t -uu_error(void) -{ - if (_uu_main_thread) - return (_uu_main_error); - - if (uu_error_key_setup < 0) /* can't happen? */ - return (UU_ERROR_UNKNOWN); - - /* - * Because UU_ERROR_NONE == 0, if uu_set_error() was - * never called, then this will return UU_ERROR_NONE: - */ - return ((uint32_t)(uintptr_t)pthread_getspecific(uu_error_key)); -} - -const char * -uu_strerror(uint32_t code) -{ - const char *str; - - switch (code) { - case UU_ERROR_NONE: - str = dgettext(TEXT_DOMAIN, "No error"); - break; - - case UU_ERROR_INVALID_ARGUMENT: - str = dgettext(TEXT_DOMAIN, "Invalid argument"); - break; - - case UU_ERROR_UNKNOWN_FLAG: - str = dgettext(TEXT_DOMAIN, "Unknown flag passed"); - break; - - case UU_ERROR_NO_MEMORY: - str = dgettext(TEXT_DOMAIN, "Out of memory"); - break; - - case UU_ERROR_CALLBACK_FAILED: - str = dgettext(TEXT_DOMAIN, "Callback-initiated failure"); - break; - - case UU_ERROR_NOT_SUPPORTED: - str = dgettext(TEXT_DOMAIN, "Operation not supported"); - break; - - case UU_ERROR_EMPTY: - str = dgettext(TEXT_DOMAIN, "No value provided"); - break; - - case UU_ERROR_UNDERFLOW: - str = dgettext(TEXT_DOMAIN, "Value too small"); - break; - - case UU_ERROR_OVERFLOW: - str = dgettext(TEXT_DOMAIN, "Value too large"); - break; - - case UU_ERROR_INVALID_CHAR: - str = dgettext(TEXT_DOMAIN, - "Value contains unexpected character"); - break; - - case UU_ERROR_INVALID_DIGIT: - str = dgettext(TEXT_DOMAIN, - "Value contains digit not in base"); - break; - - case UU_ERROR_SYSTEM: - str = dgettext(TEXT_DOMAIN, "Underlying system error"); - break; - - case UU_ERROR_UNKNOWN: - str = dgettext(TEXT_DOMAIN, "Error status not known"); - break; - - default: - errno = ESRCH; - str = NULL; - break; - } - return (str); -} - -void -uu_panic(const char *format, ...) -{ - va_list args; - - va_start(args, format); - - (void) pthread_mutex_lock(&uu_panic_lock); - if (uu_panic_thread == 0) { - uu_panic_thread = pthread_self(); - uu_panic_format = format; - va_copy(uu_panic_args, args); - } - (void) pthread_mutex_unlock(&uu_panic_lock); - - (void) vfprintf(stderr, format, args); - - va_end(args); - - if (uu_panic_thread == pthread_self()) - abort(); - else - for (;;) - (void) pause(); -} - -static void -uu_lockup(void) -{ - (void) pthread_mutex_lock(&uu_panic_lock); -#if !defined(PTHREAD_ONCE_KEY_NP) - (void) pthread_mutex_lock(&uu_key_lock); -#endif - uu_avl_lockup(); - uu_list_lockup(); -} - -static void -uu_release(void) -{ - (void) pthread_mutex_unlock(&uu_panic_lock); -#if !defined(PTHREAD_ONCE_KEY_NP) - (void) pthread_mutex_unlock(&uu_key_lock); -#endif - uu_avl_release(); - uu_list_release(); -} - -static void -uu_release_child(void) -{ - uu_panic_format = NULL; - uu_panic_thread = 0; - - uu_release(); -} - -#ifdef __GNUC__ -static void -uu_init(void) __attribute__((constructor)); -#else -#pragma init(uu_init) -#endif - -static void -uu_init(void) -{ - _uu_main_thread = 1; - (void) pthread_atfork(uu_lockup, uu_release, uu_release_child); -} diff --git a/sys/contrib/openzfs/lib/libuutil/uu_string.c b/sys/contrib/openzfs/lib/libuutil/uu_string.c deleted file mode 100644 index 76f0a082607a..000000000000 --- a/sys/contrib/openzfs/lib/libuutil/uu_string.c +++ /dev/null @@ -1,55 +0,0 @@ -// 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) 2009, 2010, Oracle and/or its affiliates. All rights reserved. - */ - -/* - * String helper functions - */ - -#include <string.h> -#include <sys/types.h> -#include <ctype.h> -#include "libuutil.h" - -/* Return true if strings are equal */ -boolean_t -uu_streq(const char *a, const char *b) -{ - return (strcmp(a, b) == 0); -} - -/* Return true if strings are equal, case-insensitively */ -boolean_t -uu_strcaseeq(const char *a, const char *b) -{ - return (strcasecmp(a, b) == 0); -} - -/* Return true if string a Begins With string b */ -boolean_t -uu_strbw(const char *a, const char *b) -{ - return (strncmp(a, b, strlen(b)) == 0); -} diff --git a/sys/contrib/openzfs/lib/libzfs/Makefile.am b/sys/contrib/openzfs/lib/libzfs/Makefile.am index e2cbca47b9a3..999dccd719ce 100644 --- a/sys/contrib/openzfs/lib/libzfs/Makefile.am +++ b/sys/contrib/openzfs/lib/libzfs/Makefile.am @@ -55,8 +55,7 @@ libzfs_la_LIBADD = \ libshare.la \ libzfs_core.la \ libnvpair.la \ - libzutil.la \ - libuutil.la + libzutil.la libzfs_la_LIBADD += -lrt -lm $(LIBCRYPTO_LIBS) $(ZLIB_LIBS) $(LIBFETCH_LIBS) $(LTLIBINTL) diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs.abi b/sys/contrib/openzfs/lib/libzfs/libzfs.abi index f481b6221e4d..7cb7e70877c9 100644 --- a/sys/contrib/openzfs/lib/libzfs/libzfs.abi +++ b/sys/contrib/openzfs/lib/libzfs/libzfs.abi @@ -6,7 +6,6 @@ <dependency name='libuuid.so.1'/> <dependency name='libblkid.so.1'/> <dependency name='libudev.so.1'/> - <dependency name='libuutil.so.3'/> <dependency name='libm.so.6'/> <dependency name='libcrypto.so.3'/> <dependency name='libz.so.1'/> @@ -327,15 +326,6 @@ <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'/> - <elf-symbol name='tpool_dispatch' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='tpool_member' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='tpool_resume' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='tpool_suspend' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='tpool_suspended' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='tpool_wait' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='update_vdev_config_dev_strs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='update_vdev_config_dev_sysfs_path' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> <elf-symbol name='use_color' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> @@ -1387,17 +1377,16 @@ <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'/> + <typedef-decl name='hrtime_t' type-id='1eb56b1e' id='cebdd548'/> + <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' layout-offset-in-bits='320'> - <var-decl name='m_owner' type-id='4051f5e7' visibility='default'/> + <data-member access='public'> + <var-decl name='__align' type-id='95e97e5e' 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> + <typedef-decl name='pthread_condattr_t' type-id='33dd3aad' id='836265dd'/> <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'> @@ -1408,14 +1397,48 @@ <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='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='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='gettimeofday' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='4bcf44c1'/> <parameter type-id='1b7446cd'/> @@ -1917,34 +1940,7 @@ <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'/> @@ -1954,44 +1950,6 @@ </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'/> @@ -2091,88 +2049,11 @@ </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='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='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'/> + <typedef-decl name='pthread_once_t' type-id='95e97e5e' id='2568d84b'/> <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='2568d84b' size-in-bits='64' id='d9bab700'/> <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'/> @@ -2181,15 +2062,16 @@ <parameter type-id='95e97e5e'/> <return type-id='6ae5a80d'/> </function-decl> + <function-decl name='pthread_once' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='d9bab700'/> + <parameter type-id='953b12f8'/> + <return type-id='95e97e5e'/> + </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'/> @@ -2205,13 +2087,6 @@ <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'/> @@ -2236,28 +2111,11 @@ <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'/> @@ -2279,6 +2137,7 @@ <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'/> + <parameter type-id='c19b74c3' name='wait'/> <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'> @@ -2293,6 +2152,24 @@ </function-type> </abi-instr> <abi-instr address-size='64' path='lib/libspl/thread.c' language='LANG_C99'> + <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'/> @@ -2303,6 +2180,10 @@ <parameter type-id='80f4b756'/> <return type-id='95e97e5e'/> </function-decl> + <function-decl name='__sysconf' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='95e97e5e'/> + <return type-id='bd54fe1a'/> + </function-decl> <function-decl name='p0' mangled-name='p0' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='p0'> <return type-id='48b5725f'/> </function-decl> @@ -2348,339 +2229,6 @@ <return type-id='f8b828c9'/> </function-decl> </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'> - <subrange length='16' type-id='7359adad' id='848d0938'/> - </array-type-def> - <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='384' id='36d7f119'> - <subrange length='48' type-id='7359adad' id='8f6d2a81'/> - </array-type-def> - <array-type-def dimensions='1' type-id='f0981eeb' size-in-bits='64' id='0d532ec1'> - <subrange length='2' type-id='7359adad' id='52efc4ef'/> - </array-type-def> - <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'/> - <typedef-decl name='__cpu_mask' type-id='7359adad' id='49ef3ffd'/> - <class-decl name='cpu_set_t' size-in-bits='1024' is-struct='yes' naming-typedef-id='8037c762' visibility='default' id='1f20d231'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='__bits' type-id='a14403f5' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='cpu_set_t' type-id='1f20d231' id='8037c762'/> - <union-decl name='pthread_condattr_t' size-in-bits='32' naming-typedef-id='836265dd' visibility='default' id='33dd3aad'> - <data-member access='public'> - <var-decl name='__size' type-id='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> - <class-decl name='sched_param' size-in-bits='32' is-struct='yes' visibility='default' id='0897719a'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='sched_priority' type-id='95e97e5e' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='tpool_job_t' type-id='3b8579e5' id='66a0afc9'/> - <class-decl name='tpool_job' size-in-bits='192' is-struct='yes' visibility='default' id='3b8579e5'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='tpj_next' type-id='f32b30e4' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='tpj_func' type-id='b7f9d8e6' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='tpj_arg' type-id='eaa32e2f' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='tpool_active_t' type-id='c8d086f4' id='6fcda10e'/> - <class-decl name='tpool_active' size-in-bits='128' is-struct='yes' visibility='default' id='c8d086f4'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='tpa_next' type-id='ad33e5e7' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='tpa_tid' type-id='4051f5e7' visibility='default'/> - </data-member> - </class-decl> - <qualified-type-def type-id='8037c762' const='yes' id='f50ea9b2'/> - <pointer-type-def type-id='f50ea9b2' size-in-bits='64' id='5e14fa48'/> - <qualified-type-def type-id='836265dd' const='yes' id='7d24c58d'/> - <pointer-type-def type-id='7d24c58d' size-in-bits='64' id='a7e325e5'/> - <qualified-type-def type-id='a7e325e5' restrict='yes' id='4c428e67'/> - <qualified-type-def type-id='0897719a' const='yes' id='c4a7b189'/> - <pointer-type-def type-id='c4a7b189' size-in-bits='64' id='36fca399'/> - <qualified-type-def type-id='36fca399' restrict='yes' id='37e4897b'/> - <qualified-type-def type-id='e05e8614' restrict='yes' id='0be2e71c'/> - <pointer-type-def type-id='8037c762' size-in-bits='64' id='d74a6869'/> - <qualified-type-def type-id='7292109c' restrict='yes' id='6942f6a4'/> - <qualified-type-def type-id='7347a39e' restrict='yes' id='578ba182'/> - <pointer-type-def type-id='62fab762' size-in-bits='64' id='db285b03'/> - <qualified-type-def type-id='db285b03' restrict='yes' id='2a468b41'/> - <qualified-type-def type-id='18c91f9e' restrict='yes' id='6e745582'/> - <pointer-type-def type-id='0897719a' size-in-bits='64' id='23cbcb08'/> - <qualified-type-def type-id='23cbcb08' restrict='yes' id='b09b2050'/> - <pointer-type-def type-id='6fcda10e' size-in-bits='64' id='ad33e5e7'/> - <pointer-type-def type-id='66a0afc9' size-in-bits='64' id='f32b30e4'/> - <qualified-type-def type-id='63e171df' restrict='yes' id='9e7a3a7d'/> - <function-decl name='pthread_self' visibility='default' binding='global' size-in-bits='64'> - <return type-id='4051f5e7'/> - </function-decl> - <function-decl name='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_getdetachstate' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='540db505'/> - <parameter type-id='7292109c'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='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_getguardsize' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='540db505'/> - <parameter type-id='78c01427'/> - <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_getschedparam' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='e1815e87'/> - <parameter type-id='b09b2050'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='pthread_attr_setschedparam' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='578ba182'/> - <parameter type-id='37e4897b'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='pthread_attr_getschedpolicy' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='e1815e87'/> - <parameter type-id='6942f6a4'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='pthread_attr_setschedpolicy' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='7347a39e'/> - <parameter type-id='95e97e5e'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='pthread_attr_getinheritsched' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='e1815e87'/> - <parameter type-id='6942f6a4'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='pthread_attr_setinheritsched' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='7347a39e'/> - <parameter type-id='95e97e5e'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='pthread_attr_getscope' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='e1815e87'/> - <parameter type-id='6942f6a4'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='pthread_attr_setscope' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='7347a39e'/> - <parameter type-id='95e97e5e'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='pthread_attr_getstack' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='e1815e87'/> - <parameter type-id='9e7a3a7d'/> - <parameter type-id='d19b2c25'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='pthread_attr_setstack' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='7347a39e'/> - <parameter type-id='eaa32e2f'/> - <parameter type-id='b59d7dce'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='pthread_attr_setaffinity_np' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='7347a39e'/> - <parameter type-id='b59d7dce'/> - <parameter type-id='5e14fa48'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='pthread_attr_getaffinity_np' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='540db505'/> - <parameter type-id='b59d7dce'/> - <parameter type-id='d74a6869'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='pthread_setcancelstate' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='95e97e5e'/> - <parameter type-id='7292109c'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='pthread_setcanceltype' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='95e97e5e'/> - <parameter type-id='7292109c'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='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_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='__sysconf' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='95e97e5e'/> - <return type-id='bd54fe1a'/> - </function-decl> - <function-decl name='tpool_abandon' mangled-name='tpool_abandon' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='tpool_abandon'> - <parameter type-id='9cf59a50' name='tpool'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='tpool_suspend' mangled-name='tpool_suspend' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='tpool_suspend'> - <parameter type-id='9cf59a50' name='tpool'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='tpool_suspended' mangled-name='tpool_suspended' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='tpool_suspended'> - <parameter type-id='9cf59a50' name='tpool'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='tpool_resume' mangled-name='tpool_resume' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='tpool_resume'> - <parameter type-id='9cf59a50' name='tpool'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='tpool_member' mangled-name='tpool_member' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='tpool_member'> - <parameter type-id='9cf59a50' name='tpool'/> - <return type-id='95e97e5e'/> - </function-decl> - <pointer-type-def type-id='b1bbf10d' size-in-bits='64' id='9cf59a50'/> - <typedef-decl name='tpool_t' type-id='88d1b7f9' id='b1bbf10d'/> - <class-decl name='tpool' size-in-bits='2496' is-struct='yes' visibility='default' id='88d1b7f9'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='tp_forw' type-id='9cf59a50' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='tp_back' type-id='9cf59a50' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='tp_mutex' type-id='7a6844eb' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='tp_busycv' type-id='62fab762' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='tp_workcv' type-id='62fab762' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1216'> - <var-decl name='tp_waitcv' type-id='62fab762' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1600'> - <var-decl name='tp_active' type-id='ad33e5e7' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1664'> - <var-decl name='tp_head' type-id='f32b30e4' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1728'> - <var-decl name='tp_tail' type-id='f32b30e4' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1792'> - <var-decl name='tp_attr' type-id='7d8569fd' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2240'> - <var-decl name='tp_flags' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2272'> - <var-decl name='tp_linger' type-id='3502e3ff' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2304'> - <var-decl name='tp_njobs' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2336'> - <var-decl name='tp_minimum' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2368'> - <var-decl name='tp_maximum' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2400'> - <var-decl name='tp_current' type-id='95e97e5e' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2432'> - <var-decl name='tp_idle' type-id='95e97e5e' visibility='default'/> - </data-member> - </class-decl> - </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'> <subrange length='2' type-id='7359adad' id='52efc4ef'/> @@ -2696,9 +2244,6 @@ <subrange length='40' type-id='7359adad' id='8f80b239'/> </array-type-def> <class-decl name='re_dfa_t' is-struct='yes' visibility='default' is-declaration-only='yes' id='b48d2441'/> - <class-decl name='uu_avl' is-struct='yes' visibility='default' is-declaration-only='yes' id='4af029d1'/> - <class-decl name='uu_avl_pool' is-struct='yes' visibility='default' is-declaration-only='yes' id='12a530a8'/> - <class-decl name='uu_avl_walk' is-struct='yes' visibility='default' is-declaration-only='yes' id='e70a39e3'/> <array-type-def dimensions='1' type-id='80f4b756' size-in-bits='256' id='71dc54ac'> <subrange length='4' type-id='7359adad' id='16fe7105'/> </array-type-def> @@ -2706,30 +2251,17 @@ <type-decl name='long int' size-in-bits='64' id='bd54fe1a'/> <type-decl name='long long int' size-in-bits='64' id='1eb56b1e'/> <type-decl name='short int' size-in-bits='16' id='a2185560'/> - <array-type-def dimensions='1' type-id='e475ab95' size-in-bits='192' id='0ce65a8b'> - <subrange length='3' type-id='7359adad' id='56f209d2'/> - </array-type-def> <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='9cac1fee'/> <type-decl name='unsigned char' size-in-bits='8' id='002ac4a6'/> <type-decl name='unsigned int' size-in-bits='32' id='f0981eeb'/> <type-decl name='unsigned long int' size-in-bits='64' id='7359adad'/> <type-decl name='void' id='48b5725f'/> - <typedef-decl name='uu_compare_fn_t' type-id='add6e811' id='40f93560'/> - <typedef-decl name='uu_avl_pool_t' type-id='12a530a8' id='7f84e390'/> - <typedef-decl name='uu_avl_t' type-id='4af029d1' id='bb7f0973'/> - <class-decl name='uu_avl_node' size-in-bits='192' is-struct='yes' visibility='default' id='f65f4326'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='uan_opaque' type-id='0ce65a8b' visibility='default'/> - </data-member> - </class-decl> - <typedef-decl name='uu_avl_node_t' type-id='f65f4326' id='73a65116'/> - <typedef-decl name='uu_avl_walk_t' type-id='e70a39e3' id='edd8457b'/> - <typedef-decl name='uu_avl_index_t' type-id='e475ab95' id='5d7f5fc8'/> <typedef-decl name='zfs_handle_t' type-id='f6ee4445' id='775509eb'/> <typedef-decl name='zpool_handle_t' type-id='67002a8a' id='b1efc708'/> <typedef-decl name='libzfs_handle_t' type-id='c8a9d9d8' id='95942d0c'/> <typedef-decl name='zfs_iter_f' type-id='5571cde4' id='d8e49ab9'/> <typedef-decl name='avl_tree_t' type-id='b351119f' id='f20fbd51'/> + <typedef-decl name='avl_index_t' type-id='e475ab95' id='fba6cb51'/> <class-decl name='avl_node' size-in-bits='192' is-struct='yes' visibility='default' id='428b67b3'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='avl_child' type-id='f0f65199' visibility='default'/> @@ -3070,7 +2602,7 @@ <typedef-decl name='__uint32_t' type-id='f0981eeb' id='62f1140c'/> <typedef-decl name='__uint64_t' type-id='7359adad' id='8910171f'/> <typedef-decl name='size_t' type-id='7359adad' id='b59d7dce'/> - <class-decl name='libzfs_handle' size-in-bits='18240' is-struct='yes' visibility='default' id='c8a9d9d8'> + <class-decl name='libzfs_handle' size-in-bits='18432' is-struct='yes' visibility='default' id='c8a9d9d8'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='libzfs_error' type-id='95e97e5e' visibility='default'/> </data-member> @@ -3081,51 +2613,48 @@ <var-decl name='libzfs_pool_handles' type-id='4c81de99' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='libzfs_ns_avlpool' type-id='de82c773' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='libzfs_ns_avl' type-id='a5c21a38' visibility='default'/> + <var-decl name='libzfs_ns_avl' type-id='f20fbd51' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='256'> + <data-member access='public' layout-offset-in-bits='448'> <var-decl name='libzfs_ns_gen' type-id='9c313c2d' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='320'> + <data-member access='public' layout-offset-in-bits='512'> <var-decl name='libzfs_desc_active' type-id='95e97e5e' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='352'> + <data-member access='public' layout-offset-in-bits='544'> <var-decl name='libzfs_action' type-id='b54ce520' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='8544'> + <data-member access='public' layout-offset-in-bits='8736'> <var-decl name='libzfs_desc' type-id='b54ce520' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='16736'> + <data-member access='public' layout-offset-in-bits='16928'> <var-decl name='libzfs_printerr' type-id='95e97e5e' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='16768'> + <data-member access='public' layout-offset-in-bits='16960'> <var-decl name='libzfs_mnttab_enable' type-id='c19b74c3' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='16832'> + <data-member access='public' layout-offset-in-bits='17024'> <var-decl name='libzfs_mnttab_cache_lock' type-id='7a6844eb' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='17152'> + <data-member access='public' layout-offset-in-bits='17344'> <var-decl name='libzfs_mnttab_cache' type-id='f20fbd51' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='17472'> + <data-member access='public' layout-offset-in-bits='17664'> <var-decl name='libzfs_pool_iter' type-id='95e97e5e' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='17504'> + <data-member access='public' layout-offset-in-bits='17696'> <var-decl name='libzfs_prop_debug' type-id='c19b74c3' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='17536'> + <data-member access='public' layout-offset-in-bits='17728'> <var-decl name='libzfs_urire' type-id='aca3bac8' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='18048'> + <data-member access='public' layout-offset-in-bits='18240'> <var-decl name='libzfs_max_nvlist' type-id='9c313c2d' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='18112'> + <data-member access='public' layout-offset-in-bits='18304'> <var-decl name='libfetch' type-id='eaa32e2f' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='18176'> + <data-member access='public' layout-offset-in-bits='18368'> <var-decl name='libfetch_load_error' type-id='26a90f95' visibility='default'/> </data-member> </class-decl> @@ -3203,7 +2732,10 @@ </data-member> </class-decl> <pointer-type-def type-id='0e01899c' size-in-bits='64' id='4d98cd5a'/> + <pointer-type-def type-id='fba6cb51' size-in-bits='64' id='32adbf30'/> <pointer-type-def type-id='428b67b3' size-in-bits='64' id='bf311473'/> + <pointer-type-def type-id='b351119f' size-in-bits='64' id='716943c7'/> + <pointer-type-def type-id='f20fbd51' size-in-bits='64' id='a3681dea'/> <pointer-type-def type-id='a84c031d' size-in-bits='64' id='26a90f95'/> <pointer-type-def type-id='26a90f95' size-in-bits='64' id='9b23c9ad'/> <qualified-type-def type-id='a84c031d' const='yes' id='9b45d938'/> @@ -3219,83 +2751,12 @@ <pointer-type-def type-id='b48d2441' size-in-bits='64' id='33976309'/> <pointer-type-def type-id='b96825af' size-in-bits='64' id='ae3e8ca6'/> <pointer-type-def type-id='002ac4a6' size-in-bits='64' id='cf536864'/> - <pointer-type-def type-id='5d7f5fc8' size-in-bits='64' id='813a2225'/> - <pointer-type-def type-id='73a65116' size-in-bits='64' id='2dc35b9d'/> - <pointer-type-def type-id='7f84e390' size-in-bits='64' id='de82c773'/> - <pointer-type-def type-id='bb7f0973' size-in-bits='64' id='a5c21a38'/> - <pointer-type-def type-id='edd8457b' size-in-bits='64' id='5842d146'/> - <pointer-type-def type-id='40f93560' size-in-bits='64' id='d502b39f'/> <pointer-type-def type-id='48b5725f' size-in-bits='64' id='eaa32e2f'/> + <pointer-type-def type-id='eaa32e2f' size-in-bits='64' id='63e171df'/> <pointer-type-def type-id='775509eb' size-in-bits='64' id='9200a744'/> <pointer-type-def type-id='b1efc708' size-in-bits='64' id='4c81de99'/> <pointer-type-def type-id='a2256d42' size-in-bits='64' id='debc6aa3'/> <class-decl name='re_dfa_t' is-struct='yes' visibility='default' is-declaration-only='yes' id='b48d2441'/> - <class-decl name='uu_avl' is-struct='yes' visibility='default' is-declaration-only='yes' id='4af029d1'/> - <class-decl name='uu_avl_pool' is-struct='yes' visibility='default' is-declaration-only='yes' id='12a530a8'/> - <class-decl name='uu_avl_walk' is-struct='yes' visibility='default' is-declaration-only='yes' id='e70a39e3'/> - <function-decl name='uu_avl_pool_create' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='80f4b756'/> - <parameter type-id='b59d7dce'/> - <parameter type-id='b59d7dce'/> - <parameter type-id='d502b39f'/> - <parameter type-id='8f92235e'/> - <return type-id='de82c773'/> - </function-decl> - <function-decl name='uu_avl_pool_destroy' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='de82c773'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='uu_avl_node_init' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='eaa32e2f'/> - <parameter type-id='2dc35b9d'/> - <parameter type-id='de82c773'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='uu_avl_create' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='de82c773'/> - <parameter type-id='eaa32e2f'/> - <parameter type-id='8f92235e'/> - <return type-id='a5c21a38'/> - </function-decl> - <function-decl name='uu_avl_destroy' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='a5c21a38'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='uu_avl_last' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='a5c21a38'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='uu_avl_walk_start' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='a5c21a38'/> - <parameter type-id='8f92235e'/> - <return type-id='5842d146'/> - </function-decl> - <function-decl name='uu_avl_walk_next' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='5842d146'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='uu_avl_walk_end' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='5842d146'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='uu_avl_find' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='a5c21a38'/> - <parameter type-id='eaa32e2f'/> - <parameter type-id='eaa32e2f'/> - <parameter type-id='813a2225'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='uu_avl_insert' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='a5c21a38'/> - <parameter type-id='eaa32e2f'/> - <parameter type-id='5d7f5fc8'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='uu_avl_remove' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='a5c21a38'/> - <parameter type-id='eaa32e2f'/> - <return type-id='48b5725f'/> - </function-decl> <function-decl name='zfs_get_handle' mangled-name='zfs_get_handle' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_get_handle'> <parameter type-id='9200a744'/> <return type-id='b0382bb3'/> @@ -3400,6 +2861,53 @@ <parameter type-id='4567bbc9'/> <return type-id='48b5725f'/> </function-decl> + <function-decl name='avl_create' mangled-name='avl_create' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_create'> + <parameter type-id='a3681dea'/> + <parameter type-id='585e1de9'/> + <parameter type-id='b59d7dce'/> + <parameter type-id='b59d7dce'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='avl_find' mangled-name='avl_find' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_find'> + <parameter type-id='a3681dea'/> + <parameter type-id='eaa32e2f'/> + <parameter type-id='32adbf30'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='avl_insert' mangled-name='avl_insert' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_insert'> + <parameter type-id='a3681dea'/> + <parameter type-id='eaa32e2f'/> + <parameter type-id='fba6cb51'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='avl_first' mangled-name='avl_first' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_first'> + <parameter type-id='a3681dea'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='avl_last' mangled-name='avl_last' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_last'> + <parameter type-id='a3681dea'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='avl_remove' mangled-name='avl_remove' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_remove'> + <parameter type-id='a3681dea'/> + <parameter type-id='eaa32e2f'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='avl_destroy_nodes' mangled-name='avl_destroy_nodes' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_destroy_nodes'> + <parameter type-id='a3681dea'/> + <parameter type-id='63e171df'/> + <return type-id='eaa32e2f'/> + </function-decl> + <function-decl name='avl_destroy' mangled-name='avl_destroy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_destroy'> + <parameter type-id='a3681dea'/> + <return type-id='48b5725f'/> + </function-decl> + <function-decl name='avl_walk' mangled-name='avl_walk' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_walk'> + <parameter type-id='716943c7'/> + <parameter type-id='eaa32e2f'/> + <parameter type-id='95e97e5e'/> + <return type-id='eaa32e2f'/> + </function-decl> <function-decl name='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'/> @@ -3438,12 +2946,6 @@ <parameter type-id='80f4b756'/> <return type-id='b59d7dce'/> </function-decl> - <function-decl name='zfs_error' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='b0382bb3'/> - <parameter type-id='95e97e5e'/> - <parameter type-id='80f4b756'/> - <return type-id='95e97e5e'/> - </function-decl> <function-decl name='zfs_alloc' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='b0382bb3'/> <parameter type-id='b59d7dce'/> @@ -3458,12 +2960,6 @@ <parameter type-id='eaa32e2f'/> <return type-id='95e97e5e'/> </function-type> - <function-type size-in-bits='64' id='add6e811'> - <parameter type-id='eaa32e2f'/> - <parameter type-id='eaa32e2f'/> - <parameter type-id='eaa32e2f'/> - <return type-id='95e97e5e'/> - </function-type> <function-type size-in-bits='64' id='cb9628fa'> <parameter type-id='9200a744'/> <parameter type-id='eaa32e2f'/> @@ -3749,10 +3245,10 @@ <var-decl name='zc_inject_record' type-id='a4301ca6' visibility='default'/> </data-member> <data-member access='public'> - <var-decl name='' type-id='e7f43f73' visibility='default'/> + <var-decl name='' type-id='e7f43f72' visibility='default'/> </data-member> </union-decl> - <class-decl name='__anonymous_struct__' size-in-bits='2944' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f73'> + <class-decl name='__anonymous_struct__' size-in-bits='2944' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f72'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='zc_pad1' type-id='514368c7' visibility='default'/> </data-member> @@ -3793,24 +3289,9 @@ <pointer-type-def type-id='95e97e5e' size-in-bits='64' id='7292109c'/> <pointer-type-def type-id='5ce45b60' size-in-bits='64' id='857bb57e'/> <pointer-type-def type-id='57928edf' size-in-bits='64' id='3fa542f0'/> - <pointer-type-def type-id='eaa32e2f' size-in-bits='64' id='63e171df'/> <pointer-type-def type-id='3522cd69' size-in-bits='64' id='b65f7fd1'/> <pointer-type-def type-id='a5559cdd' size-in-bits='64' id='e4ec4540'/> <pointer-type-def type-id='4c81de99' size-in-bits='64' id='237193c9'/> - <function-decl name='uu_avl_first' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='a5c21a38'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='uu_avl_next' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='a5c21a38'/> - <parameter type-id='eaa32e2f'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='uu_avl_teardown' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='a5c21a38'/> - <parameter type-id='63e171df'/> - <return type-id='eaa32e2f'/> - </function-decl> <function-decl name='zfs_standard_error' mangled-name='zfs_standard_error' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_standard_error'> <parameter type-id='b0382bb3'/> <parameter type-id='95e97e5e'/> @@ -4142,28 +3623,28 @@ <var-decl name='_pad' type-id='47394ee0' visibility='default'/> </data-member> <data-member access='public'> - <var-decl name='_kill' type-id='e7f43f74' visibility='default'/> + <var-decl name='_kill' type-id='e7f43f73' visibility='default'/> </data-member> <data-member access='public'> - <var-decl name='_timer' type-id='e7f43f75' visibility='default'/> + <var-decl name='_timer' type-id='e7f43f74' visibility='default'/> </data-member> <data-member access='public'> - <var-decl name='_rt' type-id='e7f43f76' visibility='default'/> + <var-decl name='_rt' type-id='e7f43f75' visibility='default'/> </data-member> <data-member access='public'> - <var-decl name='_sigchld' type-id='e7f43f77' visibility='default'/> + <var-decl name='_sigchld' type-id='e7f43f76' visibility='default'/> </data-member> <data-member access='public'> - <var-decl name='_sigfault' type-id='e7f43f78' visibility='default'/> + <var-decl name='_sigfault' type-id='e7f43f77' visibility='default'/> </data-member> <data-member access='public'> - <var-decl name='_sigpoll' type-id='e7f43f79' visibility='default'/> + <var-decl name='_sigpoll' type-id='e7f43f78' visibility='default'/> </data-member> <data-member access='public'> - <var-decl name='_sigsys' type-id='e7f43f7a' visibility='default'/> + <var-decl name='_sigsys' type-id='e7f43f79' visibility='default'/> </data-member> </union-decl> - <class-decl name='__anonymous_struct__1' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f74'> + <class-decl name='__anonymous_struct__1' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f73'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='si_pid' type-id='3629bad8' visibility='default'/> </data-member> @@ -4171,7 +3652,7 @@ <var-decl name='si_uid' type-id='cc5fcceb' visibility='default'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__2' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f75'> + <class-decl name='__anonymous_struct__2' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f74'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='si_tid' type-id='95e97e5e' visibility='default'/> </data-member> @@ -4182,7 +3663,7 @@ <var-decl name='si_sigval' type-id='eabacd01' visibility='default'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__3' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f76'> + <class-decl name='__anonymous_struct__3' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f75'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='si_pid' type-id='3629bad8' visibility='default'/> </data-member> @@ -4193,7 +3674,7 @@ <var-decl name='si_sigval' type-id='eabacd01' visibility='default'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__4' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f77'> + <class-decl name='__anonymous_struct__4' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f76'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='si_pid' type-id='3629bad8' visibility='default'/> </data-member> @@ -4210,7 +3691,7 @@ <var-decl name='si_stime' type-id='4d66c6d7' visibility='default'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__5' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f78'> + <class-decl name='__anonymous_struct__5' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f77'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='si_addr' type-id='eaa32e2f' visibility='default'/> </data-member> @@ -4223,13 +3704,13 @@ </class-decl> <union-decl name='__anonymous_union__2' size-in-bits='128' is-anonymous='yes' visibility='default' id='ac5ab598'> <data-member access='public'> - <var-decl name='_addr_bnd' type-id='e7f43f7b' visibility='default'/> + <var-decl name='_addr_bnd' type-id='e7f43f7a' visibility='default'/> </data-member> <data-member access='public'> <var-decl name='_pkey' type-id='62f1140c' visibility='default'/> </data-member> </union-decl> - <class-decl name='__anonymous_struct__6' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f7b'> + <class-decl name='__anonymous_struct__6' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f7a'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='_lower' type-id='eaa32e2f' visibility='default'/> </data-member> @@ -4237,7 +3718,7 @@ <var-decl name='_upper' type-id='eaa32e2f' visibility='default'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__7' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f79'> + <class-decl name='__anonymous_struct__7' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f78'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='si_band' type-id='bd54fe1a' visibility='default'/> </data-member> @@ -4245,7 +3726,7 @@ <var-decl name='si_fd' type-id='95e97e5e' visibility='default'/> </data-member> </class-decl> - <class-decl name='__anonymous_struct__8' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f7a'> + <class-decl name='__anonymous_struct__8' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f79'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='_call_addr' type-id='eaa32e2f' visibility='default'/> </data-member> @@ -4692,6 +4173,12 @@ <parameter type-id='9200a744' name='zhp'/> <return type-id='c19b74c3'/> </function-decl> + <function-decl name='zfs_error' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='b0382bb3'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='80f4b756'/> + <return type-id='95e97e5e'/> + </function-decl> <function-decl name='zfs_error_aux' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='b0382bb3'/> <parameter type-id='80f4b756'/> @@ -4756,7 +4243,6 @@ <enumerator name='LZC_DATSET_TYPE_ZFS' value='2'/> <enumerator name='LZC_DATSET_TYPE_ZVOL' value='3'/> </enum-decl> - <typedef-decl name='avl_index_t' type-id='e475ab95' id='fba6cb51'/> <enum-decl name='zfs_userquota_prop_t' naming-typedef-id='279fde6a' id='5258d2f6'> <underlying-type type-id='9cac1fee'/> <enumerator name='ZFS_PROP_USERUSED' value='0'/> @@ -4926,8 +4412,6 @@ <typedef-decl name='time_t' type-id='65eda9c0' id='c9d12d66'/> <typedef-decl name='uid_t' type-id='cc5fcceb' id='354978ed'/> <typedef-decl name='prop_changelist_t' type-id='d86edc51' id='eae6431d'/> - <pointer-type-def type-id='fba6cb51' size-in-bits='64' id='32adbf30'/> - <pointer-type-def type-id='f20fbd51' size-in-bits='64' id='a3681dea'/> <qualified-type-def type-id='26a90f95' restrict='yes' id='266fe297'/> <qualified-type-def type-id='56fe4a37' const='yes' id='a75125ce'/> <pointer-type-def type-id='a75125ce' size-in-bits='64' id='48bea5ec'/> @@ -5129,42 +4613,15 @@ <parameter type-id='b59d7dce'/> <return type-id='48b5725f'/> </function-decl> - <function-decl name='avl_create' mangled-name='avl_create' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_create'> - <parameter type-id='a3681dea'/> - <parameter type-id='585e1de9'/> - <parameter type-id='b59d7dce'/> - <parameter type-id='b59d7dce'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='avl_find' mangled-name='avl_find' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_find'> - <parameter type-id='a3681dea'/> - <parameter type-id='eaa32e2f'/> - <parameter type-id='32adbf30'/> - <return type-id='eaa32e2f'/> - </function-decl> <function-decl name='avl_add' mangled-name='avl_add' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_add'> <parameter type-id='a3681dea'/> <parameter type-id='eaa32e2f'/> <return type-id='48b5725f'/> </function-decl> - <function-decl name='avl_remove' mangled-name='avl_remove' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_remove'> - <parameter type-id='a3681dea'/> - <parameter type-id='eaa32e2f'/> - <return type-id='48b5725f'/> - </function-decl> <function-decl name='avl_numnodes' mangled-name='avl_numnodes' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_numnodes'> <parameter type-id='a3681dea'/> <return type-id='ee1f298e'/> </function-decl> - <function-decl name='avl_destroy_nodes' mangled-name='avl_destroy_nodes' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_destroy_nodes'> - <parameter type-id='a3681dea'/> - <parameter type-id='63e171df'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='avl_destroy' mangled-name='avl_destroy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_destroy'> - <parameter type-id='a3681dea'/> - <return type-id='48b5725f'/> - </function-decl> <function-decl name='zfs_prop_readonly' mangled-name='zfs_prop_readonly' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_prop_readonly'> <parameter type-id='58603c44'/> <return type-id='c19b74c3'/> @@ -6192,17 +5649,6 @@ </function-type> </abi-instr> <abi-instr address-size='64' path='lib/libzfs/libzfs_iter.c' language='LANG_C99'> - <pointer-type-def type-id='b351119f' size-in-bits='64' id='716943c7'/> - <function-decl name='avl_first' mangled-name='avl_first' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_first'> - <parameter type-id='a3681dea'/> - <return type-id='eaa32e2f'/> - </function-decl> - <function-decl name='avl_walk' mangled-name='avl_walk' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_walk'> - <parameter type-id='716943c7'/> - <parameter type-id='eaa32e2f'/> - <parameter type-id='95e97e5e'/> - <return type-id='eaa32e2f'/> - </function-decl> <function-decl name='make_dataset_handle_zc' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='b0382bb3'/> <parameter type-id='e4ec4540'/> @@ -6290,79 +5736,150 @@ <array-type-def dimensions='1' type-id='6028cbfe' size-in-bits='256' id='b39b9aa7'> <subrange length='4' type-id='7359adad' id='16fe7105'/> </array-type-def> + <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> + <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> <class-decl name='__dirstream' is-struct='yes' visibility='default' is-declaration-only='yes' id='20cd73f2'/> - <class-decl name='tpool' size-in-bits='2496' is-struct='yes' visibility='default' id='88d1b7f9'> + <array-type-def dimensions='1' type-id='95e97e5e' size-in-bits='64' id='e4266c7e'> + <subrange length='2' type-id='7359adad' id='52efc4ef'/> + </array-type-def> + <type-decl name='long long unsigned int' size-in-bits='64' id='3a47d82b'/> + <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> + <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> + <class-decl name='get_all_cb' size-in-bits='192' is-struct='yes' visibility='default' id='803dac95'> <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='tp_forw' type-id='9cf59a50' visibility='default'/> + <var-decl name='cb_handles' type-id='4507922a' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='tp_back' type-id='9cf59a50' visibility='default'/> + <var-decl name='cb_alloc' type-id='b59d7dce' visibility='default'/> </data-member> <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='tp_mutex' type-id='7a6844eb' visibility='default'/> + <var-decl name='cb_used' type-id='b59d7dce' visibility='default'/> + </data-member> + </class-decl> + <typedef-decl name='get_all_cb_t' type-id='803dac95' id='9b293607'/> + <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'/> + <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='tp_busycv' type-id='62fab762' visibility='default'/> + <var-decl name='rw_owner' type-id='4051f5e7' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='tp_workcv' type-id='62fab762' visibility='default'/> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='rw_readers' type-id='3502e3ff' visibility='default'/> </data-member> - <data-member access='public' layout-offset-in-bits='1216'> - <var-decl name='tp_waitcv' type-id='62fab762' visibility='default'/> + </class-decl> + <typedef-decl name='krwlock_t' type-id='4361e3b2' id='477df69a'/> + <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='1600'> - <var-decl name='tp_active' type-id='ad33e5e7' 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='1664'> - <var-decl name='tp_head' type-id='f32b30e4' 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='1728'> - <var-decl name='tp_tail' type-id='f32b30e4' 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='1792'> - <var-decl name='tp_attr' type-id='7d8569fd' 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='2240'> - <var-decl name='tp_flags' type-id='95e97e5e' 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='2272'> - <var-decl name='tp_linger' type-id='3502e3ff' 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='2304'> - <var-decl name='tp_njobs' type-id='95e97e5e' visibility='default'/> + <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='2336'> - <var-decl name='tp_minimum' type-id='95e97e5e' visibility='default'/> + <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='2368'> - <var-decl name='tp_maximum' type-id='95e97e5e' 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='2400'> - <var-decl name='tp_current' type-id='95e97e5e' visibility='default'/> + <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='2432'> - <var-decl name='tp_idle' type-id='95e97e5e' visibility='default'/> + <data-member access='public' layout-offset-in-bits='2048'> + <var-decl name='tq_flags' type-id='95e97e5e' visibility='default'/> </data-member> - </class-decl> - <array-type-def dimensions='1' type-id='95e97e5e' size-in-bits='64' id='e4266c7e'> - <subrange length='2' type-id='7359adad' id='52efc4ef'/> - </array-type-def> - <class-decl name='get_all_cb' size-in-bits='192' is-struct='yes' visibility='default' id='803dac95'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='cb_handles' type-id='4507922a' visibility='default'/> + <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='64'> - <var-decl name='cb_alloc' type-id='b59d7dce' visibility='default'/> + <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='128'> - <var-decl name='cb_used' type-id='b59d7dce' visibility='default'/> + <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='get_all_cb_t' type-id='803dac95' id='9b293607'/> - <typedef-decl name='tpool_t' type-id='88d1b7f9' id='b1bbf10d'/> + <typedef-decl name='taskq_t' type-id='1804594f' id='ef507f03'/> + <typedef-decl name='kthread_t' type-id='4051f5e7' id='9bccee1a'/> <typedef-decl name='DIR' type-id='20cd73f2' id='54a5d683'/> <typedef-decl name='mode_t' type-id='e1c52942' id='d50d396c'/> <typedef-decl name='__compar_fn_t' type-id='585e1de9' id='aba7edd8'/> + <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='e7f43f7b' visibility='default'/> + </data-member> + </union-decl> + <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' id='e7f43f7b'> + <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'/> <class-decl name='dirent64' size-in-bits='2240' is-struct='yes' visibility='default' id='5725d813'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='d_ino' type-id='71288a47' visibility='default'/> @@ -6380,6 +5897,30 @@ <var-decl name='d_name' type-id='d1617432' visibility='default'/> </data-member> </class-decl> + <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'/> + <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'/> <class-decl name='statfs64' size-in-bits='960' is-struct='yes' visibility='default' id='a2a6be1a'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='f_type' type-id='6028cbfe' visibility='default'/> @@ -6418,6 +5959,44 @@ <var-decl name='f_spare' type-id='b39b9aa7' visibility='default'/> </data-member> </class-decl> + <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> <class-decl name='stat' size-in-bits='1152' is-struct='yes' visibility='default' id='aafc373f'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='st_dev' type-id='35ed8932' visibility='default'/> @@ -6465,6 +6044,29 @@ <var-decl name='__glibc_reserved' type-id='083f8d58' visibility='default'/> </data-member> </class-decl> + <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='__ino_t' type-id='7359adad' id='e43e523d'/> <class-decl name='__fsid_t' size-in-bits='64' is-struct='yes' naming-typedef-id='0f35d263' visibility='default' id='ea35c84a'> <data-member access='public' layout-offset-in-bits='0'> @@ -6479,12 +6081,15 @@ <pointer-type-def type-id='54a5d683' size-in-bits='64' id='f09217ba'/> <pointer-type-def type-id='5725d813' size-in-bits='64' id='07b96073'/> <pointer-type-def type-id='9b293607' size-in-bits='64' id='77bf1784'/> - <pointer-type-def type-id='7d8569fd' size-in-bits='64' id='7347a39e'/> + <pointer-type-def type-id='9bccee1a' size-in-bits='64' id='6ae5a80d'/> + <pointer-type-def type-id='6ae5a80d' size-in-bits='64' id='6e87b565'/> <pointer-type-def type-id='aafc373f' size-in-bits='64' id='4330df87'/> <qualified-type-def type-id='4330df87' restrict='yes' id='73665405'/> <pointer-type-def type-id='a2a6be1a' size-in-bits='64' id='7fd094c8'/> - <pointer-type-def type-id='b1bbf10d' size-in-bits='64' id='9cf59a50'/> - <pointer-type-def type-id='c5c76c9c' size-in-bits='64' id='b7f9d8e6'/> + <pointer-type-def type-id='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='9200a744' size-in-bits='64' id='4507922a'/> <class-decl name='__dirstream' is-struct='yes' visibility='default' is-declaration-only='yes' id='20cd73f2'/> <function-decl name='zpool_disable_datasets_os' mangled-name='zpool_disable_datasets_os' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_disable_datasets_os'> @@ -6496,27 +6101,6 @@ <parameter type-id='80f4b756'/> <return type-id='48b5725f'/> </function-decl> - <function-decl name='tpool_create' mangled-name='tpool_create' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='tpool_create'> - <parameter type-id='3502e3ff'/> - <parameter type-id='3502e3ff'/> - <parameter type-id='3502e3ff'/> - <parameter type-id='7347a39e'/> - <return type-id='9cf59a50'/> - </function-decl> - <function-decl name='tpool_dispatch' mangled-name='tpool_dispatch' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='tpool_dispatch'> - <parameter type-id='9cf59a50'/> - <parameter type-id='b7f9d8e6'/> - <parameter type-id='eaa32e2f'/> - <return type-id='95e97e5e'/> - </function-decl> - <function-decl name='tpool_destroy' mangled-name='tpool_destroy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='tpool_destroy'> - <parameter type-id='9cf59a50'/> - <return type-id='48b5725f'/> - </function-decl> - <function-decl name='tpool_wait' mangled-name='tpool_wait' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='tpool_wait'> - <parameter type-id='9cf59a50'/> - <return type-id='48b5725f'/> - </function-decl> <function-decl name='mkdirp' mangled-name='mkdirp' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mkdirp'> <parameter type-id='80f4b756'/> <parameter type-id='d50d396c'/> @@ -6547,6 +6131,30 @@ <parameter type-id='9155d4b5'/> <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'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='c497180a'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='95e97e5e'/> + <parameter type-id='3502e3ff'/> + <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'/> + <parameter type-id='41cce5ce'/> + <parameter type-id='eaa32e2f'/> + <parameter type-id='3502e3ff'/> + <return type-id='de0ea20e'/> + </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'/> + <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'/> + <return type-id='48b5725f'/> + </function-decl> <function-decl name='fdopendir' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='95e97e5e'/> <return type-id='f09217ba'/> @@ -6655,7 +6263,6 @@ </function-decl> </abi-instr> <abi-instr address-size='64' path='lib/libzfs/libzfs_pool.c' language='LANG_C99'> - <type-decl name='long long unsigned int' size-in-bits='64' id='3a47d82b'/> <class-decl name='splitflags' size-in-bits='64' is-struct='yes' visibility='default' id='dc01bf52'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='dryrun' type-id='f0981eeb' visibility='default'/> @@ -8572,6 +8179,7 @@ <pointer-type-def type-id='3ff5601b' size-in-bits='64' id='4aafb922'/> <pointer-type-def type-id='acbdbcc6' size-in-bits='64' id='116842ac'/> <qualified-type-def type-id='116842ac' restrict='yes' id='3d3c4cf4'/> + <pointer-type-def type-id='7d8569fd' size-in-bits='64' id='7347a39e'/> <pointer-type-def type-id='9e59d1d4' size-in-bits='64' id='4ea84b4f'/> <pointer-type-def type-id='945467e6' size-in-bits='64' id='8def7735'/> <pointer-type-def type-id='519bc206' size-in-bits='64' id='ef2f159c'/> @@ -8685,12 +8293,6 @@ <parameter is-variadic='yes'/> <return type-id='48b5725f'/> </function-decl> - <function-decl name='avl_insert' mangled-name='avl_insert' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_insert'> - <parameter type-id='a3681dea'/> - <parameter type-id='eaa32e2f'/> - <parameter type-id='fba6cb51'/> - <return type-id='48b5725f'/> - </function-decl> <function-decl name='nvlist_add_boolean' visibility='default' binding='global' size-in-bits='64'> <parameter type-id='5ce45b60'/> <parameter type-id='80f4b756'/> @@ -9951,9 +9553,6 @@ </function-decl> </abi-instr> <abi-instr address-size='64' path='lib/libzutil/zutil_import.c' language='LANG_C99'> - <array-type-def dimensions='1' type-id='a84c031d' size-in-bits='256' id='16dc656a'> - <subrange length='32' type-id='7359adad' id='ae5bde82'/> - </array-type-def> <class-decl name='importargs' size-in-bits='512' is-struct='yes' visibility='default' id='7ac83801'> <data-member access='public' layout-offset-in-bits='0'> <var-decl name='path' type-id='9b23c9ad' visibility='default'/> @@ -10220,10 +9819,6 @@ </function-decl> </abi-instr> <abi-instr address-size='64' path='module/avl/avl.c' language='LANG_C99'> - <function-decl name='avl_last' mangled-name='avl_last' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_last'> - <parameter type-id='a3681dea' name='tree'/> - <return type-id='eaa32e2f'/> - </function-decl> <function-decl name='avl_nearest' mangled-name='avl_nearest' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='avl_nearest'> <parameter type-id='a3681dea' name='tree'/> <parameter type-id='fba6cb51' name='where'/> @@ -10364,6 +9959,7 @@ <qualified-type-def type-id='3eee3342' const='yes' id='0c1d5bbb'/> <pointer-type-def type-id='0c1d5bbb' size-in-bits='64' id='a3372543'/> <pointer-type-def type-id='611586a1' size-in-bits='64' id='2e243169'/> + <pointer-type-def type-id='c5c76c9c' size-in-bits='64' id='b7f9d8e6'/> <qualified-type-def type-id='eaa32e2f' const='yes' id='83be723c'/> <pointer-type-def type-id='83be723c' size-in-bits='64' id='7acd98a2'/> <var-decl name='spa_feature_table' type-id='fd43354e' mangled-name='spa_feature_table' visibility='default' elf-symbol-id='spa_feature_table'/> diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs_changelist.c b/sys/contrib/openzfs/lib/libzfs/libzfs_changelist.c index d290d949f4b2..eac06f8f5ab5 100644 --- a/sys/contrib/openzfs/lib/libzfs/libzfs_changelist.c +++ b/sys/contrib/openzfs/lib/libzfs/libzfs_changelist.c @@ -31,12 +31,12 @@ */ #include <libintl.h> -#include <libuutil.h> #include <stddef.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <zone.h> +#include <sys/avl.h> #include <libzfs.h> @@ -70,15 +70,14 @@ typedef struct prop_changenode { int cn_mounted; int cn_zoned; boolean_t cn_needpost; /* is postfix() needed? */ - uu_avl_node_t cn_treenode; + avl_node_t cn_treenode; } prop_changenode_t; struct prop_changelist { zfs_prop_t cl_prop; zfs_prop_t cl_realprop; zfs_prop_t cl_shareprop; /* used with sharenfs/sharesmb */ - uu_avl_pool_t *cl_pool; - uu_avl_t *cl_tree; + avl_tree_t cl_tree; boolean_t cl_waslegacy; boolean_t cl_allchildren; boolean_t cl_alldependents; @@ -97,7 +96,6 @@ int changelist_prefix(prop_changelist_t *clp) { prop_changenode_t *cn; - uu_avl_walk_t *walk; int ret = 0; const enum sa_protocol smb[] = {SA_PROTOCOL_SMB, SA_NO_PROTOCOL}; boolean_t commit_smb_shares = B_FALSE; @@ -115,10 +113,8 @@ changelist_prefix(prop_changelist_t *clp) if (clp->cl_gflags & CL_GATHER_DONT_UNMOUNT) return (0); - if ((walk = uu_avl_walk_start(clp->cl_tree, UU_WALK_ROBUST)) == NULL) - return (-1); - - while ((cn = uu_avl_walk_next(walk)) != NULL) { + for (cn = avl_first(&clp->cl_tree); cn != NULL; + cn = AVL_NEXT(&clp->cl_tree, cn)) { /* if a previous loop failed, set the remaining to false */ if (ret == -1) { @@ -159,7 +155,6 @@ changelist_prefix(prop_changelist_t *clp) if (commit_smb_shares) zfs_commit_shares(smb); - uu_avl_walk_end(walk); if (ret == -1) (void) changelist_postfix(clp); @@ -179,7 +174,6 @@ int changelist_postfix(prop_changelist_t *clp) { prop_changenode_t *cn; - uu_avl_walk_t *walk; char shareopts[ZFS_MAXPROPLEN]; boolean_t commit_smb_shares = B_FALSE; boolean_t commit_nfs_shares = B_FALSE; @@ -199,7 +193,7 @@ changelist_postfix(prop_changelist_t *clp) * location), or have explicit mountpoints set (in which case they won't * be in the changelist). */ - if ((cn = uu_avl_last(clp->cl_tree)) == NULL) + if ((cn = avl_last(&clp->cl_tree)) == NULL) return (0); if (clp->cl_prop == ZFS_PROP_MOUNTPOINT && @@ -211,11 +205,8 @@ changelist_postfix(prop_changelist_t *clp) * datasets before mounting the children. We walk all datasets even if * there are errors. */ - if ((walk = uu_avl_walk_start(clp->cl_tree, - UU_WALK_REVERSE | UU_WALK_ROBUST)) == NULL) - return (-1); - - while ((cn = uu_avl_walk_next(walk)) != NULL) { + for (cn = avl_last(&clp->cl_tree); cn != NULL; + cn = AVL_PREV(&clp->cl_tree, cn)) { boolean_t sharenfs; boolean_t sharesmb; @@ -299,7 +290,6 @@ changelist_postfix(prop_changelist_t *clp) *p++ = SA_PROTOCOL_SMB; *p++ = SA_NO_PROTOCOL; zfs_commit_shares(proto); - uu_avl_walk_end(walk); return (0); } @@ -334,13 +324,10 @@ void changelist_rename(prop_changelist_t *clp, const char *src, const char *dst) { prop_changenode_t *cn; - uu_avl_walk_t *walk; char newname[ZFS_MAX_DATASET_NAME_LEN]; - if ((walk = uu_avl_walk_start(clp->cl_tree, UU_WALK_ROBUST)) == NULL) - return; - - while ((cn = uu_avl_walk_next(walk)) != NULL) { + for (cn = avl_first(&clp->cl_tree); cn != NULL; + cn = AVL_NEXT(&clp->cl_tree, cn)) { /* * Do not rename a clone that's not in the source hierarchy. */ @@ -359,8 +346,6 @@ changelist_rename(prop_changelist_t *clp, const char *src, const char *dst) (void) strlcpy(cn->cn_handle->zfs_name, newname, sizeof (cn->cn_handle->zfs_name)); } - - uu_avl_walk_end(walk); } /* @@ -371,24 +356,20 @@ int changelist_unshare(prop_changelist_t *clp, const enum sa_protocol *proto) { prop_changenode_t *cn; - uu_avl_walk_t *walk; int ret = 0; if (clp->cl_prop != ZFS_PROP_SHARENFS && clp->cl_prop != ZFS_PROP_SHARESMB) return (0); - if ((walk = uu_avl_walk_start(clp->cl_tree, UU_WALK_ROBUST)) == NULL) - return (-1); - - while ((cn = uu_avl_walk_next(walk)) != NULL) { + for (cn = avl_first(&clp->cl_tree); cn != NULL; + cn = AVL_NEXT(&clp->cl_tree, cn)) { if (zfs_unshare(cn->cn_handle, NULL, proto) != 0) ret = -1; } for (const enum sa_protocol *p = proto; *p != SA_NO_PROTOCOL; ++p) sa_commit_shares(*p); - uu_avl_walk_end(walk); return (ret); } @@ -411,22 +392,16 @@ void changelist_remove(prop_changelist_t *clp, const char *name) { prop_changenode_t *cn; - uu_avl_walk_t *walk; - - if ((walk = uu_avl_walk_start(clp->cl_tree, UU_WALK_ROBUST)) == NULL) - return; - while ((cn = uu_avl_walk_next(walk)) != NULL) { + for (cn = avl_first(&clp->cl_tree); cn != NULL; + cn = AVL_NEXT(&clp->cl_tree, cn)) { if (strcmp(cn->cn_handle->zfs_name, name) == 0) { - uu_avl_remove(clp->cl_tree, cn); + avl_remove(&clp->cl_tree, cn); zfs_close(cn->cn_handle); free(cn); - uu_avl_walk_end(walk); return; } } - - uu_avl_walk_end(walk); } /* @@ -436,26 +411,14 @@ void changelist_free(prop_changelist_t *clp) { prop_changenode_t *cn; + void *cookie = NULL; - if (clp->cl_tree) { - uu_avl_walk_t *walk; - - if ((walk = uu_avl_walk_start(clp->cl_tree, - UU_WALK_ROBUST)) == NULL) - return; - - while ((cn = uu_avl_walk_next(walk)) != NULL) { - uu_avl_remove(clp->cl_tree, cn); - zfs_close(cn->cn_handle); - free(cn); - } - - uu_avl_walk_end(walk); - uu_avl_destroy(clp->cl_tree); + while ((cn = avl_destroy_nodes(&clp->cl_tree, &cookie)) != NULL) { + zfs_close(cn->cn_handle); + free(cn); } - if (clp->cl_pool) - uu_avl_pool_destroy(clp->cl_pool); + avl_destroy(&clp->cl_tree); free(clp); } @@ -467,7 +430,7 @@ changelist_add_mounted(zfs_handle_t *zhp, void *data) { prop_changelist_t *clp = data; prop_changenode_t *cn; - uu_avl_index_t idx; + avl_index_t idx; ASSERT3U(clp->cl_prop, ==, ZFS_PROP_MOUNTPOINT); @@ -483,10 +446,8 @@ changelist_add_mounted(zfs_handle_t *zhp, void *data) if (getzoneid() == GLOBAL_ZONEID && cn->cn_zoned) clp->cl_haszonedchild = B_TRUE; - uu_avl_node_init(cn, &cn->cn_treenode, clp->cl_pool); - - if (uu_avl_find(clp->cl_tree, cn, NULL, &idx) == NULL) { - uu_avl_insert(clp->cl_tree, cn, idx); + if (avl_find(&clp->cl_tree, cn, &idx) == NULL) { + avl_insert(&clp->cl_tree, cn, idx); } else { free(cn); zfs_close(zhp); @@ -553,12 +514,9 @@ change_one(zfs_handle_t *zhp, void *data) if (getzoneid() == GLOBAL_ZONEID && cn->cn_zoned) clp->cl_haszonedchild = B_TRUE; - uu_avl_node_init(cn, &cn->cn_treenode, clp->cl_pool); - - uu_avl_index_t idx; - - if (uu_avl_find(clp->cl_tree, cn, NULL, &idx) == NULL) { - uu_avl_insert(clp->cl_tree, cn, idx); + avl_index_t idx; + if (avl_find(&clp->cl_tree, cn, &idx) == NULL) { + avl_insert(&clp->cl_tree, cn, idx); } else { free(cn); cn = NULL; @@ -610,11 +568,11 @@ compare_props(const void *a, const void *b, zfs_prop_t prop) else if (!haspropa && !haspropb) return (0); else - return (strcmp(propb, propa)); + return (TREE_ISIGN(strcmp(propb, propa))); } static int -compare_mountpoints(const void *a, const void *b, void *unused) +compare_mountpoints(const void *a, const void *b) { /* * When unsharing or unmounting filesystems, we need to do it in @@ -622,14 +580,12 @@ compare_mountpoints(const void *a, const void *b, void *unused) * hierarchy that is different from the dataset hierarchy, and still * allow it to be changed. */ - (void) unused; return (compare_props(a, b, ZFS_PROP_MOUNTPOINT)); } static int -compare_dataset_names(const void *a, const void *b, void *unused) +compare_dataset_names(const void *a, const void *b) { - (void) unused; return (compare_props(a, b, ZFS_PROP_NAME)); } @@ -671,28 +627,14 @@ changelist_gather(zfs_handle_t *zhp, zfs_prop_t prop, int gather_flags, } } - clp->cl_pool = uu_avl_pool_create("changelist_pool", + avl_create(&clp->cl_tree, + legacy ? compare_dataset_names : compare_mountpoints, sizeof (prop_changenode_t), - offsetof(prop_changenode_t, cn_treenode), - legacy ? compare_dataset_names : compare_mountpoints, 0); - if (clp->cl_pool == NULL) { - assert(uu_error() == UU_ERROR_NO_MEMORY); - (void) zfs_error(zhp->zfs_hdl, EZFS_NOMEM, "internal error"); - changelist_free(clp); - return (NULL); - } + offsetof(prop_changenode_t, cn_treenode)); - clp->cl_tree = uu_avl_create(clp->cl_pool, NULL, UU_DEFAULT); clp->cl_gflags = gather_flags; clp->cl_mflags = mnt_flags; - if (clp->cl_tree == NULL) { - assert(uu_error() == UU_ERROR_NO_MEMORY); - (void) zfs_error(zhp->zfs_hdl, EZFS_NOMEM, "internal error"); - changelist_free(clp); - return (NULL); - } - /* * If this is a rename or the 'zoned' property, we pretend we're * changing the mountpoint and flag it so we can catch all children in @@ -778,10 +720,9 @@ changelist_gather(zfs_handle_t *zhp, zfs_prop_t prop, int gather_flags, cn->cn_zoned = zfs_prop_get_int(zhp, ZFS_PROP_ZONED); cn->cn_needpost = B_TRUE; - uu_avl_node_init(cn, &cn->cn_treenode, clp->cl_pool); - uu_avl_index_t idx; - if (uu_avl_find(clp->cl_tree, cn, NULL, &idx) == NULL) { - uu_avl_insert(clp->cl_tree, cn, idx); + avl_index_t idx; + if (avl_find(&clp->cl_tree, cn, &idx) == NULL) { + avl_insert(&clp->cl_tree, cn, idx); } else { free(cn); zfs_close(temp); diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs_config.c b/sys/contrib/openzfs/lib/libzfs/libzfs_config.c index 9d704e4303ff..f522d7c934e6 100644 --- a/sys/contrib/openzfs/lib/libzfs/libzfs_config.c +++ b/sys/contrib/openzfs/lib/libzfs/libzfs_config.c @@ -47,55 +47,37 @@ #include <string.h> #include <unistd.h> #include <libintl.h> -#include <libuutil.h> #include "libzfs_impl.h" typedef struct config_node { char *cn_name; nvlist_t *cn_config; - uu_avl_node_t cn_avl; + avl_node_t cn_avl; } config_node_t; static int -config_node_compare(const void *a, const void *b, void *unused) +config_node_compare(const void *a, const void *b) { - (void) unused; const config_node_t *ca = (config_node_t *)a; const config_node_t *cb = (config_node_t *)b; - int ret = strcmp(ca->cn_name, cb->cn_name); - - if (ret < 0) - return (-1); - else if (ret > 0) - return (1); - else - return (0); + return (TREE_ISIGN(strcmp(ca->cn_name, cb->cn_name))); } void namespace_clear(libzfs_handle_t *hdl) { - if (hdl->libzfs_ns_avl) { - config_node_t *cn; - void *cookie = NULL; - - while ((cn = uu_avl_teardown(hdl->libzfs_ns_avl, - &cookie)) != NULL) { - nvlist_free(cn->cn_config); - free(cn->cn_name); - free(cn); - } + config_node_t *cn; + void *cookie = NULL; - uu_avl_destroy(hdl->libzfs_ns_avl); - hdl->libzfs_ns_avl = NULL; + while ((cn = avl_destroy_nodes(&hdl->libzfs_ns_avl, &cookie)) != NULL) { + nvlist_free(cn->cn_config); + free(cn->cn_name); + free(cn); } - if (hdl->libzfs_ns_avlpool) { - uu_avl_pool_destroy(hdl->libzfs_ns_avlpool); - hdl->libzfs_ns_avlpool = NULL; - } + avl_destroy(&hdl->libzfs_ns_avl); } /* @@ -111,20 +93,8 @@ namespace_reload(libzfs_handle_t *hdl) void *cookie; if (hdl->libzfs_ns_gen == 0) { - /* - * This is the first time we've accessed the configuration - * cache. Initialize the AVL tree and then fall through to the - * common code. - */ - if ((hdl->libzfs_ns_avlpool = uu_avl_pool_create("config_pool", - sizeof (config_node_t), - offsetof(config_node_t, cn_avl), - config_node_compare, UU_DEFAULT)) == NULL) - return (no_memory(hdl)); - - if ((hdl->libzfs_ns_avl = uu_avl_create(hdl->libzfs_ns_avlpool, - NULL, UU_DEFAULT)) == NULL) - return (no_memory(hdl)); + avl_create(&hdl->libzfs_ns_avl, config_node_compare, + sizeof (config_node_t), offsetof(config_node_t, cn_avl)); } zcmd_alloc_dst_nvlist(hdl, &zc, 0); @@ -167,7 +137,7 @@ namespace_reload(libzfs_handle_t *hdl) * Clear out any existing configuration information. */ cookie = NULL; - while ((cn = uu_avl_teardown(hdl->libzfs_ns_avl, &cookie)) != NULL) { + while ((cn = avl_destroy_nodes(&hdl->libzfs_ns_avl, &cookie)) != NULL) { nvlist_free(cn->cn_config); free(cn->cn_name); free(cn); @@ -176,7 +146,7 @@ namespace_reload(libzfs_handle_t *hdl) elem = NULL; while ((elem = nvlist_next_nvpair(config, elem)) != NULL) { nvlist_t *child; - uu_avl_index_t where; + avl_index_t where; cn = zfs_alloc(hdl, sizeof (config_node_t)); cn->cn_name = zfs_strdup(hdl, nvpair_name(elem)); @@ -187,10 +157,9 @@ namespace_reload(libzfs_handle_t *hdl) nvlist_free(config); return (no_memory(hdl)); } - verify(uu_avl_find(hdl->libzfs_ns_avl, cn, NULL, &where) - == NULL); + verify(avl_find(&hdl->libzfs_ns_avl, cn, &where) == NULL); - uu_avl_insert(hdl->libzfs_ns_avl, cn, where); + avl_insert(&hdl->libzfs_ns_avl, cn, where); } nvlist_free(config); @@ -400,8 +369,8 @@ zpool_iter(libzfs_handle_t *hdl, zpool_iter_f func, void *data) return (-1); hdl->libzfs_pool_iter++; - for (cn = uu_avl_first(hdl->libzfs_ns_avl); cn != NULL; - cn = uu_avl_next(hdl->libzfs_ns_avl, cn)) { + for (cn = avl_first(&hdl->libzfs_ns_avl); cn != NULL; + cn = AVL_NEXT(&hdl->libzfs_ns_avl, cn)) { if (zpool_skip_pool(cn->cn_name)) continue; @@ -438,8 +407,8 @@ zfs_iter_root(libzfs_handle_t *hdl, zfs_iter_f func, void *data) if (namespace_reload(hdl) != 0) return (-1); - for (cn = uu_avl_first(hdl->libzfs_ns_avl); cn != NULL; - cn = uu_avl_next(hdl->libzfs_ns_avl, cn)) { + for (cn = avl_first(&hdl->libzfs_ns_avl); cn != NULL; + cn = AVL_NEXT(&hdl->libzfs_ns_avl, cn)) { if (zpool_skip_pool(cn->cn_name)) continue; diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs_impl.h b/sys/contrib/openzfs/lib/libzfs/libzfs_impl.h index 9053740ec2f0..5bcba3c8e58b 100644 --- a/sys/contrib/openzfs/lib/libzfs/libzfs_impl.h +++ b/sys/contrib/openzfs/lib/libzfs/libzfs_impl.h @@ -36,7 +36,6 @@ #include <sys/zfs_ioctl.h> #include <regex.h> -#include <libuutil.h> #include <libzfs.h> #include <libshare.h> #include <libzfs_core.h> @@ -51,8 +50,7 @@ struct libzfs_handle { int libzfs_error; int libzfs_fd; zpool_handle_t *libzfs_pool_handles; - uu_avl_pool_t *libzfs_ns_avlpool; - uu_avl_t *libzfs_ns_avl; + avl_tree_t libzfs_ns_avl; uint64_t libzfs_ns_gen; int libzfs_desc_active; char libzfs_action[1024]; diff --git a/sys/contrib/openzfs/lib/libzfs/libzfs_mount.c b/sys/contrib/openzfs/lib/libzfs/libzfs_mount.c index 5c9e2199eed4..8d840dff786d 100644 --- a/sys/contrib/openzfs/lib/libzfs/libzfs_mount.c +++ b/sys/contrib/openzfs/lib/libzfs/libzfs_mount.c @@ -78,7 +78,6 @@ #include <libzutil.h> #include "libzfs_impl.h" -#include <thread_pool.h> #include <libshare.h> #include <sys/systeminfo.h> @@ -1071,7 +1070,7 @@ non_descendant_idx(zfs_handle_t **handles, size_t num_handles, int idx) typedef struct mnt_param { libzfs_handle_t *mnt_hdl; - tpool_t *mnt_tp; + taskq_t *mnt_tq; zfs_handle_t **mnt_zhps; /* filesystems to mount */ size_t mnt_num_handles; int mnt_idx; /* Index of selected entry to mount */ @@ -1085,19 +1084,20 @@ typedef struct mnt_param { */ static void zfs_dispatch_mount(libzfs_handle_t *hdl, zfs_handle_t **handles, - size_t num_handles, int idx, zfs_iter_f func, void *data, tpool_t *tp) + size_t num_handles, int idx, zfs_iter_f func, void *data, taskq_t *tq) { mnt_param_t *mnt_param = zfs_alloc(hdl, sizeof (mnt_param_t)); mnt_param->mnt_hdl = hdl; - mnt_param->mnt_tp = tp; + mnt_param->mnt_tq = tq; mnt_param->mnt_zhps = handles; mnt_param->mnt_num_handles = num_handles; mnt_param->mnt_idx = idx; mnt_param->mnt_func = func; mnt_param->mnt_data = data; - if (tpool_dispatch(tp, zfs_mount_task, (void*)mnt_param)) { + if (taskq_dispatch(tq, zfs_mount_task, (void*)mnt_param, + TQ_SLEEP) == TASKQID_INVALID) { /* Could not dispatch to thread pool; execute directly */ zfs_mount_task((void*)mnt_param); } @@ -1188,7 +1188,7 @@ zfs_mount_task(void *arg) if (!libzfs_path_contains(mountpoint, child)) break; /* not a descendant, return */ zfs_dispatch_mount(mp->mnt_hdl, handles, num_handles, i, - mp->mnt_func, mp->mnt_data, mp->mnt_tp); + mp->mnt_func, mp->mnt_data, mp->mnt_tq); } out: @@ -1246,7 +1246,8 @@ zfs_foreach_mountpoint(libzfs_handle_t *hdl, zfs_handle_t **handles, * Issue the callback function for each dataset using a parallel * algorithm that uses a thread pool to manage threads. */ - tpool_t *tp = tpool_create(1, nthr, 0, NULL); + taskq_t *tq = taskq_create("zfs_foreach_mountpoint", nthr, minclsyspri, + 1, INT_MAX, TASKQ_DYNAMIC); /* * There may be multiple "top level" mountpoints outside of the pool's @@ -1264,11 +1265,11 @@ zfs_foreach_mountpoint(libzfs_handle_t *hdl, zfs_handle_t **handles, zfs_prop_get_int(handles[i], ZFS_PROP_ZONED)) break; zfs_dispatch_mount(hdl, handles, num_handles, i, func, data, - tp); + tq); } - tpool_wait(tp); /* wait for all scheduled mounts to complete */ - tpool_destroy(tp); + taskq_wait(tq); /* wait for all scheduled mounts to complete */ + taskq_destroy(tq); } /* diff --git a/sys/contrib/openzfs/lib/libzfs/os/linux/libzfs_mount_os.c b/sys/contrib/openzfs/lib/libzfs/os/linux/libzfs_mount_os.c index 585d22d9e5b3..cdfb432b10ad 100644 --- a/sys/contrib/openzfs/lib/libzfs/os/linux/libzfs_mount_os.c +++ b/sys/contrib/openzfs/lib/libzfs/os/linux/libzfs_mount_os.c @@ -49,7 +49,6 @@ #include <libzfs.h> #include "../../libzfs_impl.h" -#include <thread_pool.h> #define ZS_COMMENT 0x00000000 /* comment */ #define ZS_ZFSUTIL 0x00000001 /* caller is zfs(8) */ diff --git a/sys/contrib/openzfs/lib/libzfs_core/libzfs_core.abi b/sys/contrib/openzfs/lib/libzfs_core/libzfs_core.abi index 238151d432f1..893a87c7e9e3 100644 --- a/sys/contrib/openzfs/lib/libzfs_core/libzfs_core.abi +++ b/sys/contrib/openzfs/lib/libzfs_core/libzfs_core.abi @@ -2004,14 +2004,17 @@ <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'/> + <typedef-decl name='pthread_once_t' type-id='95e97e5e' id='2568d84b'/> <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='2568d84b' size-in-bits='64' id='d9bab700'/> <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='ee076206' size-in-bits='64' id='953b12f8'/> <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'/> @@ -2025,15 +2028,16 @@ <parameter type-id='eaa32e2f'/> <return type-id='48b5725f'/> </function-decl> + <function-decl name='pthread_once' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='d9bab700'/> + <parameter type-id='953b12f8'/> + <return type-id='95e97e5e'/> + </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'/> @@ -2123,6 +2127,7 @@ <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'/> + <parameter type-id='c19b74c3' name='wait'/> <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'> @@ -2131,6 +2136,9 @@ <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='ee076206'> + <return type-id='48b5725f'/> + </function-type> <function-type size-in-bits='64' id='c5c76c9c'> <parameter type-id='eaa32e2f'/> <return type-id='48b5725f'/> diff --git a/sys/contrib/openzfs/lib/libzutil/Makefile.am b/sys/contrib/openzfs/lib/libzutil/Makefile.am index 519906235f7f..e5af9d69de54 100644 --- a/sys/contrib/openzfs/lib/libzutil/Makefile.am +++ b/sys/contrib/openzfs/lib/libzutil/Makefile.am @@ -30,7 +30,6 @@ endif libzutil_la_LIBADD = \ libavl.la \ - libtpool.la \ libnvpair.la \ libspl.la diff --git a/sys/contrib/openzfs/lib/libzutil/os/freebsd/zutil_import_os.c b/sys/contrib/openzfs/lib/libzutil/os/freebsd/zutil_import_os.c index 324ba1cf372b..1d38d6e6bb09 100644 --- a/sys/contrib/openzfs/lib/libzutil/os/freebsd/zutil_import_os.c +++ b/sys/contrib/openzfs/lib/libzutil/os/freebsd/zutil_import_os.c @@ -62,7 +62,6 @@ #include <fcntl.h> #include <sys/efi_partition.h> -#include <thread_pool.h> #include <libgeom.h> #include <sys/vdev_impl.h> diff --git a/sys/contrib/openzfs/lib/libzutil/os/linux/zutil_import_os.c b/sys/contrib/openzfs/lib/libzutil/os/linux/zutil_import_os.c index 2b2043889e68..7cee63616bcd 100644 --- a/sys/contrib/openzfs/lib/libzutil/os/linux/zutil_import_os.c +++ b/sys/contrib/openzfs/lib/libzutil/os/linux/zutil_import_os.c @@ -63,7 +63,6 @@ #include <sys/vdev_impl.h> #include <sys/fs/zfs.h> -#include <thread_pool.h> #include <libzutil.h> #include <libnvpair.h> #include <libzfs.h> diff --git a/sys/contrib/openzfs/lib/libzutil/zutil_import.c b/sys/contrib/openzfs/lib/libzutil/zutil_import.c index 08367f4c064d..56ac11e2029c 100644 --- a/sys/contrib/openzfs/lib/libzutil/zutil_import.c +++ b/sys/contrib/openzfs/lib/libzutil/zutil_import.c @@ -65,8 +65,8 @@ #include <sys/dktp/fdisk.h> #include <sys/vdev_impl.h> #include <sys/fs/zfs.h> +#include <sys/taskq.h> -#include <thread_pool.h> #include <libzutil.h> #include <libnvpair.h> @@ -1457,7 +1457,7 @@ zpool_find_import_impl(libpc_handle_t *hdl, importargs_t *iarg, name_entry_t *ne, *nenext; rdsk_node_t *slice; void *cookie; - tpool_t *t; + taskq_t *tq; verify(iarg->poolname == NULL || iarg->guid == 0); @@ -1480,13 +1480,14 @@ zpool_find_import_impl(libpc_handle_t *hdl, importargs_t *iarg, threads = MIN(threads, am / VDEV_LABELS); #endif #endif - t = tpool_create(1, threads, 0, NULL); + tq = taskq_create("zpool_find_import", threads, minclsyspri, 1, INT_MAX, + TASKQ_DYNAMIC); for (slice = avl_first(cache); slice; (slice = avl_walk(cache, slice, AVL_AFTER))) - (void) tpool_dispatch(t, zpool_open_func, slice); + (void) taskq_dispatch(tq, zpool_open_func, slice, TQ_SLEEP); - tpool_wait(t); - tpool_destroy(t); + taskq_wait(tq); + taskq_destroy(tq); /* * Process the cache, filtering out any entries which are not diff --git a/sys/contrib/openzfs/module/Kbuild.in b/sys/contrib/openzfs/module/Kbuild.in index 95313c984178..e653908efc9c 100644 --- a/sys/contrib/openzfs/module/Kbuild.in +++ b/sys/contrib/openzfs/module/Kbuild.in @@ -2,7 +2,7 @@ # first. This ensures its module initialization function is run before # any of the other module initialization functions which depend on it. -ZFS_MODULE_CFLAGS += -std=gnu99 -Wno-declaration-after-statement +ZFS_MODULE_CFLAGS += -std=gnu11 -Wno-declaration-after-statement ZFS_MODULE_CFLAGS += -Wmissing-prototypes ZFS_MODULE_CFLAGS += @KERNEL_DEBUG_CFLAGS@ @KERNEL_NO_FORMAT_ZERO_LENGTH@ diff --git a/sys/contrib/openzfs/module/os/freebsd/spl/spl_taskq.c b/sys/contrib/openzfs/module/os/freebsd/spl/spl_taskq.c index c7cfc9f88975..f3b88674f5b5 100644 --- a/sys/contrib/openzfs/module/os/freebsd/spl/spl_taskq.c +++ b/sys/contrib/openzfs/module/os/freebsd/spl/spl_taskq.c @@ -351,7 +351,7 @@ taskq_free(taskq_ent_t *task) } int -taskq_cancel_id(taskq_t *tq, taskqid_t tid) +taskq_cancel_id(taskq_t *tq, taskqid_t tid, boolean_t wait) { uint32_t pend; int rc; @@ -362,12 +362,12 @@ taskq_cancel_id(taskq_t *tq, taskqid_t tid) if (ent->tqent_type == NORMAL_TASK) { rc = taskqueue_cancel(tq->tq_queue, &ent->tqent_task, &pend); - if (rc == EBUSY) + if (rc == EBUSY && wait) taskqueue_drain(tq->tq_queue, &ent->tqent_task); } else { rc = taskqueue_cancel_timeout(tq->tq_queue, &ent->tqent_timeout_task, &pend); - if (rc == EBUSY) { + if (rc == EBUSY && wait) { taskqueue_drain_timeout(tq->tq_queue, &ent->tqent_timeout_task); } @@ -381,6 +381,13 @@ taskq_cancel_id(taskq_t *tq, taskqid_t tid) } /* Free the extra reference we added with taskq_lookup. */ taskq_free(ent); + + /* + * If task was running and we didn't wait, return EBUSY. + * Otherwise return 0 if cancelled or ENOENT if not found. + */ + if (rc == EBUSY && !wait) + return (EBUSY); return (pend ? 0 : ENOENT); } diff --git a/sys/contrib/openzfs/module/os/linux/spl/spl-kmem-cache.c b/sys/contrib/openzfs/module/os/linux/spl/spl-kmem-cache.c index 22e4ed169d03..5594b2f80c02 100644 --- a/sys/contrib/openzfs/module/os/linux/spl/spl-kmem-cache.c +++ b/sys/contrib/openzfs/module/os/linux/spl/spl-kmem-cache.c @@ -840,7 +840,7 @@ spl_kmem_cache_destroy(spl_kmem_cache_t *skc) id = skc->skc_taskqid; spin_unlock(&skc->skc_lock); - taskq_cancel_id(spl_kmem_cache_taskq, id); + taskq_cancel_id(spl_kmem_cache_taskq, id, B_TRUE); /* * Wait until all current callers complete, this is mainly diff --git a/sys/contrib/openzfs/module/os/linux/spl/spl-taskq.c b/sys/contrib/openzfs/module/os/linux/spl/spl-taskq.c index 00ff789265c6..c0d654e0dcf5 100644 --- a/sys/contrib/openzfs/module/os/linux/spl/spl-taskq.c +++ b/sys/contrib/openzfs/module/os/linux/spl/spl-taskq.c @@ -598,13 +598,22 @@ taskq_of_curthread(void) EXPORT_SYMBOL(taskq_of_curthread); /* - * Cancel an already dispatched task given the task id. Still pending tasks - * will be immediately canceled, and if the task is active the function will - * block until it completes. Preallocated tasks which are canceled must be - * freed by the caller. + * Cancel a dispatched task. Pending tasks are cancelled immediately. + * If the task is running, behavior depends on wait parameter: + * - wait=B_TRUE: Block until task completes + * - wait=B_FALSE: Return EBUSY immediately + * + * Return values: + * 0 - Cancelled before execution. Caller must release resources. + * EBUSY - Task running (wait=B_FALSE only). Will self-cleanup. + * ENOENT - Not found, or completed after waiting. Already cleaned up. + * + * Note: wait=B_TRUE returns ENOENT (not EBUSY) after waiting because + * the task no longer exists. This distinguishes "cancelled before run" + * from "completed naturally" for proper resource management. */ int -taskq_cancel_id(taskq_t *tq, taskqid_t id) +taskq_cancel_id(taskq_t *tq, taskqid_t id, boolean_t wait) { taskq_ent_t *t; int rc = ENOENT; @@ -633,14 +642,31 @@ taskq_cancel_id(taskq_t *tq, taskqid_t id) /* * The task_expire() function takes the tq->tq_lock so drop - * drop the lock before synchronously cancelling the timer. + * the lock before synchronously cancelling the timer. + * + * Always call timer_delete_sync() unconditionally. A + * timer_pending() check would be insufficient and unsafe. + * When a timer expires, it is immediately dequeued from the + * timer wheel (timer_pending() returns FALSE), but the + * callback (task_expire) may not run until later. + * + * The race window: + * 1) Timer expires and is dequeued - timer_pending() now + * returns FALSE + * 2) task_done() is called below, freeing the task, sets + * tqent_func = NULL and clears flags including CANCEL + * 3) Timer callback finally runs, sees no CANCEL flag, + * queues task to prio_list + * 4) Worker thread attempts to execute NULL tqent_func + * and panics + * + * timer_delete_sync() prevents this by ensuring the timer + * callback completes before the task is freed. */ - if (timer_pending(&t->tqent_timer)) { - spin_unlock_irqrestore(&tq->tq_lock, flags); - timer_delete_sync(&t->tqent_timer); - spin_lock_irqsave_nested(&tq->tq_lock, flags, - tq->tq_lock_class); - } + spin_unlock_irqrestore(&tq->tq_lock, flags); + timer_delete_sync(&t->tqent_timer); + spin_lock_irqsave_nested(&tq->tq_lock, flags, + tq->tq_lock_class); if (!(t->tqent_flags & TQENT_FLAG_PREALLOC)) task_done(tq, t); @@ -650,8 +676,12 @@ taskq_cancel_id(taskq_t *tq, taskqid_t id) spin_unlock_irqrestore(&tq->tq_lock, flags); if (t == ERR_PTR(-EBUSY)) { - taskq_wait_id(tq, id); - rc = EBUSY; + if (wait) { + taskq_wait_id(tq, id); + rc = ENOENT; /* Completed, no longer exists */ + } else { + rc = EBUSY; /* Still running */ + } } return (rc); diff --git a/sys/contrib/openzfs/module/os/linux/zfs/zfs_ctldir.c b/sys/contrib/openzfs/module/os/linux/zfs/zfs_ctldir.c index fb4de50480a3..1ac60119fdcf 100644 --- a/sys/contrib/openzfs/module/os/linux/zfs/zfs_ctldir.c +++ b/sys/contrib/openzfs/module/os/linux/zfs/zfs_ctldir.c @@ -120,7 +120,6 @@ typedef struct { spa_t *se_spa; /* pool spa */ uint64_t se_objsetid; /* snapshot objset id */ struct dentry *se_root_dentry; /* snapshot root dentry */ - krwlock_t se_taskqid_lock; /* scheduled unmount taskqid lock */ taskqid_t se_taskqid; /* scheduled unmount taskqid */ avl_node_t se_node_name; /* zfs_snapshots_by_name link */ avl_node_t se_node_objsetid; /* zfs_snapshots_by_objsetid link */ @@ -147,7 +146,6 @@ zfsctl_snapshot_alloc(const char *full_name, const char *full_path, spa_t *spa, se->se_objsetid = objsetid; se->se_root_dentry = root_dentry; se->se_taskqid = TASKQID_INVALID; - rw_init(&se->se_taskqid_lock, NULL, RW_DEFAULT, NULL); zfs_refcount_create(&se->se_refcount); @@ -164,7 +162,6 @@ zfsctl_snapshot_free(zfs_snapentry_t *se) zfs_refcount_destroy(&se->se_refcount); kmem_strfree(se->se_name); kmem_strfree(se->se_path); - rw_destroy(&se->se_taskqid_lock); kmem_free(se, sizeof (zfs_snapentry_t)); } @@ -340,17 +337,15 @@ snapentry_expire(void *data) return; } - rw_enter(&se->se_taskqid_lock, RW_WRITER); - se->se_taskqid = TASKQID_INVALID; - rw_exit(&se->se_taskqid_lock); (void) zfsctl_snapshot_unmount(se->se_name, MNT_EXPIRE); - zfsctl_snapshot_rele(se); /* - * Reschedule the unmount if the zfs_snapentry_t wasn't removed. + * Clear taskqid and reschedule if the snapshot wasn't removed. * This can occur when the snapshot is busy. */ - rw_enter(&zfs_snapshot_lock, RW_READER); + rw_enter(&zfs_snapshot_lock, RW_WRITER); + se->se_taskqid = TASKQID_INVALID; + zfsctl_snapshot_rele(se); if ((se = zfsctl_snapshot_find_by_objsetid(spa, objsetid)) != NULL) { zfsctl_snapshot_unmount_delay_impl(se, zfs_expire_snapshot); zfsctl_snapshot_rele(se); @@ -367,17 +362,17 @@ static void zfsctl_snapshot_unmount_cancel(zfs_snapentry_t *se) { int err = 0; - rw_enter(&se->se_taskqid_lock, RW_WRITER); - err = taskq_cancel_id(system_delay_taskq, se->se_taskqid); + + ASSERT(RW_WRITE_HELD(&zfs_snapshot_lock)); + + err = taskq_cancel_id(system_delay_taskq, se->se_taskqid, B_FALSE); /* - * if we get ENOENT, the taskq couldn't be found to be - * canceled, so we can just mark it as invalid because - * it's already gone. If we got EBUSY, then we already - * blocked until it was gone _anyway_, so we don't care. + * Clear taskqid only if we successfully cancelled before execution. + * For ENOENT, task already cleared it. For EBUSY, task will clear + * it when done. */ - se->se_taskqid = TASKQID_INVALID; - rw_exit(&se->se_taskqid_lock); if (err == 0) { + se->se_taskqid = TASKQID_INVALID; zfsctl_snapshot_rele(se); } } @@ -388,12 +383,11 @@ zfsctl_snapshot_unmount_cancel(zfs_snapentry_t *se) static void zfsctl_snapshot_unmount_delay_impl(zfs_snapentry_t *se, int delay) { + ASSERT(RW_LOCK_HELD(&zfs_snapshot_lock)); if (delay <= 0) return; - zfsctl_snapshot_hold(se); - rw_enter(&se->se_taskqid_lock, RW_WRITER); /* * If this condition happens, we managed to: * - dispatch once @@ -404,13 +398,12 @@ zfsctl_snapshot_unmount_delay_impl(zfs_snapentry_t *se, int delay) * no problem. */ if (se->se_taskqid != TASKQID_INVALID) { - rw_exit(&se->se_taskqid_lock); - zfsctl_snapshot_rele(se); return; } + + zfsctl_snapshot_hold(se); se->se_taskqid = taskq_dispatch_delay(system_delay_taskq, snapentry_expire, se, TQ_SLEEP, ddi_get_lbolt() + delay * HZ); - rw_exit(&se->se_taskqid_lock); } /* @@ -425,7 +418,7 @@ zfsctl_snapshot_unmount_delay(spa_t *spa, uint64_t objsetid, int delay) zfs_snapentry_t *se; int error = ENOENT; - rw_enter(&zfs_snapshot_lock, RW_READER); + rw_enter(&zfs_snapshot_lock, RW_WRITER); if ((se = zfsctl_snapshot_find_by_objsetid(spa, objsetid)) != NULL) { zfsctl_snapshot_unmount_cancel(se); zfsctl_snapshot_unmount_delay_impl(se, delay); @@ -614,13 +607,18 @@ zfsctl_destroy(zfsvfs_t *zfsvfs) rw_enter(&zfs_snapshot_lock, RW_WRITER); se = zfsctl_snapshot_find_by_objsetid(spa, objsetid); - if (se != NULL) - zfsctl_snapshot_remove(se); - rw_exit(&zfs_snapshot_lock); if (se != NULL) { + zfsctl_snapshot_remove(se); + /* + * Don't wait if snapentry_expire task is calling + * umount, which may have resulted in this destroy + * call. Waiting would deadlock: snapentry_expire + * waits for umount while umount waits for task. + */ zfsctl_snapshot_unmount_cancel(se); zfsctl_snapshot_rele(se); } + rw_exit(&zfs_snapshot_lock); } else if (zfsvfs->z_ctldir) { iput(zfsvfs->z_ctldir); zfsvfs->z_ctldir = NULL; diff --git a/sys/contrib/openzfs/module/os/linux/zfs/zfs_dir.c b/sys/contrib/openzfs/module/os/linux/zfs/zfs_dir.c index e8de536606e2..7edea05f94e6 100644 --- a/sys/contrib/openzfs/module/os/linux/zfs/zfs_dir.c +++ b/sys/contrib/openzfs/module/os/linux/zfs/zfs_dir.c @@ -573,7 +573,8 @@ zfs_unlinked_drain_stop_wait(zfsvfs_t *zfsvfs) if (zfsvfs->z_draining) { zfsvfs->z_drain_cancel = B_TRUE; taskq_cancel_id(dsl_pool_unlinked_drain_taskq( - dmu_objset_pool(zfsvfs->z_os)), zfsvfs->z_drain_task); + dmu_objset_pool(zfsvfs->z_os)), zfsvfs->z_drain_task, + B_TRUE); zfsvfs->z_drain_task = TASKQID_INVALID; zfsvfs->z_draining = B_FALSE; } diff --git a/sys/contrib/openzfs/module/zfs/ddt.c b/sys/contrib/openzfs/module/zfs/ddt.c index 0dc9adc7fd4f..42d399289140 100644 --- a/sys/contrib/openzfs/module/zfs/ddt.c +++ b/sys/contrib/openzfs/module/zfs/ddt.c @@ -362,20 +362,26 @@ static const ddt_kstats_t ddt_kstats_template = { }; #ifdef _KERNEL +/* + * Hot-path lookup counters use wmsums to avoid cache line bouncing. + * DDT_KSTAT_BUMP: Increment a wmsum counter (lookup stats). + * + * Sync-only counters use direct kstat assignment (no atomics needed). + * DDT_KSTAT_SET: Set a value (log entry counts, rates). + * DDT_KSTAT_SUB: Subtract from a value (decrement log entry counts). + * DDT_KSTAT_ZERO: Zero a value (clear log entry counts). + */ #define _DDT_KSTAT_STAT(ddt, stat) \ &((ddt_kstats_t *)(ddt)->ddt_ksp->ks_data)->stat.value.ui64 #define DDT_KSTAT_BUMP(ddt, stat) \ - do { atomic_inc_64(_DDT_KSTAT_STAT(ddt, stat)); } while (0) -#define DDT_KSTAT_ADD(ddt, stat, val) \ - do { atomic_add_64(_DDT_KSTAT_STAT(ddt, stat), val); } while (0) + wmsum_add(&(ddt)->ddt_kstat_##stat, 1) #define DDT_KSTAT_SUB(ddt, stat, val) \ - do { atomic_sub_64(_DDT_KSTAT_STAT(ddt, stat), val); } while (0) + do { *_DDT_KSTAT_STAT(ddt, stat) -= (val); } while (0) #define DDT_KSTAT_SET(ddt, stat, val) \ - do { atomic_store_64(_DDT_KSTAT_STAT(ddt, stat), val); } while (0) + do { *_DDT_KSTAT_STAT(ddt, stat) = (val); } while (0) #define DDT_KSTAT_ZERO(ddt, stat) DDT_KSTAT_SET(ddt, stat, 0) #else #define DDT_KSTAT_BUMP(ddt, stat) do {} while (0) -#define DDT_KSTAT_ADD(ddt, stat, val) do {} while (0) #define DDT_KSTAT_SUB(ddt, stat, val) do {} while (0) #define DDT_KSTAT_SET(ddt, stat, val) do {} while (0) #define DDT_KSTAT_ZERO(ddt, stat) do {} while (0) @@ -783,7 +789,7 @@ ddt_class_start(void) { uint64_t start = gethrestime_sec(); - if (ddt_prune_artificial_age) { + if (unlikely(ddt_prune_artificial_age)) { /* * debug aide -- simulate a wider distribution * so we don't have to wait for an aged DDT @@ -1004,6 +1010,7 @@ ddt_alloc_entry_io(ddt_entry_t *dde) return; dde->dde_io = kmem_zalloc(sizeof (ddt_entry_io_t), KM_SLEEP); + mutex_init(&dde->dde_io->dde_io_lock, NULL, MUTEX_DEFAULT, NULL); } static void @@ -1016,6 +1023,7 @@ ddt_free(const ddt_t *ddt, ddt_entry_t *dde) if (dde->dde_io->dde_repair_abd != NULL) abd_free(dde->dde_io->dde_repair_abd); + mutex_destroy(&dde->dde_io->dde_io_lock); kmem_free(dde->dde_io, sizeof (ddt_entry_io_t)); } @@ -1171,7 +1179,7 @@ ddt_lookup(ddt_t *ddt, const blkptr_t *bp, boolean_t verify) ASSERT(MUTEX_HELD(&ddt->ddt_lock)); - if (ddt->ddt_version == DDT_VERSION_UNCONFIGURED) { + if (unlikely(ddt->ddt_version == DDT_VERSION_UNCONFIGURED)) { /* * This is the first use of this DDT since the pool was * created; finish getting it ready for use. @@ -1594,6 +1602,46 @@ not_found: return (0); } +static int +ddt_kstat_update(kstat_t *ksp, int rw) +{ + ddt_t *ddt = ksp->ks_private; + ddt_kstats_t *dds = ksp->ks_data; + + if (rw == KSTAT_WRITE) + return (SET_ERROR(EACCES)); + + /* Aggregate wmsum counters for lookup stats */ + dds->dds_lookup.value.ui64 = + wmsum_value(&ddt->ddt_kstat_dds_lookup); + dds->dds_lookup_live_hit.value.ui64 = + wmsum_value(&ddt->ddt_kstat_dds_lookup_live_hit); + dds->dds_lookup_live_wait.value.ui64 = + wmsum_value(&ddt->ddt_kstat_dds_lookup_live_wait); + dds->dds_lookup_live_miss.value.ui64 = + wmsum_value(&ddt->ddt_kstat_dds_lookup_live_miss); + dds->dds_lookup_existing.value.ui64 = + wmsum_value(&ddt->ddt_kstat_dds_lookup_existing); + dds->dds_lookup_new.value.ui64 = + wmsum_value(&ddt->ddt_kstat_dds_lookup_new); + dds->dds_lookup_log_hit.value.ui64 = + wmsum_value(&ddt->ddt_kstat_dds_lookup_log_hit); + dds->dds_lookup_log_active_hit.value.ui64 = + wmsum_value(&ddt->ddt_kstat_dds_lookup_log_active_hit); + dds->dds_lookup_log_flushing_hit.value.ui64 = + wmsum_value(&ddt->ddt_kstat_dds_lookup_log_flushing_hit); + dds->dds_lookup_log_miss.value.ui64 = + wmsum_value(&ddt->ddt_kstat_dds_lookup_log_miss); + dds->dds_lookup_stored_hit.value.ui64 = + wmsum_value(&ddt->ddt_kstat_dds_lookup_stored_hit); + dds->dds_lookup_stored_miss.value.ui64 = + wmsum_value(&ddt->ddt_kstat_dds_lookup_stored_miss); + + /* Sync-only counters are already set directly in kstats */ + + return (0); +} + static void ddt_table_alloc_kstats(ddt_t *ddt) { @@ -1601,12 +1649,28 @@ ddt_table_alloc_kstats(ddt_t *ddt) char *name = kmem_asprintf("ddt_stats_%s", zio_checksum_table[ddt->ddt_checksum].ci_name); + /* Initialize wmsums for lookup counters */ + wmsum_init(&ddt->ddt_kstat_dds_lookup, 0); + wmsum_init(&ddt->ddt_kstat_dds_lookup_live_hit, 0); + wmsum_init(&ddt->ddt_kstat_dds_lookup_live_wait, 0); + wmsum_init(&ddt->ddt_kstat_dds_lookup_live_miss, 0); + wmsum_init(&ddt->ddt_kstat_dds_lookup_existing, 0); + wmsum_init(&ddt->ddt_kstat_dds_lookup_new, 0); + wmsum_init(&ddt->ddt_kstat_dds_lookup_log_hit, 0); + wmsum_init(&ddt->ddt_kstat_dds_lookup_log_active_hit, 0); + wmsum_init(&ddt->ddt_kstat_dds_lookup_log_flushing_hit, 0); + wmsum_init(&ddt->ddt_kstat_dds_lookup_log_miss, 0); + wmsum_init(&ddt->ddt_kstat_dds_lookup_stored_hit, 0); + wmsum_init(&ddt->ddt_kstat_dds_lookup_stored_miss, 0); + ddt->ddt_ksp = kstat_create(mod, 0, name, "misc", KSTAT_TYPE_NAMED, sizeof (ddt_kstats_t) / sizeof (kstat_named_t), KSTAT_FLAG_VIRTUAL); if (ddt->ddt_ksp != NULL) { ddt_kstats_t *dds = kmem_alloc(sizeof (ddt_kstats_t), KM_SLEEP); memcpy(dds, &ddt_kstats_template, sizeof (ddt_kstats_t)); ddt->ddt_ksp->ks_data = dds; + ddt->ddt_ksp->ks_update = ddt_kstat_update; + ddt->ddt_ksp->ks_private = ddt; kstat_install(ddt->ddt_ksp); } @@ -1648,6 +1712,20 @@ ddt_table_free(ddt_t *ddt) kstat_delete(ddt->ddt_ksp); } + /* Cleanup wmsums for lookup counters */ + wmsum_fini(&ddt->ddt_kstat_dds_lookup); + wmsum_fini(&ddt->ddt_kstat_dds_lookup_live_hit); + wmsum_fini(&ddt->ddt_kstat_dds_lookup_live_wait); + wmsum_fini(&ddt->ddt_kstat_dds_lookup_live_miss); + wmsum_fini(&ddt->ddt_kstat_dds_lookup_existing); + wmsum_fini(&ddt->ddt_kstat_dds_lookup_new); + wmsum_fini(&ddt->ddt_kstat_dds_lookup_log_hit); + wmsum_fini(&ddt->ddt_kstat_dds_lookup_log_active_hit); + wmsum_fini(&ddt->ddt_kstat_dds_lookup_log_flushing_hit); + wmsum_fini(&ddt->ddt_kstat_dds_lookup_log_miss); + wmsum_fini(&ddt->ddt_kstat_dds_lookup_stored_hit); + wmsum_fini(&ddt->ddt_kstat_dds_lookup_stored_miss); + ddt_log_free(ddt); ASSERT0(avl_numnodes(&ddt->ddt_tree)); ASSERT0(avl_numnodes(&ddt->ddt_repair_tree)); diff --git a/sys/contrib/openzfs/module/zfs/dmu_objset.c b/sys/contrib/openzfs/module/zfs/dmu_objset.c index 8e6b569c2100..5a815b59e37b 100644 --- a/sys/contrib/openzfs/module/zfs/dmu_objset.c +++ b/sys/contrib/openzfs/module/zfs/dmu_objset.c @@ -1452,7 +1452,8 @@ dmu_objset_upgrade_stop(objset_t *os) os->os_upgrade_id = 0; mutex_exit(&os->os_upgrade_lock); - if ((taskq_cancel_id(os->os_spa->spa_upgrade_taskq, id)) == 0) { + if ((taskq_cancel_id(os->os_spa->spa_upgrade_taskq, id, + B_TRUE)) == 0) { dsl_dataset_long_rele(dmu_objset_ds(os), upgrade_tag); } txg_wait_synced(os->os_spa->spa_dsl_pool, 0); diff --git a/sys/contrib/openzfs/module/zfs/spa.c b/sys/contrib/openzfs/module/zfs/spa.c index 34de3f1d9525..c481070e1f2d 100644 --- a/sys/contrib/openzfs/module/zfs/spa.c +++ b/sys/contrib/openzfs/module/zfs/spa.c @@ -1934,7 +1934,7 @@ spa_deactivate(spa_t *spa) list_destroy(&spa->spa_evicting_os_list); list_destroy(&spa->spa_state_dirty_list); - taskq_cancel_id(system_delay_taskq, spa->spa_deadman_tqid); + taskq_cancel_id(system_delay_taskq, spa->spa_deadman_tqid, B_TRUE); for (int t = 0; t < ZIO_TYPES; t++) { for (int q = 0; q < ZIO_TASKQ_TYPES; q++) { @@ -10451,7 +10451,7 @@ spa_sync(spa_t *spa, uint64_t txg) spa->spa_sync_starttime = gethrtime(); - taskq_cancel_id(system_delay_taskq, spa->spa_deadman_tqid); + taskq_cancel_id(system_delay_taskq, spa->spa_deadman_tqid, B_TRUE); spa->spa_deadman_tqid = taskq_dispatch_delay(system_delay_taskq, spa_deadman, spa, TQ_SLEEP, ddi_get_lbolt() + NSEC_TO_TICK(spa->spa_deadman_synctime)); @@ -10508,7 +10508,7 @@ spa_sync(spa_t *spa, uint64_t txg) spa_sync_rewrite_vdev_config(spa, tx); dmu_tx_commit(tx); - taskq_cancel_id(system_delay_taskq, spa->spa_deadman_tqid); + taskq_cancel_id(system_delay_taskq, spa->spa_deadman_tqid, B_TRUE); spa->spa_deadman_tqid = 0; /* diff --git a/sys/contrib/openzfs/module/zfs/zfs_chksum.c b/sys/contrib/openzfs/module/zfs/zfs_chksum.c index 21852bf3d865..e5113a857e15 100644 --- a/sys/contrib/openzfs/module/zfs/zfs_chksum.c +++ b/sys/contrib/openzfs/module/zfs/zfs_chksum.c @@ -155,11 +155,11 @@ chksum_run(chksum_stat_t *cs, abd_t *abd, void *ctx, int round, switch (round) { case 1: /* 1k */ size = 1<<10; loops = 128; break; - case 2: /* 2k */ + case 2: /* 4k */ size = 1<<12; loops = 64; break; - case 3: /* 4k */ + case 3: /* 16k */ size = 1<<14; loops = 32; break; - case 4: /* 16k */ + case 4: /* 64k */ size = 1<<16; loops = 16; break; case 5: /* 256k */ size = 1<<18; loops = 8; break; @@ -212,6 +212,7 @@ chksum_benchit(chksum_stat_t *cs) chksum_run(cs, abd, ctx, 2, &cs->bs4k); chksum_run(cs, abd, ctx, 3, &cs->bs16k); chksum_run(cs, abd, ctx, 4, &cs->bs64k); + chksum_run(cs, abd, ctx, 5, &cs->bs256k); chksum_run(cs, abd, ctx, 6, &cs->bs1m); abd_free(abd); @@ -249,15 +250,16 @@ chksum_benchmark(void) if (chksum_stat_limit == AT_DONE) return; - /* count implementations */ - chksum_stat_cnt = 1; /* edonr */ - chksum_stat_cnt += 1; /* skein */ - chksum_stat_cnt += sha256->getcnt(); - chksum_stat_cnt += sha512->getcnt(); - chksum_stat_cnt += blake3->getcnt(); - chksum_stat_data = kmem_zalloc( - sizeof (chksum_stat_t) * chksum_stat_cnt, KM_SLEEP); + if (chksum_stat_limit == AT_STARTUP) { + chksum_stat_cnt = 1; /* edonr */ + chksum_stat_cnt += 1; /* skein */ + chksum_stat_cnt += sha256->getcnt(); + chksum_stat_cnt += sha512->getcnt(); + chksum_stat_cnt += blake3->getcnt(); + chksum_stat_data = kmem_zalloc( + sizeof (chksum_stat_t) * chksum_stat_cnt, KM_SLEEP); + } /* edonr - needs to be the first one here (slow CPU check) */ cs = &chksum_stat_data[cbid++]; diff --git a/sys/contrib/openzfs/module/zfs/zfs_fm.c b/sys/contrib/openzfs/module/zfs/zfs_fm.c index 4a0d41c24eed..eb18296ec3f2 100644 --- a/sys/contrib/openzfs/module/zfs/zfs_fm.c +++ b/sys/contrib/openzfs/module/zfs/zfs_fm.c @@ -1531,7 +1531,8 @@ zfs_ereport_taskq_fini(void) { mutex_enter(&recent_events_lock); if (recent_events_cleaner_tqid != 0) { - taskq_cancel_id(system_delay_taskq, recent_events_cleaner_tqid); + taskq_cancel_id(system_delay_taskq, recent_events_cleaner_tqid, + B_TRUE); recent_events_cleaner_tqid = 0; } mutex_exit(&recent_events_lock); diff --git a/sys/contrib/openzfs/module/zfs/zio.c b/sys/contrib/openzfs/module/zfs/zio.c index 74373f759cec..26b1ae1801a1 100644 --- a/sys/contrib/openzfs/module/zfs/zio.c +++ b/sys/contrib/openzfs/module/zfs/zio.c @@ -3088,7 +3088,7 @@ zio_gang_issue(zio_t *zio) } static void -zio_gang_inherit_allocator(zio_t *pio, zio_t *cio) +zio_inherit_allocator(zio_t *pio, zio_t *cio) { cio->io_allocator = pio->io_allocator; } @@ -3223,7 +3223,7 @@ zio_write_gang_block(zio_t *pio, metaslab_class_t *mc) zio_write_gang_done, NULL, pio->io_priority, ZIO_GANG_CHILD_FLAGS(pio), &pio->io_bookmark); - zio_gang_inherit_allocator(pio, zio); + zio_inherit_allocator(pio, zio); if (pio->io_flags & ZIO_FLAG_ALLOC_THROTTLED) { boolean_t more; VERIFY(metaslab_class_throttle_reserve(mc, zio->io_allocator, @@ -3285,7 +3285,7 @@ zio_write_gang_block(zio_t *pio, metaslab_class_t *mc) (allocated ? ZIO_FLAG_PREALLOCATED : 0), &pio->io_bookmark); resid -= psize; - zio_gang_inherit_allocator(zio, cio); + zio_inherit_allocator(zio, cio); if (allocated) { metaslab_trace_move(&cio_list, &cio->io_alloc_list); metaslab_group_alloc_increment_all(spa, @@ -3683,7 +3683,7 @@ zio_ddt_child_write_done(zio_t *zio) ddt_phys_variant_t v = DDT_PHYS_VARIANT(ddt, p); ddt_univ_phys_t *ddp = dde->dde_phys; - ddt_enter(ddt); + mutex_enter(&dde->dde_io->dde_io_lock); /* we're the lead, so once we're done there's no one else outstanding */ if (dde->dde_io->dde_lead_zio[p] == zio) @@ -3700,22 +3700,25 @@ zio_ddt_child_write_done(zio_t *zio) ddt_phys_unextend(ddp, orig, v); ddt_phys_clear(orig, v); + mutex_exit(&dde->dde_io->dde_io_lock); + + /* + * Undo the optimistic refcount increments that were done in + * zio_ddt_write() for all non-DDT-child parents. Since errors + * are rare, taking the global lock here is acceptable. + */ + ddt_enter(ddt); + zio_t *pio; + zl = NULL; + while ((pio = zio_walk_parents(zio, &zl)) != NULL) { + if (!(pio->io_flags & ZIO_FLAG_DDT_CHILD)) + ddt_phys_decref(ddp, v); + } ddt_exit(ddt); return; } /* - * Add references for all dedup writes that were waiting on the - * physical one, skipping any other physical writes that are waiting. - */ - zio_t *pio; - zl = NULL; - while ((pio = zio_walk_parents(zio, &zl)) != NULL) { - if (!(pio->io_flags & ZIO_FLAG_DDT_CHILD)) - ddt_phys_addref(ddp, v); - } - - /* * We've successfully added new DVAs to the entry. Clear the saved * state or, if there's still outstanding IO, remember it so we can * revert to a known good state if that IO fails. @@ -3725,7 +3728,7 @@ zio_ddt_child_write_done(zio_t *zio) else ddt_phys_copy(orig, ddp, v); - ddt_exit(ddt); + mutex_exit(&dde->dde_io->dde_io_lock); } static void @@ -3753,7 +3756,7 @@ zio_ddt_child_write_ready(zio_t *zio) if (zio->io_error != 0) return; - ddt_enter(ddt); + mutex_enter(&dde->dde_io->dde_io_lock); ddt_phys_extend(dde->dde_phys, v, zio->io_bp); @@ -3764,7 +3767,7 @@ zio_ddt_child_write_ready(zio_t *zio) ddt_bp_fill(dde->dde_phys, v, pio->io_bp, zio->io_txg); } - ddt_exit(ddt); + mutex_exit(&dde->dde_io->dde_io_lock); } static zio_t * @@ -3799,11 +3802,11 @@ zio_ddt_write(zio_t *zio) dde = ddt_lookup(ddt, bp, B_FALSE); if (dde == NULL) { /* DDT size is over its quota so no new entries */ + ddt_exit(ddt); zp->zp_dedup = B_FALSE; BP_SET_DEDUP(bp, B_FALSE); if (zio->io_bp_override == NULL) zio->io_pipeline = ZIO_WRITE_PIPELINE; - ddt_exit(ddt); return (zio); } @@ -3814,6 +3817,7 @@ zio_ddt_write(zio_t *zio) * we can't resolve it, so just convert to an ordinary write. * (And automatically e-mail a paper to Nature?) */ + ddt_exit(ddt); if (!(zio_checksum_table[zp->zp_checksum].ci_flags & ZCHECKSUM_FLAG_DEDUP)) { zp->zp_checksum = spa_dedup_checksum(spa); @@ -3826,7 +3830,6 @@ zio_ddt_write(zio_t *zio) } ASSERT(!BP_GET_DEDUP(bp)); zio->io_pipeline = ZIO_WRITE_PIPELINE; - ddt_exit(ddt); return (zio); } @@ -3877,10 +3880,15 @@ zio_ddt_write(zio_t *zio) uint8_t parent_dvas = 0; /* - * What we do next depends on whether or not there's IO outstanding that - * will update this entry. + * What we do next depends on whether or not there's IO outstanding + * that will update this entry. If dde_io exists, we need to hold + * its lock to safely check and use dde_lead_zio. */ - if (dde->dde_io == NULL || dde->dde_io->dde_lead_zio[p] == NULL) { + ddt_entry_io_t *dde_io = dde->dde_io; + if (dde_io != NULL) + mutex_enter(&dde_io->dde_io_lock); + + if (dde_io == NULL || dde_io->dde_lead_zio[p] == NULL) { /* * No IO outstanding, so we only need to worry about ourselves. */ @@ -3895,6 +3903,8 @@ zio_ddt_write(zio_t *zio) * block and leave. */ if (have_dvas == 0) { + if (dde_io != NULL) + mutex_exit(&dde_io->dde_io_lock); ASSERT(BP_GET_BIRTH(bp) == txg); ASSERT(BP_EQUAL(bp, zio->io_bp_override)); ddt_phys_extend(ddp, v, bp); @@ -3923,6 +3933,9 @@ zio_ddt_write(zio_t *zio) * then we can just use them as-is. */ if (have_dvas >= need_dvas) { + if (dde_io != NULL) + mutex_exit(&dde_io->dde_io_lock); + /* * For rewrite operations, try preserving the original * logical birth time. If the result matches the @@ -3934,8 +3947,8 @@ zio_ddt_write(zio_t *zio) ddt_bp_fill(ddp, v, bp, orig_logical_birth); if (BP_EQUAL(bp, &zio->io_bp_orig)) { /* We can skip accounting. */ - zio->io_flags |= ZIO_FLAG_NOPWRITE; ddt_exit(ddt); + zio->io_flags |= ZIO_FLAG_NOPWRITE; return (zio); } } @@ -3997,7 +4010,16 @@ zio_ddt_write(zio_t *zio) * missed out. */ ddt_bp_fill(ddp, v, bp, txg); - zio_add_child(zio, dde->dde_io->dde_lead_zio[p]); +piggyback: + zio_add_child(zio, dde_io->dde_lead_zio[p]); + + /* + * Optimistically increment refcount for this parent. + * If the write fails, zio_ddt_child_write_done() will + * decrement for all non-DDT-child parents. + */ + ddt_phys_addref(ddp, v); + mutex_exit(&dde_io->dde_io_lock); ddt_exit(ddt); return (zio); } @@ -4023,11 +4045,8 @@ zio_ddt_write(zio_t *zio) ASSERT(pio); parent_dvas = pio->io_prop.zp_copies; - if (parent_dvas >= need_dvas) { - zio_add_child(zio, dde->dde_io->dde_lead_zio[p]); - ddt_exit(ddt); - return (zio); - } + if (parent_dvas >= need_dvas) + goto piggyback; /* * Still not enough, so we will need to issue to get the @@ -4037,10 +4056,12 @@ zio_ddt_write(zio_t *zio) } if (is_ganged) { + if (dde_io != NULL) + mutex_exit(&dde_io->dde_io_lock); + ddt_exit(ddt); zp->zp_dedup = B_FALSE; BP_SET_DEDUP(bp, B_FALSE); zio->io_pipeline = ZIO_WRITE_PIPELINE; - ddt_exit(ddt); return (zio); } @@ -4062,6 +4083,7 @@ zio_ddt_write(zio_t *zio) zio_ddt_child_write_ready, NULL, zio_ddt_child_write_done, dde, zio->io_priority, ZIO_DDT_CHILD_FLAGS(zio), &zio->io_bookmark); + zio_inherit_allocator(zio, cio); zio_push_transform(cio, zio->io_abd, zio->io_size, 0, NULL); @@ -4069,21 +4091,45 @@ zio_ddt_write(zio_t *zio) * We are the new lead zio, because our parent has the highest * zp_copies that has been requested for this entry so far. */ - ddt_alloc_entry_io(dde); - if (dde->dde_io->dde_lead_zio[p] == NULL) { + if (dde_io == NULL) { + /* + * New dde_io. No lock needed since no other thread can have + * a reference yet. + */ + ddt_alloc_entry_io(dde); + dde_io = dde->dde_io; /* * First time out, take a copy of the stable entry to revert * to if there's an error (see zio_ddt_child_write_done()) */ - ddt_phys_copy(&dde->dde_io->dde_orig_phys, dde->dde_phys, v); + ddt_phys_copy(&dde_io->dde_orig_phys, dde->dde_phys, v); + dde_io->dde_lead_zio[p] = cio; } else { - /* - * Make the existing chain our child, because it cannot - * complete until we have. - */ - zio_add_child(cio, dde->dde_io->dde_lead_zio[p]); + if (dde_io->dde_lead_zio[p] == NULL) { + /* + * First time out, take a copy of the stable entry + * to revert to if there's an error (see + * zio_ddt_child_write_done()) + */ + ddt_phys_copy(&dde_io->dde_orig_phys, dde->dde_phys, + v); + } else { + /* + * Make the existing chain our child, because it + * cannot complete until we have. + */ + zio_add_child(cio, dde_io->dde_lead_zio[p]); + } + dde_io->dde_lead_zio[p] = cio; + mutex_exit(&dde_io->dde_io_lock); } - dde->dde_io->dde_lead_zio[p] = cio; + + /* + * Optimistically increment the refcount for this dedup write. + * If the write fails, zio_ddt_child_write_done() will decrement + * for all non-DDT-child parents. + */ + ddt_phys_addref(ddp, v); ddt_exit(ddt); diff --git a/sys/contrib/openzfs/rpm/generic/zfs.spec.in b/sys/contrib/openzfs/rpm/generic/zfs.spec.in index 9ae479aeb96b..fa89f9d2aef6 100644 --- a/sys/contrib/openzfs/rpm/generic/zfs.spec.in +++ b/sys/contrib/openzfs/rpm/generic/zfs.spec.in @@ -113,7 +113,6 @@ Source0: %{name}-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) Requires: libzpool7%{?_isa} = %{version}-%{release} Requires: libnvpair3%{?_isa} = %{version}-%{release} -Requires: libuutil3%{?_isa} = %{version}-%{release} Requires: libzfs7%{?_isa} = %{version}-%{release} Requires: %{name}-kmod = %{version} Provides: %{name}-kmod-common = %{version}-%{release} @@ -199,29 +198,6 @@ to write self describing data structures on disk. %postun -n libnvpair3 -p /sbin/ldconfig %endif -%package -n libuutil3 -Summary: Solaris userland utility library for Linux -Group: System Environment/Kernel -Obsoletes: libuutil1 <= %{version} - -%description -n libuutil3 -This library provides a variety of compatibility functions for OpenZFS: - * libspl: The Solaris Porting Layer userland library, which provides APIs - that make it possible to run Solaris user code in a Linux environment - with relatively minimal modification. - * libavl: The Adelson-Velskii Landis balanced binary tree manipulation - library. - * libefi: The Extensible Firmware Interface library for GUID disk - partitioning. - * libshare: NFS, SMB, and iSCSI service integration for ZFS. - -%if %{defined ldconfig_scriptlets} -%ldconfig_scriptlets -n libuutil3 -%else -%post -n libuutil3 -p /sbin/ldconfig -%postun -n libuutil3 -p /sbin/ldconfig -%endif - # The library version is encoded in the package name. When updating the # version information it is important to add an obsoletes line below for # the previous version of the package. @@ -249,10 +225,8 @@ Group: System Environment/Kernel Requires: libzfs7%{?_isa} = %{version}-%{release} Requires: libzpool7%{?_isa} = %{version}-%{release} Requires: libnvpair3%{?_isa} = %{version}-%{release} -Requires: libuutil3%{?_isa} = %{version}-%{release} Provides: libzpool7-devel = %{version}-%{release} Provides: libnvpair3-devel = %{version}-%{release} -Provides: libuutil3-devel = %{version}-%{release} Obsoletes: zfs-devel <= %{version} Obsoletes: libzfs2-devel <= %{version} Obsoletes: libzfs4-devel <= %{version} @@ -556,9 +530,6 @@ systemctl --system daemon-reload >/dev/null || true %files -n libnvpair3 %{_libdir}/libnvpair.so.* -%files -n libuutil3 -%{_libdir}/libuutil.so.* - %files -n libzfs7 %{_libdir}/libzfs*.so.* diff --git a/sys/contrib/openzfs/tests/zfs-tests/tests/functional/events/slow_vdev_degraded_sit_out.ksh b/sys/contrib/openzfs/tests/zfs-tests/tests/functional/events/slow_vdev_degraded_sit_out.ksh index d5feb6936b4b..1c9303123c93 100755 --- a/sys/contrib/openzfs/tests/zfs-tests/tests/functional/events/slow_vdev_degraded_sit_out.ksh +++ b/sys/contrib/openzfs/tests/zfs-tests/tests/functional/events/slow_vdev_degraded_sit_out.ksh @@ -60,7 +60,12 @@ set_tunable64 SIT_OUT_CHECK_INTERVAL 20 log_must truncate -s 150M $TEST_BASE_DIR/vdev.$$.{0..9} -for raidtype in raidz2 raidz3 draid2 draid3 ; do +raidtypes=(raidz2 raidz3 draid2 draid3) +retry=0 + +for (( t=0; t<4; t++ )); do + raidtype="${raidtypes[$t]}" + log_must zpool create $TESTPOOL2 $raidtype $TEST_BASE_DIR/vdev.$$.{0..9} log_must zpool set autosit=on $TESTPOOL2 "${raidtype}-0" log_must dd if=/dev/urandom of=/$TESTPOOL2/bigfile bs=1M count=400 @@ -90,13 +95,24 @@ for raidtype in raidz2 raidz3 draid2 draid3 ; do fi done - log_must test "$(get_vdev_prop sit_out $TESTPOOL2 $SLOW_VDEV)" == "on" - # Clear fault injection log_must zinject -c all - # Wait for us to exit our sit out period - log_must wait_sit_out $TESTPOOL2 $SLOW_VDEV 10 + if test "$(get_vdev_prop sit_out $TESTPOOL2 $SLOW_VDEV)" == "on"; then + # Wait for us to exit our sit out period + log_must wait_sit_out $TESTPOOL2 $SLOW_VDEV 10 + else + # Depending on exactly how the blocks are laid out and the + # I/O is issued we may not always trigger a sitout. Allow + # up to 3 retries to avoid false positives. + if test $retry -lt 3; then + retry=$((retry + 1)) + t=$(($t - 1)) + log_note "Retrying $retry/3 $raidtype vdev type" + else + log_fail "Exceeded total allowed retries" + fi + fi log_must test "$(get_vdev_prop sit_out $TESTPOOL2 $SLOW_VDEV)" == "off" destroy_pool $TESTPOOL2 diff --git a/sys/contrib/openzfs/tests/zfs-tests/tests/functional/raidz/raidz_001_neg.ksh b/sys/contrib/openzfs/tests/zfs-tests/tests/functional/raidz/raidz_001_neg.ksh index ad6faaf7ee59..ec06435c8cc9 100755 --- a/sys/contrib/openzfs/tests/zfs-tests/tests/functional/raidz/raidz_001_neg.ksh +++ b/sys/contrib/openzfs/tests/zfs-tests/tests/functional/raidz/raidz_001_neg.ksh @@ -34,6 +34,6 @@ # This option should make raidz_test to return non 0. # -log_mustnot raidz_test -T +log_mustnot raidz_test -Tv log_pass "raidz_test detects errors as expected." diff --git a/sys/contrib/openzfs/udev/zvol_id.c b/sys/contrib/openzfs/udev/zvol_id.c index 7b7883a0c74f..134a76c09f6a 100644 --- a/sys/contrib/openzfs/udev/zvol_id.c +++ b/sys/contrib/openzfs/udev/zvol_id.c @@ -67,7 +67,7 @@ main(int argc, const char *const *argv) return (1); } - char zvol_name[MAXNAMELEN + strlen("-part") + 10]; + char zvol_name[MAXNAMELEN+15]; if (ioctl(fd, BLKZNAME, zvol_name) == -1) { fprintf(stderr, "%s: BLKZNAME: %s\n", dev_name, strerror(errno)); |
