diff --git a/mkinitrd b/mkinitrd index 5d6fd78..18e8a4c 100755 --- a/mkinitrd +++ b/mkinitrd @@ -543,7 +543,7 @@ findstoragedriver () { continue fi vecho "Looking for driver for device $device" - if [[ "$device" =~ ^dm- ]]; then + if [[ "$device" =~ ^(dm-|mapper/) ]]; then majmin=$(get_numeric_dev dec "/dev/$device") sysfs=$(finddevnoinsys $majmin) handledm $(echo "$majmin" |cut -d : -f 1) $(echo "$majmin" |cut -d : -f 2) @@ -675,9 +675,32 @@ handledm() { findmodule --skiperrors $mod done dmname=$(dmsetup info -j $major -m $minor -c --noheadings -o name) - eval cryptodev${ncryptodevs}='"'/dev/$slavedev $dmname'"' - let ncryptodevs++ - findstoragedriver "$slavedev" + # do the device resolution dance to get /dev/mapper/foo + # since 'lvm lvs' doesn't like dm-X device nodes + if [[ "$slavedev" =~ ^dm- ]]; then + majmin=$(get_numeric_dev dec "/dev/$slavedev") + for dmdev in /dev/mapper/* ; do + dmnum=$(get_numeric_dev dev $dmdev) + if [ $dmnum = $majmin ]; then + slavedev=${dmdev#/dev/} + break + fi + done + fi + + # determine if $slavedev is an LV + # if so, add the device to latecryptodevs + # if not, add the device to cryptodevs + local vg=$(lvshow /dev/$slavedev) + if [ -n "$vg" ]; then + eval latecryptodev${ncryptodevs}='"'/dev/$slavedev $dmname'"' + let nlatecryptodevs++ + else + eval cryptodev${ncryptodevs}='"'/dev/$slavedev $dmname'"' + let ncryptodevs++ + fi + + handlelvordev "/dev/$slavedev" ;; esac done << EOF @@ -1533,7 +1556,7 @@ findkeymap () { done } -if [ $ncryptodevs -ne 0 ]; then +if [ $ncryptodevs -ne 0 -o $nlatecryptodevs -ne 0 ]; then inst /sbin/cryptsetup "$MNTIMAGE" KEYTABLE= @@ -1760,6 +1783,10 @@ if [ -z "$nolvm" -a -n "$vg_list" ]; then emit "lvm vgchange -ay --ignorelockingfailure $vg_list" fi +for cryptdev in ${!latecryptodev@} ; do + emitcrypto `eval echo '$'$cryptdev` +done + if [ -z "$noresume" -a -n "$swsuspdev" ]; then emit "resume $swsuspdev" fi