]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
hibernate-util: if asked to bypass space check, accept the case when we 30074/head
authorMike Yuan <me@yhndnzj.com>
Sat, 18 Nov 2023 12:09:23 +0000 (20:09 +0800)
committerMike Yuan <me@yhndnzj.com>
Sat, 18 Nov 2023 12:15:42 +0000 (20:15 +0800)
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

index d1f74923170442f89f41cbbc5fe6fd883ed53727..3eb13d48f68897b66a0aa64b5e000239aace5c41 100644 (file)
@@ -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);