Report "Device-mapper support missing in kernel." as error message
[grml-debootstrap.git] / grml-debootstrap
index 96f4a45..1a3cda5 100755 (executable)
@@ -298,7 +298,13 @@ cleanup() {
 
   if [ -n "${ORIG_TARGET}" ] ; then
     einfo "Removing loopback mount of file ${ORIG_TARGET}."
-    kpartx -d "${ORIG_TARGET}" ; eend $?
+    kpartx -d "${ORIG_TARGET}"
+    # Workaround for a bug in kpartx which doesn't clean up properly,
+    # see Debian Bug #891077 and Github-PR grml/grml-debootstrap#112
+    if dmsetup ls | grep -q "^${LOOP_PART} "; then
+      kpartx -d "/dev/${LOOP_DISK}" >/dev/null
+    fi
+    eend $?
   fi
 }
 
@@ -1387,7 +1393,7 @@ prepare_vm() {
      bailout 1
   fi
 
-  # make sure loop module is present and an usable loop device exists
+  # make sure loop module is present and a usable loop device exists
   modprobe -q loop
   if ! losetup -f >/dev/null 2>&1; then
     eerror "Error finding usable loop device" ; eend 1
@@ -1398,7 +1404,7 @@ prepare_vm() {
   # "Is device-mapper driver missing from kernel? [...]"
   modprobe -q dm-mod
   if ! grep -q 'device-mapper' /proc/misc >/dev/null 2>&1 ; then
-    einfo "Device-mapper support missing in kernel."
+    eerror "Device-mapper support missing in kernel." ; eend 1
     bailout 1
   fi
 
@@ -1428,6 +1434,7 @@ prepare_vm() {
   # hopefully this always works as expected
   LOOP_PART="${DEVINFO##add map }" # 'loop0p1 (254:5): 0 20477 linear 7:0 3'
   LOOP_PART="${LOOP_PART// */}"    # 'loop0p1'
+  LOOP_DISK="${LOOP_PART%p*}"      # 'loop0'
   export TARGET="/dev/mapper/$LOOP_PART" # '/dev/mapper/loop1p1'
 
   if [ -z "$TARGET" ] ; then
@@ -1512,6 +1519,11 @@ fi
   try_umount 3 "${MNTPOINT}"/dev
   umount "${MNTPOINT}"
   kpartx -d "${ORIG_TARGET}" >/dev/null
+  # Workaround for a bug in kpartx which doesn't clean up properly,
+  # see Debian Bug #891077 and Github-PR grml/grml-debootstrap#112
+  if dmsetup ls | grep -q "^${LOOP_PART} "; then
+    kpartx -d "/dev/${LOOP_DISK}" >/dev/null
+  fi
 }
 # }}}