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