[PATCH 1/2] check kernel module existance

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Cong Wang <xiyou.wangcong@xxxxxxxxx>

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@xxxxxxxxxx>
Signed-off-by: Cong Wang <xiyou.wangcong@xxxxxxxxx>
Cc: Harald Hoyer <harald@xxxxxxxxxx>

---
 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 26f4784..8cff439 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
-- 
1.7.7.6

--
To unsubscribe from this list: send the line "unsubscribe initramfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Kernel]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]

  Powered by Linux