hibernate-resume: don't wait forever if hibernate info is from EFI

This commit is contained in:
Mike Yuan 2023-12-12 16:20:32 +08:00 committed by Luca Boccassi
parent 2527b725ba
commit 6cfce71b50

View 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);