Signed-off-by: Ben Hutchings <b...@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.
signature.asc
Description: This is a digitally signed message part