From 66a5308d2e8f61093716a076f4386416dc18045c Mon Sep 17 00:00:00 2001 From: Oyvind Albrigtsen Date: Mon, 22 Apr 2024 11:26:09 +0200 Subject: [PATCH] Filesystem: fail when incorrect device mounted on mountpoint, and dont unmount the mountpoint in this case, or if mountpoint set to "/" --- heartbeat/Filesystem | 71 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 58 insertions(+), 13 deletions(-) diff --git a/heartbeat/Filesystem b/heartbeat/Filesystem index e1378f781..cec71f1a6 100755 --- a/heartbeat/Filesystem +++ b/heartbeat/Filesystem @@ -582,10 +582,16 @@ Filesystem_start() fi # See if the device is already mounted. - if Filesystem_status >/dev/null 2>&1 ; then - ocf_log info "Filesystem $MOUNTPOINT is already mounted." - return $OCF_SUCCESS - fi + Filesystem_status + case "$?" in + $OCF_SUCCESS) + ocf_log info "Filesystem $MOUNTPOINT is already mounted." + return $OCF_SUCCESS + ;; + $OCF_ERR_CONFIGURED) + return $OCF_ERR_CONFIGURED + ;; + esac fstype_supported || exit $OCF_ERR_INSTALLED @@ -801,10 +807,42 @@ Filesystem_stop() # Filesystem_status() { - match_string="${TAB}${CANONICALIZED_MOUNTPOINT}${TAB}" - if list_mounts | grep "$match_string" >/dev/null 2>&1; then - rc=$OCF_SUCCESS - msg="$MOUNTPOINT is mounted (running)" + local match_string="${TAB}${CANONICALIZED_MOUNTPOINT}${TAB}" + local mounted_device=$(list_mounts | grep "$match_string" | awk '{print $1}') + + if [ -n "$mounted_device" ]; then + if [ "X$blockdevice" = "Xyes" ]; then + if [ -e "$DEVICE" ] ; then + local canonicalized_device="$(readlink -f "$DEVICE")" + if [ $? -ne 0 ]; then + ocf_exit_reason "Could not canonicalize $DEVICE because readlink failed" + exit $OCF_ERR_GENERIC + fi + else + local canonicalized_device="$DEVICE" + fi + if [ -e "$mounted_device" ] ; then + local canonicalized_mounted_device="$(readlink -f "$mounted_device")" + if [ $? -ne 0 ]; then + ocf_exit_reason "Could not canonicalize $mounted_device because readlink failed" + exit $OCF_ERR_GENERIC + fi + else + local canonicalized_mounted_device="$mounted_device" + fi + if [ "$canonicalized_device" != "$canonicalized_mounted_device" ]; then + if ocf_is_probe || [ "$__OCF_ACTION" = "stop" ]; then + ocf_log debug "Another device ($mounted_device) is already mounted on $MOUNTPOINT" + rc=$OCF_NOT_RUNNING + else + ocf_exit_reason "Another device ($mounted_device) is already mounted on $MOUNTPOINT" + rc=$OCF_ERR_CONFIGURED + fi + fi + else + rc=$OCF_SUCCESS + msg="$MOUNTPOINT is mounted (running)" + fi else rc=$OCF_NOT_RUNNING msg="$MOUNTPOINT is unmounted (stopped)" @@ -1041,9 +1079,18 @@ else else CANONICALIZED_MOUNTPOINT="$MOUNTPOINT" fi - # At this stage, $MOUNTPOINT does not contain trailing "/" unless it is "/" - # TODO: / mounted via Filesystem sounds dangerous. On stop, we'll - # kill the whole system. Is that a good idea? + + if echo "$CANONICALIZED_MOUNTPOINT" | grep -q "^\s*/\s*$"; then + if ocf_is_probe; then + ocf_log debug "/ cannot be managed in a cluster" + exit $OCF_NOT_RUNNING + elif [ "$__OCF_ACTION" = "start" ] || [ "$__OCF_ACTION" = "monitor" ] || [ "$__OCF_ACTION" = "status" ]; then + ocf_exit_reason "/ cannot be managed in a cluster" + exit $OCF_ERR_CONFIGURED + elif [ "$__OCF_ACTION" = "stop" ]; then + exit $OCF_SUCCESS + fi + fi fi # Check to make sure the utilites are found @@ -1124,5 +1171,3 @@ case $OP in ;; esac exit $? - -