--- /usr/share/initramfs-tools/scripts/local-top/lvm2 2009-08-17 19:28:09.000000000 +0200 +++ /usr/share/initramfs-tools/scripts/local-top/lvm2 2010-02-19 23:22:14.000000000 +0100 @@ -45,12 +45,30 @@ eval $(dmsetup splitname --nameprefixes --noheadings --rows "$dev") - if [ "$DM_VG_NAME" ] && [ "$DM_LV_NAME" ]; then - lvm lvchange -aly --ignorelockingfailure "$DM_VG_NAME/$DM_LV_NAME" - rc=$? - if [ $rc = 5 ]; then - echo "Unable to find LVM volume $DM_VG_NAME/$DM_LV_NAME" - fi + # Make sure that we have non-empty volume group and logical volume + if [ -z "$DM_VG_NAME" ] || [ -z "$DM_LV_NAME" ]; then + return 1 + fi + + # If the logical volume hasn't shown up yet, give it a little while + # to deal with LVM on removable devices (inspired from scripts/local) + fulldev="/dev/$DM_VG_NAME/$DM_LV_NAME" + if [ -z "`lvm lvscan -a --ignorelockingfailure |grep $fulldev`" ]; then + # Use default root delay + slumber=$(( ${ROOTDELAY:-180} * 10 )) + + while [ -z "`lvm lvscan -a --ignorelockingfailure |grep $fulldev`" ]; do + /bin/sleep 0.1 + slumber=$(( ${slumber} - 1 )) + [ ${slumber} -gt 0 ] || break + done + fi + + # Activate logical volume + lvm lvchange -aly --ignorelockingfailure "$DM_VG_NAME/$DM_LV_NAME" + rc=$? + if [ $rc = 5 ]; then + echo "Unable to find LVM volume $DM_VG_NAME/$DM_LV_NAME" fi }