From f43cb1fef68058272e0959c841773d41f7002ac4 Mon Sep 17 00:00:00 2001 From: Rob Norris Date: Thu, 19 Feb 2026 11:30:12 +1100 Subject: [PATCH] libzfs/mnttab: lift node alloc/free Sponsored-by: TrueNAS Reviewed-by: Ameer Hamza Reviewed-by: Brian Behlendorf Signed-off-by: Rob Norris Closes #18296 --- lib/libzfs/libzfs_mnttab.c | 68 ++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 35 deletions(-) diff --git a/lib/libzfs/libzfs_mnttab.c b/lib/libzfs/libzfs_mnttab.c index c1995eda5..bf79003ae 100644 --- a/lib/libzfs/libzfs_mnttab.c +++ b/lib/libzfs/libzfs_mnttab.c @@ -47,6 +47,28 @@ typedef struct mnttab_node { avl_node_t mtn_node; } mnttab_node_t; +static mnttab_node_t * +mnttab_node_alloc(libzfs_handle_t *hdl, const char *special, + const char *mountp, const char *mntopts) +{ + mnttab_node_t *mtn = zfs_alloc(hdl, sizeof (mnttab_node_t)); + mtn->mtn_mt.mnt_special = zfs_strdup(hdl, special); + mtn->mtn_mt.mnt_mountp = zfs_strdup(hdl, mountp); + mtn->mtn_mt.mnt_fstype = (char *)MNTTYPE_ZFS; + mtn->mtn_mt.mnt_mntopts = zfs_strdup(hdl, mntopts); + return (mtn); +} + +static void +mnttab_node_free(libzfs_handle_t *hdl, mnttab_node_t *mtn) +{ + (void) hdl; + free(mtn->mtn_mt.mnt_special); + free(mtn->mtn_mt.mnt_mountp); + free(mtn->mtn_mt.mnt_mntopts); + free(mtn); +} + static int libzfs_mnttab_cache_compare(const void *arg1, const void *arg2) { @@ -86,19 +108,12 @@ libzfs_mnttab_update(libzfs_handle_t *hdl) if (strcmp(entry.mnt_fstype, MNTTYPE_ZFS) != 0) continue; - mtn = zfs_alloc(hdl, sizeof (mnttab_node_t)); - mtn->mtn_mt.mnt_special = zfs_strdup(hdl, entry.mnt_special); - mtn->mtn_mt.mnt_mountp = zfs_strdup(hdl, entry.mnt_mountp); - mtn->mtn_mt.mnt_fstype = zfs_strdup(hdl, entry.mnt_fstype); - mtn->mtn_mt.mnt_mntopts = zfs_strdup(hdl, entry.mnt_mntopts); + mtn = mnttab_node_alloc(hdl, entry.mnt_special, + entry.mnt_mountp, entry.mnt_mntopts); /* Exclude duplicate mounts */ if (avl_find(&hdl->libzfs_mnttab_cache, mtn, &where) != NULL) { - free(mtn->mtn_mt.mnt_special); - free(mtn->mtn_mt.mnt_mountp); - free(mtn->mtn_mt.mnt_fstype); - free(mtn->mtn_mt.mnt_mntopts); - free(mtn); + mnttab_node_free(hdl, mtn); continue; } @@ -116,13 +131,9 @@ libzfs_mnttab_fini(libzfs_handle_t *hdl) mnttab_node_t *mtn; while ((mtn = avl_destroy_nodes(&hdl->libzfs_mnttab_cache, &cookie)) - != NULL) { - free(mtn->mtn_mt.mnt_special); - free(mtn->mtn_mt.mnt_mountp); - free(mtn->mtn_mt.mnt_fstype); - free(mtn->mtn_mt.mnt_mntopts); - free(mtn); - } + != NULL) + mnttab_node_free(hdl, mtn); + avl_destroy(&hdl->libzfs_mnttab_cache); (void) mutex_destroy(&hdl->libzfs_mnttab_cache_lock); } @@ -170,25 +181,16 @@ libzfs_mnttab_add(libzfs_handle_t *hdl, const char *special, mutex_enter(&hdl->libzfs_mnttab_cache_lock); - mtn = zfs_alloc(hdl, sizeof (mnttab_node_t)); - mtn->mtn_mt.mnt_special = zfs_strdup(hdl, special); - mtn->mtn_mt.mnt_mountp = zfs_strdup(hdl, mountp); - mtn->mtn_mt.mnt_fstype = zfs_strdup(hdl, MNTTYPE_ZFS); - mtn->mtn_mt.mnt_mntopts = zfs_strdup(hdl, mntopts); + mtn = mnttab_node_alloc(hdl, special, mountp, mntopts); /* * Another thread may have already added this entry * via libzfs_mnttab_update. If so we should skip it. */ - if (avl_find(&hdl->libzfs_mnttab_cache, mtn, NULL) != NULL) { - free(mtn->mtn_mt.mnt_special); - free(mtn->mtn_mt.mnt_mountp); - free(mtn->mtn_mt.mnt_fstype); - free(mtn->mtn_mt.mnt_mntopts); - free(mtn); - } else { + if (avl_find(&hdl->libzfs_mnttab_cache, mtn, NULL) != NULL) + mnttab_node_free(hdl, mtn); + else avl_add(&hdl->libzfs_mnttab_cache, mtn); - } mutex_exit(&hdl->libzfs_mnttab_cache_lock); } @@ -204,11 +206,7 @@ libzfs_mnttab_remove(libzfs_handle_t *hdl, const char *fsname) if ((ret = avl_find(&hdl->libzfs_mnttab_cache, (void *)&find, NULL)) != NULL) { avl_remove(&hdl->libzfs_mnttab_cache, ret); - free(ret->mtn_mt.mnt_special); - free(ret->mtn_mt.mnt_mountp); - free(ret->mtn_mt.mnt_fstype); - free(ret->mtn_mt.mnt_mntopts); - free(ret); + mnttab_node_free(hdl, ret); } mutex_exit(&hdl->libzfs_mnttab_cache_lock); }