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 <dyoung@redhat.com>
Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
Cc: Harald Hoyer <harald@redhat.com>
master
Cong Wang 2012-05-15 14:19:56 +08:00 committed by Harald Hoyer
parent 40913ad219
commit a6d3be9dd5
3 changed files with 51 additions and 22 deletions

View File

@ -1108,17 +1108,22 @@ find_kernel_modules () {
find_kernel_modules_by_path drivers find_kernel_modules_by_path drivers
} }


# instmods <kernel module> [<kernel module> ... ] # instmods [-c] <kernel module> [<kernel module> ... ]
# instmods <kernel subsystem> # instmods [-c] <kernel subsystem>
# install kernel modules along with all their dependencies. # install kernel modules along with all their dependencies.
# <kernel subsystem> can be e.g. "=block" or "=drivers/usb/storage" # <kernel subsystem> can be e.g. "=block" or "=drivers/usb/storage"
instmods() { instmods() {
[[ $no_kernel = yes ]] && return [[ $no_kernel = yes ]] && return
# called [sub]functions inherit _fderr # called [sub]functions inherit _fderr
local _fderr=9 local _fderr=9
local _check=no
if [[ $1 = '-c' ]]; then
_check=yes
shift
fi


function inst1mod() { function inst1mod() {
local _mod="$1" local _ret=0 _mod="$1"
case $_mod in case $_mod in
=*) =*)
if [ -f $srcmods/modules.${_mod#=} ]; then if [ -f $srcmods/modules.${_mod#=} ]; then
@ -1162,26 +1167,40 @@ instmods() {
((_ret+=$?)) ((_ret+=$?))
;; ;;
esac 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 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}>... # Capture all stderr from modprobe to _fderr. We could use {var}>...
# redirections, but that would make dracut require bash4 at least. # redirections, but that would make dracut require bash4 at least.
eval "( instmods_1 \"\$@\" ) ${_fderr}>&1" \ eval "( instmods_1 \"\$@\" ) ${_fderr}>&1" \
| while read line; do [[ "$line" =~ $_filter_not_found ]] || echo $line;done | derror | while read line; do [[ "$line" =~ $_filter_not_found ]] || echo $line;done | derror
return $? _ret=$?
set +o pipefail
return $_ret
} }

View File

@ -708,11 +708,17 @@ for moddir in "$dracutbasedir/modules.d"/[0-9][0-9]*; do
[[ $show_modules = yes ]] && echo "$_d_mod" || \ [[ $show_modules = yes ]] && echo "$_d_mod" || \
dinfo "*** Including module: $_d_mod ***" dinfo "*** Including module: $_d_mod ***"
if [[ $kernel_only = yes ]]; then if [[ $kernel_only = yes ]]; then
module_installkernel $_d_mod module_installkernel $_d_mod || {
dfatal "installkernel failed in module $_d_mod"
exit 1
}
else else
module_install $_d_mod module_install $_d_mod
if [[ $no_kernel != yes ]]; then if [[ $no_kernel != yes ]]; then
module_installkernel $_d_mod module_installkernel $_d_mod || {
dfatal "installkernel failed in module $_d_mod"
exit 1
}
fi fi
fi fi
mods_to_load=${mods_to_load// $_d_mod /} mods_to_load=${mods_to_load// $_d_mod /}

View File

@ -58,8 +58,12 @@ installkernel() {
hostonly='' instmods $drivers hostonly='' instmods $drivers
fi fi


[[ $add_drivers ]] && hostonly='' instmods $add_drivers if [[ $add_drivers ]]; then
[[ $filesystems ]] && hostonly='' instmods $filesystems hostonly='' instmods -c $add_drivers || return 1
fi
if [[ $filesystems ]]; then
hostonly='' instmods -c $filesystems || return 1
fi


# force install of scsi_wait_scan # force install of scsi_wait_scan
hostonly='' instmods scsi_wait_scan hostonly='' instmods scsi_wait_scan