From a6d3be9dd5e105c926b753fc3a26f0a91119c2a4 Mon Sep 17 00:00:00 2001
From: Cong Wang <xiyou.wangcong@gmail.com>
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 <dyoung@redhat.com>
Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
Cc: Harald Hoyer <harald@redhat.com>
---
dracut-functions.sh | 37 +++++++++++++++++++++-------
dracut.sh | 10 ++++++--
modules.d/90kernel-modules/module-setup.sh | 8 ++++--
3 files changed, 42 insertions(+), 13 deletions(-)
diff --git a/dracut-functions.sh b/dracut-functions.sh
index 8256e02..4fe428e 100755
--- a/dracut-functions.sh
+++ b/dracut-functions.sh
@@ -1108,17 +1108,22 @@ find_kernel_modules () {
find_kernel_modules_by_path drivers
}
-# instmods <kernel module> [<kernel module> ... ]
-# instmods <kernel subsystem>
+# instmods [-c] <kernel module> [<kernel module> ... ]
+# instmods [-c] <kernel subsystem>
# install kernel modules along with all their dependencies.
# <kernel subsystem> 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 2a7a812..315b965 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 97e1de8..b91785e 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