From: Mike Yuan Date: Sat, 18 Nov 2023 12:09:23 +0000 (+0800) Subject: hibernate-util: if asked to bypass space check, accept the case when we X-Git-Tag: v255-rc3~32^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F30074%2Fhead;p=thirdparty%2Fsystemd.git hibernate-util: if asked to bypass space check, accept the case when we have no swap space at all But I shall still recommend https://chrisdown.name/2018/01/02/in-defence-of-swap.html to everyone ;-) Fixes #30083 --- diff --git a/src/shared/hibernate-util.c b/src/shared/hibernate-util.c index d1f74923170..3eb13d48f68 100644 --- a/src/shared/hibernate-util.c +++ b/src/shared/hibernate-util.c @@ -425,10 +425,18 @@ static int get_proc_meminfo_active(unsigned long long *ret) { int hibernation_is_safe(void) { unsigned long long active; uint64_t size, used; - bool resume_set; + bool resume_set, bypass_space_check; int r; + bypass_space_check = getenv_bool("SYSTEMD_BYPASS_HIBERNATION_MEMORY_CHECK") > 0; + r = find_suitable_hibernation_device_full(NULL, &size, &used); + if (r == -ENOSPC && bypass_space_check) + /* If we don't have any available swap space at all, and SYSTEMD_BYPASS_HIBERNATION_MEMORY_CHECK + * is set, skip all remaining checks since we can't do that properly anyway. It is quite + * possible that the user is using a setup similar to #30083. When we actually perform + * hibernation in sleep.c we'll check everything again. */ + return 0; if (r < 0) return r; resume_set = r > 0; @@ -437,7 +445,7 @@ int hibernation_is_safe(void) { return log_debug_errno(SYNTHETIC_ERRNO(ENOTRECOVERABLE), "Not running on EFI and resume= is not set. Hibernation is not safe."); - if (getenv_bool("SYSTEMD_BYPASS_HIBERNATION_MEMORY_CHECK") > 0) + if (bypass_space_check) return true; r = get_proc_meminfo_active(&active);