@@ -858,12 +858,21 @@ process_config_dir(struct config *conf, char *dir)
pthread_cleanup_pop(1);
}
+__attribute__((weak)) pid_t daemon_pid = -1;
+
#ifdef USE_SYSTEMD
static void set_max_checkint_from_watchdog(struct config *conf)
{
- char *envp = getenv("WATCHDOG_USEC");
+ const char *envp;
unsigned long checkint;
+ long pid;
+ envp = getenv("WATCHDOG_PID");
+ /* See sd_watchdog_enabled(3) */
+ if (envp && sscanf(envp, "%lu", &pid) == 1 && pid != daemon_pid)
+ return;
+
+ envp = getenv("WATCHDOG_USEC");
if (envp && sscanf(envp, "%lu", &checkint) == 1) {
if (checkint == 0)
/* watchdog disabled */
@@ -315,4 +315,6 @@ int parse_uid_attrs(char *uid_attrs, struct config *conf);
const char *get_uid_attribute_by_attrs(const struct config *conf,
const char *path_dev);
+/* Weak dummy function, meant to be overridden by multipathd */
+extern pid_t daemon_pid;
#endif
@@ -70,6 +70,7 @@ global:
cleanup_multipath_and_paths;
coalesce_paths;
count_active_paths;
+ daemon_pid;
delete_all_foreign;
delete_foreign;
dm_cancel_deferred_remove;
WATCHDOG_USEC should only be evaluated if WATCHDOG_PID is either unset (systemd <= 208) or set to the main daemon's pid [1]. Passing the daemon's PID to set_max_checkint_from_watchdog() requires a mechanism similar to what we've been using for get_multipath_config(). [1] https://www.freedesktop.org/software/systemd/man/latest/sd_watchdog_enabled.html Signed-off-by: Martin Wilck <mwilck@suse.com> --- libmultipath/config.c | 11 ++++++++++- libmultipath/config.h | 2 ++ libmultipath/libmultipath.version | 1 + 3 files changed, 13 insertions(+), 1 deletion(-)