From: Cong Wang Date: Tue, 15 May 2012 06:19:56 +0000 (+0800) Subject: check kernel module existance X-Git-Tag: 019~56 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a6d3be9dd5e105c926b753fc3a26f0a91119c2a4;p=thirdparty%2Fdracut.git check kernel module existance This patch adds check of kernel module existance and propagate errors to upper callers. In case of break other callers of instmods(), this patch adds an option '-c' to it, only when "-c" is specified we fail, otherwise, errors are ignored. Reported-by: Dave Young Signed-off-by: Cong Wang Cc: Harald Hoyer --- diff --git a/dracut-functions.sh b/dracut-functions.sh index 8256e023e..4fe428ef0 100755 --- a/dracut-functions.sh +++ b/dracut-functions.sh @@ -1108,17 +1108,22 @@ find_kernel_modules () { find_kernel_modules_by_path drivers } -# instmods [ ... ] -# instmods +# instmods [-c] [ ... ] +# instmods [-c] # install kernel modules along with all their dependencies. # can be e.g. "=block" or "=drivers/usb/storage" instmods() { [[ $no_kernel = yes ]] && return # called [sub]functions inherit _fderr local _fderr=9 + local _check=no + if [[ $1 = '-c' ]]; then + _check=yes + shift + fi function inst1mod() { - local _mod="$1" + local _ret=0 _mod="$1" case $_mod in =*) if [ -f $srcmods/modules.${_mod#=} ]; then @@ -1162,26 +1167,40 @@ instmods() { ((_ret+=$?)) ;; esac + return $_ret } function instmods_1() { - local _ret=0 _mod _mpargs + local _mod _mpargs if (($# == 0)); then # filenames from stdin while read _mod; do - inst1mod "${_mod%.ko*}" + inst1mod "${_mod%.ko*}" || { + if [ "$_check" = "yes" ]; then + dfatal "Failed to install $_mod" + return 1 + fi + } done fi while (($# > 0)); do # filenames as arguments - inst1mod ${1%.ko*} + inst1mod ${1%.ko*} || { + if [ "$_check" = "yes" ]; then + dfatal "Failed to install $1" + return 1 + fi + } shift done - return $_ret + return 0 } - local _filter_not_found='FATAL: Module .* not found.' + local _ret _filter_not_found='FATAL: Module .* not found.' + set -o pipefail # Capture all stderr from modprobe to _fderr. We could use {var}>... # redirections, but that would make dracut require bash4 at least. eval "( instmods_1 \"\$@\" ) ${_fderr}>&1" \ | while read line; do [[ "$line" =~ $_filter_not_found ]] || echo $line;done | derror - return $? + _ret=$? + set +o pipefail + return $_ret } diff --git a/dracut.sh b/dracut.sh index 2a7a812be..315b965e7 100755 --- a/dracut.sh +++ b/dracut.sh @@ -708,11 +708,17 @@ for moddir in "$dracutbasedir/modules.d"/[0-9][0-9]*; do [[ $show_modules = yes ]] && echo "$_d_mod" || \ dinfo "*** Including module: $_d_mod ***" if [[ $kernel_only = yes ]]; then - module_installkernel $_d_mod + module_installkernel $_d_mod || { + dfatal "installkernel failed in module $_d_mod" + exit 1 + } else module_install $_d_mod if [[ $no_kernel != yes ]]; then - module_installkernel $_d_mod + module_installkernel $_d_mod || { + dfatal "installkernel failed in module $_d_mod" + exit 1 + } fi fi mods_to_load=${mods_to_load// $_d_mod /} diff --git a/modules.d/90kernel-modules/module-setup.sh b/modules.d/90kernel-modules/module-setup.sh index 97e1de836..b91785e14 100755 --- a/modules.d/90kernel-modules/module-setup.sh +++ b/modules.d/90kernel-modules/module-setup.sh @@ -58,8 +58,12 @@ installkernel() { hostonly='' instmods $drivers fi - [[ $add_drivers ]] && hostonly='' instmods $add_drivers - [[ $filesystems ]] && hostonly='' instmods $filesystems + if [[ $add_drivers ]]; then + hostonly='' instmods -c $add_drivers || return 1 + fi + if [[ $filesystems ]]; then + hostonly='' instmods -c $filesystems || return 1 + fi # force install of scsi_wait_scan hostonly='' instmods scsi_wait_scan