[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#409622: os-prober unmounts partitions unnecessarily (linux-boot-prober)



Package: os-prober
Version: 1.14
Severity: wishlist

linux-boot-prober unmounts mounted partitions unnecessarily when run
with the '-mounted' parameter. I'd already spoken to someone on the
d-i list(i can't find that thread now), and was asked to submit the
patch through the BTS. I've attached the patch to 50mounted-tests.
I've tested the patch and it works well on my system.

Thank You
--
The Abattoir
--- 50mounted-tests.new	2007-02-04 21:06:31.000000000 +0800
+++ 50mounted-tests.orig	2006-12-19 21:35:56.000000000 +0800
@@ -19,73 +19,67 @@
 	done
 }
 
-rootmounted=""
+tmpmnt=/var/lib/os-prober/mount
+if [ ! -d $tmpmnt ]; then
+	mkdir $tmpmnt
+fi
 
-# If DO_MOUNTED is set, process already mounted partitions from their current mountpoint
-mnt=$(mount |grep "$partition "|cut -d' ' -f 3)
-if [ -n "$DO_MOUNTED" ] && [ -n "$mnt" ]; then
-	rootmounted=1
-elif [ ! -n  "$DO_MOUNTED" ]; then
-	mnt=/var/lib/os-prober/mount
-	if [ ! -d $mnt ]; then
-		mkdir $mnt
-	fi
+# If DO_MOUNTED is set, also process already mounted partitions by temporarily
+# unmounting them.
+oldmnt=$(mount |grep "$partition "|cut -d' ' -f 3)
+if [ -n "$DO_MOUNTED" ] && [ -n "$oldmnt" ]; then
+	oldopts=$(mount |grep "$partition "|sed 's/.*(\(.*\)).*/\1/')
+	umount $partition
 fi
 
 for type in $(grep -v nodev /proc/filesystems); do
-	if [ ! -n "$DO_MOUNTED" ]; then
-		if mount -o ro -t $type $partition $mnt 2>/dev/null; then
-			rootmounted=1
-		else
-			error "failed to mount $partition"
-		fi
-	fi
-	if [ "$rootmounted" ]; then
+	if mount -o ro -t $type $partition $tmpmnt 2>/dev/null; then
 		bootpart=""
-		if [ -e "$mnt/etc/fstab" ]; then
+		if [ -e "$tmpmnt/etc/fstab" ]; then
 			# Try to mount any /boot partition.
-			bootmnt=$(parsefstab < $mnt/etc/fstab | grep " /boot ") || true
+			bootmnt=$(parsefstab < $tmpmnt/etc/fstab | grep " /boot ") || true
 			if [ -n "$bootmnt" ]; then
 				set -- $bootmnt
 				boottomnt=""
-				bootmounted=""
+				mounted=""
 				if [ -e "$1" ]; then
 					bootpart="$1"
 					boottomnt="$1"
-				elif [ -e "$mnt/$1" ]; then
+				elif [ -e "$tmpmnt/$1" ]; then
 					bootpart="$1"
-					boottomnt="$mnt/$1"
+					boottomnt="$tmpmnt/$1"
 				elif [ -e "/target/$1" ]; then
 					bootpart="$1"
 					boottomnt="/target/$1"
 				elif echo "$1" | grep -q "LABEL="; then
 					debug "mounting boot partition by label for linux system on $partition: $1"
 					label=$(echo "$1" | cut -d = -f 2)
-					if /target/bin/mount -L "$label" -o ro $mnt/boot -t "$3"; then
-						bootmounted=1
-						bootpart=$(mount | grep $mnt/boot | cut -d " " -f 1)
+					if /target/bin/mount -L "$label" -o ro $tmpmnt/boot -t "$3"; then
+						mounted=1
+						bootpart=$(mount | grep $tmpmnt/boot | cut -d " " -f 1)
 					else
 						error "failed to mount by label"
 					fi
 				elif echo "$1" | grep -q "UUID="; then
 					debug "mounting boot partition by UUID for linux system on $partition: $1"
 					uuid=$(echo "$1" | cut -d = -f 2)
-					if /target/bin/mount -U "$uuid" -o ro $mnt/boot -t "$3"; then
-						bootmounted=1
-						bootpart=$(mount | grep $mnt/boot | cut -d " " -f 1)
+					if /target/bin/mount -U "$uuid" -o ro $tmpmnt/boot -t "$3"; then
+						mounted=1
+						bootpart=$(mount | grep $tmpmnt/boot | cut -d " " -f 1)
 					else
 						error "failed to mount by UUID"
 					fi
 				else
 					bootpart=""
 				fi
-				if [ ! "$bootmounted" ]; then
+
+				if [ ! "$mounted" ]; then
 					if [ -z "$bootpart" ]; then
 						debug "found boot partition $1 for linux system on $partition, but cannot map to existing device"
 					else
 						debug "found boot partition $bootpart for linux system on $partition"
-						if ! mount -o ro "$boottomnt" $mnt/boot -t "$3"; then
-							error "failed to mount $boottomnt on $mnt/boot"
+						if ! mount -o ro "$boottomnt" $tmpmnt/boot -t "$3"; then
+							error "failed to mount $boottomnt on $tmpmnt/boot"
 						fi
 					fi
 				fi
@@ -94,31 +88,34 @@
 		if [ -z "$bootpart" ]; then
 			bootpart="$partition"
 		fi
+		
 		for test in /usr/lib/linux-boot-probes/mounted/*; do
 			if [ -f $test ] && [ -x $test ]; then
-				debug "running $test $partition $bootpart $mnt $type"
-				if $test $partition $bootpart $mnt $type; then
+				debug "running $test $partition $bootpart $tmpmnt $type"
+				if $test $partition $bootpart $tmpmnt $type; then
 					debug "$test succeeded"
-					umount $mnt/boot 2>/dev/null || true 	
-					#umount $mnt
-					if [ ! -n "$DO_MOUNTED" ]; then
-						umount $mnt
-						rmdir $mnt
+					umount $tmpmnt/boot 2>/dev/null || true 	
+					umount $tmpmnt
+					if [ -n "$DO_MOUNTED" ] && [ -n "$oldmnt" ]; then
+						mount $partition $oldmnt -o $oldopts
 					fi
+					rmdir $tmpmnt || true
 					exit 0
 				fi
 			fi
 		done
-
-		umount $mnt/boot 2>/dev/null || true 	
-		#umount $mnt
-		if [ ! -n "$DO_MOUNTED" ]; then
-			umount $mnt
-                        rmdir $mnt || true
+		
+		umount $tmpmnt/boot 2>/dev/null || true 	
+		umount $tmpmnt
+		if [ -n "$DO_MOUNTED" ] && [ -n "$oldmnt" ]; then
+			mount $partition $oldmnt -o $oldopts
 		fi
+
 		break
 	fi
 done
 
+rmdir $tmpmnt || true
+
 # No tests found anything.
-exit 1
\ No newline at end of file
+exit 1

Reply to: