From ee2deebc855d1db93b89000f3524b4e22e5d0d71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Tue, 5 Sep 2017 11:30:33 +0200 Subject: [PATCH] cryptsetup-generator: use remote-cryptsetup.target when _netdev is present This allows such devices to depend on the network. Their startup will be delayed similarly to network mount units. Fixes #4642. (cherry picked from commit b001ad61e91b6499897f0c977045c7608c233bfa) (cherry picked from commit 8f21747f369f6d88768d1409d95527c60f2cd7c7) --- man/crypttab.xml | 13 +++++++++++++ src/cryptsetup/cryptsetup-generator.c | 30 +++++++++++++++++------------- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/man/crypttab.xml b/man/crypttab.xml index 17976f3704..162377ebc1 100644 --- a/man/crypttab.xml +++ b/man/crypttab.xml @@ -213,6 +213,19 @@ . + + + + Marks this cryptsetup device as requiring network. It will be + started after the network is available, similarly to + systemd.mount5 + units marked with . The service unit to set up this device + will be ordered between remote-cryptsetup-pre.target and + remote-cryptsetup.target, instead of + cryptsetup-pre.target and + cryptsetup.target. + + diff --git a/src/cryptsetup/cryptsetup-generator.c b/src/cryptsetup/cryptsetup-generator.c index f10e9fdc24..7d3f480a2a 100644 --- a/src/cryptsetup/cryptsetup-generator.c +++ b/src/cryptsetup/cryptsetup-generator.c @@ -62,7 +62,7 @@ static int create_disk( *filtered = NULL; _cleanup_fclose_ FILE *f = NULL; const char *dmname; - bool noauto, nofail, tmp, swap; + bool noauto, nofail, tmp, swap, netdev; int r; assert(name); @@ -72,6 +72,7 @@ static int create_disk( nofail = fstab_test_yes_no_option(options, "nofail\0" "fail\0"); tmp = fstab_test_option(options, "tmp\0"); swap = fstab_test_option(options, "swap\0"); + netdev = fstab_test_option(options, "_netdev\0"); if (tmp && swap) { log_error("Device '%s' cannot be both 'tmp' and 'swap'. Ignoring.", name); @@ -102,20 +103,22 @@ static int create_disk( if (!f) return log_error_errno(errno, "Failed to create unit file %s: %m", p); - fputs("# Automatically generated by systemd-cryptsetup-generator\n\n" - "[Unit]\n" - "Description=Cryptography Setup for %I\n" - "Documentation=man:crypttab(5) man:systemd-cryptsetup-generator(8) man:systemd-cryptsetup@.service(8)\n" - "SourcePath=/etc/crypttab\n" - "DefaultDependencies=no\n" - "Conflicts=umount.target\n" - "IgnoreOnIsolate=true\n" - "After=cryptsetup-pre.target\n", - f); + fprintf(f, + "# Automatically generated by systemd-cryptsetup-generator\n\n" + "[Unit]\n" + "Description=Cryptography Setup for %%I\n" + "Documentation=man:crypttab(5) man:systemd-cryptsetup-generator(8) man:systemd-cryptsetup@.service(8)\n" + "SourcePath=/etc/crypttab\n" + "DefaultDependencies=no\n" + "Conflicts=umount.target\n" + "IgnoreOnIsolate=true\n" + "After=%s\n", + netdev ? "remote-cryptsetup-pre.target" : "cryptsetup-pre.target"); if (!nofail) fprintf(f, - "Before=cryptsetup.target\n"); + "Before=%s\n", + netdev ? "remote-cryptsetup.target" : "cryptsetup.target"); if (password) { if (STR_IN_SET(password, "/dev/urandom", "/dev/random", "/dev/hw_random")) @@ -191,7 +194,8 @@ static int create_disk( if (r < 0) return r; - r = generator_add_symlink(arg_dest, "cryptsetup.target", + r = generator_add_symlink(arg_dest, + netdev ? "remote-cryptsetup.target" : "cryptsetup.target", nofail ? "wants" : "requires", n); if (r < 0) return r;