modprobe included in version prior to 3.7 of module-init-tools doesn't have -d | --dirname option which allows to give a prefix other than '/' for kernel modules path. Dracut assumes existence of that option and uses it even with default '/'. The patch passes -d option only if it's different from default and also checks module-init-tools version if user changes the prefix by --kmoddir Dracut option. --- dracut | 8 +++++++- dracut-functions | 44 ++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 49 insertions(+), 3 deletions(-)
diff --git a/dracut b/dracut
index 35be7eb..139d0e0 100755
--- a/dracut
+++ b/dracut
@@ -183,7 +183,13 @@ esac
abs_outfile=$(readlink -f "$outfile") && outfile="$abs_outfile"
srcmods="/lib/modules/$kernel/"
-[[ $drivers_dir ]] && srcmods="$drivers_dir"
+[[ $drivers_dir ]] && {
+ if verlt $(modprobe --version | cut -d' ' -f3) 3.7; then
+ derror 'To use --kmoddir option module-init-tools >= 3.7 is required.'
+ exit 1
+ fi
+ srcmods="$drivers_dir"
+}
export srcmods
if [[ -f $outfile && ! $force ]]; then
diff --git a/dracut-functions b/dracut-functions
index a76cc22..fbac282 100755
--- a/dracut-functions
+++ b/dracut-functions
@@ -24,6 +24,39 @@ IF_dynamic=""
# Generic substring function. If $2 is in $1, return 0.
strstr() { [[ $1 =~ $2 ]]; }
+# Version comparision function. Returns result similar to C strcmp,
+# but instead of -1 is 2. Function assumes version scheme like does
+# Linux kernel.
+vercmp() {
+ local n1 n2 i=1
+
+ while true
+ do
+ n1=$(echo $1 | cut -d'.' -f$i)
+ n2=$(echo $2 | cut -d'.' -f$i)
+
+ [[ ! $n1 && ! $n2 ]] && return 0
+ [[ $n1 -lt $n2 ]] && return 2
+ [[ $n1 -gt $n2 ]] && return 1
+
+ ((i++))
+ done
+}
+
+# Variation of version comparision function. If $1 >= $2, return 0.
+verge() {
+ vercmp $1 $2
+
+ [[ $? = 0 || $? = 1 ]]
+}
+
+# Variation of version comparision function. If $1 < $2, return 0.
+verlt() {
+ vercmp $1 $2
+
+ [[ $? = 2 ]]
+}
+
# Log initrd creation.
if ! [[ $dracutlogfile ]]; then
[[ $dracutbasedir = /usr/share/dracut ]] && \
@@ -487,7 +520,7 @@ filter_kernel_modules () (
# install kernel modules along with all their dependencies.
instmods() {
[[ $no_kernel = yes ]] && return
- local mod mpargs modpath modname cmd
+ local mod mpargs modpath modname cmd moddirname
while (($# > 0)); do
mod=${1%.ko*}
case $mod in
@@ -519,10 +552,17 @@ instmods() {
! echo $add_drivers | grep -qe "\<${mod}\>" && {
shift; continue;
}
+
+ # We use '-d' option in modprobe only if modules prefix path
+ # differs from default '/'. This allows us to use Dracut with
+ # old version of modprobe which doesn't have '-d' option.
+ moddirname=${srcmods%%/lib/modules/*}
+ [[ -n ${moddirname} ]] && moddirname="-d ${moddirname}/"
+
# ok, load the module, all its dependencies, and any firmware
# it may require
for_each_kmod_dep install_kmod_with_fw $mod \
- --set-version $kernel -d ${srcmods%%/lib/modules/*}/
+ --set-version $kernel ${moddirname}
;;
esac
shift
--
1.7.1
signature.asc
Description: PGP signature
