2cf40b2f98
- Add 0073-libmultipath-util-constify-function-arguments.patch - Add 0074-libmultipath-constify-file-argument-in-config-parser.patch - Add 0075-libmultipath-provide-defaults-for-get-put-_multipath.patch - Add 0076-libmpathpersist-allow-using-libmultipath-get-put-_mu.patch - Add 0077-multipath-use-get_put-_multipath_config-from-libmult.patch - Add 0078-mpathpersist-use-get-put-_multipath_config-from-libm.patch - Add 0079-libmultipath-add-udev-and-logsink-symbols.patch - Add 0080-multipath-remove-logsink-and-udev.patch - Add 0081-libmpathpersist-call-libmultipath_-init-exit.patch - Add 0082-mpathpersist-remove-logsink-and-udev.patch - Add 0083-multipathd-remove-logsink-and-udev.patch * Pull in upsteam library changes - Add 0084-libmpathvalid-use-default-_multipath_config-udev-and.patch - Add 0085-Revert-libmultipath-add-ignore_udev_uid-option.patch - Add 0086-libmultipath-change-log-level-for-null-uid_attribute.patch - Add 0087-libmultipath-orphan_paths-avoid-BUG-message.patch * update libmpathvalid to use upstream library changes. changes submitted upstream
183 lines
5.0 KiB
Diff
183 lines
5.0 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Martin Wilck <mwilck@suse.com>
|
|
Date: Thu, 24 Sep 2020 15:37:08 +0200
|
|
Subject: [PATCH] libmultipath: provide defaults for {get,put}_multipath_config
|
|
|
|
Add an implementation of get_multipath_config() and put_multipath_config()
|
|
to libmultipath. The linker's symbol lookup rules will make sure that
|
|
applications can override these functions if they need to. Defining
|
|
these functions in libmultipath avoids the need to provide stubs
|
|
for these functions in every appliation linking to libmultipath.
|
|
|
|
libmultipath's internal functions simply refer to a static "struct config".
|
|
It must be initialized with init_config() rather than load_config(),
|
|
which always allocates a new struct for backward compatibility, and must
|
|
be teared down using uninit_config().
|
|
|
|
Signed-off-by: Martin Wilck <mwilck@suse.com>
|
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
|
---
|
|
libmultipath/config.c | 72 +++++++++++++++++++++++++++++++++++++------
|
|
libmultipath/config.h | 21 +++++++++++--
|
|
2 files changed, 80 insertions(+), 13 deletions(-)
|
|
|
|
diff --git a/libmultipath/config.c b/libmultipath/config.c
|
|
index 1818f8b9..422e923d 100644
|
|
--- a/libmultipath/config.c
|
|
+++ b/libmultipath/config.c
|
|
@@ -28,6 +28,23 @@
|
|
#include "propsel.h"
|
|
#include "version.h"
|
|
|
|
+static struct config __internal_config;
|
|
+struct config *libmp_get_multipath_config(void)
|
|
+{
|
|
+ return &__internal_config;
|
|
+}
|
|
+
|
|
+struct config *get_multipath_config(void)
|
|
+ __attribute__((weak, alias("libmp_get_multipath_config")));
|
|
+
|
|
+void libmp_put_multipath_config(void *conf __attribute__((unused)))
|
|
+{
|
|
+ /* empty */
|
|
+}
|
|
+
|
|
+void put_multipath_config(void *conf)
|
|
+ __attribute__((weak, alias("libmp_put_multipath_config")));
|
|
+
|
|
static int
|
|
hwe_strmatch (const struct hwentry *hwe1, const struct hwentry *hwe2)
|
|
{
|
|
@@ -575,17 +592,15 @@ restart:
|
|
return;
|
|
}
|
|
|
|
-struct config *
|
|
-alloc_config (void)
|
|
+static struct config *alloc_config (void)
|
|
{
|
|
return (struct config *)MALLOC(sizeof(struct config));
|
|
}
|
|
|
|
-void
|
|
-free_config (struct config * conf)
|
|
+static void _uninit_config(struct config *conf)
|
|
{
|
|
if (!conf)
|
|
- return;
|
|
+ conf = &__internal_config;
|
|
|
|
if (conf->multipath_dir)
|
|
FREE(conf->multipath_dir);
|
|
@@ -649,7 +664,27 @@ free_config (struct config * conf)
|
|
free_hwtable(conf->hwtable);
|
|
free_hwe(conf->overrides);
|
|
free_keywords(conf->keywords);
|
|
- FREE(conf);
|
|
+
|
|
+ memset(conf, 0, sizeof(*conf));
|
|
+}
|
|
+
|
|
+void uninit_config(void)
|
|
+{
|
|
+ _uninit_config(&__internal_config);
|
|
+}
|
|
+
|
|
+void free_config(struct config *conf)
|
|
+{
|
|
+ if (!conf)
|
|
+ return;
|
|
+ else if (conf == &__internal_config) {
|
|
+ condlog(0, "ERROR: %s called for internal config. Use uninit_config() instead",
|
|
+ __func__);
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ _uninit_config(conf);
|
|
+ free(conf);
|
|
}
|
|
|
|
/* if multipath fails to process the config directory, it should continue,
|
|
@@ -718,12 +753,29 @@ static void set_max_checkint_from_watchdog(struct config *conf)
|
|
}
|
|
#endif
|
|
|
|
+static int _init_config (const char *file, struct config *conf);
|
|
+
|
|
+int init_config(const char *file)
|
|
+{
|
|
+ return _init_config(file, &__internal_config);
|
|
+}
|
|
+
|
|
struct config *load_config(const char *file)
|
|
{
|
|
struct config *conf = alloc_config();
|
|
|
|
+ if (conf && !_init_config(file, conf))
|
|
+ return conf;
|
|
+
|
|
+ free(conf);
|
|
+ return NULL;
|
|
+}
|
|
+
|
|
+int _init_config (const char *file, struct config *conf)
|
|
+{
|
|
+
|
|
if (!conf)
|
|
- return NULL;
|
|
+ conf = &__internal_config;
|
|
|
|
/*
|
|
* internal defaults
|
|
@@ -911,10 +963,10 @@ struct config *load_config(const char *file)
|
|
!conf->wwids_file || !conf->prkeys_file)
|
|
goto out;
|
|
|
|
- return conf;
|
|
+ return 0;
|
|
out:
|
|
- free_config(conf);
|
|
- return NULL;
|
|
+ _uninit_config(conf);
|
|
+ return 1;
|
|
}
|
|
|
|
char *get_uid_attribute_by_attrs(struct config *conf,
|
|
diff --git a/libmultipath/config.h b/libmultipath/config.h
|
|
index 78375f2f..83d179ac 100644
|
|
--- a/libmultipath/config.h
|
|
+++ b/libmultipath/config.h
|
|
@@ -254,10 +254,25 @@ void free_mptable (vector mptable);
|
|
int store_hwe (vector hwtable, struct hwentry *);
|
|
|
|
struct config *load_config (const char *file);
|
|
-struct config * alloc_config (void);
|
|
void free_config (struct config * conf);
|
|
-extern struct config *get_multipath_config(void);
|
|
-extern void put_multipath_config(void *);
|
|
+int init_config(const char *file);
|
|
+void uninit_config(void);
|
|
+
|
|
+/*
|
|
+ * libmultipath provides default implementations of
|
|
+ * get_multipath_config() and put_multipath_config().
|
|
+ * Applications using these should use init_config(file, NULL)
|
|
+ * to load the configuration, rather than load_config(file).
|
|
+ * Likewise, uninit_config() should be used for teardown, but
|
|
+ * using free_config() for that is supported, too.
|
|
+ * Applications can define their own {get,put}_multipath_config()
|
|
+ * functions, which override the library-internal ones, but
|
|
+ * could still call libmp_{get,put}_multipath_config().
|
|
+ */
|
|
+struct config *libmp_get_multipath_config(void);
|
|
+struct config *get_multipath_config(void);
|
|
+void libmp_put_multipath_config(void *);
|
|
+void put_multipath_config(void *);
|
|
|
|
int parse_uid_attrs(char *uid_attrs, struct config *conf);
|
|
char *get_uid_attribute_by_attrs(struct config *conf,
|
|
--
|
|
2.17.2
|
|
|