summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--man/systemd.mount.xml37
-rw-r--r--man/systemd.swap.xml40
-rw-r--r--src/core/swap.c16
-rw-r--r--src/fstab-generator/fstab-generator.c27
4 files changed, 70 insertions, 50 deletions
diff --git a/man/systemd.mount.xml b/man/systemd.mount.xml
index ba841c3bab..6d8eae6a93 100644
--- a/man/systemd.mount.xml
+++ b/man/systemd.mount.xml
@@ -124,7 +124,7 @@
</refsect1>
<refsect1>
- <title><filename>/etc/fstab</filename></title>
+ <title><filename>fstab</filename></title>
<para>Mount units may either be configured via unit
files, or via <filename>/etc/fstab</filename> (see
@@ -142,8 +142,7 @@
<para>When reading <filename>/etc/fstab</filename> a
few special mount options are understood by systemd
which influence how dependencies are created for mount
- points from <filename>/etc/fstab</filename>. systemd
- will create a dependency of type
+ points. systemd will create a dependency of type
<option>Wants</option> or <option>Requires</option>
(see option <option>nofail</option> below), from
either <filename>local-fs.target</filename> or
@@ -181,26 +180,13 @@
</varlistentry>
<varlistentry>
- <term><option>nofail</option></term>
- <term><option>fail</option></term>
-
- <listitem><para>With <option>nofail</option> this
- mount will be only wanted, not required, by the
- <filename>local-fs.target</filename>. This means
- that the boot will continue even if this mount
- point is not mounted successfully. Option
- <option>fail</option> has the opposite meaning and
- is the default.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
<term><option>noauto</option></term>
<term><option>auto</option></term>
<listitem><para>With <option>noauto</option>, this
mount will not be added as a dependency for
- <filename>local-fs.target</filename>. This means
+ <filename>local-fs.target</filename> or
+ <filename>remote-fs.target</filename>. This means
that it will not be mounted automatically during
boot, unless it is pulled in by some other
unit. Option <option>auto</option> has the
@@ -209,6 +195,21 @@
</varlistentry>
<varlistentry>
+ <term><option>nofail</option></term>
+ <term><option>fail</option></term>
+
+ <listitem><para>With <option>nofail</option> this
+ mount will be only wanted, not required, by
+ <filename>local-fs.target</filename> or
+ <filename>remote-fs.target</filename>. This means
+ that the boot will continue even if this mount
+ point is not mounted successfully. Option
+ <option>fail</option> has the opposite meaning and
+ is the default.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><option>x-initrd.mount</option></term>
<listitem><para>An additional filesystem to be
diff --git a/man/systemd.swap.xml b/man/systemd.swap.xml
index 44c16e7bcc..1155758e28 100644
--- a/man/systemd.swap.xml
+++ b/man/systemd.swap.xml
@@ -117,12 +117,40 @@
<filename>/etc/fstab</filename> and a unit file, the
configuration in the latter takes precedence.</para>
- <para>Unless the <option>noauto</option> option is set
- for them all swap units configured in
- <filename>/etc/fstab</filename> are also added as
- requirements to <filename>swap.target</filename>, so
- that they are waited for and activated during
- boot.</para>
+ <para>When reading <filename>/etc/fstab</filename> a
+ few special options are understood by systemd which
+ influence how dependencies are created for swap
+ units.</para>
+
+ <variablelist class='fstab-options'>
+ <varlistentry>
+ <term><option>noauto</option></term>
+ <term><option>auto</option></term>
+
+ <listitem><para>With <option>noauto</option> the
+ swap unit will not be added as a dependency for
+ <filename>swap.target</filename>. This means that
+ it will not be activated automatically during
+ boot, unless it is pulled in by some other
+ unit. Option <option>auto</option> has the
+ opposite meaning and is the default.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>nofail</option></term>
+ <term><option>fail</option></term>
+
+ <listitem><para>With <option>nofail</option> the
+ swap unit will be only wanted, not required by
+ <filename>swap.target</filename>. This means that
+ the boot will continue even if this swap device is
+ not activated successfully. Option
+ <option>fail</option> has the opposite meaning and
+ is the default.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
</refsect1>
<refsect1>
diff --git a/src/core/swap.c b/src/core/swap.c
index 0a1cc80936..e509a633d0 100644
--- a/src/core/swap.c
+++ b/src/core/swap.c
@@ -209,8 +209,6 @@ static int swap_add_device_links(Swap *s) {
}
static int swap_add_default_dependencies(Swap *s) {
- int r;
-
assert(s);
if (UNIT(s)->manager->running_as != SYSTEMD_SYSTEM)
@@ -219,19 +217,7 @@ static int swap_add_default_dependencies(Swap *s) {
if (detect_container(NULL) > 0)
return 0;
- r = unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true);
- if (r < 0)
- return r;
-
- if (!s->from_fragment)
- /* The swap unit can either be for an alternative device name, in which
- * case we don't need to add the dependency on swap.target because this unit
- * is following a different unit which will have this dependency added,
- * or it can be derived from /proc/swaps, in which case it was started
- * manually, and should not become a dependency of swap.target. */
- return 0;
-
- return unit_add_two_dependencies_by_name_inverse(UNIT(s), UNIT_AFTER, UNIT_REQUIRES, SPECIAL_SWAP_TARGET, NULL, true);
+ return unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true);
}
static int swap_verify(Swap *s) {
diff --git a/src/fstab-generator/fstab-generator.c b/src/fstab-generator/fstab-generator.c
index af45c25400..14e664236e 100644
--- a/src/fstab-generator/fstab-generator.c
+++ b/src/fstab-generator/fstab-generator.c
@@ -74,11 +74,14 @@ static int mount_find_pri(struct mntent *me, int *ret) {
return 1;
}
-static int add_swap(const char *what, struct mntent *me) {
+static int add_swap(
+ const char *what,
+ struct mntent *me,
+ bool noauto,
+ bool nofail) {
+
_cleanup_free_ char *name = NULL, *unit = NULL, *lnk = NULL;
_cleanup_fclose_ FILE *f = NULL;
-
- bool noauto;
int r, pri = -1;
assert(what);
@@ -95,8 +98,6 @@ static int add_swap(const char *what, struct mntent *me) {
return r;
}
- noauto = !!hasmntopt(me, "noauto");
-
name = unit_name_from_path(what, ".swap");
if (!name)
return log_oom();
@@ -143,7 +144,8 @@ static int add_swap(const char *what, struct mntent *me) {
return r;
if (!noauto) {
- lnk = strjoin(arg_dest, "/" SPECIAL_SWAP_TARGET ".wants/", name, NULL);
+ lnk = strjoin(arg_dest, "/" SPECIAL_SWAP_TARGET,
+ nofail ? ".wants/" : ".requires/", name, NULL);
if (!lnk)
return log_oom();
@@ -357,6 +359,7 @@ static int parse_fstab(bool initrd) {
while ((me = getmntent(f))) {
_cleanup_free_ char *where = NULL, *what = NULL;
+ bool noauto, nofail;
int k;
if (initrd && !mount_in_initrd(me))
@@ -378,16 +381,18 @@ static int parse_fstab(bool initrd) {
if (is_path(where))
path_kill_slashes(where);
- log_debug("Found entry what=%s where=%s type=%s", what, where, me->mnt_type);
+ noauto = !!hasmntopt(me, "noauto");
+ nofail = !!hasmntopt(me, "nofail");
+ log_debug("Found entry what=%s where=%s type=%s nofail=%s noauto=%s",
+ what, where, me->mnt_type,
+ yes_no(noauto), yes_no(nofail));
if (streq(me->mnt_type, "swap"))
- k = add_swap(what, me);
+ k = add_swap(what, me, noauto, nofail);
else {
- bool noauto, nofail, automount;
+ bool automount;
const char *post;
- noauto = !!hasmntopt(me, "noauto");
- nofail = !!hasmntopt(me, "nofail");
automount =
hasmntopt(me, "comment=systemd.automount") ||
hasmntopt(me, "x-systemd.automount");