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 Tony Hutter
parent b19477898c
commit 4bc401b30f
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
# #