From: Mike Yuan Date: Mon, 14 Oct 2024 16:31:14 +0000 (+0200) Subject: hibernate-resume-generator: don't initiate resume if soft-rebooted X-Git-Tag: v257-rc1~227^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=70ae9dc4f66aa6d0ee4d487f65bc2fdf0027cc4b;p=thirdparty%2Fsystemd.git hibernate-resume-generator: don't initiate resume if soft-rebooted This is just paranoia, to ensure that we don't accidentally initiate resume if the initrd is entered through soft-reboot rather than the initial one for booting up. --- diff --git a/src/hibernate-resume/hibernate-resume-generator.c b/src/hibernate-resume/hibernate-resume-generator.c index 01684283942..2b175342c14 100644 --- a/src/hibernate-resume/hibernate-resume-generator.c +++ b/src/hibernate-resume/hibernate-resume-generator.c @@ -107,6 +107,11 @@ static int run(const char *dest, const char *dest_early, const char *dest_late) return 0; } + if (generator_soft_rebooted()) { + log_debug("Running in an initrd entered through soft-reboot, not initiating resume."); + return 0; + } + r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, 0); if (r < 0) log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m"); diff --git a/src/shared/generator.c b/src/shared/generator.c index bff44cfc15d..b3e57770aa7 100644 --- a/src/shared/generator.c +++ b/src/shared/generator.c @@ -16,6 +16,7 @@ #include "macro.h" #include "mkdir-label.h" #include "mountpoint-util.h" +#include "parse-util.h" #include "path-util.h" #include "process-util.h" #include "special.h" @@ -974,3 +975,25 @@ void log_setup_generator(void) { log_parse_environment(); log_open(); } + +bool generator_soft_rebooted(void) { + static int cached = -1; + int r; + + if (cached >= 0) + return cached; + + const char *e = secure_getenv("SYSTEMD_SOFT_REBOOTS_COUNT"); + if (!e) + return (cached = false); + + unsigned u; + + r = safe_atou(e, &u); + if (r < 0) { + log_debug_errno(r, "Failed to parse $SYSTEMD_SOFT_REBOOTS_COUNT, assuming the system hasn't soft-rebooted: %m"); + return (cached = false); + } + + return (cached = u > 0); +} diff --git a/src/shared/generator.h b/src/shared/generator.h index baf1dafca3f..f07d7d6b3ae 100644 --- a/src/shared/generator.h +++ b/src/shared/generator.h @@ -100,6 +100,8 @@ int generator_enable_remount_fs_service(const char *dir); void log_setup_generator(void); +bool generator_soft_rebooted(void); + /* Similar to DEFINE_MAIN_FUNCTION, but initializes logging and assigns positional arguments. */ #define DEFINE_MAIN_GENERATOR_FUNCTION(impl) \ _DEFINE_MAIN_FUNCTION( \