rpms/module-init-tools/devel module-init-tools.spec, 1.60, 1.61 weak-modules, 1.14, 1.15

Jon Masters (jcm) fedora-extras-commits at redhat.com
Sun Oct 7 22:45:42 UTC 2007


Author: jcm

Update of /cvs/pkgs/rpms/module-init-tools/devel
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv31983

Modified Files:
	module-init-tools.spec weak-modules 
Log Message:
Synchronize weak-modules script with RHEL5.



Index: module-init-tools.spec
===================================================================
RCS file: /cvs/pkgs/rpms/module-init-tools/devel/module-init-tools.spec,v
retrieving revision 1.60
retrieving revision 1.61
diff -u -r1.60 -r1.61
--- module-init-tools.spec	7 Oct 2007 22:38:31 -0000	1.60
+++ module-init-tools.spec	7 Oct 2007 22:45:09 -0000	1.61
@@ -1,7 +1,7 @@
 Summary: Kernel module management utilities.
 Name: module-init-tools
 Version: 3.4
-Release: 1%{?dist}
+Release: 2%{?dist}
 License: GPL
 Group: System Environment/Kernel
 Source: http://www.kerneltools.org/pub/downloads/module-init-tools/module-init-tools-%{version}.tar.bz2
@@ -103,8 +103,9 @@
 %ghost %config %verify(not md5 size mtime) /etc/modprobe.conf
 
 %changelog
-* Sun Oct  7 2007 Jon Masters <jcm at redhat.com> - 3.4-1
+* Sun Oct  7 2007 Jon Masters <jcm at redhat.com> - 3.4-2
 - Rebase to latest upstream release.
+- Sychronize weak-modules with RHEL.
 
 * Thu Mar 22 2007 Jon Masters <jcm at redhat.com> - 3.3-0.pre11.1.0
 - Rebase to latest upstream release.


Index: weak-modules
===================================================================
RCS file: /cvs/pkgs/rpms/module-init-tools/devel/weak-modules,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- weak-modules	3 Aug 2006 00:19:24 -0000	1.14
+++ weak-modules	7 Oct 2007 22:45:09 -0000	1.15
@@ -4,12 +4,24 @@
 #                kernels and set up the symlinks in /lib/*/weak-updates.
 #
 
