From a6d3be9dd5e105c926b753fc3a26f0a91119c2a4 Mon Sep 17 00:00:00 2001 From: Cong Wang Date: Tue, 15 May 2012 14:19:56 +0800 Subject: [PATCH] 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 --- dracut-functions.sh | 55 +++++++++++++++------- dracut.sh | 10 +++- modules.d/90kernel-modules/module-setup.sh | 8 +++- 3 files changed, 51 insertions(+), 22 deletions(-) diff --git a/dracut-functions.sh b/dracut-functions.sh index 8256e023..4fe428ef 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 - } - - function instmods_1() { - local _ret=0 _mod _mpargs - if (($# == 0)); then # filenames from stdin - while read _mod; do - inst1mod "${_mod%.ko*}" - done - fi - while (($# > 0)); do # filenames as arguments - inst1mod ${1%.ko*} - shift - done return $_ret } - local _filter_not_found='FATAL: Module .* not found.' + function instmods_1() { + local _mod _mpargs + if (($# == 0)); then # filenames from stdin + while read _mod; do + 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*} || { + if [ "$_check" = "yes" ]; then + dfatal "Failed to install $1" + return 1 + fi + } + shift + done + return 0 + } + + 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 2a7a812b..315b965e 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 97e1de83..b91785e1 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