Index: systemd-190/src/cryptsetup/cryptsetup-generator.c =================================================================== --- systemd-190.orig/src/cryptsetup/cryptsetup-generator.c +++ systemd-190/src/cryptsetup/cryptsetup-generator.c @@ -136,7 +136,7 @@ static int create_disk( const char *password, const char *options) { - char *p = NULL, *n = NULL, *d = NULL, *u = NULL, *from = NULL, *to = NULL, *e = NULL; + char *p = NULL, *n = NULL, *d = NULL, *u = NULL, *from = NULL, *to = NULL, *e = NULL, *path_file = NULL; int r; FILE *f = NULL; bool noauto, nofail; @@ -168,11 +168,51 @@ static int create_disk( goto fail; } - d = unit_name_from_path(u, ".device"); - if (!d) { - r = -ENOMEM; - log_error("Failed to allocate device name."); - goto fail; + if (!startswith(device,"/dev/")) { + d = unit_name_from_path_instance("cryptsetup", name, ".path"); + if (!d) { + r = -ENOMEM; + log_error("Failed to allocate path name."); + goto fail; + } + + if (asprintf(&path_file, "%s/%s", arg_dest, d) < 0) { + r = -ENOMEM; + log_error("Failed to allocate unit file name."); + goto fail; + } + + f = fopen(path_file, "wxe"); + if (!f) { + r = -errno; + log_error("Failed to create unit file: %m"); + goto fail; + } + + fprintf(f, + "[Unit]\n" + "Description=Cryptography Setup for %s\n" + "DefaultDependencies=no\n" + "[Path]\n" + "PathExists=%s\n", + device, device); + + fflush(f); + + if (ferror(f)) { + r = -errno; + log_error("Failed to write file: %m"); + goto fail; + } + + f = NULL; + } else { + d = unit_name_from_path(u, ".device"); + if (!d) { + r = -ENOMEM; + log_error("Failed to allocate device name."); + goto fail; + } } f = fopen(p, "wxe"); @@ -298,6 +338,7 @@ fail: free(n); free(d); free(e); + free(path_file); free(from); free(to);