]> git.ipfire.org Git - thirdparty/dracut.git/commitdiff
90dm: Fixup shutdown script
authorHannes Reinecke <hare@suse.de>
Thu, 25 Aug 2016 07:28:30 +0000 (09:28 +0200)
committerDaniel Molkentin <dmolkentin@suse.com>
Fri, 15 Dec 2017 19:55:23 +0000 (20:55 +0100)
When calling the shutdown script we need to take care of traversing
the device-mapper tables, otherwise we might end up trying to remove
a device-mapper device which still has another one stacked on top
and the removal will fail.

References: bsc#994860

Signed-off-by: Hannes Reinecke <hare@suse.com>
modules.d/90dm/dm-shutdown.sh

index 7e4f4a586a6004ea4ecbeac6bdabd097555cdbc1..4e2e2602c8c43a0c70f4d3436ace4a34c23fd741 100755 (executable)
@@ -1,11 +1,28 @@
 #!/bin/sh
 
+_remove_dm() {
+    local dev=$1
+    local s
+    local devname
+
+    for s in /sys/block/${dev}/holders/dm-* ; do
+        [ -e ${s} ] || continue
+        _remove_dm ${s##*/}
+    done
+    devname=$(cat /sys/block/${dev}/dm/name)
+    dmsetup -v --noudevsync remove "$devname" || return $?
+    return 0
+}
+
 _do_dm_shutdown() {
     local ret=0
     local final=$1
+    local dev
+
     info "Disassembling device-mapper devices"
-    for dev in $(dmsetup info -c --noheadings -o name) ; do
-        dmsetup -v --noudevsync remove "$dev" || ret=$?
+    for dev in /sys/block/dm-* ; do
+        [ -e ${dev} ] || continue
+        _remove_dm ${dev##*/} || ret=$?
     done
     if [ "x$final" != "x" ]; then
         info "dmsetup ls --tree"