From mboxrd@z Thu Jan 1 00:00:00 1970 From: Abhijith Das Date: Mon, 3 Aug 2015 15:30:28 -0400 (EDT) Subject: [Cluster-devel] [GFS2 PATCH] gfs2-utils: Fix hang on withdraw Message-ID: <1807895749.3527110.1438630228383.JavaMail.zimbra@redhat.com> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Issuing a withdraw on a gfs2 filesystem causes a hang. When gfs_controld was removed, the userspace functionality that completes a withdraw operation went away. This causes gfs2 kernel to hang waiting for a withdraw completion ack from userspace. This patchset introduces a uevent-based shell script to do the job that gfs_controld used to do on withdraw. An 'offline' uevent triggers the execution of this script. This script suspends the device associated with the filesystem and signals a completed withdraw to the kernel. Resolves: rhbz#1225634 Signed-off-by: Abhi Das --- gfs2/scripts/82-gfs2-withdraw.rules | 2 ++ gfs2/scripts/gfs2_wd_udev.sh | 30 ++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 gfs2/scripts/82-gfs2-withdraw.rules create mode 100755 gfs2/scripts/gfs2_wd_udev.sh diff --git a/gfs2/scripts/82-gfs2-withdraw.rules b/gfs2/scripts/82-gfs2-withdraw.rules new file mode 100644 index 0000000..c1ab02b --- /dev/null +++ b/gfs2/scripts/82-gfs2-withdraw.rules @@ -0,0 +1,2 @@ +SUBSYSTEM=="gfs2", ACTION=="offline", RUN+="/bin/sh /sbin/gfs2_wd_udev.sh" + diff --git a/gfs2/scripts/gfs2_wd_udev.sh b/gfs2/scripts/gfs2_wd_udev.sh new file mode 100755 index 0000000..ac3ce35 --- /dev/null +++ b/gfs2/scripts/gfs2_wd_udev.sh @@ -0,0 +1,30 @@ +#!/bin/sh +# +# Do not run this script manually. This script is called by udev on a gfs2 +# withdraw uevent and is used to complete the withdraw action and notify the +# kernel. +# + +# Sanity checks +if [ "$SUBSYSTEM" != "gfs2" ] || [ "$LOCKPROTO" != "lock_dlm" ] || + [ -z "$DEVPATH" ] || [ "$ACTION" != "offline" ] +then + exit 1 # Nothing to do here +fi + +# Try and suspend the device +SYSFS_TOPDIR="/sys"$DEVPATH +DM_NAME=$(cat "$SYSFS_TOPDIR/device/dm/name") +DM_DEV="/dev/mapper/"$DM_NAME + +if [ -z "$DM_DEV" ] +then + /usr/bin/dmsetup suspend $DM_DEV +fi + +# Signal completion of withdraw +WD_ACK="$SYSFS_TOPDIR/lock_module/withdraw" +if [ -f "$WD_ACK" ] +then + echo "1" > $WD_ACK +fi -- 2.4.3