[OpenWrt-Devel] fstools: factory reset on power failure during startup

Felix Fietkau nbd at openwrt.org
Thu Nov 26 08:05:05 EST 2015


On 2015-11-26 09:24, Florian Eckert wrote:
> Hi,
> 
> I am using openwrt CC and an ubifs filesystem on top of ubi.
> If I plug off the power during startup, some times my configuration
> get lost and i am back to factory reset.
> 
> In the package fstools there is the bin "mount_root" it is called
> twice during startup.
> 1. S10boot at line 10
> 2. S95done at line 6
> 
> this calles edit the ./fs_state link
> 
> S10boot/S95done:
> ---
> Because ubifs is doing filesystem handling in a background process
> "ubi_bgt0d", could it be possible,
> that (see code) ./.fs_state is not rewritten written anymore?
> So that at next boot the system thinks he is in upgrade mode?
> 
> If I add a sleep(10) between unlink and symlink function call i can
> reproduce the failure if i unplug the power.
> I think the first think what should be done is to call
> "snprintf(valstr, sizeof(valstr), "%d", state);" before "unlink(path).
> 
> Or this this a deeper Problem?
I think you're right that there's a race here. When I wrote this code,
I never actually intended for the file to get re-written after the
first boot, it seems that I simply forgot to add the necessary check
for it.
Please test if this fstools patch fixes the problem:
---
--- a/libfstools/overlay.c
+++ b/libfstools/overlay.c
@@ -311,6 +311,9 @@ int fs_state_set(const char *dir, enum fs_state state)
 	char valstr[16];
 	char *path;
 
+	if (fs_state_get(dir) == state)
+		return 0;
+
 	path = alloca(strlen(dir) + 1 + sizeof("/.fs_state"));
 	sprintf(path, "%s/.fs_state", dir);
 	unlink(path);
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list