[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#570100: [patch] please call udevadm settle in scripts/init-premount/select_eth_device



Package: live-initramfs
Version: 1.173.1-1
Severity: wishlist

Hello,

when select_eth_device is run before udevadm settle has been run, it
will not find any devices, which will lead to a kernel panic when
ipconfig is run in scripts/live. Normally udevadm settle is run by
scripts/init-premount/udev, but the udev package from Ubuntu does not do
so. The attached patch adds udevadm calls to select_eth_device and also
fixes some indentation inconsistencies. Set severity to whishlist as it
is quite unusual to use udev from Ubuntu in Debian, but I think it is
useful to ensure udevadm settle has been called. I'd also like to point
out that this may be a timing issue, so it may be hard to reproduce.

Thanks,

Andreas

-- System Information:
Debian Release: 5.0.4
  APT prefers stable
  APT policy: (500, 'stable')
Architecture: amd64 (x86_64)

Kernel: Linux 2.6.26-2-amd64 (SMP w/2 CPU cores)
Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash

diff --git a/scripts/init-premount/select_eth_device b/scripts/init-premount/select_eth_device
index 6ab8bfe..4323880 100755
--- a/scripts/init-premount/select_eth_device
+++ b/scripts/init-premount/select_eth_device
@@ -3,8 +3,6 @@
 # Original script by Andreas Teuchert <ant+dl@hsg-kl.de>
 # Modified by Frédéric Boiteux <fboiteux@calistel.com>
 
-
-
 PREREQ="blacklist udev"
 
 prereqs()
@@ -25,16 +23,28 @@ bootconf=$(egrep '^BOOT=' /conf/initramfs.conf | tail -1)
 
 # can be superseded by command line (used by Debian-Live's netboot for example)
 for ARGUMENT in $(cat /proc/cmdline); do
-    case "${ARGUMENT}" in
-        netboot=*)
-        NETBOOT="${ARGUMENT#netboot=}"
-        ;;
-    esac
+	case "${ARGUMENT}" in
+		netboot=*)
+			NETBOOT="${ARGUMENT#netboot=}"
+			;;
+	esac
 done
 
 if [ "$bootconf" != "BOOT=nfs" ] && [ "$NETBOOT" = "" ]; then
-    # Not a net boot : nothing to do
-    exit 0
+	# Not a net boot : nothing to do
+	exit 0
+fi
+
+# be sure this has been run (*should* be done by scripts/init-premount/udev)
+if [ -x /sbin/udevadm ]
+then
+	# lenny
+	udevadm trigger
+	udevadm settle
+else
+	# etch
+	udevtrigger
+	udevsettle
 fi
 
 # we want to do some basic IP
@@ -44,34 +54,35 @@ modprobe -q af_packet
 l_interfaces=$(cd /sys/class/net/ && ls -d eth* 2>/dev/null)
 
 if [ $(echo $l_interfaces | wc -w) -lt 2 ]; then
-    # only one interface : no choice
-    echo "DEVICE=$l_interfaces" >> /conf/param.conf
-    exit 0
+	# only one interface : no choice
+	echo "DEVICE=$l_interfaces" >> /conf/param.conf
+	exit 0
 fi
 
 while true; do
-        echo -n "Looking for a connected Ethernet interface ..."
+	echo -n "Looking for a connected Ethernet interface ..."
 
 	for interface in $l_interfaces; do
 		# ATTR{carrier} is not set if this is not done
-                echo -n " $interface ?"
+		echo -n " $interface ?"
 		ipconfig -c none -d $interface -t 1 >/dev/null 2>&1
-        done
-        echo ''
+	done
+
+	echo ''
 
-        for step in 1 2 3 4 5; do
-	        for interface in $l_interfaces; do
-                        carrier=$(cat /sys/class/net/$interface/carrier \
-                                  2>/dev/null)
-                        # link detected
-                        if [ "$carrier" = 1 ]; then
-                                echo " found $interface."
-                                # inform initrd's init script :
-                                echo "DEVICE=$interface" >> /conf/param.conf
-                                exit 0
-		        fi
-	        done
-                # wait a bit
-                sleep 1
-        done
+	for step in 1 2 3 4 5; do
+		for interface in $l_interfaces; do
+			carrier=$(cat /sys/class/net/$interface/carrier \
+				2>/dev/null)
+			# link detected
+			if [ "$carrier" = 1 ]; then
+				echo " found $interface."
+				# inform initrd's init script :
+				echo "DEVICE=$interface" >> /conf/param.conf
+				exit 0
+			fi
+		done
+		# wait a bit
+		sleep 1
+	done
 done

Attachment: signature.asc
Description: Digital signature


Reply to: