diff --git a/man/kernel-command-line.xml b/man/kernel-command-line.xml
index 40b7766214d..903ff924f56 100644
--- a/man/kernel-command-line.xml
+++ b/man/kernel-command-line.xml
@@ -402,10 +402,11 @@
resume=
+ resumeflags=
Enables resume from hibernation using the specified
- device. All
+ device and mount options. All
fstab5-like
paths are supported. For details, see
systemd-hibernate-resume-generator8.
diff --git a/man/systemd-hibernate-resume-generator.xml b/man/systemd-hibernate-resume-generator.xml
index ff105d435c3..f532a19a48a 100644
--- a/man/systemd-hibernate-resume-generator.xml
+++ b/man/systemd-hibernate-resume-generator.xml
@@ -55,6 +55,13 @@
supported.
+
+ resumeflags=
+
+ Takes the resume device mount options to
+ use. Defaults rootflags= if not specified.
+
+
noresume
diff --git a/src/hibernate-resume/hibernate-resume-generator.c b/src/hibernate-resume/hibernate-resume-generator.c
index 02eb0c9a519..3f49f564d6d 100644
--- a/src/hibernate-resume/hibernate-resume-generator.c
+++ b/src/hibernate-resume/hibernate-resume-generator.c
@@ -17,9 +17,13 @@
static const char *arg_dest = "/tmp";
static char *arg_resume_device = NULL;
+static char *arg_resume_options = NULL;
+static char *arg_root_options = NULL;
static bool arg_noresume = false;
STATIC_DESTRUCTOR_REGISTER(arg_resume_device, freep);
+STATIC_DESTRUCTOR_REGISTER(arg_resume_options, freep);
+STATIC_DESTRUCTOR_REGISTER(arg_root_options, freep);
static int parse_proc_cmdline_item(const char *key, const char *value, void *data) {
@@ -35,6 +39,22 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat
free_and_replace(arg_resume_device, s);
+ } else if (streq(key, "resumeflags")) {
+
+ if (proc_cmdline_value_missing(key, value))
+ return 0;
+
+ if (!strextend_with_separator(&arg_resume_options, ",", value, NULL))
+ return log_oom();
+
+ } else if (streq(key, "rootflags")) {
+
+ if (proc_cmdline_value_missing(key, value))
+ return 0;
+
+ if (!strextend_with_separator(&arg_root_options, ",", value, NULL))
+ return log_oom();
+
} else if (streq(key, "noresume")) {
if (value) {
log_warning("\"noresume\" kernel command line switch specified with an argument, ignoring.");
@@ -49,6 +69,7 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat
static int process_resume(void) {
_cleanup_free_ char *name = NULL, *lnk = NULL;
+ const char *opts;
int r;
if (!arg_resume_device)
@@ -66,6 +87,15 @@ static int process_resume(void) {
if (symlink(SYSTEM_DATA_UNIT_PATH "/systemd-hibernate-resume@.service", lnk) < 0)
return log_error_errno(errno, "Failed to create symlink %s: %m", lnk);
+ if (arg_resume_options)
+ opts = arg_resume_options;
+ else
+ opts = arg_root_options;
+
+ r = generator_write_timeouts(arg_dest, arg_resume_device, arg_resume_device, opts, NULL);
+ if (r < 0)
+ return r;
+
return 0;
}
diff --git a/test/fuzz/fuzz-unit-file/directives.service b/test/fuzz/fuzz-unit-file/directives.service
index fe6b1be3023..8105d23a47a 100644
--- a/test/fuzz/fuzz-unit-file/directives.service
+++ b/test/fuzz/fuzz-unit-file/directives.service
@@ -290,6 +290,7 @@ rd.udev.event_timeout=
rd.udev.exec_delay=
rd.udev.log_priority=
resume=
+resumeflags=
root=
rootflags=
rootfstype=