mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-11-17 10:01:01 +03:00
Link libshare directly to libzfs
Drop usage of dlopen/dlsym for libshare. There is no need to do this because the zfs packages provide libshare. Unlike on Solaris we are guaranteed it will be available. This avoids possible problems with hardcoding the libshare path in the code (e.g. when users specify a different install path via configure options). It additionally simplifies the code which is good for maintainability. Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
This commit is contained in:
parent
46e18b3f0f
commit
52e7c3a2e5
@ -12,6 +12,7 @@ libzfs_la_LIBADD = \
|
||||
$(top_builddir)/lib/libspl/libspl.la \
|
||||
$(top_builddir)/lib/libefi/libefi.la \
|
||||
$(top_builddir)/lib/libnvpair/libnvpair.la \
|
||||
$(top_builddir)/lib/libshare/libshare.la \
|
||||
$(top_builddir)/lib/libuutil/libuutil.la \
|
||||
$(top_builddir)/lib/libzpool/libzpool.la
|
||||
|
||||
|
@ -113,6 +113,7 @@ LTLIBRARIES = $(lib_LTLIBRARIES)
|
||||
libzfs_la_DEPENDENCIES = $(top_builddir)/lib/libspl/libspl.la \
|
||||
$(top_builddir)/lib/libefi/libefi.la \
|
||||
$(top_builddir)/lib/libnvpair/libnvpair.la \
|
||||
$(top_builddir)/lib/libshare/libshare.la \
|
||||
$(top_builddir)/lib/libuutil/libuutil.la \
|
||||
$(top_builddir)/lib/libzpool/libzpool.la
|
||||
am_libzfs_la_OBJECTS = libzfs_changelist.lo libzfs_config.lo \
|
||||
@ -337,6 +338,7 @@ libzfs_la_LIBADD = \
|
||||
$(top_builddir)/lib/libspl/libspl.la \
|
||||
$(top_builddir)/lib/libefi/libefi.la \
|
||||
$(top_builddir)/lib/libnvpair/libnvpair.la \
|
||||
$(top_builddir)/lib/libshare/libshare.la \
|
||||
$(top_builddir)/lib/libuutil/libuutil.la \
|
||||
$(top_builddir)/lib/libzpool/libzpool.la
|
||||
|
||||
|
@ -641,97 +641,6 @@ zfs_is_shared_smb(zfs_handle_t *zhp, char **where)
|
||||
PROTO_SMB) != SHARED_NOT_SHARED);
|
||||
}
|
||||
|
||||
/*
|
||||
* Make sure things will work if libshare isn't installed by using
|
||||
* wrapper functions that check to see that the pointers to functions
|
||||
* initialized in _zfs_init_libshare() are actually present.
|
||||
*/
|
||||
|
||||
static sa_handle_t (*_sa_init)(int);
|
||||
static void (*_sa_fini)(sa_handle_t);
|
||||
static sa_share_t (*_sa_find_share)(sa_handle_t, char *);
|
||||
static int (*_sa_enable_share)(sa_share_t, char *);
|
||||
static int (*_sa_disable_share)(sa_share_t, char *);
|
||||
static char *(*_sa_errorstr)(int);
|
||||
static int (*_sa_parse_legacy_options)(sa_group_t, char *, char *);
|
||||
static boolean_t (*_sa_needs_refresh)(sa_handle_t *);
|
||||
static libzfs_handle_t *(*_sa_get_zfs_handle)(sa_handle_t);
|
||||
static int (*_sa_zfs_process_share)(sa_handle_t, sa_group_t, sa_share_t,
|
||||
char *, char *, zprop_source_t, char *, char *, char *);
|
||||
static void (*_sa_update_sharetab_ts)(sa_handle_t);
|
||||
|
||||
/*
|
||||
* _zfs_init_libshare()
|
||||
*
|
||||
* Find the libshare.so.1 entry points that we use here and save the
|
||||
* values to be used later. This is triggered by the runtime loader.
|
||||
* Make sure the correct ISA version is loaded.
|
||||
*/
|
||||
#ifdef __GNUC__
|
||||
static void
|
||||
_zfs_init_libshare(void) __attribute__((constructor));
|
||||
#else
|
||||
#pragma init(_zfs_init_libshare)
|
||||
#endif
|
||||
static void
|
||||
_zfs_init_libshare(void)
|
||||
{
|
||||
void *libshare;
|
||||
char path[MAXPATHLEN];
|
||||
char isa[MAXISALEN];
|
||||
|
||||
/*#if defined(_LP64)
|
||||
if (sysinfo(SI_ARCHITECTURE_64, isa, MAXISALEN) == -1)
|
||||
isa[0] = '\0';
|
||||
#else*/
|
||||
isa[0] = '\0';
|
||||
/*#endif*/
|
||||
(void) snprintf(path, MAXPATHLEN,
|
||||
"/usr/lib/%s/libshare.so.1", isa);
|
||||
|
||||
if ((libshare = dlopen(path, RTLD_LAZY | RTLD_GLOBAL)) != NULL) {
|
||||
_sa_init = (sa_handle_t (*)(int))dlsym(libshare, "sa_init");
|
||||
_sa_fini = (void (*)(sa_handle_t))dlsym(libshare, "sa_fini");
|
||||
_sa_find_share = (sa_share_t (*)(sa_handle_t, char *))
|
||||
dlsym(libshare, "sa_find_share");
|
||||
_sa_enable_share = (int (*)(sa_share_t, char *))dlsym(libshare,
|
||||
"sa_enable_share");
|
||||
_sa_disable_share = (int (*)(sa_share_t, char *))dlsym(libshare,
|
||||
"sa_disable_share");
|
||||
_sa_errorstr = (char *(*)(int))dlsym(libshare, "sa_errorstr");
|
||||
_sa_parse_legacy_options = (int (*)(sa_group_t, char *, char *))
|
||||
dlsym(libshare, "sa_parse_legacy_options");
|
||||
_sa_needs_refresh = (boolean_t (*)(sa_handle_t *))
|
||||
dlsym(libshare, "sa_needs_refresh");
|
||||
_sa_get_zfs_handle = (libzfs_handle_t *(*)(sa_handle_t))
|
||||
dlsym(libshare, "sa_get_zfs_handle");
|
||||
_sa_zfs_process_share = (int (*)(sa_handle_t, sa_group_t,
|
||||
sa_share_t, char *, char *, zprop_source_t, char *,
|
||||
char *, char *))dlsym(libshare, "sa_zfs_process_share");
|
||||
_sa_update_sharetab_ts = (void (*)(sa_handle_t))
|
||||
dlsym(libshare, "sa_update_sharetab_ts");
|
||||
if (_sa_init == NULL || _sa_fini == NULL ||
|
||||
_sa_find_share == NULL || _sa_enable_share == NULL ||
|
||||
_sa_disable_share == NULL || _sa_errorstr == NULL ||
|
||||
_sa_parse_legacy_options == NULL ||
|
||||
_sa_needs_refresh == NULL || _sa_get_zfs_handle == NULL ||
|
||||
_sa_zfs_process_share == NULL ||
|
||||
_sa_update_sharetab_ts == NULL) {
|
||||
_sa_init = NULL;
|
||||
_sa_fini = NULL;
|
||||
_sa_disable_share = NULL;
|
||||
_sa_enable_share = NULL;
|
||||
_sa_errorstr = NULL;
|
||||
_sa_parse_legacy_options = NULL;
|
||||
(void) dlclose(libshare);
|
||||
_sa_needs_refresh = NULL;
|
||||
_sa_get_zfs_handle = NULL;
|
||||
_sa_zfs_process_share = NULL;
|
||||
_sa_update_sharetab_ts = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* zfs_init_libshare(zhandle, service)
|
||||
*
|
||||
@ -745,9 +654,6 @@ zfs_init_libshare(libzfs_handle_t *zhandle, int service)
|
||||
{
|
||||
int ret = SA_OK;
|
||||
|
||||
if (_sa_init == NULL)
|
||||
ret = SA_CONFIG_ERR;
|
||||
|
||||
if (ret == SA_OK && zhandle->libzfs_shareflags & ZFSSHARE_MISS) {
|
||||
/*
|
||||
* We had a cache miss. Most likely it is a new ZFS
|
||||
@ -758,15 +664,14 @@ zfs_init_libshare(libzfs_handle_t *zhandle, int service)
|
||||
* internal cache.
|
||||
*/
|
||||
zhandle->libzfs_shareflags &= ~ZFSSHARE_MISS;
|
||||
if (_sa_needs_refresh != NULL &&
|
||||
_sa_needs_refresh(zhandle->libzfs_sharehdl)) {
|
||||
if (sa_needs_refresh(zhandle->libzfs_sharehdl)) {
|
||||
zfs_uninit_libshare(zhandle);
|
||||
zhandle->libzfs_sharehdl = _sa_init(service);
|
||||
zhandle->libzfs_sharehdl = sa_init(service);
|
||||
}
|
||||
}
|
||||
|
||||
if (ret == SA_OK && zhandle && zhandle->libzfs_sharehdl == NULL)
|
||||
zhandle->libzfs_sharehdl = _sa_init(service);
|
||||
zhandle->libzfs_sharehdl = sa_init(service);
|
||||
|
||||
if (ret == SA_OK && zhandle->libzfs_sharehdl == NULL)
|
||||
ret = SA_NO_MEMORY;
|
||||
@ -784,8 +689,7 @@ void
|
||||
zfs_uninit_libshare(libzfs_handle_t *zhandle)
|
||||
{
|
||||
if (zhandle != NULL && zhandle->libzfs_sharehdl != NULL) {
|
||||
if (_sa_fini != NULL)
|
||||
_sa_fini(zhandle->libzfs_sharehdl);
|
||||
sa_fini(zhandle->libzfs_sharehdl);
|
||||
zhandle->libzfs_sharehdl = NULL;
|
||||
}
|
||||
}
|
||||
@ -799,53 +703,8 @@ zfs_uninit_libshare(libzfs_handle_t *zhandle)
|
||||
int
|
||||
zfs_parse_options(char *options, zfs_share_proto_t proto)
|
||||
{
|
||||
if (_sa_parse_legacy_options != NULL) {
|
||||
return (_sa_parse_legacy_options(NULL, options,
|
||||
return (sa_parse_legacy_options(NULL, options,
|
||||
proto_table[proto].p_name));
|
||||
}
|
||||
return (SA_CONFIG_ERR);
|
||||
}
|
||||
|
||||
/*
|
||||
* zfs_sa_find_share(handle, path)
|
||||
*
|
||||
* wrapper around sa_find_share to find a share path in the
|
||||
* configuration.
|
||||
*/
|
||||
static sa_share_t
|
||||
zfs_sa_find_share(sa_handle_t handle, char *path)
|
||||
{
|
||||
if (_sa_find_share != NULL)
|
||||
return (_sa_find_share(handle, path));
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* zfs_sa_enable_share(share, proto)
|
||||
*
|
||||
* Wrapper for sa_enable_share which enables a share for a specified
|
||||
* protocol.
|
||||
*/
|
||||
static int
|
||||
zfs_sa_enable_share(sa_share_t share, char *proto)
|
||||
{
|
||||
if (_sa_enable_share != NULL)
|
||||
return (_sa_enable_share(share, proto));
|
||||
return (SA_CONFIG_ERR);
|
||||
}
|
||||
|
||||
/*
|
||||
* zfs_sa_disable_share(share, proto)
|
||||
*
|
||||
* Wrapper for sa_enable_share which disables a share for a specified
|
||||
* protocol.
|
||||
*/
|
||||
static int
|
||||
zfs_sa_disable_share(sa_share_t share, char *proto)
|
||||
{
|
||||
if (_sa_disable_share != NULL)
|
||||
return (_sa_disable_share(share, proto));
|
||||
return (SA_CONFIG_ERR);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -871,8 +730,7 @@ zfs_share_proto(zfs_handle_t *zhp, zfs_share_proto_t *proto)
|
||||
if ((ret = zfs_init_libshare(hdl, SA_INIT_SHARE_API)) != SA_OK) {
|
||||
(void) zfs_error_fmt(hdl, EZFS_SHARENFSFAILED,
|
||||
dgettext(TEXT_DOMAIN, "cannot share '%s': %s"),
|
||||
zfs_get_name(zhp), _sa_errorstr != NULL ?
|
||||
_sa_errorstr(ret) : "");
|
||||
zfs_get_name(zhp), sa_errorstr(ret));
|
||||
return (-1);
|
||||
}
|
||||
|
||||
@ -895,7 +753,7 @@ zfs_share_proto(zfs_handle_t *zhp, zfs_share_proto_t *proto)
|
||||
if (zfs_prop_get_int(zhp, ZFS_PROP_ZONED))
|
||||
continue;
|
||||
|
||||
share = zfs_sa_find_share(hdl->libzfs_sharehdl, mountpoint);
|
||||
share = sa_find_share(hdl->libzfs_sharehdl, mountpoint);
|
||||
if (share == NULL) {
|
||||
/*
|
||||
* This may be a new file system that was just
|
||||
@ -906,7 +764,7 @@ zfs_share_proto(zfs_handle_t *zhp, zfs_share_proto_t *proto)
|
||||
* safe to add this to the internal
|
||||
* configuration.
|
||||
*/
|
||||
if (_sa_zfs_process_share(hdl->libzfs_sharehdl,
|
||||
if (sa_zfs_process_share(hdl->libzfs_sharehdl,
|
||||
NULL, NULL, mountpoint,
|
||||
proto_table[*curr_proto].p_name, sourcetype,
|
||||
shareopts, sourcestr, zhp->zfs_name) != SA_OK) {
|
||||
@ -917,12 +775,12 @@ zfs_share_proto(zfs_handle_t *zhp, zfs_share_proto_t *proto)
|
||||
return (-1);
|
||||
}
|
||||
hdl->libzfs_shareflags |= ZFSSHARE_MISS;
|
||||
share = zfs_sa_find_share(hdl->libzfs_sharehdl,
|
||||
share = sa_find_share(hdl->libzfs_sharehdl,
|
||||
mountpoint);
|
||||
}
|
||||
if (share != NULL) {
|
||||
int err;
|
||||
err = zfs_sa_enable_share(share,
|
||||
err = sa_enable_share(share,
|
||||
proto_table[*curr_proto].p_name);
|
||||
if (err != SA_OK) {
|
||||
(void) zfs_error_fmt(hdl,
|
||||
@ -984,18 +842,18 @@ unshare_one(libzfs_handle_t *hdl, const char *name, const char *mountpoint,
|
||||
free(mntpt); /* don't need the copy anymore */
|
||||
return (zfs_error_fmt(hdl, EZFS_SHARENFSFAILED,
|
||||
dgettext(TEXT_DOMAIN, "cannot unshare '%s': %s"),
|
||||
name, _sa_errorstr(err)));
|
||||
name, sa_errorstr(err)));
|
||||
}
|
||||
|
||||
share = zfs_sa_find_share(hdl->libzfs_sharehdl, mntpt);
|
||||
share = sa_find_share(hdl->libzfs_sharehdl, mntpt);
|
||||
free(mntpt); /* don't need the copy anymore */
|
||||
|
||||
if (share != NULL) {
|
||||
err = zfs_sa_disable_share(share, proto_table[proto].p_name);
|
||||
err = sa_disable_share(share, proto_table[proto].p_name);
|
||||
if (err != SA_OK) {
|
||||
return (zfs_error_fmt(hdl, EZFS_UNSHARENFSFAILED,
|
||||
dgettext(TEXT_DOMAIN, "cannot unshare '%s': %s"),
|
||||
name, _sa_errorstr(err)));
|
||||
name, sa_errorstr(err)));
|
||||
}
|
||||
} else {
|
||||
return (zfs_error_fmt(hdl, EZFS_UNSHARENFSFAILED,
|
||||
|
Loading…
Reference in New Issue
Block a user