From 0e8f09561fd82e6bf17785a2b15d5248f6fcf270 Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Sat, 18 Nov 2023 20:09:23 +0800 Subject: [PATCH] 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 --- src/shared/hibernate-util.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) 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); -- 2.47.3