[projects/geninitrd] wait for root only if it's not using device mapper

atler atler at pld-linux.org
Thu Dec 11 21:21:42 CET 2025


commit 3a15323cb7b33c41764d121830b51e871b83680d
Author: Jan Palus <atler at pld-linux.org>
Date:   Thu Dec 11 19:58:58 2025 +0100

    wait for root only if it's not using device mapper

 functions | 44 ++++++++++++++++++++++++++++++++++++++++++--
 geninitrd |  2 +-
 2 files changed, 43 insertions(+), 3 deletions(-)
---
diff --git a/functions b/functions
index 5f38115..e656452 100644
--- a/functions
+++ b/functions
@@ -50,6 +50,18 @@ find_devname() {
 	echo $outname
 }
 
+find_dev_major() {
+	local maj_hex
+	maj_hex=$(stat -L -c %t "$1") || return 1
+	echo $((0x$maj_hex))
+}
+
+find_dev_minor() {
+	local min_hex
+	min_hex=$(stat -L -c %T "$1") || return 1
+	echo $((0x$min_hex))
+}
+
 # Find root device from fstab.
 #
 # @param	string	$fstab location of /etc/fstab
@@ -115,6 +127,16 @@ find_root() {
 	return 0
 }
 
+blk_dev_sysfs() {
+	local maj min
+	# /sys/dev available since 2.6.26
+	if [ "$kernel_version_long" -ge "002006026" ]; then
+		maj=$(find_dev_major "$1")
+		min=$(find_dev_minor "$1")
+		echo /sys/dev/block/$maj:$min
+	fi
+}
+
 # resolve /dev/dm-0 to lvm2 node
 # which they got from blkid program fs was specifed as UUID= in fstab
 dm_lvm2_name() {
@@ -131,8 +153,7 @@ dm_lvm2_name() {
 		dm_minor=${node#/dev/dm-}
 		;;
 	/dev/mapper/*)
-		stat=$(stat -L -c %T "$node") || die "stat failed: $node"
-		dm_minor=$((0x$stat))
+		dm_minor=$(find_dev_minor "$node") || die "find_dev_minor failed: $node"
 	;;
 	esac
 
@@ -157,6 +178,25 @@ dm_lvm2_name() {
 	echo $lvm_path
 }
 
+# check if device is device mapper node
+is_dm() {
+	local sysfs
+	# /sys/dev/block/*/dm available since 2.6.29
+	[ "$kernel_version_long" -ge "002006029" ] && sysfs=$(blk_dev_sysfs "$1")
+	if [ -n "$sysfs" ]; then
+		test -e "$sysfs/dm"
+	else
+		case $(readlink -f "$1") in
+		/dev/mapper/*|/dev/dm-[0-9]*)
+			return 0
+			;;
+		*)
+			return 1
+			;;
+		esac
+	fi
+}
+
 # resolve /dev/dm-0, /dev/mapper/name
 # @return	DM name
 dm_name() {
diff --git a/geninitrd b/geninitrd
index fa62d58..b3153a5 100755
--- a/geninitrd
+++ b/geninitrd
@@ -1765,7 +1765,7 @@ else
 	initrd_gen_lvm
 	initrd_gen_bcache
 	initrd_gen_luks
-	echo 'wait_blk_dev "$ROOT"' | add_linuxrc
+	is_dm "$rootdev" || echo 'wait_blk_dev "$ROOT"' | add_linuxrc
 	initrd_gen_blkid
 	initrd_gen_setrootdev
 fi
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/projects/geninitrd.git/commitdiff/ed261c3ecdc4e50c55c1e2adcca5715668e144f0



More information about the pld-cvs-commit mailing list