udev-cache: take a read-only rootfs into consideration

In case of a read-only rootfs, we skip the process of generating
udev cache, as the data cannot be persisted between reboots.

However, it's possbile that the $DEVCACHE (default to /etc/dev.tar)
exists in a read-only rootfs, no matter how it's generated or installed.
In such situation, we try to use $DEVCACHE if possible.

Besides the basic changes in the logic of udev cache handling,
this patch also adds code to output more information if the udev
cache is not used and VERBOSE enabled.

This patch also changes the readfile function to readfiles function
so that it could handle more than one file at once.

(From OE-Core rev: 4ec1266e7e1aacdb9d3d0fc5cd6307b60df1731e)

Signed-off-by: Chen Qi <Qi.Chen@windriver.com>
Signed-off-by: Saul Wold <sgw@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Chen Qi 2013-06-28 15:48:22 +08:00 committed by Richard Purdie
parent 6ecba81678
commit 28786ec6cc
2 changed files with 38 additions and 22 deletions

View File

@ -18,15 +18,17 @@ export TZ=/etc/localtime
[ -x @UDEVD@ ] || exit 1
[ -f /etc/default/udev-cache ] && . /etc/default/udev-cache
[ -f /etc/udev/udev.conf ] && . /etc/udev/udev.conf
[ -f /etc/default/rcS ] && . /etc/default/rcS
readfile () {
filename=$1
readfiles () {
READDATA=""
if [ -r $filename ]; then
while read line; do
READDATA="$READDATA$line"
done < $filename
fi
for filename in $@; do
if [ -r $filename ]; then
while read line; do
READDATA="$READDATA$line"
done < $filename
fi
done
}
case "$1" in
@ -52,29 +54,37 @@ case "$1" in
mount -a -t tmpfs 2>/dev/null
mkdir -p /var/volatile/tmp
# cache handling
# Cache handling.
# A list of files which are used as a criteria to judge whether the udev cache could be reused.
CMP_FILE_LIST="/proc/version /proc/cmdline /proc/devices /proc/atags"
if [ "$DEVCACHE" != "" ]; then
readfile /proc/version
VERSION="$READDATA"
readfile /proc/cmdline
CMDLINE="$READDATA"
readfile /proc/devices
DEVICES="$READDATA"
readfile /proc/atags
ATAGS="$READDATA"
if [ -e $DEVCACHE ]; then
readfile /etc/udev/cache.data
if [ "$READDATA" = "$VERSION$CMDLINE$DEVICES$ATAGS" ]; then
readfiles $CMP_FILE_LIST
NEWDATA="$READDATA"
readfiles /etc/udev/cache.data
OLDDATA="$READDATA"
if [ "$OLDDATA" = "$NEWDATA" ]; then
(cd /; tar xf $DEVCACHE > /dev/null 2>&1)
not_first_boot=1
[ "$VERBOSE" != "no" ] && echo "udev: using cache file $DEVCACHE"
[ -e /dev/shm/udev.cache ] && rm -f /dev/shm/udev.cache
else
echo "$VERSION$CMDLINE$DEVICES$ATAGS" > /dev/shm/udev.cache
# Output detailed reason why the cached /dev is not used
if [ "$VERBOSE" != "no" ]; then
echo "udev: udev cache not used"
echo "udev: we use $CMP_FILE_LIST as criteria to judge whether the cache /dev could be resued"
echo "udev: olddata: $OLDDATA"
echo "udev: newdata: $NEWDATA"
fi
echo "$NEWDATA" > /dev/shm/udev.cache
fi
else
echo "$VERSION$CMDLINE$DEVICES$ATAGS" > /dev/shm/udev.cache
else
if [ "$ROOTFS_READ_ONLY" != "yes" ]; then
# If rootfs is not read-only, it's possible that a new udev cache would be generated;
# otherwise, we do not bother to read files.
readfiles $CMP_FILE_LIST
echo "$READDATA" > /dev/shm/udev.cache
fi
fi
fi

View File

@ -15,8 +15,14 @@ export TZ=/etc/localtime
[ -x @UDEVD@ ] || exit 1
[ -d /sys/class ] || exit 1
[ -f /etc/default/rcS ] && . /etc/default/rcS
[ -f /etc/default/udev-cache ] && . /etc/default/udev-cache
if [ "$ROOTFS_READ_ONLY" = "yes" ]; then
[ "$VERBOSE" != "no" ] && echo "udev-cache: read-only rootfs, skip generating udev-cache"
exit 0
fi
if [ "$DEVCACHE" != "" -a -e /dev/shm/udev.cache ]; then
echo "Populating dev cache"
(cd /; tar cf "$DEVCACHE" dev)