From 9a799fb3464b61df51f5e772c693cd76ad948f28 Mon Sep 17 00:00:00 2001 From: James Limbouris Date: Tue, 7 Jun 2011 17:35:26 +0800 Subject: initscripts: Modify 'populate-volatile.sh' to atomically update 'volatile.cache' When power is lost before a new volatile.cache has been flushed to disk, it can be corrupted, leaving the volatiles uncreated and causing software failure during the next reboot. Since only the existence of volative.cache is checked for using a temporary file on the same volume and renaming it avoids this issue. The file is sync'd before the rename to avoid problems with newer caching filesystems, in which the rename is atomic, but the contents of the file may not yet be flushed. Signed-off-by: James Limbouris Acked-by: Paul Menzel --- recipes/initscripts/initscripts-1.0/populate-volatile.sh | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/recipes/initscripts/initscripts-1.0/populate-volatile.sh b/recipes/initscripts/initscripts-1.0/populate-volatile.sh index 3bb3d94de6..f0a45eaea7 100755 --- a/recipes/initscripts/initscripts-1.0/populate-volatile.sh +++ b/recipes/initscripts/initscripts-1.0/populate-volatile.sh @@ -14,7 +14,7 @@ create_file() { chown ${TUSER}.${TGROUP} $1 || echo \"Failed to set owner -${TUSER}- for -$1-.\" >/dev/tty0 2>&1; chmod ${TMODE} $1 || echo \"Failed to set mode -${TMODE}- for -$1-.\" >/dev/tty0 2>&1 " - test "$VOLATILE_ENABLE_CACHE" = yes && echo "$EXEC" >> /etc/volatile.cache + test "$VOLATILE_ENABLE_CACHE" = yes && echo "$EXEC" >> /etc/volatile.cache.build [ -e "$1" ] && { [ "${VERBOSE}" != "no" ] && echo "Target already exists. Skipping." @@ -29,7 +29,7 @@ mk_dir() { chown ${TUSER}.${TGROUP} $1 || echo \"Failed to set owner -${TUSER}- for -$1-.\" >/dev/tty0 2>&1; chmod ${TMODE} $1 || echo \"Failed to set mode -${TMODE}- for -$1-.\" >/dev/tty0 2>&1 " - test "$VOLATILE_ENABLE_CACHE" = yes && echo "$EXEC" >> /etc/volatile.cache + test "$VOLATILE_ENABLE_CACHE" = yes && echo "$EXEC" >> /etc/volatile.cache.build [ -e "$1" ] && { [ "${VERBOSE}" != "no" ] && echo "Target already exists. Skipping." @@ -41,7 +41,7 @@ mk_dir() { link_file() { EXEC="test -e \"$2\" -o -L $2 || ln -s \"$1\" \"$2\" >/dev/tty0 2>&1" - test "$VOLATILE_ENABLE_CACHE" = yes && echo " $EXEC" >> /etc/volatile.cache + test "$VOLATILE_ENABLE_CACHE" = yes && echo " $EXEC" >> /etc/volatile.cache.build [ -e "$2" ] && { echo "Cannot create link over existing -${TNAME}-." >&2 @@ -164,8 +164,10 @@ if test -e /etc/volatile.cache -a "$VOLATILE_ENABLE_CACHE" = "yes" -a "x$1" != " then sh /etc/volatile.cache else - rm -f /etc/volatile.cache + rm -f /etc/volatile.cache /etc/volatile.cache.build for file in `ls -1 "${CFGDIR}" | sort`; do apply_cfgfile "${CFGDIR}/${file}" done + + [ -e /etc/volatile.cache.build ] && sync && mv /etc/volatile.cache.build /etc/volatile.cache fi -- cgit 1.2.3-korg