From: David Teigland Date: Tue, 25 Jan 2022 22:05:32 +0000 (-0600) Subject: remove static autoactivation X-Git-Tag: v2_03_15~9 X-Git-Url: https://sourceware.org/git/?a=commitdiff_plain;h=ee8fb0310c53ed003a43b324c99cdfd891dd1a7c;p=lvm2.git remove static autoactivation event based autoactivation is now the only method that lvm provides for autoactivation. Setting lvm.conf event_activation=0 can still be used to disable event based autoactivation commands, but doing so will no longer enable static autoactivation. --- diff --git a/lib/config/config_settings.h b/lib/config/config_settings.h index d280e7adb..bda6207d7 100644 --- a/lib/config/config_settings.h +++ b/lib/config/config_settings.h @@ -1119,16 +1119,11 @@ cfg(global_lvdisplay_shows_full_device_path_CFG, "lvdisplay_shows_full_device_pa "was never a valid path in the /dev filesystem.\n") cfg(global_event_activation_CFG, "event_activation", global_CFG_SECTION, CFG_DEFAULT_COMMENTED, CFG_TYPE_BOOL, 1, vsn(2, 3, 1), 0, 0, NULL, - "Activate LVs based on system-generated device events.\n" - "When a PV appears on the system, a system-generated uevent triggers\n" - "the lvm2-pvscan service which runs the pvscan --cache -aay command.\n" - "If the new PV completes a VG, pvscan autoactivates LVs in the VG.\n" - "When event_activation is disabled, the lvm2-activation services are\n" - "generated and run at fixed points during system startup. These\n" - "services run vgchange -aay to autoactivate LVs in VGs that happen\n" - "to be present at that point in time.\n" - "See the --setautoactivation option or the auto_activation_volume_list\n" - "setting to configure autoactivation for specific VGs or LVs.\n") + "Disable event based autoactivation commands.\n" + "WARNING: setting this to zero may cause machine startup to fail.\n" + "Previously, setting this to zero would enable static autoactivation\n" + "services (via the lvm2-activation-generator), but the autoactivation\n" + "services and generator have been removed.\n") cfg(global_use_lvmetad_CFG, "use_lvmetad", global_CFG_SECTION, CFG_DEFAULT_COMMENTED, CFG_TYPE_BOOL, 0, vsn(2, 2, 93), 0, vsn(2, 3, 0), NULL, NULL) diff --git a/man/Makefile.in b/man/Makefile.in index ba6f2046f..d3f0f583a 100644 --- a/man/Makefile.in +++ b/man/Makefile.in @@ -47,7 +47,6 @@ MAN8=lvm.8 lvmdump.8 lvm-fullreport.8 lvm-lvpoll.8 \ MAN8SO=lvm-config.8 lvm-dumpconfig.8 MAN8DM=dmsetup.8 dmstats.8 MAN8CLUSTER= -MAN8SYSTEMD_GENERATORS=lvm2-activation-generator.8 ifeq (,$(findstring $(MAKECMDGOALS), distclean all_man install_all_man)) MAN7 += lvmcache.7 lvmthin.7 lvmvdo.7 @@ -119,7 +118,7 @@ TESTMAN=test.gen include $(top_builddir)/make.tmpl CLEAN_TARGETS+=$(MAN5) $(MAN7) $(MAN8) $(MAN8SO) $(MAN8:%.8=%.8_gen) $(MAN8CLUSTER) \ - $(MAN8SYSTEMD_GENERATORS) $(MAN8DM) $(TESTMAN) + $(MAN8DM) $(TESTMAN) all: man device-mapper @@ -127,11 +126,11 @@ all: man device-mapper device-mapper: $(MAN8DM) -man: $(MAN5) $(MAN7) $(MAN8) $(MAN8SO) $(MAN8CLUSTER) $(MAN8SYSTEMD_GENERATORS) +man: $(MAN5) $(MAN7) $(MAN8) $(MAN8SO) $(MAN8CLUSTER) all_man: man -$(MAN5) $(MAN7) $(MAN8) $(MAN8SO) $(MAN8DM) $(MAN8CLUSTER) $(MAN8SYSTEMD_GENERATORS): Makefile +$(MAN5) $(MAN7) $(MAN8) $(MAN8SO) $(MAN8DM) $(MAN8CLUSTER): Makefile $(MANGENERATOR): @echo " [MAKE] $<" @@ -289,11 +288,6 @@ install_device-mapper: $(MAN8DM) $(Q) $(INSTALL) -d $(MAN8DIR) $(Q) $(INSTALL_DATA) $^ $(MAN8DIR)/ -install_systemd_generators: $(MAN8SYSTEMD_GENERATORS) - @echo " [INSTALL] $^" - $(Q) $(INSTALL) -d $(MAN8DIR) - $(Q) $(INSTALL_DATA) $^ $(MAN8DIR)/ - install: install_lvm2 install_device-mapper install_cluster install_all_man: install install_systemd_generators diff --git a/man/lvm.8_main b/man/lvm.8_main index a008a3bc0..6e8a1d1d3 100644 --- a/man/lvm.8_main +++ b/man/lvm.8_main @@ -563,7 +563,6 @@ Prepends source file name and code line number with libdm debugging. .P .BR lvm-fullreport (8), .BR lvm-lvpoll (8), -.BR lvm2-activation-generator (8), .BR blkdeactivate (8), .BR lvmdump (8), .P diff --git a/man/lvm2-activation-generator.8_main b/man/lvm2-activation-generator.8_main deleted file mode 100644 index 4c54da285..000000000 --- a/man/lvm2-activation-generator.8_main +++ /dev/null @@ -1,58 +0,0 @@ -.TH "LVM2-ACTIVATION-GENERATOR" "8" "LVM TOOLS #VERSION#" "Red Hat, Inc" "\"" -. -.SH "NAME" -. -lvm2-activation-generator - generator for systemd units to activate LVM volumes on boot -. -.SH SYNOPSIS -. -.B #SYSTEMD_GENERATOR_DIR#/lvm2-activation-generator -. -.SH DESCRIPTION -. -The lvm2-activation-generator is called by \fBsystemd\fP(1) on boot to -generate systemd units at runtime to activate LVM Logical Volumes (LVs) -when global/event_activation=0 is set in \fBlvm.conf\fP(5). These units use -\fBvgchange -aay\fP to activate LVs. -.P -If event_activation=1, the lvm2-activation-generator exits immediately without -generating any systemd units, and LVM fully relies on event-based -activation to activate LVs. In this case, event-generated -.B pvscan --cache -aay -commands activate LVs. -.P -These systemd units are generated by lvm2-activation-generator: -.P -.I lvm2-activation-early.service -is run before systemd's special \fBcryptsetup.target\fP to activate -LVs that are not layered on top of encrypted devices. -.P -.I lvm2-activation.service -is run after systemd's special \fBcryptsetup.target\fP to activate -LVs that are layered on top of encrypted devices. -.P -.I lvm2-activation-net.service -is run after systemd's special \fBremote-fs-pre.target\fP to activate -LVs that are layered on attached remote devices. -.P -Note that all the underlying LVM devices (Physical Volumes) need to be -present when the service is run. If the there are any devices that appear -to the system later, LVs using these devices need to be activated directly -by \fBlvchange\fP(8) or \fBvgchange\fP(8). -.P -The lvm2-activation-generator implements the \fBGenerators Specification\fP -as referenced in \fBsystemd\fP(1). -. -.SH SEE ALSO -.nh -.ad l -.BR lvm.conf (5), -.BR vgchange (8), -.BR lvchange (8), -.BR pvscan (8), -.P -.BR systemd (1), -.BR systemd.target (5), -.BR systemd.special (7), -.P -.BR udev (7) diff --git a/man/lvmautoactivation.7_main b/man/lvmautoactivation.7_main index 54dab718b..808ea0d9f 100644 --- a/man/lvmautoactivation.7_main +++ b/man/lvmautoactivation.7_main @@ -17,13 +17,11 @@ is another way to limit autoactivation. . .SS event autoactivation .P -The most common form of autoactivation is "event based", in which complete -VGs are activated in response to uevents which occur during system startup -or at any time after the system has started. Another form of -autoactivation is "static" in which complete VGs are activated at a fixed -point during system startup by a systemd service, and not in response to -events. This can be controlled with the lvm.conf setting -event_activation. +LVM autoactivation is "event based", in which complete VGs are activated +in response to uevents which occur during system startup or at any time +after the system has started. An old form of autoactivation was "static" +in which complete VGs are activated at a fixed point during system startup +by a systemd service, and not in response to events. .P Event based autoactivation is driven by udev, udev rules, and systemd. When a device is attached to a machine, a uevent is generated by the @@ -32,7 +30,7 @@ rules to process the new device. Udev rules use blkid to identify the device as an LVM PV and then execute the lvm-specific udev rule for the device, which triggers autoactivation. .P -There are two variations of event baed autoactivation that may be used on +There are two variations of event based autoactivation that may be used on a system, depending on the LVM udev rule that is installed (found in /lib/udev/rules.d/.) The following summarizes the steps in each rule which lead to autoactivation: @@ -179,35 +177,12 @@ concurrent commands attempt to activate a VG at once. . .SS static autoactivation .P -When event autoactivation is disabled by setting lvm.conf -event_activation=0, autoactivation is performed at one or more static -points during system startup. At these points, a vgchange -aay command is -run to activate complete VGs from devices that are present on the system -at that time. pvscan commands (and lvm2-pvscan services) do not perform -autoactivation in this mode. pvscan commands may still be run from -uevents but will do nothing when they read the event_activation=0 setting. -.P -The static vgchange -aay commands are run by three systemd services at -three points during startup: lvm2-activation-early, lvm2-activation, and -lvm2-activation-net. These static activation services are "generated -services", so the service files are created at run time by the -lvm2-activation-generator command (run by systemd). -lvm2-activation-generator creates the services if lvm.conf -event_activation=0. -.P -The limitation of this method is that devices may not be attached to the -system (or set up) at a reliable point in time during startup, and they -may not be present when the services run vgchange. In this case, the VGs -will not be autoactivated. So, the timing of device attachment/setup -determines whether static autoactivation will produce the same results as -event autoactivation. For this reason, static autoactivation is not -recommended. -.P -Sometimes, static autoactivation is mistakenly expected to disable all -autoactivation of particular VGs. This may appear to be effective if those -VGs are slow to be attached or set up. But, the only correct and reliable -way to disable autoactivation is using vgchange/lvchange ---setautoactivation n, or lvm.conf auto_activation_volume_list. +A static autoactivation method is no longer provided by lvm. +Setting event_activation=0 still disables event based autoactivation. +WARNING: disabling event activation without an alternative may prevent a +system from booting. A custom systemd service could be written to run +autoactivation during system startup, in which case disabling event +autoactivation may be useful. . .SH EXAMPLES .P diff --git a/man/see_also.end b/man/see_also.end index cf7834052..46c82802a 100644 --- a/man/see_also.end +++ b/man/see_also.end @@ -53,7 +53,6 @@ .P .BR lvm-fullreport (8), .BR lvm-lvpoll (8), -.BR lvm2-activation-generator (8), .BR blkdeactivate (8), .BR lvmdump (8), .P diff --git a/scripts/Makefile.in b/scripts/Makefile.in index 0d7f45680..ebcea92f9 100644 --- a/scripts/Makefile.in +++ b/scripts/Makefile.in @@ -15,9 +15,6 @@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ -SOURCES = lvm2_activation_generator_systemd_red_hat.c -TARGETS = lvm2_activation_generator_systemd_red_hat - include $(top_builddir)/make.tmpl ifeq ("@BUILD_DMEVENTD@", "yes") @@ -78,17 +75,6 @@ ifeq ("@BLKDEACTIVATE@", "yes") $(Q) $(INSTALL_SCRIPT) blk_availability_init_red_hat $(initdir)/blk-availability endif -CFLAGS_lvm2_activation_generator_systemd_red_hat.o += $(EXTRA_EXEC_CFLAGS) - -lvm2_activation_generator_systemd_red_hat: $(OBJECTS) $(LVMINTERNAL_LIBS) - @echo " [CC] $@" - $(Q) $(CC) -o $@ $(OBJECTS) $(CFLAGS) $(LDFLAGS) $(EXTRA_EXEC_LDFLAGS) $(ELDFLAGS) $(LVMINTERNAL_LIBS) $(LIBS) - -install_systemd_generators: - @echo " [INSTALL] systemd_generators" - $(Q) $(INSTALL_DIR) $(systemd_generator_dir) - $(Q) $(INSTALL_PROGRAM) lvm2_activation_generator_systemd_red_hat $(systemd_generator_dir)/lvm2-activation-generator - install_systemd_units: install_dbus_service @echo " [INSTALL] systemd_units" $(Q) $(INSTALL_DIR) $(systemd_unit_dir) diff --git a/scripts/blk_availability_systemd_red_hat.service.in b/scripts/blk_availability_systemd_red_hat.service.in index 82d3b82d0..4102566be 100644 --- a/scripts/blk_availability_systemd_red_hat.service.in +++ b/scripts/blk_availability_systemd_red_hat.service.in @@ -1,7 +1,7 @@ [Unit] Description=Availability of block devices Before=shutdown.target -After=lvm2-activation.service iscsi-shutdown.service iscsi.service iscsid.service fcoe.service rbdmap.service +After=iscsi-shutdown.service iscsi.service iscsid.service fcoe.service rbdmap.service DefaultDependencies=no Conflicts=shutdown.target diff --git a/scripts/generator-internals.c b/scripts/generator-internals.c deleted file mode 100644 index 733e8189c..000000000 --- a/scripts/generator-internals.c +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Copyright (C) 2018 Red Hat, Inc. All rights reserved. - * - * This file is part of the device-mapper userspace tools. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU General Public License v.2. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -// This file contains the unit testable parts of -// lvm2_activation_generator_systemd_red_hat - -#include "device_mapper/all.h" - -#include -#include -#include -#include /* For PATH_MAX for musl libc */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -//---------------------------------------------------------------- - -static void _error(const char *format, ...) __attribute__ ((format(printf, 1, 2))); - -//---------------------------------------------------------------- - -// I'm rolling my own version of popen() here because I do not want to -// go through the shell. - -struct child_process { - pid_t pid; - FILE *fp; -}; - -static bool _open_child(struct child_process *child, const char *cmd, const char *argv[]) -{ - int r, pipe_fd[2]; - - r = pipe(pipe_fd); - if (r < 0) { - _error("call to pipe() failed: %d\n", r); - return false; - } - - child->pid = fork(); - if (child->pid < 0) { - (void) close(pipe_fd[0]); - (void) close(pipe_fd[1]); - _error("call to fork() failed: %d\n", r); - return false; - } - - if (child->pid == 0) { - // child - (void) close(pipe_fd[0]); - if (pipe_fd[1] != STDOUT_FILENO) { - (void) dup2(pipe_fd[1], STDOUT_FILENO); - (void) close(pipe_fd[1]); - } - - /* Suppressing any use of syslog */ - (void) setenv("LVM_SUPPRESS_SYSLOG", "1", 1); - - if (execv(cmd, (char *const *) argv) < 0) - _error("execv failed: %s\n", strerror(errno)); - // Shouldn't get here unless exec failed. - exit(1); - } else { - // parent - (void) close(pipe_fd[1]); - child->fp = fdopen(pipe_fd[0], "r"); - if (!child->fp) { - _error("call to fdopen() failed\n"); - return false; - } - } - - return true; -} - -// Returns the child's exit status -static bool _close_child(struct child_process *child) -{ - int status; - - (void) fclose(child->fp); - - while (waitpid(child->pid, &status, 0) < 0) - if (errno != EINTR) - return -1; - - if (WIFEXITED(status) && !WEXITSTATUS(status)) - return true; - - return false; -} - -//---------------------------------------------------------------- -// Aquiring config from the lvmconfig process - -#define LVM_CONF_EVENT_ACTIVATION "global/event_activation" -#define LVM_CONF_USE_LVMPOLLD "global/use_lvmpolld" - -struct config { - bool event_activation; - bool sysinit_needed; -}; - -static bool _begins_with(const char *line, const char *prefix, const char **rest) -{ - size_t len = strlen(prefix); - - if (strlen(line) < len) - return false; - - if (strncmp(line, prefix, len)) - return false; - - *rest = line + len; - - return true; -} - -static bool _parse_bool(const char *val, bool * result) -{ - const char *b = val, *e; - - while (*b && isspace(*b)) - b++; - - if (!*b) - goto parse_error; - - e = b; - while (*e && !isspace(*e)) - e++; - - if ((e - b) != 1) - goto parse_error; - - // We only handle '1', or '0' - if (*b == '1') { - *result = true; - return true; - - } else if (*b == '0') { - *result = false; - return true; - } - // Fallthrough - - parse_error: - _error("couldn't parse bool value '%s'\n", val); - return false; -} - -static bool _parse_line(const char *line, struct config *cfg) -{ - const char *val; - - if (_begins_with(line, "event_activation=", &val)) { - return _parse_bool(val, &cfg->event_activation); - - } else if (_begins_with(line, "use_lvmpolld=", &val)) { - bool r; - if (!_parse_bool(val, &r)) - return false; - cfg->sysinit_needed = !r; - return true; - } - - return false; -} - -static bool _get_config(struct config *cfg, const char *lvmconfig_path) -{ - static const char *_argv[] = { - "lvmconfig", "--type", "full", - LVM_CONF_EVENT_ACTIVATION, LVM_CONF_USE_LVMPOLLD, NULL - }; - - bool r = true; - char buffer[256]; - struct child_process child; - - cfg->event_activation = false; - cfg->sysinit_needed = true; - - if (!_open_child(&child, lvmconfig_path, _argv)) { - _error("couldn't open lvmconfig process\n"); - return false; - } - - while (fgets(buffer, sizeof(buffer), child.fp)) { - if (!_parse_line(buffer, cfg)) { - _error("_parse_line() failed\n"); - r = false; - } - } - - if (!_close_child(&child)) { - _error("lvmconfig failed\n"); - r = false; - } - - return r; -} diff --git a/scripts/lvm2_activation_generator_systemd_red_hat.c b/scripts/lvm2_activation_generator_systemd_red_hat.c deleted file mode 100644 index 0f4ac8da2..000000000 --- a/scripts/lvm2_activation_generator_systemd_red_hat.c +++ /dev/null @@ -1,233 +0,0 @@ -/* - * Copyright (C) 2012 Red Hat, Inc. All rights reserved. - * - * This file is part of the device-mapper userspace tools. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU General Public License v.2. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -// Code in this file gets included in the unit tests. -#include "generator-internals.c" - -// Logging - -#define KMSG_DEV_PATH "/dev/kmsg" -static int _kmsg_fd; - -static void _log_init(void) -{ - // failing is harmless - _kmsg_fd = open(KMSG_DEV_PATH, O_WRONLY | O_NOCTTY); -} - -static void _log_exit(void) -{ - if (_kmsg_fd != -1) - (void) close(_kmsg_fd); -} - -__attribute__ ((format(printf, 1, 2))) -static void _error(const char *format, ...) -{ - int n; - va_list ap; - char message[PATH_MAX + 30]; /* +3 for '' where n is the log level and +27 for lvm2-activation-generator: " prefix */ - - snprintf(message, 31, "<%d>lvm2-activation-generator: ", LOG_ERR); - - va_start(ap, format); - n = vsnprintf(message + 30, PATH_MAX, format, ap); - va_end(ap); - - if (_kmsg_fd < 0 || (n < 0 || ((unsigned) n + 1 > PATH_MAX))) - return; - - /* The n+31: +30 for "lvm2-activation-generator: " prefix and +1 for '\0' suffix */ - if (write(_kmsg_fd, message, n + 31) < 0) - _error("Failed to write activation message %s: %m.\n", message); -} - -//---------------------------------------------------------------- - -#define UNIT_TARGET_LOCAL_FS "local-fs-pre.target" -#define UNIT_TARGET_REMOTE_FS "remote-fs-pre.target" - -struct generator { - const char *dir; - struct config cfg; - - int kmsg_fd; - char unit_path[PATH_MAX]; - char target_path[PATH_MAX]; -}; - -enum { - UNIT_EARLY, - UNIT_MAIN, - UNIT_NET -}; - -static const char *_unit_names[] = { - [UNIT_EARLY] = "lvm2-activation-early.service", - [UNIT_MAIN] = "lvm2-activation.service", - [UNIT_NET] = "lvm2-activation-net.service" -}; - -//---------------------------------------------------------------- - -static int register_unit_with_target(struct generator *gen, const char *unit, - const char *target) -{ - int r = 1; - - if (dm_snprintf(gen->target_path, PATH_MAX, "%s/%s.wants", gen->dir, target) < 0) { - r = 0; - goto out; - } - - (void) dm_prepare_selinux_context(gen->target_path, S_IFDIR); - if (mkdir(gen->target_path, 0755) < 0 && errno != EEXIST) { - _error("Failed to create target directory %s: %m.\n", gen->target_path); - r = 0; - goto out; - } - - if (dm_snprintf - (gen->target_path, PATH_MAX, "%s/%s.wants/%s", gen->dir, target, unit) < 0) { - r = 0; - goto out; - } - (void) dm_prepare_selinux_context(gen->target_path, S_IFLNK); - if (symlink(gen->unit_path, gen->target_path) < 0) { - _error("Failed to create symlink for unit %s: %m.\n", unit); - r = 0; - } - out: - dm_prepare_selinux_context(NULL, 0); - return r; -} - -static int generate_unit(struct generator *gen, int unit) -{ - FILE *f; - const char *unit_name = _unit_names[unit]; - const char *target_name = - unit == UNIT_NET ? UNIT_TARGET_REMOTE_FS : UNIT_TARGET_LOCAL_FS; - - if (dm_snprintf(gen->unit_path, PATH_MAX, "%s/%s", gen->dir, unit_name) - < 0) - return 0; - - if (!(f = fopen(gen->unit_path, "wxe"))) { - _error("Failed to create unit file %s: %m.\n", unit_name); - return 0; - } - - fputs("# Automatically generated by lvm2-activation-generator.\n" - "#\n" - "# This unit is responsible for direct activation of LVM logical volumes\n" - "# if event-based activation not used (global/event_activation=0 in\n" - "# lvm.conf). Direct LVM activation requires udev to be settled!\n\n" - "[Unit]\n" - "Description=LVM direct activation of logical volumes\n" - "Documentation=man:lvm2-activation-generator(8)\n" - "SourcePath=/etc/lvm/lvm.conf\n" "DefaultDependencies=no\n", f); - - fputs("Conflicts=shutdown.target\n", f); - - if (unit == UNIT_NET) { - fprintf(f, "After=%s iscsi.service fcoe.service rbdmap.service\n" - "Before=remote-fs-pre.target shutdown.target\n\n" - "[Service]\n" - "ExecStartPre=/usr/bin/udevadm settle\n", _unit_names[UNIT_MAIN]); - } else { - if (unit == UNIT_EARLY) - fputs("After=systemd-udev-settle.service\n" - "Before=cryptsetup.target\n", f); - else - fprintf(f, "After=%s cryptsetup.target\n", _unit_names[UNIT_EARLY]); - - fputs("Before=local-fs-pre.target shutdown.target\n" - "Wants=systemd-udev-settle.service\n\n" "[Service]\n", f); - } - - fputs("ExecStart=" LVM_PATH " vgchange -aay", f); - if (gen->cfg.sysinit_needed) - fputs(" --sysinit", f); - fputs("\nType=oneshot\n", f); - - if (fclose(f) < 0) { - _error("Failed to write unit file %s: %m.\n", unit_name); - return 0; - } - - if (!register_unit_with_target(gen, unit_name, target_name)) { - _error("Failed to register unit %s with target %s.\n", - unit_name, target_name); - return 0; - } - - return 1; -} - -static bool _parse_command_line(struct generator *gen, int argc, const char **argv) -{ - if (argc != 4) { - _error("Incorrect number of arguments for activation generator.\n"); - return false; - } - - gen->dir = argv[1]; - return true; -} - -static bool _run(int argc, const char **argv) -{ - bool r; - mode_t old_mask; - struct generator gen; - - if (!_parse_command_line(&gen, argc, argv)) - return false; - - if (_get_config(&gen.cfg, LVMCONFIG_PATH)) { - if (gen.cfg.event_activation) - // If event_activation=1, pvscan --cache -aay does activation. - return true; - } - - /* - * Create the activation units if: - * - _get_config succeeded and event_activation=0 - * - _get_config failed, then this is a failsafe fallback - */ - - /* mark lvm2-activation.*.service as world-accessible */ - old_mask = umask(0022); - - r = generate_unit(&gen, UNIT_EARLY) && - generate_unit(&gen, UNIT_MAIN) && generate_unit(&gen, UNIT_NET); - - umask(old_mask); - - return r; -} - -int main(int argc, const char **argv) -{ - bool r; - - _log_init(); - r = _run(argc, argv); - if (!r) - _error("Activation generator failed.\n"); - _log_exit(); - - return r ? EXIT_SUCCESS : EXIT_FAILURE; -} diff --git a/scripts/lvm2_monitoring_systemd_red_hat.service.in b/scripts/lvm2_monitoring_systemd_red_hat.service.in index 4bf744a7f..c0c96e316 100644 --- a/scripts/lvm2_monitoring_systemd_red_hat.service.in +++ b/scripts/lvm2_monitoring_systemd_red_hat.service.in @@ -2,7 +2,7 @@ Description=Monitoring of LVM2 mirrors, snapshots etc. using dmeventd or progress polling Documentation=man:dmeventd(8) man:lvcreate(8) man:lvchange(8) man:vgchange(8) Requires=dm-event.socket -After=dm-event.socket dm-event.service lvm2-activation.service +After=dm-event.socket dm-event.service Before=local-fs-pre.target shutdown.target DefaultDependencies=no Conflicts=shutdown.target diff --git a/spec/packages.inc b/spec/packages.inc index 9b4eba263..f8271533a 100644 --- a/spec/packages.inc +++ b/spec/packages.inc @@ -101,9 +101,6 @@ fi %{_mandir}/man8/lvm-config.8.gz %{_mandir}/man8/lvm-dumpconfig.8.gz %{_mandir}/man8/lvm.8.gz -%if %{enable_systemd} - %{_mandir}/man8/lvm2-activation-generator.8.gz -%endif %{_mandir}/man8/lvmconfig.8.gz %{_mandir}/man8/lvmdevices.8.gz %{_mandir}/man8/lvmdiskscan.8.gz @@ -190,7 +187,6 @@ fi %{_tmpfilesdir}/%{name}.conf %{_unitdir}/blk-availability.service %{_unitdir}/lvm2-monitor.service - %attr(555, -, -) %{_prefix}/lib/systemd/system-generators/lvm2-activation-generator %if %{have_service lvmpolld} %{_unitdir}/lvm2-lvmpolld.service %{_unitdir}/lvm2-lvmpolld.socket diff --git a/test/unit/Makefile b/test/unit/Makefile index 5826f41c2..05e25012f 100644 --- a/test/unit/Makefile +++ b/test/unit/Makefile @@ -16,7 +16,6 @@ UNIT_SOURCE=\ device_mapper/vdo/status.c \ \ - test/unit/activation-generator_t.c \ test/unit/bcache_t.c \ test/unit/bcache_utils_t.c \ test/unit/bitset_t.c \ diff --git a/test/unit/activation-generator_t.c b/test/unit/activation-generator_t.c deleted file mode 100644 index f1e2aeda4..000000000 --- a/test/unit/activation-generator_t.c +++ /dev/null @@ -1,268 +0,0 @@ -/* - * Copyright (C) 2018 Red Hat, Inc. All rights reserved. - * - * This file is part of LVM2. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU General Public License v.2. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "units.h" -#include "scripts/generator-internals.c" - -//---------------------------------------------------------------- - -static void _error(const char *format, ...) -{ - va_list ap; - - va_start(ap, format); - vfprintf(stderr, format, ap); - va_end(ap); -} - -//---------------------------------------------------------------- - -struct bw_test { - const char *input; - const char *prefix; - const char *val; -}; - -static void _test_begins_with(void *fixture) -{ - static struct bw_test _tests[] = { - {"", "foo", NULL}, - {"lskdj", "foo", NULL}, - {"foo", "foobar", NULL}, - {"fish", "fish", ""}, - {"foo=bar ", "foo=", "bar "}, - }; - - unsigned i; - for (i = 0; i < DM_ARRAY_SIZE(_tests); i++) { - const char *val; - struct bw_test *t = _tests + i; - if (t->val) { - if (!_begins_with(t->input, t->prefix, &val)) - test_fail("_begins_with('%s', '%s') failed", t->input, t->prefix); - if (strcmp(val, t->val)) - test_fail("_begins_with('%s', '%s') -> '%s', expected '%s'", - t->input, t->prefix, val, t->val); - } else { - if (_begins_with(t->input, t->prefix, &val)) - test_fail("_begins_with('%s', '%s') unexpectedly succeeded", - t->input, t->prefix); - - } - } -} - -struct pb_test { - const char *input; - bool parsed; - bool result; -}; - -static const char *_bool(bool v) -{ - return v ? "true" : "false"; -} - -static void _test_parse_bool(void *fixture) -{ - static struct pb_test _tests[] = { - {"", false, false}, - {"fish", false, false}, - {"true", false, false}, - {"false", false, false}, - {"1", true, true}, - {" \t 1\t\t", true, true}, - {"0", true, false}, - {" \t0 ", true, false} - }; - - unsigned i; - - for (i = 0; i < DM_ARRAY_SIZE(_tests); i++) { - bool result; - struct pb_test *t = _tests + i; - - if (t->parsed) { - if (!_parse_bool(t->input, &result)) - test_fail("_parse_bool('%s') unexpectedly failed", t->input); - if (result != t->result) - test_fail("_parse_bool('%s') -> %s", t->input, _bool(result)); - } else { - if (_parse_bool(t->input, &result)) - test_fail("_parse_bool('%s') unexpectedly succeeded", t->input); - } - } -} - -struct pl_test { - const char *input; - bool success; - bool event_activation; - bool sysinit_needed; -}; - -static void _test_parse_line(void *fixture) -{ - static struct pl_test _tests[] = { - {"", false, false, false}, - {"sldkjfs", false, false, false}, - {"event_activation=1", true, true, true}, - {"event_activation=0", true, false, true}, - {"use_lvmpolld=1", true, false, false}, - {"use_lvmpolld=0", true, false, true} - }; - - unsigned i; - - for (i = 0; i< DM_ARRAY_SIZE(_tests); i++) { - bool r; - struct config cfg = { - .sysinit_needed = true - }; - struct pl_test *t = _tests + i; - - r = _parse_line(t->input, &cfg); - if (t->success) { - if (!r) - test_fail("_parse_line('%s') failed", t->input); - - if (cfg.event_activation != t->event_activation) - test_fail("_parse_line('%s') -> event_activation='%s'", - t->input, _bool(cfg.event_activation)); - - if (cfg.sysinit_needed != t->sysinit_needed) - test_fail("_parse_line('%s') -> sysinit_needed='%s'", - t->input, _bool(cfg.sysinit_needed)); - } else if (r) - test_fail("_parse_line('%s') succeeded", t->input); - } -} - -static void _test_get_config_bad_path(void *fixture) -{ - struct config cfg; - - if (_get_config(&cfg, "/usr/bin/no-such-file")) - test_fail("_get_config() succeeded despite a bad lvmconfig path"); -} - -static void _test_get_config_bad_exit(void *fixture) -{ - struct config cfg; - - if (_get_config(&cfg, "/usr/bin/false")) - test_fail("_get_config() succeeded despite a bad lvmconfig exit"); -} - -struct gc_test { - const char *output; - bool success; - bool event_activation; - bool sysinit_needed; -}; - -static const char *_fake_lvmconfig(const char *output) -{ - const char *path = "./fake-lvmconfig"; - - FILE *fp = fopen(path, "w"); - if (!fp) - return NULL; - - fprintf(fp, "#!/usr/bin/env bash\n"); - fprintf(fp, "cat <output); - if (!path) - test_fail("couldn't create fake lvmconfig"); - - r = _get_config(&cfg, path); - if (t->success) { - if (!r) - test_fail("_get_config() <- '%s' failed", t->output); - - if (t->event_activation != cfg.event_activation) - test_fail("_get_config() <- '%s', event_activation = %s", - t->output, _bool(cfg.event_activation)); - - if (t->sysinit_needed != cfg.sysinit_needed) - test_fail("_get_config() <- '%s', sysinit = %s", - t->output, _bool(cfg.sysinit_needed)); - } else { - if (r) - test_fail("_get_config() <- '%s' unexpectedly succeeded", t->output); - } - - (void) unlink(path); - } -} - -//---------------------------------------------------------------- - -#define T(path, desc, fn) register_test(ts, "/activation-generator/" path, desc, fn) - -static struct test_suite *_tests(void) -{ - struct test_suite *ts = test_suite_create(NULL, NULL); - if (!ts) { - fprintf(stderr, "out of memory\n"); - exit(1); - }; - - T("begins-with", "Test cases for _begins_with()", _test_begins_with); - T("parse-bool", "Test cases for _parse_bool()", _test_parse_bool); - T("parse-line", "Test cases for _parse_line()", _test_parse_line); - T("get-config-bad-path", "_get_config() needs a valid lvmconfig path", _test_get_config_bad_path); - T("get-config-bad-exit", "lvmconfig bad exit code gets propagated", _test_get_config_bad_exit); - T("get-config", "Test cases for _get_config()", _test_get_config); - - return ts; -} - -void activation_generator_tests(struct dm_list *all_tests) -{ - dm_list_add(all_tests, &_tests()->list); -} - -//---------------------------------------------------------------- diff --git a/test/unit/units.h b/test/unit/units.h index bc0db8d13..d7ac6adc3 100644 --- a/test/unit/units.h +++ b/test/unit/units.h @@ -20,7 +20,6 @@ //----------------------------------------------------------------- // Declare the function that adds tests suites here ... -void activation_generator_tests(struct dm_list *suites); void bcache_tests(struct dm_list *suites); void bcache_utils_tests(struct dm_list *suites); void bitset_tests(struct dm_list *suites); @@ -37,7 +36,6 @@ void vdo_tests(struct dm_list *suites); // ... and call it in here. static inline void register_all_tests(struct dm_list *suites) { - activation_generator_tests(suites); bcache_tests(suites); bcache_utils_tests(suites); bitset_tests(suites);