summaryrefslogtreecommitdiffstats
path: root/modules.d/90dm/dm-shutdown.sh
diff options
context:
space:
mode:
Diffstat (limited to 'modules.d/90dm/dm-shutdown.sh')
-rwxr-xr-xmodules.d/90dm/dm-shutdown.sh53
1 files changed, 53 insertions, 0 deletions
diff --git a/modules.d/90dm/dm-shutdown.sh b/modules.d/90dm/dm-shutdown.sh
new file mode 100755
index 0000000..bd7134a
--- /dev/null
+++ b/modules.d/90dm/dm-shutdown.sh
@@ -0,0 +1,53 @@
+#!/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
+ # multipath devices might have MD devices on top,
+ # which are removed after this script. So do not
+ # remove those to avoid spurious errors
+ case $(cat /sys/block/"${dev}"/dm/uuid) in
+ mpath-*)
+ return 0
+ ;;
+ *)
+ read -r devname < /sys/block/"${dev}"/dm/name
+ dmsetup -v --noudevsync remove "$devname" || return $?
+ ;;
+ esac
+ return 0
+}
+
+_do_dm_shutdown() {
+ local ret=0
+ local final="$1"
+ local dev
+
+ info "Disassembling device-mapper devices"
+ for dev in /sys/block/dm-*; do
+ [ -e "${dev}" ] || continue
+ if [ "x$final" != "x" ]; then
+ _remove_dm "${dev##*/}" || ret=$?
+ else
+ _remove_dm "${dev##*/}" > /dev/null 2>&1 || ret=$?
+ fi
+ done
+ if [ "x$final" != "x" ]; then
+ info "dmsetup ls --tree"
+ dmsetup ls --tree 2>&1 | vinfo
+ fi
+ return $ret
+}
+
+if command -v dmsetup > /dev/null \
+ && [ "x$(dmsetup status)" != "xNo devices found" ]; then
+ _do_dm_shutdown "$1"
+else
+ :
+fi