Patchwork [v2] initscripts: Modify 'populate-volatile.sh' to atomically update 'volatile.cache'

login
register
mail settings
Submitter James Limbouris
Date June 7, 2011, 9:35 a.m.
Message ID <1307439326-12974-1-git-send-email-james@digitalmatter.com.au>
Download mbox | patch
Permalink /patch/5521/
State Accepted
Headers show

Comments

James Limbouris - June 7, 2011, 9:35 a.m.
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.
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 <james@digitalmatter.com.au>
---
 .../initscripts-1.0/populate-volatile.sh           |   10 ++++++----
 1 files changed, 6 insertions(+), 4 deletions(-)
Paul Menzel - June 7, 2011, 10:13 a.m.
Dear James,


thank you for the updated patch.

Am Dienstag, den 07.06.2011, 17:35 +0800 schrieb James Limbouris:
> 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.

So the device is still booting up although the power is lost? I am still
confused how this patch can fix this. I am sorry for my ignorance.

> 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 <james@digitalmatter.com.au>

I will commit your patch during the next days to leave some time for
others to comment/review.

> ---
>  .../initscripts-1.0/populate-volatile.sh           |   10 ++++++----
>  1 files changed, 6 insertions(+), 4 deletions(-)

[…]


Thanks,

Paul

Patch

diff --git a/recipes/initscripts/initscripts-1.0/populate-volatile.sh b/recipes/initscripts/initscripts-1.0/populate-volatile.sh
index 3bb3d94..e355680 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