chiark / gitweb /
swap: create .wants symlink to 'auto' swap devices
authorTom Gundersen <teg@jklm.no>
Sun, 15 Sep 2013 23:08:32 +0000 (01:08 +0200)
committerTom Gundersen <teg@jklm.no>
Sun, 15 Sep 2013 23:11:52 +0000 (01:11 +0200)
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
src/fstab-generator/fstab-generator.c

index 3950860757a3883e6c3e1c0bd70301e2ea977f38..76c7d4500641b9b5cd574b41f3e770bdfe33b9fd 100644 (file)
@@ -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;
         }
index 6ebe8aa67300016a901171f3c52cd89f18df232c..b73dfa4899ee65d137915c8468cbc42cd83dd744 100644 (file)
@@ -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;
 }