88 lines
3.3 KiB
Diff
88 lines
3.3 KiB
Diff
|
From c1f9c15f319f7dfb96bcbf2c3cf879f2b4457350 Mon Sep 17 00:00:00 2001
|
||
|
From: Tom Gundersen <teg@jklm.no>
|
||
|
Date: Mon, 16 Sep 2013 01:08:32 +0200
|
||
|
Subject: [PATCH] swap: create .wants symlink to 'auto' swap devices
|
||
|
|
||
|
As we load unit files lazily, we need to make sure something pulls in swap
|
||
|
units that should be started automatically, otherwise the default dependencies
|
||
|
will never be applied.
|
||
|
|
||
|
This partially reinstates code removed in
|
||
|
commit 64347fc2b983f33e7efb0fd2bb44e133fb9f30f4.
|
||
|
|
||
|
Also don't order swap devices after swap.target when they are 'nofail'.
|
||
|
---
|
||
|
src/core/swap.c | 8 ++++++--
|
||
|
src/fstab-generator/fstab-generator.c | 18 ++++++++++++++++--
|
||
|
2 files changed, 22 insertions(+), 4 deletions(-)
|
||
|
|
||
|
diff --git a/src/core/swap.c b/src/core/swap.c
|
||
|
index 3950860..76c7d45 100644
|
||
|
--- a/src/core/swap.c
|
||
|
+++ b/src/core/swap.c
|
||
|
@@ -220,8 +220,12 @@ static int swap_add_default_dependencies(Swap *s) {
|
||
|
}
|
||
|
|
||
|
if (!noauto) {
|
||
|
- r = unit_add_two_dependencies_by_name_inverse(UNIT(s), UNIT_AFTER, (nofail ? UNIT_WANTS : UNIT_REQUIRES),
|
||
|
- SPECIAL_SWAP_TARGET, NULL, true);
|
||
|
+ if (nofail)
|
||
|
+ r = unit_add_dependency_by_name_inverse(UNIT(s),
|
||
|
+ UNIT_WANTS, SPECIAL_SWAP_TARGET, NULL, true);
|
||
|
+ else
|
||
|
+ r = unit_add_two_dependencies_by_name_inverse(UNIT(s),
|
||
|
+ UNIT_AFTER, UNIT_REQUIRES, SPECIAL_SWAP_TARGET, NULL, true);
|
||
|
if (r < 0)
|
||
|
return r;
|
||
|
}
|
||
|
diff --git a/src/fstab-generator/fstab-generator.c b/src/fstab-generator/fstab-generator.c
|
||
|
index 6ebe8aa..b73dfa4 100644
|
||
|
--- a/src/fstab-generator/fstab-generator.c
|
||
|
+++ b/src/fstab-generator/fstab-generator.c
|
||
|
@@ -66,6 +66,7 @@ static int mount_find_pri(struct mntent *me, int *ret) {
|
||
|
static int add_swap(const char *what, struct mntent *me) {
|
||
|
_cleanup_free_ char *name = NULL, *unit = NULL, *lnk = NULL, *device = NULL;
|
||
|
_cleanup_fclose_ FILE *f = NULL;
|
||
|
+ bool noauto;
|
||
|
int r, pri = -1;
|
||
|
|
||
|
assert(what);
|
||
|
@@ -77,6 +78,8 @@ static int add_swap(const char *what, struct mntent *me) {
|
||
|
return pri;
|
||
|
}
|
||
|
|
||
|
+ noauto = !!hasmntopt(me, "noauto");
|
||
|
+
|
||
|
name = unit_name_from_path(what, ".swap");
|
||
|
if (!name)
|
||
|
return log_oom();
|
||
|
@@ -97,8 +100,7 @@ static int add_swap(const char *what, struct mntent *me) {
|
||
|
fprintf(f,
|
||
|
"# Automatically generated by systemd-fstab-generator\n\n"
|
||
|
"[Unit]\n"
|
||
|
- "SourcePath=/etc/fstab\n"
|
||
|
- "\n"
|
||
|
+ "SourcePath=/etc/fstab\n\n"
|
||
|
"[Swap]\n"
|
||
|
"What=%s\n",
|
||
|
what);
|
||
|
@@ -114,6 +116,18 @@ static int add_swap(const char *what, struct mntent *me) {
|
||
|
return -errno;
|
||
|
}
|
||
|
|
||
|
+ if (!noauto) {
|
||
|
+ lnk = strjoin(arg_dest, "/" SPECIAL_SWAP_TARGET ".wants/", name, NULL);
|
||
|
+ if (!lnk)
|
||
|
+ return log_oom();
|
||
|
+
|
||
|
+ mkdir_parents_label(lnk, 0755);
|
||
|
+ if (symlink(unit, lnk) < 0) {
|
||
|
+ log_error("Failed to create symlink %s: %m", lnk);
|
||
|
+ return -errno;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
return 0;
|
||
|
}
|
||
|
|