[Ocfs2-tools-devel] [PATCH 4/7] o2cb.init: Kill processes using dlmfs during stop
Sunil Mushran
sunil.mushran at oracle.com
Thu Mar 17 17:31:48 PDT 2011
The o2cb init script needs to kill all processes using dlmfs before
shutting down the heartbeat. This patch uses fuser to kill processes
using dlmfs during o2cb stop.
Signed-off-by: Sunil Mushran <sunil.mushran at oracle.com>
---
vendor/common/o2cb.init.sh | 70 +++++++++++++++++++++++++++++++++++--------
1 files changed, 57 insertions(+), 13 deletions(-)
diff --git a/vendor/common/o2cb.init.sh b/vendor/common/o2cb.init.sh
index 4857aff..fdaab31 100644
--- a/vendor/common/o2cb.init.sh
+++ b/vendor/common/o2cb.init.sh
@@ -616,6 +616,19 @@ mount_filesystem()
return 0
}
+o2cbmounts()
+{
+ if [ "$#" != "1" -o -z "$1" ]
+ then
+ echo "o2cbmounts(): Missing arguments" >&2
+ exit 1
+ fi
+
+ FSNAME="$1"
+
+ LC_ALL=C awk -v FSNAME=$FSNAME 'BEGIN {fsname = FSNAME;} $3 == fsname { print $2 }' /proc/mounts
+}
+
#
# unmount_filesystem()
# Unmount a pseudo-filesystem of type $1 from mountpoint $2. It will
@@ -636,14 +649,34 @@ unmount_filesystem()
if check_filesystem "$FSNAME" "$MOUNTPOINT"
then
echo -n "Unmounting ${FSNAME} filesystem: "
- umount $MOUNTPOINT
- RC=$?
- if [ $RC != 0 ]
+ remaining=$(o2cbmounts $FSNAME)
+ sig=
+ retry=3
+ while [ -n "$remaining" -a "$retry" -gt 0 ]
+ do
+ if [ "$retry" -lt 3 ]; then
+ echo -n "Retry unmounting $FSNAME} filesystem: "
+ fi
+
+ umount $MOUNTPOINT
+ RC=$?
+ if_fail $RC
+
+ remaining=$(o2cbmounts $FSNAME)
+ [ -z "$remaining" ] && break
+
+ fuser -km $sig $remaining >/dev/null 2>&1
+ sleep 5
+ retry=$(($retry - 1))
+ sig=-9
+ done
+
+ remaining=$(o2cbmounts $FSNAME)
+ if [ -n "$remaining" ]
then
echo "Unable to unmount ${FSNAME} filesystem" >&2
return 1
fi
- if_fail $RC # For the success string
fi
unload_filesystem "$FSNAME"
@@ -960,15 +993,26 @@ userdlm_status()
#
clean_userdlm_domains()
{
- for domain in $(userdlm_domains)
- do
- domain_path="${DLMFS_DIR}/${domain}"
- magic=$(stat -f --printf="%t" ${domain_path})
- if [ "x$magic" = "x$DLMFS_MAGIC" ]
- then
- rm -rf ${domain_path}
- fi
- done
+ # Cleanup only if mounted
+ magic=$(stat -f --printf="%t" ${DLMFS_DIR})
+ if [ "x$magic" = "x$DLMFS_MAGIC" ]
+ then
+ echo -n "Clean userdlm domains: "
+ # Kill all processes accessing dlmfs
+ fuser -km -9 ${DLMFS_DIR} >/dev/null 2>&1
+
+ # Remove all domains and locks
+ for domain in $(userdlm_domains)
+ do
+ domain_path="${DLMFS_DIR}/${domain}"
+ magic=$(stat -f --printf="%t" ${domain_path})
+ if [ "x$magic" = "x$DLMFS_MAGIC" ]
+ then
+ rm -rf ${domain_path}
+ fi
+ done
+ echo "OK"
+ fi
}
#
--
1.7.1
More information about the Ocfs2-tools-devel
mailing list