]> sourceware.org Git - lvm2.git/commitdiff
blkdeactivate: add support for bind mounts
authorPeter Rajnoha <prajnoha@redhat.com>
Tue, 13 Aug 2013 15:26:36 +0000 (17:26 +0200)
committerPeter Rajnoha <prajnoha@redhat.com>
Tue, 13 Aug 2013 15:51:40 +0000 (17:51 +0200)
Recent version of util-linux/umount (v2.23+) provides
umount --all-targets that can unmount all the mount targets of
the same device (the bind mounts). Use this if available when
calling the umount blkdeactivate.

Otherwise, for older versions of util-linux, use findmnt
(that is also a part of the util-linux) to iterate over all
mount targets of the same device - this is the manual way.

WHATS_NEW
scripts/blkdeactivate.sh.in

index dd907265eb1e0461d96ab909f835aca6395a2c40..40e99e6c09f12cfd9f838e4da18765b01d0d7c4f 100644 (file)
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
 Version 2.02.101 - 
 ===================================
+  Add support for bind mounts in blkdeactivate.
   Add blkdeactivate -v/--verbose for debug output from external tools used.
   Add blkdeactivate -e/--errors for error messages from external tools used.
   Suppress messages from external tools called in blkdeactivate by default.
index 48f9fe3bae3f4bcd96a7c193ec5bdb4d37cb00c6..b6d0117b14343cba138c895339db2435a529b8d6 100644 (file)
@@ -36,7 +36,13 @@ UMOUNT="/bin/umount"
 DMSETUP="@sbindir@/dmsetup"
 LVM="@sbindir@/lvm"
 
-UMOUNT_OPTS=""
+if $UMOUNT --help | grep -- "--all-targets" >$DEV_DIR/null; then
+       UMOUNT_OPTS="--all-targets "
+else
+       UMOUNT_OPTS=""
+       FINDMNT="/bin/findmnt -r --noheadings -u -o TARGET"
+       FINDMNT_READ="read -r mnt"
+fi
 DMSETUP_OPTS=""
 LVM_OPTS=""
 
@@ -132,10 +138,8 @@ is_top_level_device() {
        test -z "$files"
 }
 
-device_umount () {
-       test -z "$mnt" && return 0;
-
-       test "$devtype" != "lvm" && test "${kname:0:3}" != "dm-" && return 0
+device_umount_one() {
+       test -z "$mnt" && return 0
 
        if test -z "${SKIP_UMOUNT_LIST["$mnt"]}" -a "$DO_UMOUNT" -eq "1"; then
                echo -n "  [UMOUNT]: unmounting $name ($kname) mounted on $mnt... "
@@ -151,6 +155,22 @@ device_umount () {
        fi
 }
 
+device_umount() {
+       test "$devtype" != "lvm" && test "${kname:0:3}" != "dm-" && return 0
+
+       # FINDMNT is defined only if umount --all-targets is not available.
+       # In that case, read the list of multiple mount points of one device
+       # using FINDMNT and unmount it one by one manually.
+       if test -z "$FINDMNT"; then
+               device_umount_one
+       else
+               while $FINDMNT_READ; do
+                       device_umount_one || return 1
+               done <<< "`$FINDMNT $DEV_DIR/$kname`"
+       fi
+
+}
+
 deactivate_holders () {
        local skip=1; $LSBLK_VARS
 
This page took 0.040446 seconds and 5 git commands to generate.