Merge pull request #30641 from YHNdnzj/hibernation-device

Follow-ups for hibernate-util
This commit is contained in:
Yu Watanabe 2023-12-28 04:09:55 +09:00 committed by GitHub
commit 9e7cd6bed1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 20 additions and 17 deletions

View file

@ -388,12 +388,24 @@ int find_suitable_hibernation_device_full(HibernationDevice *ret_device, uint64_
return log_debug_errno(SYNTHETIC_ERRNO(ENOSPC), "Cannot find swap entry corresponding to /sys/power/resume.");
}
if (ret_device)
if (ret_device) {
char *path;
if (entry->swapfile) {
r = device_path_make_canonical(S_IFBLK, entry->devno, &path);
if (r < 0)
return log_debug_errno(r,
"Failed to format canonical device path for devno '" DEVNUM_FORMAT_STR "': %m",
DEVNUM_FORMAT_VAL(entry->devno));
} else
path = TAKE_PTR(entry->path);
*ret_device = (HibernationDevice) {
.devno = entry->devno,
.offset = entry->offset,
.path = TAKE_PTR(entry->path),
.path = path,
};
}
if (ret_size) {
*ret_size = entry->size;
@ -463,30 +475,23 @@ int hibernation_is_safe(void) {
int write_resume_config(dev_t devno, uint64_t offset, const char *device) {
char offset_str[DECIMAL_STR_MAX(uint64_t)];
_cleanup_free_ char *path = NULL;
const char *devno_str;
int r;
assert(devno > 0);
assert(device);
devno_str = FORMAT_DEVNUM(devno);
xsprintf(offset_str, "%" PRIu64, offset);
if (!device) {
r = device_path_make_canonical(S_IFBLK, devno, &path);
if (r < 0)
return log_error_errno(r,
"Failed to format canonical device path for devno '" DEVNUM_FORMAT_STR "': %m",
DEVNUM_FORMAT_VAL(devno));
device = path;
}
/* We write the offset first since it's safer. Note that this file is only available in 4.17+, so
* fail gracefully if it doesn't exist and we're only overwriting it with 0. */
r = write_string_file("/sys/power/resume_offset", offset_str, WRITE_STRING_FILE_DISABLE_BUFFER);
if (r == -ENOENT) {
if (offset != 0)
return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP),
"Can't configure hibernation offset %" PRIu64 ", kernel does not support /sys/power/resume_offset. Refusing.",
offset);
"Can't configure swap file offset %s, kernel does not support /sys/power/resume_offset. Refusing.",
offset_str);
log_warning_errno(r, "/sys/power/resume_offset is unavailable, skipping writing swap file offset.");
} else if (r < 0)

View file

@ -253,10 +253,8 @@ static int execute(
return r;
r = write_resume_config(hibernation_device.devno, hibernation_device.offset, hibernation_device.path);
if (r < 0) {
log_error_errno(r, "Failed to write hibernation device to /sys/power/resume or /sys/power/resume_offset: %m");
if (r < 0)
goto fail;
}
}
r = write_mode(sleep_config->modes[operation]);