aboutsummaryrefslogtreecommitdiffstats
path: root/lib/libshare/os
diff options
context:
space:
mode:
authorнаб <[email protected]>2022-02-28 14:50:28 +0100
committerBrian Behlendorf <[email protected]>2022-05-12 09:26:25 -0700
commit63ce6dd9886a6bf7b070fb353780b1b25f693c90 (patch)
tree33d7c2c505b49a38f0b6c2569b4ca95d131e1d70 /lib/libshare/os
parent4ccbb23971f6e8b41073509fb4934f1dd1ea1e7e (diff)
libshare: use AVL tree with static data, pass all data in arguments
This makes it so we don't leak a consistent 64 bytes anymore, makes the searches simpler and faster, removes /all allocations/ from the driver (quite trivially, since they were absolutely needless), and makes libshare thread-safe (except, maybe, linux/smb, but that only does pointer-width loads/stores so it's also mostly fine, except for leaking smb_shares) Reviewed-by: Brian Behlendorf <[email protected]> Signed-off-by: Ahelenia Ziemiańska <[email protected]> Closes #13165
Diffstat (limited to 'lib/libshare/os')
-rw-r--r--lib/libshare/os/freebsd/nfs.c32
-rw-r--r--lib/libshare/os/freebsd/smb.c39
-rw-r--r--lib/libshare/os/linux/nfs.c46
-rw-r--r--lib/libshare/os/linux/smb.c48
4 files changed, 18 insertions, 147 deletions
diff --git a/lib/libshare/os/freebsd/nfs.c b/lib/libshare/os/freebsd/nfs.c
index d0cd5f2b3..388bafc28 100644
--- a/lib/libshare/os/freebsd/nfs.c
+++ b/lib/libshare/os/freebsd/nfs.c
@@ -52,8 +52,6 @@ __FBSDID("$FreeBSD$");
#define ZFS_EXPORTS_FILE "/etc/zfs/exports"
#define ZFS_EXPORTS_LOCK ZFS_EXPORTS_FILE".lock"
-static sa_fstype_t *nfs_fstype;
-
/*
* This function translates options to a format acceptable by exports(5), eg.
*
@@ -107,7 +105,7 @@ translate_opts(const char *shareopts, FILE *out)
static int
nfs_enable_share_impl(sa_share_impl_t impl_share, FILE *tmpfile)
{
- char *shareopts = FSINFO(impl_share, nfs_fstype)->shareopts;
+ const char *shareopts = impl_share->sa_shareopts;
if (strcmp(shareopts, "on") == 0)
shareopts = "";
@@ -158,19 +156,6 @@ nfs_validate_shareopts(const char *shareopts)
return (SA_OK);
}
-static int
-nfs_update_shareopts(sa_share_impl_t impl_share, const char *shareopts)
-{
- FSINFO(impl_share, nfs_fstype)->shareopts = (char *)shareopts;
- return (SA_OK);
-}
-
-static void
-nfs_clear_shareopts(sa_share_impl_t impl_share)
-{
- FSINFO(impl_share, nfs_fstype)->shareopts = NULL;
-}
-
/*
* Commit the shares by restarting mountd.
*/
@@ -201,22 +186,13 @@ start:
return (SA_OK);
}
-static const sa_share_ops_t nfs_shareops = {
+sa_fstype_t libshare_nfs_type = {
+ .protocol = "nfs",
+
.enable_share = nfs_enable_share,
.disable_share = nfs_disable_share,
.is_shared = nfs_is_shared,
.validate_shareopts = nfs_validate_shareopts,
- .update_shareopts = nfs_update_shareopts,
- .clear_shareopts = nfs_clear_shareopts,
.commit_shares = nfs_commit_shares,
};
-
-/*
- * Initializes the NFS functionality of libshare.
- */
-void
-libshare_nfs_init(void)
-{
- nfs_fstype = register_fstype("nfs", &nfs_shareops);
-}
diff --git a/lib/libshare/os/freebsd/smb.c b/lib/libshare/os/freebsd/smb.c
index f14e631b2..fd61d473d 100644
--- a/lib/libshare/os/freebsd/smb.c
+++ b/lib/libshare/os/freebsd/smb.c
@@ -27,8 +27,6 @@
#include <libshare.h>
#include "libshare_impl.h"
-static sa_fstype_t *smb_fstype;
-
/*
* Enables SMB sharing for the specified share.
*/
@@ -71,51 +69,20 @@ smb_is_share_active(sa_share_impl_t impl_share)
return (B_FALSE);
}
-/*
- * Called to update a share's options. A share's options might be out of
- * date if the share was loaded from disk and the "sharesmb" dataset
- * property has changed in the meantime. This function also takes care
- * of re-enabling the share if necessary.
- */
-static int
-smb_update_shareopts(sa_share_impl_t impl_share, const char *shareopts)
-{
- (void) impl_share, (void) shareopts;
- return (SA_OK);
-}
-
static int
smb_update_shares(void)
{
/* Not implemented */
return (0);
}
-/*
- * Clears a share's SMB options. Used by libshare to
- * clean up shares that are about to be free()'d.
- */
-static void
-smb_clear_shareopts(sa_share_impl_t impl_share)
-{
- FSINFO(impl_share, smb_fstype)->shareopts = NULL;
-}
-static const sa_share_ops_t smb_shareops = {
+sa_fstype_t libshare_smb_type = {
+ .protocol = "smb",
+
.enable_share = smb_enable_share,
.disable_share = smb_disable_share,
.is_shared = smb_is_share_active,
.validate_shareopts = smb_validate_shareopts,
- .update_shareopts = smb_update_shareopts,
- .clear_shareopts = smb_clear_shareopts,
.commit_shares = smb_update_shares,
};
-
-/*
- * Initializes the SMB functionality of libshare.
- */
-void
-libshare_smb_init(void)
-{
- smb_fstype = register_fstype("smb", &smb_shareops);
-}
diff --git a/lib/libshare/os/linux/nfs.c b/lib/libshare/os/linux/nfs.c
index 72653b6d4..f8a34924c 100644
--- a/lib/libshare/os/linux/nfs.c
+++ b/lib/libshare/os/linux/nfs.c
@@ -45,8 +45,6 @@
#define ZFS_EXPORTS_FILE ZFS_EXPORTS_DIR"/zfs.exports"
#define ZFS_EXPORTS_LOCK ZFS_EXPORTS_FILE".lock"
-static sa_fstype_t *nfs_fstype;
-
typedef int (*nfs_shareopt_callback_t)(const char *opt, const char *value,
void *cookie);
@@ -229,7 +227,6 @@ foreach_nfs_host(sa_share_impl_t impl_share, FILE *tmpfile,
nfs_host_callback_t callback, void *cookie)
{
nfs_host_cookie_t udata;
- char *shareopts;
udata.callback = callback;
udata.sharepath = impl_share->sa_mountpoint;
@@ -237,10 +234,8 @@ foreach_nfs_host(sa_share_impl_t impl_share, FILE *tmpfile,
udata.tmpfile = tmpfile;
udata.security = "sys";
- shareopts = FSINFO(impl_share, nfs_fstype)->shareopts;
-
- return (foreach_nfs_shareopt(shareopts, foreach_nfs_host_cb,
- &udata));
+ return (foreach_nfs_shareopt(impl_share->sa_shareopts,
+ foreach_nfs_host_cb, &udata));
}
/*
@@ -411,11 +406,10 @@ nfs_add_entry(FILE *tmpfile, const char *sharepath,
static int
nfs_enable_share_impl(sa_share_impl_t impl_share, FILE *tmpfile)
{
- char *shareopts, *linux_opts;
+ char *linux_opts;
int error;
- shareopts = FSINFO(impl_share, nfs_fstype)->shareopts;
- error = get_linux_shareopts(shareopts, &linux_opts);
+ error = get_linux_shareopts(impl_share->sa_shareopts, &linux_opts);
if (error != SA_OK)
return (error);
@@ -476,23 +470,6 @@ nfs_validate_shareopts(const char *shareopts)
}
static int
-nfs_update_shareopts(sa_share_impl_t impl_share, const char *shareopts)
-{
- FSINFO(impl_share, nfs_fstype)->shareopts = (char *)shareopts;
- return (SA_OK);
-}
-
-/*
- * Clears a share's NFS options. Used by libshare to
- * clean up shares that are about to be free()'d.
- */
-static void
-nfs_clear_shareopts(sa_share_impl_t impl_share)
-{
- FSINFO(impl_share, nfs_fstype)->shareopts = NULL;
-}
-
-static int
nfs_commit_shares(void)
{
char *argv[] = {
@@ -504,22 +481,13 @@ nfs_commit_shares(void)
return (libzfs_run_process(argv[0], argv, 0));
}
-static const sa_share_ops_t nfs_shareops = {
+sa_fstype_t libshare_nfs_type = {
+ .protocol = "nfs",
+
.enable_share = nfs_enable_share,
.disable_share = nfs_disable_share,
.is_shared = nfs_is_shared,
.validate_shareopts = nfs_validate_shareopts,
- .update_shareopts = nfs_update_shareopts,
- .clear_shareopts = nfs_clear_shareopts,
.commit_shares = nfs_commit_shares,
};
-
-/*
- * Initializes the NFS functionality of libshare.
- */
-void
-libshare_nfs_init(void)
-{
- nfs_fstype = register_fstype("nfs", &nfs_shareops);
-}
diff --git a/lib/libshare/os/linux/smb.c b/lib/libshare/os/linux/smb.c
index f4a0bfd6b..91dffc9bb 100644
--- a/lib/libshare/os/linux/smb.c
+++ b/lib/libshare/os/linux/smb.c
@@ -63,8 +63,6 @@
static boolean_t smb_available(void);
-static sa_fstype_t *smb_fstype;
-
static smb_share_t *smb_shares;
static int smb_disable_share(sa_share_impl_t impl_share);
static boolean_t smb_is_share_active(sa_share_impl_t impl_share);
@@ -265,19 +263,16 @@ smb_enable_share_one(const char *sharename, const char *sharepath)
static int
smb_enable_share(sa_share_impl_t impl_share)
{
- char *shareopts;
-
if (!smb_available())
return (SA_SYSTEM_ERR);
if (smb_is_share_active(impl_share))
smb_disable_share(impl_share);
- shareopts = FSINFO(impl_share, smb_fstype)->shareopts;
- if (shareopts == NULL) /* on/off */
+ if (impl_share->sa_shareopts == NULL) /* on/off */
return (SA_SYSTEM_ERR);
- if (strcmp(shareopts, "off") == 0)
+ if (strcmp(impl_share->sa_shareopts, "off") == 0)
return (SA_OK);
/* Magic: Enable (i.e., 'create new') share */
@@ -361,22 +356,6 @@ smb_is_share_active(sa_share_impl_t impl_share)
return (B_FALSE);
}
-/*
- * Called to update a share's options. A share's options might be out of
- * date if the share was loaded from disk and the "sharesmb" dataset
- * property has changed in the meantime. This function also takes care
- * of re-enabling the share if necessary.
- */
-static int
-smb_update_shareopts(sa_share_impl_t impl_share, const char *shareopts)
-{
- if (!impl_share)
- return (SA_SYSTEM_ERR);
-
- FSINFO(impl_share, smb_fstype)->shareopts = (char *)shareopts;
- return (SA_OK);
-}
-
static int
smb_update_shares(void)
{
@@ -384,24 +363,14 @@ smb_update_shares(void)
return (0);
}
-/*
- * Clears a share's SMB options. Used by libshare to
- * clean up shares that are about to be free()'d.
- */
-static void
-smb_clear_shareopts(sa_share_impl_t impl_share)
-{
- FSINFO(impl_share, smb_fstype)->shareopts = NULL;
-}
+sa_fstype_t libshare_smb_type = {
+ .protocol = "smb",
-static const sa_share_ops_t smb_shareops = {
.enable_share = smb_enable_share,
.disable_share = smb_disable_share,
.is_shared = smb_is_share_active,
.validate_shareopts = smb_validate_shareopts,
- .update_shareopts = smb_update_shareopts,
- .clear_shareopts = smb_clear_shareopts,
.commit_shares = smb_update_shares,
};
@@ -422,12 +391,3 @@ smb_available(void)
return (B_TRUE);
}
-
-/*
- * Initializes the SMB functionality of libshare.
- */
-void
-libshare_smb_init(void)
-{
- smb_fstype = register_fstype("smb", &smb_shareops);
-}