[PATCH] dkms: don't move /etc/sysconfig/kernel/INITRD_MODULES= entries on add

Matt Domsch Matt_Domsch at dell.com
Tue Mar 28 15:47:49 CST 2006


The problem is when you already have a megaraid_sas dkms rpm installed
and configured with the megaraid_sas driver at the begining of the
INITRD_MODULES line.  If you download and install a newer version of
the megaraid_sas dkms RPM, the RPM removes the megaraid_sas driver
from the begining of the INITRD_MODULES line and moves it to the end
of the line before running mkinitrd.   Upon reboot you will have a
kernel panic (the modules are loaded in the wrong order).


Proposed patch leaves modules already present in the INITRD_MODULES
list in place.  If not already in INITRD_MODULES, add them to the end
of the INITRD_MODULES list.

Please review.
-Matt


--- /usr/sbin/dkms	Thu Mar 16 16:05:02 2006
+++ dkms	Tue Mar 28 15:16:00 2006
@@ -652,20 +652,33 @@ function moduleconfig_remove ()
     rm -rf $temp_dir_name
 }
 
+# Does string word exist as a word in string list?
+# returns 0 if word present, 1 if word not present
+function is_word_in_list ()
+{
+    for l in $2; do
+	[ "$1" = "${l}" ] && return 0
+    done
+    return 1
+}
+
 function etc_sysconfig_kernel_modify ()
 {
     # Make a temp directory to store files
     local temp_dir_name=`mktemp -d $tmp_location/dkms.XXXXXX`
 
     if [ -e "/etc/sysconfig/kernel" ] && [ -n "$remake_initrd" ]; then
-
         # Make /etc/sysconfig/kernel changes as necessary
 	if [ "$1" == "add" ]; then
-	    etc_sysconfig_kernel_modify "delete"
+	    unset INITRD_MODULES
+	    eval `grep ^INITRD_MODULES= /etc/sysconfig/kernel`
 	    for module_name_after in "${dest_module_name[@]}"; do
-		sed -e "s/INITRD_MODULES=\"\(.*\)\"/INITRD_MODULES=\"\1 $module_name_after\"/" /etc/sysconfig/kernel > $temp_dir_name/kernel.new
-		mv $temp_dir_name/kernel.new /etc/sysconfig/kernel
+		if ! is_word_in_list "${module_name_after}" "${INITRD_MODULES}"; then
+		    sed -e "s/INITRD_MODULES=\"\(.*\)\"/INITRD_MODULES=\"\1 $module_name_after\"/" /etc/sysconfig/kernel > $temp_dir_name/kernel.new
+		    mv $temp_dir_name/kernel.new /etc/sysconfig/kernel
+		fi
 	    done
+	    unset INITRD_MODULES
 	
         # Remove /etc/sysconfig/kernel entries
 	elif [ "$1" == "delete" ]; then



More information about the DKMS-devel mailing list