Merge with git+ssh://master.kernel.org/pub/scm/libs/klibc/klibc.git
diff --git a/usr/kinit/resume/resume.c b/usr/kinit/resume/resume.c
index 13143c6..80099f9 100644
--- a/usr/kinit/resume/resume.c
+++ b/usr/kinit/resume/resume.c
@@ -11,15 +11,15 @@
static __noreturn usage(void)
{
- fprintf(stderr, "Usage: %s /dev/<resumedevice>\n", progname);
+ fprintf(stderr, "Usage: %s /dev/<resumedevice> [offset]\n", progname);
exit(1);
}
int main(int argc, char *argv[], char *envp[])
{
progname = argv[0];
- if (argc != 2)
+ if (argc < 2 || argc > 3)
usage();
- return resume(argv[1]);
+ return resume(argv[1], (argc > 2) ? strtoull(argv[2], NULL, 0) : 0ULL);
}
diff --git a/usr/kinit/resume/resume.h b/usr/kinit/resume/resume.h
index bf55f1b..5fb929f 100644
--- a/usr/kinit/resume/resume.h
+++ b/usr/kinit/resume/resume.h
@@ -2,6 +2,6 @@
#define RESUME_H
int do_resume(int argc, char *argv[]);
-int resume(const char *resume_file);
+int resume(const char *resume_file, unsigned long long resume_offset);
#endif /* RESUME_H */
diff --git a/usr/kinit/resume/resumelib.c b/usr/kinit/resume/resumelib.c
index f4c5693..12ef984 100644
--- a/usr/kinit/resume/resumelib.c
+++ b/usr/kinit/resume/resumelib.c
@@ -23,6 +23,7 @@
{
const char *resume_file = CONFIG_PM_STD_PARTITION;
const char *resume_arg;
+ unsigned long long resume_offset;
resume_arg = get_arg(argc, argv, "resume=");
resume_file = resume_arg ? resume_arg : resume_file;
@@ -30,15 +31,18 @@
if (!resume_file[0])
return 0;
+ resume_arg = get_arg(argc, argv, "resume_offset=");
+ resume_offset = resume_arg ? strtoull(resume_arg, NULL, 0) : 0ULL;
+
/* Fix: we either should consider reverting the device back to
ordinary swap, or (better) put that code into swapon */
/* Noresume requested */
if (get_flag(argc, argv, "noresume"))
return 0;
- return resume(resume_file);
+ return resume(resume_file, resume_offset);
}
-int resume(const char *resume_file)
+int resume(const char *resume_file, unsigned long long resume_offset)
{
dev_t resume_device;
int powerfd = -1;
@@ -55,8 +59,10 @@
if ((powerfd = open("/sys/power/resume", O_WRONLY)) < 0)
goto fail_r;
- len = snprintf(device_string, sizeof device_string, "%u:%u",
- major(resume_device), minor(resume_device));
+ len = snprintf(device_string, sizeof device_string,
+ "%u:%u:%llu",
+ major(resume_device), minor(resume_device),
+ resume_offset);
/* This should never happen */
if (len >= sizeof device_string)