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)