Systemd mount generator: don't fail keyload from file if already loaded

Previously the generated keyload units for encryption roots with
keylocation=file://* didn't contain the code to detect if the key
was already loaded and would be marked failed in such situations.

Move the code to check whether the key is already loaded
from keylocation=prompt handling to general key loading code.

Reviewed-by: Richard Laager <rlaager@wiktel.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: InsanePrawn <insane.prawny@gmail.com>
Closes #10103
This commit is contained in:
InsanePrawn 2020-03-09 19:09:09 +01:00 committed by GitHub
parent 2b95e91132
commit ff2f960b24
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 11 additions and 7 deletions

View File

@ -151,13 +151,9 @@ process_line() {
else else
keymountdep="RequiresMountsFor='${p_keyloc#file://}'" keymountdep="RequiresMountsFor='${p_keyloc#file://}'"
fi fi
keyloadcmd="@sbindir@/zfs load-key '${dataset}'" keyloadscript="@sbindir@/zfs load-key \"${dataset}\""
elif [ "${p_keyloc}" = "prompt" ] ; then elif [ "${p_keyloc}" = "prompt" ] ; then
keyloadcmd="\ keyloadscript="\
/bin/sh -c '\
set -eu;\
keystatus=\"\$\$(@sbindir@/zfs get -H -o value keystatus \"${dataset}\")\";\
[ \"\$\$keystatus\" = \"unavailable\" ] || exit 0;\
count=0;\ count=0;\
while [ \$\$count -lt 3 ];do\ while [ \$\$count -lt 3 ];do\
systemd-ask-password --id=\"zfs:${dataset}\"\ systemd-ask-password --id=\"zfs:${dataset}\"\
@ -165,11 +161,19 @@ while [ \$\$count -lt 3 ];do\
@sbindir@/zfs load-key \"${dataset}\" && exit 0;\ @sbindir@/zfs load-key \"${dataset}\" && exit 0;\
count=\$\$((count + 1));\ count=\$\$((count + 1));\
done;\ done;\
exit 1'" exit 1"
else else
printf 'zfs-mount-generator: (%s) invalid keylocation\n' \ printf 'zfs-mount-generator: (%s) invalid keylocation\n' \
"${dataset}" >/dev/kmsg "${dataset}" >/dev/kmsg
fi fi
keyloadcmd="\
/bin/sh -c '\
set -eu;\
keystatus=\"\$\$(@sbindir@/zfs get -H -o value keystatus \"${dataset}\")\";\
[ \"\$\$keystatus\" = \"unavailable\" ] || exit 0;\
${keyloadscript}'"
# Generate the key-load .service unit # Generate the key-load .service unit
# #