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

[PATCH initramfs-tools 3/6] hook-functions: Split block device sysfs lookup into a separate function



Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
---
 hook-functions | 208 ++++++++++++++++++++++++++++++---------------------------
 1 file changed, 108 insertions(+), 100 deletions(-)

diff --git a/hook-functions b/hook-functions
index 16a71df..cb34ec2 100644
--- a/hook-functions
+++ b/hook-functions
@@ -227,6 +227,112 @@ sys_walk_mod_add()
 	done
 }
 
+block_dev_mod_add()
+{
+	local block minor dev_node dev_sys_path
+	dev_node="$1"
+
+	# lvm or luks device
+	if [ "${dev_node#/dev/mapper/}" != "${dev_node}" ] \
+		|| [ "${dev_node#/dev/dm-}" != "${dev_node}" ]; then
+		minor=$((0x$(stat --format "%T" ${dev_node}) % 256))
+		block=$(ls -1 /sys/block/dm-${minor}/slaves | head -n 1)
+		# lvm on luks or luks on lvm, possibly lvm snapshots
+		while [ "${block#dm-}" != "${block}" ]; do
+			block=$(ls -1 /sys/block/${block}/slaves | head -n 1)
+		done
+		# lvm on md or luks on md
+		if [ "${block#md}" != "${block}" ]; then
+			block=$(sed -ne 's/multipath/[/' -e 's/linear/[/' -e 's/raid[0-9][0-9]*/[/' -e 's/\([hs]d[a-z][a-z]*\)[0-9][0-9]*/\1/g' -e '/^'${block}' :/s/^[^[]*\[ \([^\[]*\)\[.*$/\1/p' </proc/mdstat)
+		fi
+		# luks or lvm on cciss or ida
+		if [ "${block#cciss}" != "${block}" ] \
+		|| [ "${block#ida}" != "${block}" ]; then
+			block="${block%p*}"
+		else
+			block=${block%%[0-9]*}
+		fi
+	# md device new naming scheme /dev/md/X
+	elif [ "${dev_node#/dev/md/}" != "${dev_node}" ]; then
+		dev_node=${dev_node#/dev/md/}
+		# strip partion number
+		dev_node=${dev_node%%p[0-9]*}
+		# drop the partition number only for sdX and hdX devices
+		# and keep it for other devices like loop#, dm-# devices
+		block=$(sed -ne 's/multipath/[/' -e 's/linear/[/' -e 's/raid[0-9][0-9]*/[/' -e 's/\([hs]d[a-z][a-z]*\)[0-9][0-9]*/\1/g' -e '/^md'$dev_node' :/s/^[^[]*\[ \([^\[]*\)\[.*$/\1/p' </proc/mdstat)
+	# md device /dev/mdX
+	elif [ "${dev_node#/dev/md}" != "${dev_node}" ]; then
+		dev_node=${dev_node#/dev/md}
+		# strip partion number
+		dev_node=${dev_node%%p[0-9]*}
+		# drop the partition number only for sdX and hdX devices
+		# and keep it for other devices like loop#, dm-# devices
+		block=$(sed -ne 's/multipath/[/' -e 's/linear/[/' -e 's/raid[0-9][0-9]*/[/' -e 's/\([hs]d[a-z][a-z]*\)[0-9][0-9]*/\1/g' -e '/^md'$dev_node' :/s/^[^[]*\[ \([^\[]*\)\[.*$/\1/p' </proc/mdstat)
+	# cciss device
+	elif [ "${dev_node#/dev/cciss/}" != "${dev_node}" ]; then
+		block=${dev_node#/dev/cciss/*}
+		block="cciss!${block%p*}"
+	# ida device
+	elif [ "${dev_node#/dev/ida/}" != "${dev_node}" ]; then
+		block=${dev_node#/dev/ida/*}
+		block="ida!${block%p*}"
+	# loop device /dev/loopX
+	elif [ "${dev_node#/dev/loop}" != "${dev_node}" ]; then
+		dev_node=${dev_node#/dev/}
+		block=$(losetup -a \
+			| awk "/${dev_node}/{print substr(\$3, 7, 3); exit}")
+	# Xen virtual device /dev/xvdX
+	elif [ "${dev_node#/dev/xvd}" != "${dev_node}" ]; then
+		block=${dev_node#/dev/}
+		# Xen has a mode where only the individual partitions are
+		# registered with the kernel as well as the usual full disk
+		# with partition table scheme.
+		if [ ! -e /sys/block/${block} ] ; then
+			block=${block%%[0-9]*}
+		fi
+	# mmc device /dev/mmcblkXpX
+	elif [ "${dev_node#/dev/mmcblk}" != "${dev_node}" ]; then
+		block=${dev_node#/dev/}
+		block=${block%%p[0-9]*}
+
+	# nbd device /dev/nbdXpX
+	elif [ "${dev_node#/dev/nbd}" != "${dev_node}" ]; then
+		block=${dev_node#/dev/}
+		block=${block%%p[0-9]*}
+
+	# DAC960 - good old mylex raid - device format /dev/rd/cXdXpX
+	elif [ "${dev_node#/dev/rd/c}" != "${dev_node}" ]; then
+		block="rd!c${dev_node#/dev/rd/c}"
+		block=${block%%p[0-9]*}
+
+	# etherd device
+	elif [ "${dev_node#/dev/etherd/}" != "${dev_node}" ]; then
+		block=${dev_node#/dev/etherd/*}
+		block="etherd!${block%p*}"
+	# i2o raid device
+	elif [ "${dev_node#/dev/i2o/}" != "${dev_node}" ]; then
+		block=${dev_node#/dev/i2o/}
+		block=${block%%[0-9]*}
+		block='i2o!'$block
+	# classical block device
+	else
+		block=${dev_node#/dev/}
+		block=${block%%[0-9]*}
+	fi
+
+	# Error out if /sys lack block dev
+	if [ -z "${block}" ] || [ ! -e /sys/block/${block} ]; then
+		echo "mkinitramfs: for device ${dev_node} missing ${block} /sys/block/ entry" >&2
+		echo "mkinitramfs: workaround is MODULES=most" >&2
+		echo "mkinitramfs: Error please report the bug" >&2
+		exit 1
+	fi
+
+	# sys walk ATA
+	dev_sys_path=$(readlink -f /sys/block/${block}/device)
+	sys_walk_mod_add ${dev_sys_path}
+}
+
 # Copy all loaded or built-in modules matching the given pattern.
 # Pattern mustn't include directory or '.ko' suffix but should use
 # '[-_]' to allow for differences in naming between /sys/module and
@@ -256,7 +362,7 @@ add_loaded_modules()
 # find and only copy modules relevant to a mountpoint
 dep_add_modules_mount()
 {
-	local dir block minor dev_node FSTYPE dev_sys_path
+	local dir dev_node FSTYPE
 	local modules=
 
 	dir="$1"
@@ -349,105 +455,7 @@ dep_add_modules_mount()
 	# Add filesystem
 	modules="$modules ${FSTYPE}"
 
-	# lvm or luks device
-	if [ "${dev_node#/dev/mapper/}" != "${dev_node}" ] \
-		|| [ "${dev_node#/dev/dm-}" != "${dev_node}" ]; then
-		minor=$((0x$(stat --format "%T" ${dev_node}) % 256))
-		block=$(ls -1 /sys/block/dm-${minor}/slaves | head -n 1)
-		# lvm on luks or luks on lvm, possibly lvm snapshots
-		while [ "${block#dm-}" != "${block}" ]; do
-			block=$(ls -1 /sys/block/${block}/slaves | head -n 1)
-		done
-		# lvm on md or luks on md
-		if [ "${block#md}" != "${block}" ]; then
-			block=$(sed -ne 's/multipath/[/' -e 's/linear/[/' -e 's/raid[0-9][0-9]*/[/' -e 's/\([hs]d[a-z][a-z]*\)[0-9][0-9]*/\1/g' -e '/^'${block}' :/s/^[^[]*\[ \([^\[]*\)\[.*$/\1/p' </proc/mdstat)
-		fi
-		# luks or lvm on cciss or ida
-		if [ "${block#cciss}" != "${block}" ] \
-		|| [ "${block#ida}" != "${block}" ]; then
-			block="${block%p*}"
-		else
-			block=${block%%[0-9]*}
-		fi
-	# md device new naming scheme /dev/md/X
-	elif [ "${dev_node#/dev/md/}" != "${dev_node}" ]; then
-		dev_node=${dev_node#/dev/md/}
-		# strip partion number
-		dev_node=${dev_node%%p[0-9]*}
-		# drop the partition number only for sdX and hdX devices
-		# and keep it for other devices like loop#, dm-# devices
-		block=$(sed -ne 's/multipath/[/' -e 's/linear/[/' -e 's/raid[0-9][0-9]*/[/' -e 's/\([hs]d[a-z][a-z]*\)[0-9][0-9]*/\1/g' -e '/^md'$dev_node' :/s/^[^[]*\[ \([^\[]*\)\[.*$/\1/p' </proc/mdstat)
-	# md device /dev/mdX
-	elif [ "${dev_node#/dev/md}" != "${dev_node}" ]; then
-		dev_node=${dev_node#/dev/md}
-		# strip partion number
-		dev_node=${dev_node%%p[0-9]*}
-		# drop the partition number only for sdX and hdX devices
-		# and keep it for other devices like loop#, dm-# devices
-		block=$(sed -ne 's/multipath/[/' -e 's/linear/[/' -e 's/raid[0-9][0-9]*/[/' -e 's/\([hs]d[a-z][a-z]*\)[0-9][0-9]*/\1/g' -e '/^md'$dev_node' :/s/^[^[]*\[ \([^\[]*\)\[.*$/\1/p' </proc/mdstat)
-	# cciss device
-	elif [ "${dev_node#/dev/cciss/}" != "${dev_node}" ]; then
-		block=${dev_node#/dev/cciss/*}
-		block="cciss!${block%p*}"
-	# ida device
-	elif [ "${dev_node#/dev/ida/}" != "${dev_node}" ]; then
-		block=${dev_node#/dev/ida/*}
-		block="ida!${block%p*}"
-	# loop device /dev/loopX
-	elif [ "${dev_node#/dev/loop}" != "${dev_node}" ]; then
-		dev_node=${dev_node#/dev/}
-		block=$(losetup -a \
-			| awk "/${dev_node}/{print substr(\$3, 7, 3); exit}")
-	# Xen virtual device /dev/xvdX
-	elif [ "${dev_node#/dev/xvd}" != "${dev_node}" ]; then
-		block=${dev_node#/dev/}
-		# Xen has a mode where only the individual partitions are
-		# registered with the kernel as well as the usual full disk
-		# with partition table scheme.
-		if [ ! -e /sys/block/${block} ] ; then
-			block=${block%%[0-9]*}
-		fi
-	# mmc device /dev/mmcblkXpX
-	elif [ "${dev_node#/dev/mmcblk}" != "${dev_node}" ]; then
-		block=${dev_node#/dev/}
-		block=${block%%p[0-9]*}
-
-	# nbd device /dev/nbdXpX
-	elif [ "${dev_node#/dev/nbd}" != "${dev_node}" ]; then
-		block=${dev_node#/dev/}
-		block=${block%%p[0-9]*}
-
-	# DAC960 - good old mylex raid - device format /dev/rd/cXdXpX
-	elif [ "${dev_node#/dev/rd/c}" != "${dev_node}" ]; then
-		block="rd!c${dev_node#/dev/rd/c}"
-		block=${block%%p[0-9]*}
-
-	# etherd device
-	elif [ "${dev_node#/dev/etherd/}" != "${dev_node}" ]; then
-		block=${dev_node#/dev/etherd/*}
-		block="etherd!${block%p*}"
-	# i2o raid device
-	elif [ "${dev_node#/dev/i2o/}" != "${dev_node}" ]; then
-		block=${dev_node#/dev/i2o/}
-		block=${block%%[0-9]*}
-		block='i2o!'$block
-	# classical block device
-	else
-		block=${dev_node#/dev/}
-		block=${block%%[0-9]*}
-	fi
-
-	# Error out if /sys lack block dev
-	if [ -z "${block}" ] || [ ! -e /sys/block/${block} ]; then
-		echo "mkinitramfs: for device ${dev_node} missing ${block} /sys/block/ entry" >&2
-		echo "mkinitramfs: workaround is MODULES=most" >&2
-		echo "mkinitramfs: Error please report the bug" >&2
-		exit 1
-	fi
-
-	# sys walk ATA
-	dev_sys_path=$(readlink -f /sys/block/${block}/device)
-	sys_walk_mod_add ${dev_sys_path}
+	block_dev_mod_add "$dev_node"
 
 	# sys walk some important device classes
 	for class in gpio phy regulator; do

-- 
Ben Hutchings
Life would be so much easier if we could look at the source code.

Attachment: signature.asc
Description: This is a digitally signed message part


Reply to: