mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 02:27:36 +03:00
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:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user