Gitweb: http://git.kernel.org/?p=linux/kernel/git/davej/dracut.git;a=commit;h=6fa0c3d60b73661645399e370fc035e81bd4ff63 Commit: 6fa0c3d60b73661645399e370fc035e81bd4ff63 Parent: 170b260bd9812de5307f394d030079549d95fc4d Author: Victor Lowther <victor.lowther@xxxxxxxxx> AuthorDate: Fri Feb 13 04:42:25 2009 -0800 Committer: Dave Jones <davej@xxxxxxxxxx> CommitDate: Mon Feb 16 13:56:41 2009 -0500 [PATCH 23/50] Rip out old recursive module loading, replace with something simpler bash allows unlimited recursion and several other tricks to make finding all the dependencies of a kernel module much simpler. This nukes about 130 lines, most of it in dracut-functions. This diff also touches some cleanups made in the inst function. --- dracut | 6 +-- dracut-functions | 205 +++++++++++++----------------------------------------- 2 files changed, 50 insertions(+), 161 deletions(-) diff --git a/dracut b/dracut index 84abdb5..018b5aa 100755 --- a/dracut +++ b/dracut @@ -113,11 +113,7 @@ for d in etc proc sys sysroot dev/pts; do mkdir -p "$initdir/$d"; done # FIXME: hard-coded module list of doom. [[ $modules ]] || modules="=ata =block =drm dm-crypt aes sha256 cbc" -mkdir -p "$initdir/lib/modules/$kernel" -# expand out module deps, etc -for mod in $(resolveAndExpandModules $modules) ; do - installmodule $mod "$initdir" -done +instmod $modules /sbin/depmod -a -b "$initdir" $kernel || { error "\"/sbin/depmod -a $kernel\" failed." diff --git a/dracut-functions b/dracut-functions index 8a237ec..732581e 100755 --- a/dracut-functions +++ b/dracut-functions @@ -62,7 +62,7 @@ get_dso_deps() { } inst() { - if (($# != 2 && $# != 3));then + if (($# != 2 && $# != 3)); then echo "usage: inst <file> <root> [<destination file>]" return 1 fi @@ -70,12 +70,10 @@ inst() { local root="${1%%/}" ; shift local dest="${1##/}" [[ $dest ]] || dest="${file##/}" - mkdir -p "$root/${dest%/*}" - local RET=0 local target="" - [ -L "$file" ] && target=$(readlink "$file") + [[ -L $file ]] && target=$(readlink "$file") if [[ $target && $dest != $target ]]; then if [[ -e $root/$dest ]]; then RET=0 @@ -83,25 +81,22 @@ inst() { ln -sf "$target" "$root/$dest" #inst "$target" "$root" local BASE=${target##*/} - local LIBDIR=`echo "$file" | sed -e 's,\(\(.*\)/\)[^/]\+$,\1,'` + local LIBDIR=$(echo "$file" | sed -e 's,\(\(.*\)/\)[^/]\+$,\1,') if [[ $LIBDIR = $BASE ]]; then - local LIBDIR=`echo "/$dest" | sed -e 's,\(\(.*\)/\)[^/]\+$,\1,'` - fi - - local TLIBDIR=`echo "$target" | sed -e 's,\(^/lib[^/]*\)/.*$,\1/,' \ - -e 's,\(\(.*\)/\)[^/]\+$,\1,'` + local LIBDIR=$(echo "/$dest" | sed -e 's,\(\(.*\)/\)[^/]\+$,\1,') + fi + local TLIBDIR=$(echo "$target" | sed -e 's,\(^/lib[^/]*\)/.*$,\1/,' \ + -e 's,\(\(.*\)/\)[^/]\+$,\1,') if [[ $TLIBDIR = $BASE ]]; then - local TLIBDIR=`echo "/$dest" | sed \ - -e 's,\(^/lib[^/]*\)/.*$,\1/,' \ - -e 's,\(\(.*\)/\)[^/]\+$,\1,'` + local TLIBDIR=$(echo "/$dest" | sed \ + -e 's,\(^/lib[^/]*\)/.*$,\1/,' \ + -e 's,\(\(.*\)/\)[^/]\+$,\1,') fi - inst "$LIBDIR/$BASE" "$root" "$TLIBDIR/$BASE" RET=$? return $RET fi fi - local SHEBANG=$(dd if="$file" bs=2 count=1 2>/dev/null) if [[ $SHEBANG = '#!' ]]; then # We're intentionally not playing the "what did this moron run @@ -111,7 +106,6 @@ inst() { RET=$? return $RET fi - if [[ -e $root/$dest ]]; then RET=0 else @@ -120,162 +114,61 @@ inst() { RET=$? else cp -aL "$file" "$root/$dest" - local DEPS=$(get_dso_deps "$file") if [[ $DEPS ]]; then - IF_dynamic="yes" + for x in $DEPS; do + local TLIBDIR=$(echo "$x" | sed 's,\(/lib[^/]*\)/.*$,\1,') + local BASE=$(basename "$x") + inst "$x" "$root" "$TLIBDIR/$BASE" + done + RET=$? fi - for x in $DEPS ; do - local TLIBDIR=`echo "$x" | sed 's,\(/lib[^/]*\)/.*$,\1,'` - local BASE=`basename "$x"` - inst "$x" "$root" "$TLIBDIR/$BASE" - done - RET=$? - fi + fi fi return $RET } -# module dep finding and installation functions -moduledep() { - MPARGS="" - if [ "$1" == "--ignore-install" ]; then - MPARGS="$MPARGS --ignore-install" - shift - fi - deps="" - deps=$(modprobe $MPARGS --set-version $kernel --show-depends $1 2>/dev/null| awk '/^insmod / { print gensub(".*/","","g",$2) }' | while read foo ; do [ "${foo%%.ko}" != "$1" ] && echo -n "${foo%%.ko} " ; done) -} - -locatemodule() { - MPARGS="" - if [ "$1" == "--ignore-install" ]; then - MPARGS="$MPARGS --ignore-install" - shift - fi - fmPath=$(modprobe $MPARGS --set-version $kernel --show-depends $1 2>/dev/null | awk '/^insmod / { print $2; }' | tail -1) - if [ -n "$fmPath" -a -f "$fmPath" ]; then - return 0 - fi - for modExt in o.gz o ko ; do - for modDir in /lib/modules/$kernel/updates /lib/modules/$kernel ; do - if [ -d $modDir ]; then - fmPath=$(find $modDir -name $1.ko |awk {'print $1; exit;'}) - if [ -n "$fmPath" -a -f "$fmPath" ]; then - return 0 - fi - fi - done +modcat="/lib/modules/$kernel/modules" +instmods() { + local mod mpargs modpath modname cmd + while (($# > 0)); do + mod=${1%.ko} + case $mod in + =ata) instmods $mpargs $(cat "${modcat}.block" |egrep 'ata|ahci');; + =*) instmods $mpargs $(cat "${modcat}.${mod#=}");; + --*) mpargs+=" $mod";; + *) modprobe $mpargs --set-version $kernel --show-depends $mod \ + 2>/dev/null |while read cmd modpath; do + [[ $cmd = insmod ]] || continue + modname=${modpath##*/} + modname=${modname%.ko} + [[ ${mod/-/_} != ${modname/-/_} ]] && { + instmods $mpargs $modname + continue + } + inst "$modpath" "$initdir" "/lib/modules/$kernel/$modname.ko" + done + ;; + esac + shift done - return 1 -} - -resolveAndExpandModules() { - items=$* - - mods=$(expandModules $items) - resdeps mods - echo $resolved -} - -expandModules() { - items=$* - - for m in $items ; do - char=$(echo $m | cut -c1) - if [ $char = '=' ]; then - NAME=$(echo $m | cut -c2-) - if [ "$NAME" = "ata" ]; then - MODS="$MODS $(cat /lib/modules/$kernel/modules.block |egrep '(ata|ahci)' |sed -e 's/.ko//')" - else - # Ignore if group list does not exist - if [ -e /lib/modules/$kernel/modules.$NAME ]; then - MODS="$MODS $(cat /lib/modules/$kernel/modules.$NAME |sed -e 's/.ko//')" - fi - fi - else - MODS="$MODS $m" - fi - done - echo $MODS -} - -installmodule() -{ - MPARGS="" - if [ "$1" == "--ignore-install" ]; then - MPARGS="$MPARGS --ignore-install" - shift - fi - MODULE=$1 - MNTIMAGE=$2 - fmPath="" - locatemodule $MPARGS $MODULE - MODULE=$fmPath - if [ -z "$MODULE" ]; then - return - fi - if [ -x /usr/bin/strip ]; then - /usr/bin/strip -g $MODULE -o $MNTIMAGE/lib/modules/$kernel/$(basename $MODULE) - else - inst "$MODULE" "$MNTIMAGE" "/lib/modules/$kernel/$(basename $MODULE)" - fi - for fw in $(/sbin/modinfo -F firmware $MODULE 2>/dev/null); do + for fw in $(/sbin/modinfo -F firmware $mod 2>/dev/null); do if [ -f /lib/firmware/$fw ]; then - inst "/lib/firmware/$fw" "$MNTIMAGE" "/lib/firmware/$fw" + inst_simple "/lib/firmware/$fw" fi done -} - -# This loops to make sure it resolves dependencies of dependencies of... -resdeps () { - modlist="$1" - - before=1 - after=2 - - items=$(eval echo \${$modlist}) - while [ $before != $after ]; do - before=$(echo $items | wc -c) - list="" - - for i in $items ; do - deps="" - moduledep $i - list="$list $deps" - done - items=$(for n in $items $list; do echo $n; done | sort -u) - after=`echo $items | wc -c` - done - - resolved="$items" -} +} findkeymap () { local MAP=$1 - - if [ ! -f "$MAP" ]; then - MAP=$(find /lib/kbd/keymaps -type f -name $MAP -o -name $MAP.\* | head -n1) - fi - - case " $KEYMAPS " in - *" $MAP "*) - return - ;; - esac - + [[ ! -f $MAP ]] && \ + MAP=$(find /lib/kbd/keymaps -type f -name $MAP -o -name $MAP.\* | head -n1) + [[ " $KEYMAPS " = *" $MAP "* ]] && return KEYMAPS="$KEYMAPS $MAP" - case $MAP in - *.gz) - cmd=zgrep - ;; - *.bz2) - cmd=bzgrep - ;; - *) - cmd=grep - ;; + *.gz) cmd=zgrep;; + *.bz2) cmd=bzgrep;; + *) cmd=grep ;; esac for INCL in $($cmd "^include " $MAP | cut -d' ' -f2 | tr -d '"'); do -- To unsubscribe from this list: send the line "unsubscribe initramfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html