resource-agents/SOURCES/bz1858752-Filesystem-support-whitespace-device-dir.patch

567 lines
18 KiB
Diff
Raw Normal View History

2021-05-14 04:17:31 +00:00
From a8051cf9e21d231ce3c445f09631266157ffc2e0 Mon Sep 17 00:00:00 2001
From: Reid wahl <nrwahl@protonmail.com>
Date: Fri, 10 Jul 2020 03:44:18 -0700
Subject: [PATCH 1/3] Filesystem: Support whitespace in device or directory
name
Whitespace in a device name (e.g., a CIFS share) or a directory name
breaks resource operations.
One issue is that many of the variable occurrences aren't quoted, so a
string containing whitespace is split into multiple tokens. This is a
problem when the string meant to be passed as a single argument to a
function (e.g., `list_submounts()`).
Another issue involves the parsing of `list_mounts()` output.
`list_mounts()` can pull data from `/proc/mounts`, `/etc/mtab`, or the
`mount` command. `/proc/mounts` and `/etc/mtab` represent spaces within
a field as octal `\040` strings, while `mount` represents them as
literal space characters.
`list_mounts()` had to be modified to output the mount list as three
distinct fields ((`device`, `mountpoint`, `fstype`), separated by tab
characters) regardless of the data source. Parsers of `list_mounts()`
were modified to use tabs as field delimiters.
The for loop in `Filesystem_stop()` also had to become a while loop to
read line-by-line irrespective of spaces. A for loop splits on spaces.
Resolves: RHBZ#1624591
---
heartbeat/Filesystem | 106 +++++++++++++++++++++++++------------------
1 file changed, 61 insertions(+), 45 deletions(-)
diff --git a/heartbeat/Filesystem b/heartbeat/Filesystem
index 2f07a90ad..9a52aa712 100755
--- a/heartbeat/Filesystem
+++ b/heartbeat/Filesystem
@@ -91,6 +91,7 @@ fi
# Variables used by multiple methods
HOSTOS=`uname`
+TAB=' '
# The status file is going to an extra directory, by default
#
@@ -100,7 +101,7 @@ suffix="${OCF_RESOURCE_INSTANCE}"
[ "$OCF_RESKEY_CRM_meta_clone" ] &&
suffix="${suffix}_$OCF_RESKEY_CRM_meta_clone"
suffix="${suffix}_`uname -n`"
-STATUSFILE=${OCF_RESKEY_directory}/$prefix$suffix
+STATUSFILE="${OCF_RESKEY_directory}/$prefix$suffix"
#######################################################################
@@ -283,6 +284,7 @@ flushbufs() {
is_bind_mount() {
echo "$options" | grep -w bind >/dev/null 2>&1
}
+
list_mounts() {
local inpf=""
local mount_list=""
@@ -296,15 +298,23 @@ list_mounts() {
# Make sure that the mount list has not been changed while reading.
while [ "$mount_list" != "$check_list" ]; do
- check_list=$mount_list
+ check_list="$mount_list"
if [ "$inpf" ]; then
- mount_list=$(cut -d' ' -f1,2,3 < $inpf)
+ # <device> <mountpoint> <fstype> ...
+ # Spaces in device or mountpoint are octal \040 in $inpf
+ # Convert literal spaces (field separators) to tabs
+ mount_list=$(cut -d' ' -f1,2,3 < $inpf | tr ' ' "$TAB")
else
- mount_list=$($MOUNT | cut -d' ' -f1,3,5)
+ # <device> on <mountpoint> type <fstype> ...
+ # Use tabs as field separators
+ match_string='\(.*\) on \(.*\) type \([^[:space:]]\)'
+ replace_string="\\1${TAB}\\3${TAB}\\5"
+ mount_list=$($MOUNT | sed "s/$match_string/$replace_string/g")
fi
done
- echo "$mount_list"
+ # Convert octal \040 to space characters
+ printf "$mount_list"
}
determine_blockdevice() {
@@ -318,7 +328,8 @@ determine_blockdevice() {
nfs4|nfs|smbfs|cifs|glusterfs|ceph|tmpfs|overlay|overlayfs|rozofs|zfs|cvfs|none|lustre)
: ;;
*)
- DEVICE=`list_mounts | grep " $CANONICALIZED_MOUNTPOINT " | cut -d' ' -f1`
+ match_string="${TAB}${CANONICALIZED_MOUNTPOINT}${TAB}"
+ DEVICE=`list_mounts | grep "$match_string" | cut -d"$TAB" -f1`
if [ -b "$DEVICE" ]; then
blockdevice=yes
fi
@@ -329,7 +340,7 @@ determine_blockdevice() {
# Lists all filesystems potentially mounted under a given path,
# excluding the path itself.
list_submounts() {
- list_mounts | grep " $1/" | cut -d' ' -f2 | sort -r
+ list_mounts | grep "${TAB}${1}/" | cut -d"$TAB" -f2 | sort -r
}
# kernels < 2.6.26 can't handle bind remounts
@@ -358,15 +369,15 @@ bind_mount() {
if is_bind_mount && [ "$options" != "-o bind" ]
then
bind_kernel_check
- bind_opts=`echo $options | sed 's/bind/remount/'`
- $MOUNT $bind_opts $MOUNTPOINT
+ bind_opts=`echo "$options" | sed 's/bind/remount/'`
+ $MOUNT $bind_opts "$MOUNTPOINT"
else
true # make sure to return OK
fi
}
is_option() {
- echo $OCF_RESKEY_options | grep -w "$1" >/dev/null 2>&1
+ echo "$OCF_RESKEY_options" | grep -w "$1" >/dev/null 2>&1
}
is_fsck_needed() {
@@ -374,7 +385,7 @@ is_fsck_needed() {
force) true;;
no) false;;
""|auto)
- case $FSTYPE in
+ case "$FSTYPE" in
ext4|ext4dev|ext3|reiserfs|reiser4|nss|xfs|jfs|vfat|fat|nfs4|nfs|cifs|smbfs|ocfs2|gfs2|none|lustre|glusterfs|ceph|tmpfs|overlay|overlayfs|rozofs|zfs|cvfs)
false;;
*)
@@ -403,7 +414,7 @@ fstype_supported()
fi
# support fuse-filesystems (e.g. GlusterFS)
- case $FSTYPE in
+ case "$FSTYPE" in
fuse.*|glusterfs|rozofs) support="fuse";;
esac
@@ -486,7 +497,8 @@ trigger_udev_rules_if_needed()
Filesystem_start()
{
# Check if there are any mounts mounted under the mountpoint
- if list_mounts | grep -q -E " $CANONICALIZED_MOUNTPOINT/\w+" >/dev/null 2>&1; then
+ match_string="${TAB}${CANONICALIZED_MOUNTPOINT}"
+ if list_mounts | grep -q -E "$match_string/\w+" >/dev/null 2>&1; then
ocf_log err "There is one or more mounts mounted under $MOUNTPOINT."
return $OCF_ERR_CONFIGURED
fi
@@ -514,9 +526,9 @@ Filesystem_start()
if is_fsck_needed; then
ocf_log info "Starting filesystem check on $DEVICE"
if [ -z "$FSTYPE" ]; then
- $FSCK -p $DEVICE
+ $FSCK -p "$DEVICE"
else
- $FSCK -t $FSTYPE -p $DEVICE
+ $FSCK -t "$FSTYPE" -p "$DEVICE"
fi
# NOTE: if any errors at all are detected, it returns non-zero
@@ -529,20 +541,20 @@ Filesystem_start()
fi
[ -d "$MOUNTPOINT" ] ||
- ocf_run mkdir -p $MOUNTPOINT
+ ocf_run mkdir -p "$MOUNTPOINT"
if [ ! -d "$MOUNTPOINT" ] ; then
ocf_exit_reason "Couldn't find directory [$MOUNTPOINT] to use as a mount point"
exit $OCF_ERR_INSTALLED
fi
- flushbufs $DEVICE
+ flushbufs "$DEVICE"
# Mount the filesystem.
case "$FSTYPE" in
- none) $MOUNT $options $DEVICE $MOUNTPOINT &&
+ none) $MOUNT $options "$DEVICE" "$MOUNTPOINT" &&
bind_mount
;;
- "") $MOUNT $options $DEVICE $MOUNTPOINT ;;
- *) $MOUNT -t $FSTYPE $options $DEVICE $MOUNTPOINT ;;
+ "") $MOUNT $options "$DEVICE" "$MOUNTPOINT" ;;
+ *) $MOUNT -t "$FSTYPE" $options "$DEVICE" "$MOUNTPOINT" ;;
esac
if [ $? -ne 0 ]; then
@@ -595,23 +607,23 @@ signal_processes() {
done
}
try_umount() {
- local SUB=$1
- $UMOUNT $umount_force $SUB
- list_mounts | grep -q " $SUB " >/dev/null 2>&1 || {
+ local SUB="$1"
+ $UMOUNT $umount_force "$SUB"
+ list_mounts | grep -q "${TAB}${SUB}${TAB}" >/dev/null 2>&1 || {
ocf_log info "unmounted $SUB successfully"
return $OCF_SUCCESS
}
return $OCF_ERR_GENERIC
}
fs_stop() {
- local SUB=$1 timeout=$2 sig cnt
+ local SUB="$1" timeout=$2 sig cnt
for sig in TERM KILL; do
cnt=$((timeout/2)) # try half time with TERM
while [ $cnt -gt 0 ]; do
- try_umount $SUB &&
+ try_umount "$SUB" &&
return $OCF_SUCCESS
ocf_exit_reason "Couldn't unmount $SUB; trying cleanup with $sig"
- signal_processes $SUB $sig
+ signal_processes "$SUB" $sig
cnt=$((cnt-1))
sleep 1
done
@@ -633,7 +645,7 @@ Filesystem_stop()
# Wipe the status file, but continue with a warning if
# removal fails -- the file system might be read only
if [ $OCF_CHECK_LEVEL -eq 20 ]; then
- rm -f ${STATUSFILE}
+ rm -f "${STATUSFILE}"
if [ $? -ne 0 ]; then
ocf_log warn "Failed to remove status file ${STATUSFILE}."
fi
@@ -650,7 +662,7 @@ Filesystem_stop()
# Umount all sub-filesystems mounted under $MOUNTPOINT/ too.
local timeout
- for SUB in `list_submounts $MOUNTPOINT` $MOUNTPOINT; do
+ while read SUB; do
ocf_log info "Trying to unmount $SUB"
if ocf_is_true "$FAST_STOP"; then
timeout=6
@@ -658,15 +670,18 @@ Filesystem_stop()
timeout=${OCF_RESKEY_CRM_meta_timeout:="20000"}
timeout=$((timeout/1000))
fi
- fs_stop $SUB $timeout
+ fs_stop "$SUB" $timeout
rc=$?
if [ $rc -ne $OCF_SUCCESS ]; then
ocf_exit_reason "Couldn't unmount $SUB, giving up!"
fi
- done
+ done <<-EOF
+ $(list_submounts "$CANONICALIZED_MOUNTPOINT"; \
+ echo $CANONICALIZED_MOUNTPOINT)
+ EOF
fi
- flushbufs $DEVICE
+ flushbufs "$DEVICE"
return $rc
}
@@ -677,7 +692,8 @@ Filesystem_stop()
#
Filesystem_status()
{
- if list_mounts | grep -q " $CANONICALIZED_MOUNTPOINT " >/dev/null 2>&1; then
+ match_string="${TAB}${CANONICALIZED_MOUNTPOINT}${TAB}"
+ if list_mounts | grep -q "$match_string" >/dev/null 2>&1; then
rc=$OCF_SUCCESS
msg="$MOUNTPOINT is mounted (running)"
else
@@ -712,7 +728,7 @@ Filesystem_monitor_10()
return $OCF_SUCCESS
fi
dd_opts="iflag=direct bs=4k count=1"
- err_output=`dd if=$DEVICE $dd_opts 2>&1 >/dev/null`
+ err_output=`dd if="$DEVICE" $dd_opts 2>&1 >/dev/null`
if [ $? -ne 0 ]; then
ocf_exit_reason "Failed to read device $DEVICE"
ocf_log err "dd said: $err_output"
@@ -733,20 +749,20 @@ Filesystem_monitor_20()
# to bypass caches.
dd_opts="oflag=direct,sync bs=4k conv=fsync,sync"
fi
- status_dir=`dirname $STATUSFILE`
+ status_dir=$(dirname "$STATUSFILE")
[ -d "$status_dir" ] || mkdir -p "$status_dir"
- err_output=`echo "${OCF_RESOURCE_INSTANCE}" | dd of=${STATUSFILE} $dd_opts 2>&1`
+ err_output=`echo "${OCF_RESOURCE_INSTANCE}" | dd of="${STATUSFILE}" $dd_opts 2>&1`
if [ $? -ne 0 ]; then
ocf_exit_reason "Failed to write status file ${STATUSFILE}"
ocf_log err "dd said: $err_output"
return $OCF_ERR_GENERIC
fi
- test -f ${STATUSFILE}
+ test -f "${STATUSFILE}"
if [ $? -ne 0 ]; then
ocf_exit_reason "Cannot stat the status file ${STATUSFILE}"
return $OCF_ERR_GENERIC
fi
- cat ${STATUSFILE} > /dev/null
+ cat "${STATUSFILE}" > /dev/null
if [ $? -ne 0 ]; then
ocf_exit_reason "Cannot read the status file ${STATUSFILE}"
return $OCF_ERR_GENERIC
@@ -791,9 +807,9 @@ Filesystem_validate_all()
# NOTE: Without inserting the $FSTYPE module, this step may be imprecise
# TODO: This is Linux specific crap.
if [ ! -z "$FSTYPE" -a "$FSTYPE" != none ]; then
- cut -f2 /proc/filesystems |grep -q ^$FSTYPE$
+ cut -f2 /proc/filesystems |grep -q "^${FSTYPE}$"
if [ $? -ne 0 ]; then
- modpath=/lib/modules/`uname -r`
+ modpath=/lib/modules/`uname -r`
moddep=$modpath/modules.dep
# Do we have $FSTYPE in modules.dep?
cut -d' ' -f1 $moddep |grep -q "^$modpath.*$FSTYPE\.k\?o:$"
@@ -826,7 +842,7 @@ set_blockdevice_var() {
blockdevice=no
# these are definitely not block devices
- case $FSTYPE in
+ case "$FSTYPE" in
nfs4|nfs|smbfs|cifs|none|glusterfs|ceph|tmpfs|overlay|overlayfs|rozofs|zfs|cvfs) return;;
esac
@@ -834,7 +850,7 @@ set_blockdevice_var() {
return
fi
- case $DEVICE in
+ case "$DEVICE" in
-*) # Oh... An option to mount instead... Typically -U or -L
;;
/dev/null) # Special case for BSC
@@ -863,7 +879,7 @@ if [ -n "${OCF_RESKEY_force_unmount}" ]; then
FORCE_UNMOUNT=$OCF_RESKEY_force_unmount
fi
-DEVICE=$OCF_RESKEY_device
+DEVICE="$OCF_RESKEY_device"
FSTYPE=$OCF_RESKEY_fstype
if [ ! -z "$OCF_RESKEY_options" ]; then
options="-o $OCF_RESKEY_options"
@@ -899,10 +915,10 @@ if [ -z "$OCF_RESKEY_directory" ]; then
exit $OCF_ERR_CONFIGURED
fi
else
- MOUNTPOINT=$(echo $OCF_RESKEY_directory | sed 's/\/*$//')
+ MOUNTPOINT="$(echo "$OCF_RESKEY_directory" | sed 's/\/*$//')"
: ${MOUNTPOINT:=/}
if [ -e "$MOUNTPOINT" ] ; then
- CANONICALIZED_MOUNTPOINT=$(readlink -f "$MOUNTPOINT")
+ CANONICALIZED_MOUNTPOINT="$(readlink -f "$MOUNTPOINT")"
if [ $? -ne 0 ]; then
ocf_exit_reason "Could not canonicalize $MOUNTPOINT because readlink failed"
exit $OCF_ERR_GENERIC
@@ -947,7 +963,7 @@ CLUSTERSAFE=0
is_option "ro" &&
CLUSTERSAFE=2
-case $FSTYPE in
+case "$FSTYPE" in
nfs4|nfs|smbfs|cifs|none|gfs2|glusterfs|ceph|ocfs2|overlay|overlayfs|tmpfs|cvfs)
CLUSTERSAFE=1 # this is kind of safe too
;;
From eca9a96ad3356df3636bfa3187afe1b1954693b2 Mon Sep 17 00:00:00 2001
From: Reid wahl <nrwahl@protonmail.com>
Date: Fri, 10 Jul 2020 16:38:04 -0700
Subject: [PATCH 2/3] Filesystem: POSIX-compliant syntax for portability
Updated to use POSIX `$()` instead of Bourne-shell backticks, and to
use `grep ... >/dev/null 2>&1` instead of `grep -q`. (Note: `grep -q`
only suppresses `stdout` anyway. `grep -q -s` would be required to
suppress both `stdout` and `stderr`.)
---
heartbeat/Filesystem | 33 +++++++++++++++++----------------
1 file changed, 17 insertions(+), 16 deletions(-)
diff --git a/heartbeat/Filesystem b/heartbeat/Filesystem
index 9a52aa712..34ade20d7 100755
--- a/heartbeat/Filesystem
+++ b/heartbeat/Filesystem
@@ -90,7 +90,7 @@ fi
: ${OCF_RESKEY_force_unmount=${OCF_RESKEY_force_unmount_default}}
# Variables used by multiple methods
-HOSTOS=`uname`
+HOSTOS=$(uname)
TAB=' '
# The status file is going to an extra directory, by default
@@ -100,7 +100,7 @@ prefix=${OCF_RESKEY_statusfile_prefix}
suffix="${OCF_RESOURCE_INSTANCE}"
[ "$OCF_RESKEY_CRM_meta_clone" ] &&
suffix="${suffix}_$OCF_RESKEY_CRM_meta_clone"
-suffix="${suffix}_`uname -n`"
+suffix="${suffix}_$(uname -n)"
STATUSFILE="${OCF_RESKEY_directory}/$prefix$suffix"
#######################################################################
@@ -329,7 +329,7 @@ determine_blockdevice() {
: ;;
*)
match_string="${TAB}${CANONICALIZED_MOUNTPOINT}${TAB}"
- DEVICE=`list_mounts | grep "$match_string" | cut -d"$TAB" -f1`
+ DEVICE=$(list_mounts | grep "$match_string" | cut -d"$TAB" -f1)
if [ -b "$DEVICE" ]; then
blockdevice=yes
fi
@@ -354,7 +354,7 @@ bind_kernel_check() {
exit(1);
}'
[ $? -ne 0 ] &&
- ocf_log warn "kernel `uname -r` cannot handle read only bind mounts"
+ ocf_log warn "kernel $(uname -r) cannot handle read only bind mounts"
}
bind_root_mount_check() {
@@ -369,7 +369,7 @@ bind_mount() {
if is_bind_mount && [ "$options" != "-o bind" ]
then
bind_kernel_check
- bind_opts=`echo "$options" | sed 's/bind/remount/'`
+ bind_opts=$(echo "$options" | sed 's/bind/remount/')
$MOUNT $bind_opts "$MOUNTPOINT"
else
true # make sure to return OK
@@ -469,7 +469,7 @@ trigger_udev_rules_if_needed()
refresh_flag="yes"
fi
else
- tmp="`echo $DEVICE|awk '{$1=""; print substr($0,2)}'`"
+ tmp="$(echo $DEVICE|awk '{$1=""; print substr($0,2)}')"
case "$DEVICE" in
-U*|--uuid*)
tmp="/dev/disk/by-uuid/$tmp"
@@ -498,7 +498,7 @@ Filesystem_start()
{
# Check if there are any mounts mounted under the mountpoint
match_string="${TAB}${CANONICALIZED_MOUNTPOINT}"
- if list_mounts | grep -q -E "$match_string/\w+" >/dev/null 2>&1; then
+ if list_mounts | grep -E "$match_string/\w+" >/dev/null 2>&1; then
ocf_log err "There is one or more mounts mounted under $MOUNTPOINT."
return $OCF_ERR_CONFIGURED
fi
@@ -602,14 +602,14 @@ signal_processes() {
return
fi
for pid in $pids; do
- ocf_log info "sending signal $sig to: `ps -f $pid | tail -1`"
+ ocf_log info "sending signal $sig to: $(ps -f $pid | tail -1)"
kill -s $sig $pid
done
}
try_umount() {
local SUB="$1"
$UMOUNT $umount_force "$SUB"
- list_mounts | grep -q "${TAB}${SUB}${TAB}" >/dev/null 2>&1 || {
+ list_mounts | grep "${TAB}${SUB}${TAB}" >/dev/null 2>&1 || {
ocf_log info "unmounted $SUB successfully"
return $OCF_SUCCESS
}
@@ -693,7 +693,7 @@ Filesystem_stop()
Filesystem_status()
{
match_string="${TAB}${CANONICALIZED_MOUNTPOINT}${TAB}"
- if list_mounts | grep -q "$match_string" >/dev/null 2>&1; then
+ if list_mounts | grep "$match_string" >/dev/null 2>&1; then
rc=$OCF_SUCCESS
msg="$MOUNTPOINT is mounted (running)"
else
@@ -728,7 +728,7 @@ Filesystem_monitor_10()
return $OCF_SUCCESS
fi
dd_opts="iflag=direct bs=4k count=1"
- err_output=`dd if="$DEVICE" $dd_opts 2>&1 >/dev/null`
+ err_output=$(dd if="$DEVICE" $dd_opts 2>&1 >/dev/null)
if [ $? -ne 0 ]; then
ocf_exit_reason "Failed to read device $DEVICE"
ocf_log err "dd said: $err_output"
@@ -751,7 +751,7 @@ Filesystem_monitor_20()
fi
status_dir=$(dirname "$STATUSFILE")
[ -d "$status_dir" ] || mkdir -p "$status_dir"
- err_output=`echo "${OCF_RESOURCE_INSTANCE}" | dd of="${STATUSFILE}" $dd_opts 2>&1`
+ err_output=$(echo "${OCF_RESOURCE_INSTANCE}" | dd of="${STATUSFILE}" $dd_opts 2>&1)
if [ $? -ne 0 ]; then
ocf_exit_reason "Failed to write status file ${STATUSFILE}"
ocf_log err "dd said: $err_output"
@@ -807,12 +807,13 @@ Filesystem_validate_all()
# NOTE: Without inserting the $FSTYPE module, this step may be imprecise
# TODO: This is Linux specific crap.
if [ ! -z "$FSTYPE" -a "$FSTYPE" != none ]; then
- cut -f2 /proc/filesystems |grep -q "^${FSTYPE}$"
+ cut -f2 /proc/filesystems | grep "^${FSTYPE}$" >/dev/null 2>&1
if [ $? -ne 0 ]; then
- modpath=/lib/modules/`uname -r`
+ modpath=/lib/modules/$(uname -r)
moddep=$modpath/modules.dep
# Do we have $FSTYPE in modules.dep?
- cut -d' ' -f1 $moddep |grep -q "^$modpath.*$FSTYPE\.k\?o:$"
+ cut -d' ' -f1 $moddep \
+ | grep "^${modpath}.*${FSTYPE}\.k\?o:$" >/dev/null 2>&1
if [ $? -ne 0 ]; then
ocf_log info "It seems we do not have $FSTYPE support"
fi
@@ -846,7 +847,7 @@ set_blockdevice_var() {
nfs4|nfs|smbfs|cifs|none|glusterfs|ceph|tmpfs|overlay|overlayfs|rozofs|zfs|cvfs|lustre) return;;
esac
- if `is_option "loop"`; then
+ if $(is_option "loop"); then
return
fi
From 5517712f4bb6e90b23cde6310c03509c9061cb36 Mon Sep 17 00:00:00 2001
From: Reid wahl <nrwahl@protonmail.com>
Date: Fri, 10 Jul 2020 16:44:17 -0700
Subject: [PATCH 3/3] Filesystem: Convert leading space characters to tabs
A few lines started with spaces instead of tabs. Tabs are the
convention in this file.
---
heartbeat/Filesystem | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/heartbeat/Filesystem b/heartbeat/Filesystem
index 34ade20d7..501e5a0d0 100755
--- a/heartbeat/Filesystem
+++ b/heartbeat/Filesystem
@@ -359,10 +359,10 @@ bind_kernel_check() {
bind_root_mount_check() {
if [ "$(df -P "$1" | awk 'END{print $6}')" = "/" ]; then
- return 1
- else
- return 0
- fi
+ return 1
+ else
+ return 0
+ fi
}
bind_mount() {
@@ -571,10 +571,10 @@ get_pids()
local procs
local mmap_procs
- if is_bind_mount && ocf_is_true "$FORCE_UNMOUNT" && ! bind_root_mount_check "$DEVICE"; then
- ocf_log debug "Change force_umount from '$FORCE_UNMOUNT' to 'safe'"
- FORCE_UNMOUNT=safe
- fi
+ if is_bind_mount && ocf_is_true "$FORCE_UNMOUNT" && ! bind_root_mount_check "$DEVICE"; then
+ ocf_log debug "Change force_umount from '$FORCE_UNMOUNT' to 'safe'"
+ FORCE_UNMOUNT=safe
+ fi
if ocf_is_true "$FORCE_UNMOUNT"; then
if [ "X${HOSTOS}" = "XOpenBSD" ];then