[OpenWrt-Devel] fstools: factory reset on power failure during startup
eckert.florian at googlemail.com
Thu Nov 26 08:25:33 EST 2015
thank your very much for your fast reply and the fix :-).
I will try it and give you an respond.
2015-11-26 14:05 GMT+01:00 Felix Fietkau <nbd at openwrt.org>:
> On 2015-11-26 09:24, Florian Eckert wrote:
>> 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
>> 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;
> char *path;
> + if (fs_state_get(dir) == state)
> + return 0;
> path = alloca(strlen(dir) + 1 + sizeof("/.fs_state"));
> sprintf(path, "%s/.fs_state", dir);
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
More information about the openwrt-devel