commit:     c4616417e5c827a1ddf4daa89de82922fecda904
Author:     Thomas Deutschmann <whissi <AT> gentoo <DOT> org>
AuthorDate: Tue Jul 16 16:06:43 2019 +0000
Commit:     Thomas Deutschmann <whissi <AT> gentoo <DOT> org>
CommitDate: Tue Jul 16 16:28:08 2019 +0000
URL:        https://gitweb.gentoo.org/proj/genkernel.git/commit/?id=c4616417

linuxrc: Change ROOTDELAY handling

Before this change we converted $ROOTDELAY into microseconds and
decremented that value on each loop iteration. Once that value was
<=0 we threw a timeout.

Because we substracted a fixed value we didn't take into account that
a command from loop could already have taken some time. During testing,
in worst case, running with ROOTDELAY=10 and invalid root=UUID= parameter,
it was seen that it took up to ~35s instead of 10s before linuxrc
prompted for new root value.

With this change, we now set a timeout based on current time in seconds
+ ROOTDELAY. Loop will end if current time is >= timeout.

In addition, ROOTDELAY default value was changed from 1 to 5.

Signed-off-by: Thomas Deutschmann <whissi <AT> gentoo.org>

 defaults/initrd.defaults |  2 +-
 defaults/linuxrc         | 18 +++++++++++-------
 2 files changed, 12 insertions(+), 8 deletions(-)

diff --git a/defaults/initrd.defaults b/defaults/initrd.defaults
index 7d941d5..fbbd214 100644
--- a/defaults/initrd.defaults
+++ b/defaults/initrd.defaults
@@ -60,7 +60,7 @@ REAL_ROOT=''
 CONSOLE='/dev/console'
 NEW_ROOT='/newroot'
 
no_umounts='/newroot|/mnt/aufs-dev|/mnt/aufs-rw-branch|/mnt/livecd|/mnt/cdrom|/.unions/memory|/.unions/memory/xino'
-ROOTDELAY=1
+ROOTDELAY=5
 CDROOT='0'
 CDROOT_DEV=''
 CDROOT_TYPE='auto'

diff --git a/defaults/linuxrc b/defaults/linuxrc
index 4706055..6b69a13 100644
--- a/defaults/linuxrc
+++ b/defaults/linuxrc
@@ -593,8 +593,9 @@ then
 fi
 
 # Determine root device
-ROOTDELAY_100MSEC=1
-[ -n "${ROOTDELAY}" ] && ROOTDELAY_100MSEC=$((${ROOTDELAY} * 10))
+let ROOTDELAY_TIMEOUT=$(date +%s)+1
+ROOTDELAY_TIME_WAITED=0
+[ -n "${ROOTDELAY}" -a ${ROOTDELAY} -gt 0 ] && let 
ROOTDELAY_TIMEOUT=${ROOTDELAY_TIMEOUT}+${ROOTDELAY}-1
 while true
 do
        good_msg_n 'Determining root device ...'
@@ -602,7 +603,7 @@ do
        while [ "${got_good_root}" != '1' ]
        do
                # Start of sleep loop waiting on root
-               while [ ${ROOTDELAY_100MSEC} -ge 0 -a "${got_good_root}" != '1' 
]
+               while [ "${got_good_root}" != '1' -a $(date +%s) -le 
${ROOTDELAY_TIMEOUT} ]
                do
                        case "${REAL_ROOT}" in
                                LABEL=*|UUID=*|PARTUUID=*)
@@ -676,6 +677,7 @@ do
                                        if [ -b "${REAL_ROOT}" ]
                                        then
                                                got_good_root=1
+                                               echo
                                                good_msg "Detected 
real_root=${REAL_ROOT}"
                                                break
                                        fi
@@ -684,10 +686,10 @@ do
 
                        if [ "${got_good_root}" != '1' ]
                        then
-                               let ROOTDELAY_100MSEC=${ROOTDELAY_100MSEC}-1
+                               let 
ROOTDELAY_TIME_WAITED=${ROOTDELAY_TIME_WAITED}+1
                                sleep 0.1s
 
-                               let 
ROOTDELAY_100MSEC_MODULO=${ROOTDELAY_100MSEC}%10
+                               let 
ROOTDELAY_100MSEC_MODULO=${ROOTDELAY_TIME_WAITED}%10
                                if [ ${ROOTDELAY_100MSEC_MODULO} = 0 ]
                                then
                                        printf "."
@@ -695,13 +697,13 @@ do
                        fi
                done  # End of sleep loop waiting on root
 
-               if [ ${ROOTDELAY_100MSEC} -le 0 ]
+               if [ $(date +%s) -gt ${ROOTDELAY_TIMEOUT} ]
                then
                        echo
                fi
 
                # Check for a block device or /dev/nfs or zfs encryption
-               if [ -n "${REAL_ROOT}" ] && [ -b "${REAL_ROOT}" ] || [ 
"${REAL_ROOT}" = "/dev/nfs" ] || [ "${ROOTFSTYPE}" = "zfs" ]
+               if [ -n "${REAL_ROOT}" ] && [ "${REAL_ROOT}" = "/dev/nfs" ] || 
[ "${ROOTFSTYPE}" = "zfs" ] || [ -b "${REAL_ROOT}" ]
                then
                        if [ "${ROOTFSTYPE}" = "zfs" ]
                        then
@@ -803,6 +805,8 @@ do
        then
                bad_msg "Block device ${REAL_ROOT} is not a valid root device 
..."
                prompt_user "REAL_ROOT" "root block device"
+               ROOTDELAY_TIME_WAITED=0
+               let ROOTDELAY_TIMEOUT=$(date +%s)+1
        fi
 done
 # End determine root device

Reply via email to