Mario Limonciello
2018-Mar-30 14:22 UTC
[klibc] [PATCH] resume: Use the kernel API from 4.17 for setting resume offset
The previous API for setting resume offset didn't actually work in the kernel. It silently ignored this part of the string. A new API was introduced under /sys/power/resume_offset specifically for setting this value. https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git/commit/?h=linux-next&id=648464076160ee7a4112d05eea13621790ab9d04 Signed-off-by: Mario Limonciello <mario.limonciello at dell.com> --- usr/kinit/resume/resumelib.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/usr/kinit/resume/resumelib.c b/usr/kinit/resume/resumelib.c index e557b05..5fc2019 100644 --- a/usr/kinit/resume/resumelib.c +++ b/usr/kinit/resume/resumelib.c @@ -45,7 +45,9 @@ int resume(const char *resume_file, unsigned long long resume_offset) { dev_t resume_device; int powerfd = -1; + int offsetfd = -1; char device_string[64]; + char offset_string[64]; int len; resume_device = name_to_dev_t(resume_file); @@ -55,13 +57,23 @@ int resume(const char *resume_file, unsigned long long resume_offset) goto failure; } + /* Write the offset, this won't work on less than 4.17 */ + offsetfd = open("/sys/power/resume_offset", O_WRONLY); + if (offsetfd > 0) { + len = snprintf(offset_string, sizeof offset_string, "%llu", + resume_offset); + if (len >= sizeof offset_string) + goto fail_r; + if (write(offsetfd, offset_string, len) != len) + goto fail_r; + } + if ((powerfd = open("/sys/power/resume", O_WRONLY)) < 0) goto fail_r; len = snprintf(device_string, sizeof device_string, - "%u:%u:%llu", - major(resume_device), minor(resume_device), - resume_offset); + "%u:%u", + major(resume_device), minor(resume_device)); /* This should never happen */ if (len >= sizeof device_string) -- 2.7.4