[oe] [PATCH] udev/mount.sh: try to kill active processes before umount

Steffen Sledz sledz at dresearch.de
Tue Jun 22 10:08:49 UTC 2010


* umount will fail if there are processes accessing files at the
  device. Therefor try to kill these processes using fuser if
  available.

Signed-off-by: Steffen Sledz <sledz at dresearch.de>
---
 recipes/udev/files/mount.sh        |   21 ++++++++++++++++++++-
 recipes/udev/files/slugos/mount.sh |   21 ++++++++++++++++++++-
 2 files changed, 40 insertions(+), 2 deletions(-)

diff --git a/recipes/udev/files/mount.sh b/recipes/udev/files/mount.sh
index be8b3df..79c6891 100644
--- a/recipes/udev/files/mount.sh
+++ b/recipes/udev/files/mount.sh
@@ -8,6 +8,7 @@
 MOUNT="/bin/mount"
 PMOUNT="/usr/bin/pmount"
 UMOUNT="/bin/umount"
+FUSER="/usr/bin/fuser"
 name="`basename "$DEVNAME"`"
 
 for line in `cat /etc/udev/mount.blacklist | grep -v ^#`
@@ -64,7 +65,25 @@ fi
 if [ "$ACTION" = "remove" ] && [ -x "$UMOUNT" ] && [ -n "$DEVNAME" ]; then
 	for mnt in `cat /proc/mounts | grep "$DEVNAME" | cut -f 2 -d " " `
 	do
-		$UMOUNT $mnt
+		if [ -x "$FUSER" ]; then
+			$FUSER -k -KILL -m $mnt
+			for try in `seq 10`
+			do
+				$FUSER -m $mnt || break
+				sleep 1
+				logger "mount.sh/automount" "$try secs waited for processes active at $mnt to finish on SIGKILL"
+			done
+
+			if $FUSER -m $mnt 
+			then
+				logger "mount.sh/automount" "Could not kill all processes using files at $mnt, try forced umount"
+				$UMOUNT -f $mnt
+			else
+				$UMOUNT $mnt
+			fi
+		else
+			$UMOUNT $mnt
+		fi
 	done
 	
 	# Remove empty directories from auto-mounter
diff --git a/recipes/udev/files/slugos/mount.sh b/recipes/udev/files/slugos/mount.sh
index 0990a7e..f67c3ff 100644
--- a/recipes/udev/files/slugos/mount.sh
+++ b/recipes/udev/files/slugos/mount.sh
@@ -8,6 +8,7 @@
 MOUNT="/bin/mount"
 PMOUNT="/usr/bin/pmount"
 UMOUNT="/bin/umount"
+FUSER="/usr/bin/fuser"
 name="`basename "$DEVNAME"`"
 
 if ( blkid "$DEVNAME" | grep -q 'TYPE="mdraid"' )
@@ -75,7 +76,25 @@ fi
 if [ "$ACTION" = "remove" ] && [ -x "$UMOUNT" ] && [ -n "$DEVNAME" ]; then
 	for mnt in `cat /proc/mounts | grep "$DEVNAME" | cut -f 2 -d " " `
 	do
-		$UMOUNT $mnt
+		if [ -x "$FUSER" ]; then
+			$FUSER -k -KILL -m $mnt
+			for try in `seq 10`
+			do
+				$FUSER -m $mnt || break
+				sleep 1
+				logger "mount.sh/automount" "$try secs waited for processes active at $mnt to finish on SIGKILL"
+			done
+
+			if $FUSER -m $mnt 
+			then
+				logger "mount.sh/automount" "Could not kill all processes using files at $mnt, try forced umount"
+				$UMOUNT -f $mnt
+			else
+				$UMOUNT $mnt
+			fi
+		else
+			$UMOUNT $mnt
+		fi
 	done
 	
 	# Remove empty directories from auto-mounter
-- 
1.6.4.2





More information about the Openembedded-devel mailing list