--- /usr/lib/dracut/dracut-functions.orig 2012-02-25 20:28:31.378736079 +0100 +++ /usr/lib/dracut/dracut-functions 2012-02-25 21:53:55.278987278 +0100 @@ -964,6 +964,28 @@ return 0 } +get_kmod_filename_with_deps_recursive() { + local _kmod=$1 _field _value _modpath _dep _deps + shift 1 + modinfo "$@" $_kmod 2>&${_fderr} | ( + while read _field _value ; do + case $_field in + filename:) + _modpath=$_value + ;; + depends:) + _deps=${_value//,/ } + for _dep in $_deps ; do + get_kmod_filename_with_deps_recursive $_dep "$@" + done + ;; + esac + done + echo $_modpath + [[ $_modpath ]] || exit 1 + ) +} + # Do something with all the dependencies of a kernel module. # Note that kernel modules depend on themselves using the technique we use # $1 = function to call for each dependency we find @@ -972,17 +994,13 @@ # rest of args = arguments to modprobe # _fderr specifies FD passed from surrounding scope for_each_kmod_dep() { - local _func=$1 _kmod=$2 _cmd _modpath _options _found=0 + local _func=$1 _kmod=$2 _modpath _found=0 shift 2 - modprobe "$@" --ignore-install --show-depends $_kmod 2>&${_fderr} | ( - while read _cmd _modpath _options; do - [[ $_cmd = insmod ]] || continue - $_func ${_modpath} || exit $? - _found=1 - done - [[ $_found -eq 0 ]] && exit 1 - exit 0 - ) + for _modpath in `get_kmod_filename_with_deps_recursive ${_kmod} "$@"` ; do + $_func ${_modpath} + _found=1 + done + [[ $_found -ne 0 ]] } # filter kernel modules to install certain modules that meet specific