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 <behlendorf1@llnl.gov>
Signed-off-by: Ahelenia Ziemiańska <nabijaczleweli@nabijaczleweli.xyz>
Closes #13165
This commit is contained in:
наб
2022-02-28 14:50:28 +01:00
committed by Brian Behlendorf
parent 4ccbb23971
commit 63ce6dd988
8 changed files with 119 additions and 413 deletions
+4 -28
View File
@@ -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);
}
+3 -36
View File
@@ -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);
}
+7 -39
View File
@@ -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);
@@ -475,23 +469,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);
}
/*
* 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)
{
@@ -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);
}
+4 -44
View File
@@ -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);
}