From 4290db97671c5f85c3a115c3fcf0f0f1bac4a917 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Arkadiusz=20Mi=C5=9Bkiewicz?= Date: Wed, 26 Oct 2011 19:55:53 +0000 Subject: [PATCH 1/1] - rel 2; replace buggy shell code for find_modules_by_class and use lspci only. Changed files: geninitrd-svn.patch -> 2.7 geninitrd.spec -> 2.189 --- geninitrd-svn.patch | 262 ++++++++------------------------------------ geninitrd.spec | 4 +- 2 files changed, 45 insertions(+), 221 deletions(-) diff --git a/geninitrd-svn.patch b/geninitrd-svn.patch index a513e04..af55f95 100644 --- a/geninitrd-svn.patch +++ b/geninitrd-svn.patch @@ -1,232 +1,56 @@ -Index: mod-usbkbd.sh -=================================================================== ---- mod-usbkbd.sh (wersja 0) -+++ mod-usbkbd.sh (wersja 12376) -@@ -0,0 +1,45 @@ -+#!/bin/sh -+SATA_RCSID='$Revision$ $Date$' -+ -+# geninitrd mod: usbkbd -+ -+# setup geninitrd module -+# @access public -+setup_mod_usbkbd() { -+} -+ -+find_modules_usbkbd() { -+ debug "Finding USB keyboard modules" -+ -+ if [ "$(echo /sys/class/input/input*)" = "/sys/class/input/input*" ]; then -+ return -+ fi -+ -+ local modules -+ -+ for i in /sys/class/input/input*; do -+ [ ! -f $i/device/bInterfaceClass -o ! -f $i/device/bInterfaceProtocol ] && continue -+ bInterfaceClass=$(cat $i/device/bInterfaceClass) -+ bInterfaceProtocol=$(cat $i/device/bInterfaceProtocol) -+ if [ "$bInterfaceClass" = "03" -a "$bInterfaceProtocol" = "01" ]; then -+ module=$(readlink $i/device/driver/module) -+ module=$(basename $module) -+ -+ if [ -n "$module" ]; then -+ debug "Found USB Keyboard: $(cat $i/name)" -+ modules="$modules $module" -+ fi -+ fi -+ done -+ -+ if [ -n "$modules" ]; then -+ # usb controllers -+ for m in $(find_modules_by_class "0c03"); do -+ find_module $m -+ done -+ -+ for m in $modules; do -+ find_module $m -+ done -+ fi -+} -Index: geninitrd -=================================================================== ---- geninitrd (wersja 12345) -+++ geninitrd (kopia robocza) -@@ -613,7 +613,7 @@ - [ "$FIRMWAREDIR" != "$firmware" ] && inst_d /lib/firmware/$FIRMWAREDIR - inst /lib/firmware/$firmware /lib/firmware/$firmware - else -- die "firmware file /lib/firmware/$firmware nor /lib/firmware/$kernel/$firmware found." -+ warn "Possible missing firmware file /lib/firmware/$firmware or /lib/firmware/$kernel/$firmware for module $module." - fi - done - -@@ -915,7 +915,7 @@ - warn "/proc filesystem not mounted, may cause wrong results or failure." - fi - --geninitrd_load_mods ide luks multipath dmraid lvm md blkid udev tuxonice suspend fbsplash condecor bootsplash uvesafb nfs sata scsi -+geninitrd_load_mods ide luks multipath dmraid lvm md blkid udev tuxonice suspend fbsplash condecor bootsplash uvesafb nfs sata scsi usbkbd - - while [ $# -gt 0 ]; do - case $1 in -@@ -1157,6 +1157,9 @@ - find_module "$FBMODULE" - fi - -+# autodetect USB keyboards -+find_modules_usbkbd -+ - # allow forcing loading SCSI and/or IDE modules - # XXX: where ADDSCSI cames from? drop? - if is_yes "$ADDSCSI"; then -Index: mod-luks.sh -=================================================================== ---- mod-luks.sh (wersja 12345) -+++ mod-luks.sh (kopia robocza) -@@ -119,7 +119,7 @@ - - while read dst src key opt; do - [ -z "$dst" -o "${dst#\#}" != "$dst" ] && continue -- [ "$src" != "$LUKSDEV" ] && continue -+ [ "$src" != "$LUKSDEV" ] && [ "$(readlink -f $src)" != "$LUKSDEV" ] && continue - - if [ -n "$key" -a "x$key" != "xnone" ]; then - if test -e "$key" ; then -@@ -155,11 +155,23 @@ - # cryptsetup can be called twice and in case on crypt on lvm only second - # will succeed because there will be no src device in first cryptsetup call - # this can be called multiple times, before lvm and after lvm. -- if [ -e "$src" ]; then -+ luksdev='$src' -+ if [ \${luksdev##/dev/disk/by-uuid/} != \${luksdev} ]; then -+ src_uuid=\${luksdev##/dev/disk/by-uuid/} -+ while read x y z name; do -+ found_uuid=\$(cryptsetup luksUUID /dev/\${name} 2>/dev/null) -+ if [ "\$found_uuid" = "\$src_uuid" ]; then -+ luksdev=/dev/\$name -+ break -+ fi -+ done < /proc/partitions -+ fi -+ -+ if [ -e "\$luksdev" ]; then - crypt_status=\$(cryptsetup status '$dst') - if [ "\${crypt_status%%is inactive.}" != "\$crypt_status" ]; then - # is inactive -- cryptsetup ${keyfile:+-d $keyfile} luksOpen '$src' '$dst' <&1 -+ cryptsetup ${keyfile:+-d $keyfile} luksOpen "\$luksdev" '$dst' <&1 - fi - fi - Index: functions =================================================================== ---- functions (wersja 12345) +--- functions (wersja 12390) +++ functions (kopia robocza) -@@ -166,3 +166,46 @@ - local node="$1" - printf "/dev/mapper/%s" $(dm_name "$node") - } -+ -+# find modules by class eg -+# find_modules_by_class 0106 - finds modules for SATA devices in the system -+# find_modules_by_class 0c03 - finds modules for USB controllers -+find_modules_by_class() { -+ local req_class="$1" -+ -+ pcimap="/lib/modules/$kernel/modules.pcimap" -+ -+ lspci=$(find_tool /sbin/lspci) -+ if [ ! -x "$lspci" ]; then -+ warn "Failed to execute lspci. Is pciutils package installed?" -+ fi -+ -+ # no pcimap, nothing to lookup from -+ if [ ! -f "$pcimap" ]; then -+ return -+ fi -+ -+ if [ -z "$lspci" ]; then -+ return -+ fi -+ -+ set -- $($lspci -n | awk -vclass=$req_class '$2 == class":" {split($3, p, ":"); printf("0x0000%s 0x0000%s\n", p[1], p[2])}') -+ -+ req_class="0x${req_class}00" -+ -+ local PCI_ANY_ID=0xffffffff pci_module vendor device subvendor subdevice class class_mask driver_data -+ while read pci_module vendor device subvendor subdevice class class_mask driver_data; do -+ # ignore program interface (last two digits) - we want any -+ class_mask=$(($class_mask & 0xffffff00)) -+ # some devices (like hcd) have very specific class -+ class=$(($class & $class_mask)) -+ [ "$(($req_class & $class_mask))" = "$class" ] || continue -+ # match vendor -+ [ "$1" = "$vendor" -o "$vendor" = "$PCI_ANY_ID" ] || continue -+ # match device, allow PCI_ANY_ID -+ [ "$2" = "$device" -o "$device" = "$PCI_ANY_ID" ] || continue -+ -+ echo "$pci_module" -+ done < $pcimap -+} -+ -Index: Makefile -=================================================================== ---- Makefile (wersja 12345) -+++ Makefile (kopia robocza) -@@ -1,6 +1,6 @@ - # when making release, make sure you do it as RELEASE document describes - VERSION := 12345 --MODS := ide luks multipath dmraid lvm md blkid udev tuxonice suspend fbsplash condecor bootsplash uvesafb nfs sata scsi -+MODS := ide luks multipath dmraid lvm md blkid udev tuxonice suspend fbsplash condecor bootsplash uvesafb nfs sata scsi usbkbd - FILES_MODS := $(MODS:%=mod-%.sh) - FILES_ADDON := extract-ikconfig - FILES := Makefile geninitrd.sysconfig geninitrd functions $(FILES_MODS) $(FILES_ADDON) geninitrd.8 geninitrd.8.xml ChangeLog -Index: mod-sata.sh -=================================================================== ---- mod-sata.sh (wersja 12345) -+++ mod-sata.sh (kopia robocza) -@@ -6,43 +6,8 @@ - # setup geninitrd module - # @access public - setup_mod_sata() { -- lspci=$(find_tool /sbin/lspci) -- -- pcimap="/lib/modules/$kernel/modules.pcimap" -- -- if [ ! -x "$lspci" ]; then -- warn "Failed to execute lspci. Is pciutils package installed?" -- fi - } +@@ -189,23 +189,33 @@ + return + fi --# private until only mod-sata uses the function --find_modules_by_class() { -- local req_class=$1 -- -- # no pcimap, nothing to lookup from -- if [ ! -f "$pcimap" ]; then -- return -- fi -- -- if [ -z "$lspci" ]; then -- return -- fi -- - set -- $($lspci -n | awk -vclass=$req_class '$2 == class":" {split($3, p, ":"); printf("0x0000%s 0x0000%s\n", p[1], p[2])}') - -- local PCI_ANY_ID=0x0000ffff pci_module vendor device subvendor subdevice class class_mask driver_data +- req_class="0x${req_class}00" +- +- local PCI_ANY_ID=0xffffffff pci_module vendor device subvendor subdevice class class_mask driver_data - while read pci_module vendor device subvendor subdevice class class_mask driver_data; do -- # match class -- [ "$(($req_class & $class_mask))" = "$(($class))" ] || continue +- # ignore program interface (last two digits) - we want any +- class_mask=$(($class_mask & 0xffffff00)) +- # some devices (like hcd) have very specific class +- class=$(($class & $class_mask)) +- [ "$(($req_class & $class_mask))" = "$class" ] || continue - # match vendor -- [ "$1" = "$vendor" ] || continue +- [ "$1" = "$vendor" -o "$vendor" = "$PCI_ANY_ID" ] || continue - # match device, allow PCI_ANY_ID -- [ "$2" = "$device" -o $device = $PCI_ANY_ID ] || continue +- [ "$2" = "$device" -o "$device" = "$PCI_ANY_ID" ] || continue - - echo "$pci_module" - done < $pcimap --} -- - find_modules_sata() { - debug "Finding SATA modules (class=0x0106)" ++ lspci -p "$pcimap" -kvmmn | awk -vreq_class="${req_class}" ' ++ BEGIN { skip_modules[1]=""; modules[1]=""; xhci=""; ehci=""; ohci=""; uhci="" } ++ /^Slot:/ { found=0 } ++ /^Class:/ { if (req_class == $2) { found=1 } } ++ /^Driver:/ { if (found) { ++ module=$2; ++ if (module == "xhci_hcd") { ++ xhci="xhci_hcd" ++ } else if (module == "ehci_hcd") { ++ ehci="ehci_hcd" ++ } else if (module == "ohci_hcd") { ++ ohci="ohci_hcd" ++ } else if (module == "uhci_hcd") { ++ uhci="uhci_hcd" ++ } else if (!(module in skip_modules)) { ++ modules[cnt]=module ++ } ++ skip_modules[cnt]=module; ++ cnt++; ++ }; ++ found=0 ++ } ++ END { ++ # xhci/ehci/ohci/uhci hack to preserve such order ++ printf "%s %s %s %s", xhci, ehci, ohci, uhci; ++ for (i in modules) { printf "%s ", modules[i]; }; ++ } ++ ' + } diff --git a/geninitrd.spec b/geninitrd.spec index d73cb16..1ef21ae 100644 --- a/geninitrd.spec +++ b/geninitrd.spec @@ -7,7 +7,7 @@ Summary: Creates an initial ramdisk image for preloading modules Summary(pl.UTF-8): Narzędzie do tworzenia inicjalnego ramdysku używanego przy starcie systemu Name: geninitrd Version: 12385 -Release: 1 +Release: 2 License: GPL Group: Applications/System Source0: %{name}-%{version}.tar.gz @@ -93,7 +93,7 @@ bieżących informacji zawartych w /etc/modules.conf. %patch0 -p1 %patch1 -p1 %endif -#%patch2 -p0 +%patch2 -p0 %build %{__make} -- 2.44.0