+# Changelog:
+#
+# 2006/12/11 - Updated logic for determining the system's initrd location,
+#              to account for IA64 differences. (#215432)
+
 unset LANG LC_ALL LC_COLLATE
 
 tmpdir=$(mktemp -td ${0##*/}.XXXXXX)
 trap "rm -rf $tmpdir" EXIT
 unset ${!changed_modules_*} ${!changed_initrd_*}
 
+if [ "ia64" == `uname -m` ];
+then
+	initrd_prefix="/boot/efi/EFI/redhat"
+else
+	initrd_prefix="/boot"
+fi
+
 #!/bin/sh
 
 # rpmsort: The sort in coreutils can't sort the RPM list how we want it so we
@@ -26,6 +38,7 @@
 
         if [ ${#rpmlist[@]} = 1 ]; then
         # By definition already sorted
+		echo ${rpmlist[@]}
                 return
         fi
 
@@ -47,8 +60,14 @@
                                 len=$((${#rpm2}*2));
                         fi
 
+		# BZ249537 - don't use head -n 1 to rip out the first line
+		# and instead use a read loop to do it. There are better
+		# ways to do this, but this solution works too :-).
+
                         if [ "$(printf "%s\n" ${hex1:0:$len} ${hex2:0:$len} \
-                              | sort | head -n 1)" = "$hex2" ]; then
+                              | sort | (read input; echo "$input"; \
+                                        while read input; do true; done))" = \
+                                "$hex2" ]; then
                                 rpmlist[j]=$rpm2; rpmlist[j+1]=$rpm1
                                 rpmhash[j]=$hex2; rpmhash[j+1]=$hex1
                         fi
@@ -88,6 +107,96 @@
     done
 }
 
+# read_old_initrd:
+compare_initrd_modules() {
+    local old_initrd=$1
+    local new_initrd=$2
+
+    rm -rf "$tmpdir/old_initrd"
+    rm -rf "$tmpdir/new_initrd"
+    mkdir "$tmpdir/old_initrd"
+    mkdir "$tmpdir/new_initrd"
+
+    pushd "$tmpdir/old_initrd" >/dev/null
+    zcat "$old_initrd" | cpio -i 2>/dev/null
+    n=0; for i in `find . -iname \*.ko|sort`; do
+        old_initrd_modules[n]="$i"
+        n=$((n+1))
+    done
+    popd >/dev/null
+
+    pushd "$tmpdir/new_initrd" >/dev/null
+    zcat "$new_initrd" | cpio -i 2>/dev/null
+    n=0; for i in `find . -iname \*.ko|sort`; do
+        new_initrd_modules[n]="$i"
+        n=$((n+1))
+    done
+    popd >/dev/null
+
+    if [ "${#old_initrd_modules[@]}" == "${#new_initrd_modules[@]}" ];
+    then
+        for ((n = 0; n < ${#old_initrd_modules[@]}; n++)); do
+            old_md5=`md5sum $tmpdir/old_initrd/${old_initrd_modules[n]}|sed -nre 's:(^\ )* .*:\1:p'`
+            new_md5=`md5sum $tmpdir/new_initrd/${new_initrd_modules[n]}|sed -nre 's:(^\ )* .*:\1:p'`
+            if [ ! "$old_md5" == "$new_md5" ];
+            then
+                return 1
+            fi
+        done
+    else
+        return 1
+    fi
+
+    return 0
+}
+
+# check_initrd:
+check_initrd() {
+    local kernel=$1
+    local kernel_is_xen=0
+    local xen_kverrel=0
+
+    if [ "xen" == "`echo $kernel|sed -nre 's:^.*(xen)$:\1:p'`" ];
+    then
+        kernel_is_xen=1
+        xen_kverrel="`echo $kernel|sed -nre 's:^(.*)xen$:\1:p'`"
+    else
+        kernel_is_xen=0
+    fi
+
+    # This logic probably isn't needed. When are we ever actually likely to have
+    # an unbootable system, with no kernel, *before* we run this script? :-)
+    if [ ! -e "$initrd_prefix/initrd-$kernel.img" ];
+    then
+        new_initrd="$initrd_prefix/initrd-$kernel.img"
+        if [ "$kernel_is_xen" == "0" ]; then
+            /sbin/new-kernel-pkg --mkinitrd --initrdfile="$new_initrd" --depmod --install "$kernel"
+        else
+            /sbin/new-kernel-pkg --mkinitrd --initrdfile="$new_initrd" --depmod --install --multiboot="$initrd_prefix/xen.gz-$xen_kverrel" "$kernel"
+        fi
+    else
+        old_initrd="$initrd_prefix/initrd-$kernel.img"
+        tmp_initrd="$initrd_prefix/initrd-$kernel.tmp"
+        new_initrd="$initrd_prefix/initrd-$kernel.img"
+
+        /sbin/mkinitrd --allow-missing -f "$tmp_initrd" "$kernel"
+
+        if ! $(compare_initrd_modules "$old_initrd" "$tmp_initrd");
+        then
+            mv "$old_initrd" "$old_initrd".dup_orig
+            mv "$tmp_initrd" "$new_initrd"
+
+            if [ "$kernel_is_xen" == "0" ]; then
+                /sbin/new-kernel-pkg --initrdfile="$new_initrd" --depmod --install "$kernel"
+            else
+                /sbin/new-kernel-pkg --initrdfile="$new_initrd" --depmod --install --multiboot="$initrd_prefix/xen.gz-$xen_kverrel" "$kernel"
+            fi
+        else
+            rm -f "$tmp_initrd"
+        fi
+    fi
+}
+
 # krel_of_module:
 # Compute the kernel release of a module.
 krel_of_module() {
@@ -106,7 +215,7 @@
         if [ ! -e $tmpdir/symvers-$krel ]; then
             if [ -e /boot/symvers-$krel.gz ]; then
                 zcat /boot/symvers-$krel.gz \
-                | sed -r -ne 's:^(0x[0-9a-f]+\t[0-9a-zA-Z_]+)\t.*:\1:p'
+                | sed -r -ne 's:^(0x[0]*[0-9a-f]{8}\t[0-9a-zA-Z_]+)\t.*:\1:p'
             fi > $tmpdir/symvers-$krel
         fi
 
@@ -116,7 +225,7 @@
             if [ -e /lib/modules/$module_krel/extra ]; then
                 find /lib/modules/$module_krel/extra -name '*.ko' \
                 | xargs nm \
-                | sed -nre 's:^([0-9a-f]+) A __crc_(.*):0x\1 \2:p'
+                | sed -nre 's:^[0]*([0-9a-f]{8}) A __crc_(.*):0x\1 \2:p'
             fi > $tmpdir/extra-symvers-$module_krel
         fi
 
@@ -127,7 +236,7 @@
     # If the module does not have modversions enabled, $tmpdir/modvers
     # will be empty.
     /sbin/modprobe --dump-modversions "$module" \
-    | sed -r -e 's:^(0x[0-9a-f]+\t.*):\1:' \
+    | sed -r -e 's:^(0x[0]*[0-9a-f]{8}\t.*):\1:' \
     | sort -u \
     > $tmpdir/modvers
 
@@ -181,6 +290,9 @@
         Remove all compatibility symlinks for the specified or current
         kernel.
 
+--no-initrd
+	Do not generate an initrd.
+
 --verbose
         Print the commands executed.
 
@@ -194,6 +306,7 @@
 # Mark if an actual change occured that we need to deal with later by calling
 # depmod or mkinitrd against the affected kernel.
 module_has_changed() {
+
     declare module=$1 krel=$2
 
     module=${module%.ko}
@@ -201,6 +314,7 @@
 
     eval "changed_modules_${krel//[^a-zA-Z0-9]/_}=$krel"
     eval "changed_initrd_${krel//[^a-zA-Z0-9]/_}=$krel"
+
 }
 
 # add_modules:
@@ -216,15 +330,27 @@
                 module_krel="${module_krels[n]}"
                 case "$module" in
                 /lib/modules/$krel/*)
+                    # Module was built against this kernel, update initrd.
+                    module_has_changed $module $krel
                     continue ;;
                 esac
+
+		# Module my also serve as a weak-update built against another
+		# kernel. We need to create symlinks for compatible kernels
+		# under /lib/modules and rerun depmod/mkinitrd for those.
+
+		# BZ249537 - don't use head -n 1 to rip out the first line
+		# and instead use a read loop to do it. There are better
+		# ways to do this, but this solution works too :-).
+
                 subpath="${module#/lib/modules/$module_krel/extra}"
                 weak_module="/lib/modules/$krel/weak-updates/${subpath#/}"
                 if [ -r "$weak_module" ]; then
                     weak_krel=$(krel_of_module "$weak_module")
                     if [ "$weak_krel" != "$module_krel" ] &&
                        [ "$(printf "%s\n" "$weak_krel" "$module_krel" \
-                            | rpmsort | head -n 1)" = \
+                            | rpmsort | (read input; echo "$input"; \
+                                         while read input; do true; done))" = \
                          "$module_krel" ]; then
                         # Keep modules from more recent kernels.
                         [ -n "$verbose" ] && echo \
@@ -235,6 +361,7 @@
                 if module_is_compatible $module $krel; then
                     doit mkdir -p $(dirname $weak_module)
                     doit ln -sf $module $weak_module
+                    # Module was built against another kernel, update initrd.
                     module_has_changed $module $krel
                 fi
             done
@@ -247,12 +374,21 @@
 remove_modules() {
     read_modules_list || exit 1
     if [ ${#modules[@]} -gt 0 ]; then
+
+	# Hunt for all known users of this module in /lib/modules, remove them
+	# and create symlinks to other compatible modules (downgrade) if
+	# possible, update initrd for each modified kernel too.
+
         krels=($(ls /lib/modules/ | rpmsort -r))
         for krel in "${krels[@]}"; do
             [ -e "/boot/symvers-$krel.gz" ] || continue
             for ((n = 0; n < ${#modules[@]}; n++)); do
                 module="${modules[n]}"
                 module_krel="${module_krels[n]}"
+
+		# Module is going to be removed, update initrd.
+		module_has_changed $module $krel
+
                 subpath="${module#/lib/modules/$module_krel/extra}"
                 weak_module="/lib/modules/$krel/weak-updates/${subpath#/}"
                 if [ "$module" == "`readlink $weak_module`" ]; then
@@ -260,19 +396,20 @@
 "Removing compatible module ${module##*/} from kernel $krel"
                     doit rm -f "$weak_module"
                     for krel2 in "${krels[@]}"; do
-                        [ -e "/boot/symvers-$krel2.gz" ] || continue
-                        module="/lib/modules/$krel2/extra/$subpath"
-                        [ -e "$module" ] || continue
-                        if module_is_compatible "$module" "$krel2"; then
-                            [ -n "$verbose" ] && echo \
+                        if [ $krel2 != $krel ]; then
+                            module="/lib/modules/$krel2/extra/${subpath#/}"
+                            [ -e "$module" ] || continue
+                            if module_is_compatible "$module" "$krel"; then
+                                [ -n "$verbose" ] && echo \
 "Adding compatible module ${module##*/} from kernel $krel2 instead"
-                            doit ln -s "$module" "$weak_module"
-                            break
+                                doit ln -s "$module" "$weak_module"
+			        module_has_changed $module $krel
+                                break
+                            fi
                         fi
                     done
                     doit rmdir --parents --ignore-fail-on-non-empty \
                                "$(dirname "$weak_module")"
-                    module_has_changed $module $krel
                 fi
             done
         done
@@ -294,6 +431,7 @@
             weak_module="/lib/modules/$add_krel/weak-updates/${subpath#/}"
             [ -e "$weak_module" ] && continue
             if module_is_compatible $module $add_krel; then
+		module_has_changed $module $add_krel
                 doit mkdir -p $(dirname $weak_module)
                 doit ln -sf $module $weak_module
             fi
@@ -304,7 +442,9 @@
 remove_kernel() {
     remove_krel=${1:-$(uname -r)}
     weak_modules="/lib/modules/$remove_krel/weak-updates"
+    module_has_changed $weak_modules $remove_krel
     doit rm -rf "$weak_modules"
+    doit rm -rf "$initrd_prefix/initrd-$remove_krel.img.dup_orig"
 }
 
 ################################################################################
@@ -312,7 +452,8 @@
 ################################################################################
 
 options=`getopt -o h --long help,add-modules,remove-modules \
-                     --long add-kernel,remove-kernel,dry-run,verbose -- "$@"`
+                     --long add-kernel,remove-kernel \
+                     --long dry-run,no-initrd,verbose -- "$@"`
 
 [ $? -eq 0 ] || usage 1
 
@@ -335,6 +476,9 @@
     --dry-run)
         dry_run=1
         ;;
+    --no-initrd)
+        no_initrd=1
+        ;;
     --verbose)
         verbose=1
         ;;
@@ -362,6 +506,8 @@
 elif [ -n "$do_remove_kernel" ]; then
 	kernel=${1:-$(uname -r)}
 	remove_kernel $kernel
+
+	exit 0
 else
 	usage 1
 fi
@@ -380,5 +526,7 @@
 for krel in ${!changed_initrd_*}; do
     krel=${!krel}
 
-    doit /sbin/mkinitrd --allow-missing -f /boot/initrd-$krel.img $krel
+    if [ ! -n "$no_initrd" ]; then
+        check_initrd $krel
+    fi
 done




More information about the fedora-extras-commits mailing list