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