init: add initqueue-finished
authorHarald Hoyer <harald@redhat.com>
Tue, 15 Sep 2009 06:47:47 +0000 (08:47 +0200)
committerHarald Hoyer <harald@redhat.com>
Tue, 15 Sep 2009 06:47:47 +0000 (08:47 +0200)
/initqueue-finished/*.sh are scripts, which return != 0, if the main
loop still has pending jobs to do.

modules.d/99base/dracut-lib.sh
modules.d/99base/init
modules.d/99base/install

index 9e33cf3..cbe70cf 100644 (file)
@@ -36,6 +36,12 @@ source_all() {
     for f in "/$1"/*.sh; do [ -f "$f" ] && . "$f"; done
 }
 
+check_finished() {
+    local f
+    for f in /initqueue-finished/*.sh; do [ -f "$f" ] && { ( . "$f" ) || return 1; } ; done
+    return 0
+}
+
 source_conf() {
     local f
     [ "$1" ] && [  -d "/$1" ] || return
@@ -109,10 +115,12 @@ incol2() {
 }
 
 udevsettle() {
+    local exit_if_exists;
+
     [ -z "$UDEVVERSION" ] && UDEVVERSION=$(udevadm --version)
 
     if [ $UDEVVERSION -ge 143 ]; then
-        udevadm settle --exit-if-exists=/initqueue/work --exit-if-exists=/dev/root 
+        udevadm settle --exit-if-exists=/initqueue/work $settle_exit_if_exists
     else
         udevadm settle --timeout=30
     fi
index bd901f2..455e809 100755 (executable)
@@ -106,64 +106,42 @@ getarg 'rdbreak=initqueue' && emergency_shell "Break before initqueue"
 
 i=0
 while :; do
-    # bail out, if we have mounted the root filesystem
-    [ -d "$NEWROOT/proc" ] && break;
-
-    # check if root can be mounted
-    [ -e /dev/root ] && break;
 
+    check_finished && break
     udevsettle
 
-    # bail out, if we have mounted the root filesystem
-    [ -d "$NEWROOT/proc" ] && break;
-    # check if root can be mounted
-    [ -e /dev/root ] && break;
-    unset queuetriggered
+    check_finished && break
+
     if [ -f /initqueue/work ]; then
         rm /initqueue/work
-       queuetriggered="1"
     fi
        
     for job in /initqueue/*.sh; do
        [ -e "$job" ] || break
         job=$job . $job
-
-        # bail out, if we have mounted the root filesystem
-        [ -d "$NEWROOT/proc" ] && break;
-        # check if root can be mounted
-        [ -e /dev/root ] && break;
+        check_finished && break 2
     done
 
-    [ -n "$queuetriggered" ] && continue
-
-    if $UDEV_QUEUE_EMPTY >/dev/null 2>&1; then
+    $UDEV_QUEUE_EMPTY >/dev/null 2>&1 || continue
 
-        modprobe scsi_wait_scan && rmmod scsi_wait_scan
+    modprobe scsi_wait_scan && rmmod scsi_wait_scan
 
-        $UDEV_QUEUE_EMPTY >/dev/null 2>&1 || continue
+    $UDEV_QUEUE_EMPTY >/dev/null 2>&1 || continue
 
-        unset queuetriggered
-       for job in /initqueue-settled/*.sh; do
-           [ -e "$job" ] || break
-
-           queuetriggered="1"
-
-            job=$job . $job
-           
-            # bail out, if we have mounted the root filesystem
-            [ -d "$NEWROOT/proc" ] && break 2;
+    for job in /initqueue-settled/*.sh; do
+        [ -e "$job" ] || break
+        job=$job . $job
+        check_finished && break 2
+    done
 
-            # check if root can be mounted
-            [ -e /dev/root ] && break 2;
-       done
+    $UDEV_QUEUE_EMPTY >/dev/null 2>&1 || continue
 
-        # no more udev jobs and queues empty.
-        sleep 0.5
-        i=$(($i+1))
-        [ $i -gt 20 ] \
-            && { flock -s 9 ; emergency_shell "No root device found"; } 9>/.console_lock
-    fi
+    # no more udev jobs and queues empty.
+    sleep 0.5
+    i=$(($i+1))
+    [ $i -gt 20 ] \
+        && { flock -s 9 ; emergency_shell "No root device found"; } 9>/.console_lock
 done
 unset job
 unset queuetriggered
index f2c1c2b..2fca1f1 100755 (executable)
@@ -9,6 +9,7 @@ fi
 inst "$moddir/init" "/init"
 inst "$moddir/initqueue" "/sbin/initqueue"
 mkdir -p ${initdir}/initqueue
+mkdir -p ${initdir}/initqueue-finished
 mkdir -p ${initdir}/initqueue-settled
 mkdir -p ${initdir}/tmp
 # Bail out if switch_root does not exist