Browse Source

[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.
master
Victor Lowther 16 years ago committed by Dave Jones
parent
commit
6fa0c3d60b
  1. 6
      dracut
  2. 189
      dracut-functions

6
dracut

@ -113,11 +113,7 @@ for d in etc proc sys sysroot dev/pts; do mkdir -p "$initdir/$d"; done @@ -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."

189
dracut-functions

@ -62,7 +62,7 @@ get_dso_deps() { @@ -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() { @@ -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() { @@ -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,'`
local LIBDIR=$(echo "/$dest" | sed -e 's,\(\(.*\)/\)[^/]\+$,\1,')
fi

local TLIBDIR=`echo "$target" | sed -e 's,\(^/lib[^/]*\)/.*$,\1/,' \
-e 's,\(\(.*\)/\)[^/]\+$,\1,'`
local TLIBDIR=$(echo "$target" | sed -e 's,\(^/lib[^/]*\)/.*$,\1/,' \
-e 's,\(\(.*\)/\)[^/]\+$,\1,')
if [[ $TLIBDIR = $BASE ]]; then
local TLIBDIR=`echo "/$dest" | sed \
local TLIBDIR=$(echo "/$dest" | sed \
-e 's,\(^/lib[^/]*\)/.*$,\1/,' \
-e 's,\(\(.*\)/\)[^/]\+$,\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() { @@ -111,7 +106,6 @@ inst() {
RET=$?
return $RET
fi

if [[ -e $root/$dest ]]; then
RET=0
else
@ -120,162 +114,61 @@ inst() { @@ -120,162 +114,61 @@ inst() {
RET=$?
else
cp -aL "$file" "$root/$dest"

local DEPS=$(get_dso_deps "$file")
if [[ $DEPS ]]; then
IF_dynamic="yes"
fi
for x in $DEPS ; do
local TLIBDIR=`echo "$x" | sed 's,\(/lib[^/]*\)/.*$,\1,'`
local BASE=`basename "$x"`
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
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
done
return 1
}

resolveAndExpandModules() {
items=$*

mods=$(expandModules $items)
resdeps mods
echo $resolved
return $RET
}

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
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
echo $MODS
}

installmodule()
{
MPARGS=""
if [ "$1" == "--ignore-install" ]; then
MPARGS="$MPARGS --ignore-install"
;;
esac
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
done
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
[[ ! -f $MAP ]] && \
MAP=$(find /lib/kbd/keymaps -type f -name $MAP -o -name $MAP.\* | head -n1)
fi

case " $KEYMAPS " in
*" $MAP "*)
return
;;
esac

[[ " $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

Loading…
Cancel
Save