sh/init: Detect a mounted /proc without sleeping

Previously we checked if /proc was alive by reading /proc/uptime twice
with a 1 second sleep between calls, so that it had time to update.
This got a complaint of an entire 1 second delay, so we improve the
check to be much faster without sleep. We cannot continue to use
/proc/uptime as it only has a 10ms resolution.

X-Gentoo-Bug: 348416
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=348416
Signed-off-by: Robin H. Johnson <robbat2@gentoo.org>
This commit is contained in:
Robin H. Johnson 2011-01-18 01:26:34 +00:00
parent 9ce957c3e7
commit 80853f5dbc

View File

@ -65,19 +65,27 @@ mount_svcdir()
# By default VServer already has /proc mounted, but OpenVZ does not! # By default VServer already has /proc mounted, but OpenVZ does not!
# However, some of our users have an old proc image in /proc # However, some of our users have an old proc image in /proc
# NFC how they managed that, but the end result means we have to test if # NFC how they managed that, but the end result means we have to test if
# /proc actually works or not. We to this by comparing uptime to one a second # /proc actually works or not. We to this by comparing two reads of
# ago # /proc/self/stat. They will not match, because at least the minor fault count
# field (field 10) should have changed.
#
# We can use any file here that fills the following requirements:
# - changes between sequential reads
# - is world-readable (not blocked in hardened kernel)
# - Is only a single line (ergo entire check is doable with no forks)
mountproc=true mountproc=true
if [ -e /proc/uptime ]; then f=/proc/self/stat
up="$(cat /proc/uptime)" if [ -e $f ]; then
sleep 1 exec 9<$f ; read a <&9 ; exec 9<&-
if [ "$up" = "$(cat /proc/uptime)" ]; then exec 9<$f ; read b <&9 ; exec 9<&-
if [ "$a" = "$b" ]; then
eerror "You have cruft in /proc that should be deleted" eerror "You have cruft in /proc that should be deleted"
else else
einfo "/proc is already mounted, skipping" einfo "/proc is already mounted, skipping"
mountproc=false mountproc=false
fi fi
fi fi
unset a b f
if $mountproc; then if $mountproc; then
procfs="proc" procfs="proc"