From b9841589cf16950af7d123ecd128b84464d15a1d Mon Sep 17 00:00:00 2001 From: Frederic Crozat Date: Mon, 7 Nov 2011 18:04:20 +0100 Subject: [PATCH] force lvm restart after cryptsetup target is reached --- src/cryptsetup-generator.c | 80 ++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 80 insertions(+), 0 deletions(-) Index: systemd-194/src/cryptsetup/cryptsetup-generator.c =================================================================== --- systemd-194.orig/src/cryptsetup/cryptsetup-generator.c +++ systemd-194/src/cryptsetup/cryptsetup-generator.c @@ -22,6 +22,7 @@ #include #include #include +#include #include "log.h" #include "util.h" @@ -64,6 +65,71 @@ static bool has_option(const char *hayst return false; } +static int create_storage_after_cryptsetup (void) { + int r; + char *to = NULL, *p = NULL; + FILE *f = NULL; + + if (asprintf(&p, "%s/storage-after-cryptsetup.service", arg_dest) < 0) { + r = -ENOMEM; + log_error("Failed to allocate unit file name."); + goto fail; + } + + if (!(f = fopen(p, "wxe"))) { + r = -errno; + log_error("Failed to create unit file: %m"); + goto fail; + } + + fprintf(f, + "[Unit]\n" + "Description=Restart storage after cryptsetup\n" + "DefaultDependencies=no\n" + "After=cryptsetup.target\n" + "Wants=cryptsetup.target\n" + "Before=local-fs.target\n" + "Before=shutdown.target\n"); + + fprintf(f, + "\n[Service]\n" + "RemainAfterExit=true\n" + "Type=oneshot\n" + "TimeoutSec=0\n" + "ExecStart=/bin/systemctl restart lvm.service\n"); + + fflush(f); + + if (ferror(f)) { + r = -errno; + log_error("Failed to write file: %m"); + goto fail; + } + + if (asprintf(&to, "%s/local-fs.target.wants/storage-after-cryptsetup.service", arg_dest) < 0) { + r = -ENOMEM; + goto fail; + } + + mkdir_parents(to, 0755); + + if (symlink("../storage-after-cryptsetup.service", to) < 0) { + log_error("Failed to create symlink ../storage-after-cryptsetup.service to '%s': %m", to); + r = -errno; + goto fail; + } + + r=0; +fail: + free(p); + free(to); + + if (f) + fclose(f); + + return r; +} + static int create_disk( const char *name, const char *device, @@ -439,6 +505,9 @@ int main(int argc, char *argv[]) { free(options); } + if ((r == EXIT_SUCCESS) && (create_storage_after_cryptsetup () < 0)) + r = EXIT_FAILURE; + finish: if (f) fclose(f);