]> git.ipfire.org Git - thirdparty/systemd.git/blobdiff - src/hibernate-resume/hibernate-resume-generator.c
hibernate-resume: don't wait forever if hibernate info is from EFI
[thirdparty/systemd.git] / src / hibernate-resume / hibernate-resume-generator.c
index c1c21a2c13d0d2503c9c5d821a53ce831ac84838..01684283942f902cf074b0e0b30a8ac814d21d5b 100644 (file)
@@ -54,26 +54,30 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat
         return 0;
 }
 
-static int process_resume(const char *device) {
+static int process_resume(const HibernateInfo *info) {
         _cleanup_free_ char *device_unit = NULL;
         int r;
 
-        assert(device);
+        assert(info);
 
-        r = unit_name_from_path(device, ".device", &device_unit);
+        r = unit_name_from_path(info->device, ".device", &device_unit);
         if (r < 0)
-                return log_error_errno(r, "Failed to generate device unit name from path '%s': %m", device);
+                return log_error_errno(r, "Failed to generate device unit name from path '%s': %m", info->device);
 
-        r = write_drop_in(arg_dest, device_unit, 40, "device-timeout",
-                          "# Automatically generated by systemd-hibernate-resume-generator\n\n"
-                          "[Unit]\n"
-                          "JobTimeoutSec=infinity\n");
+        /* If hibernate info is acquired from EFI variable, don't wait forever by default. Otherwise, if
+         * swap device is not present and HibernateLocation was not correctly cleared, we end up blocking
+         * the boot process infinitely. */
+        r = write_drop_in_format(arg_dest, device_unit, 40, "device-timeout",
+                                 "# Automatically generated by systemd-hibernate-resume-generator\n\n"
+                                 "[Unit]\n"
+                                 "JobTimeoutSec=%s\n",
+                                 info->cmdline ? "infinity" : "2min");
         if (r < 0)
                 log_warning_errno(r, "Failed to write device timeout drop-in, ignoring: %m");
 
         r = generator_write_timeouts(arg_dest,
-                                     device,
-                                     device,
+                                     info->device,
+                                     info->device,
                                      arg_resume_options ?: arg_root_options,
                                      NULL);
         if (r < 0)
@@ -120,7 +124,7 @@ static int run(const char *dest, const char *dest_early, const char *dest_late)
         if (r < 0)
                 return r;
 
-        return process_resume(info.device);
+        return process_resume(&info);
 }
 
 DEFINE_MAIN_GENERATOR_FUNCTION(run);