Re: [OpenWrt-Devel] fstools: factory reset on power failure during startup
Hello, i think the patch fixes the issue. We could reproduce a factory reset with the dc/dc test very often befor we apply your patch. But now i think there is an other problem with ubifs! See log The system fails at Saturday evening with this error Press the [f] key and hit [enter] to enter failsafe mode Press the [1], [2], [3] or [4] key and hit [enter] to select the debug level [7.184000] random: nonblocking pool is initialized [ 10.236000] mount_root: Boot cmd: [ 10.264000] UBIFS: background thread "ubifs_bgt0_1" started, PID 302 [ 10.288000] UBIFS: recovery needed [ 10.292000] UBIFS error (pid 300): check_lpt_type: invalid type (15) in LPT node type 2 [ 10.30] CPU: 0 PID: 300 Comm: mount_root Not tainted 3.18.23 #37 [ 10.304000] Stack : 804e45f2 0038 87bb9350 0001 8041316c 80490b43 012c 804e382c 87bb9350 0001 87013db8 87013dbc c01bd000 80055e54 0006 8002d3e8 804179e8 87013d2c ... [ 10.34] Call Trace: [ 10.344000] [<800199a8>] show_stack+0x50/0x84 [ 10.348000] [<80161b88>] check_lpt_type.constprop.9+0x4c/0x60 [ 10.352000] [<80163bc0>] ubifs_lpt_init+0x148/0x4e8 [ 10.36] [<8014adc8>] ubifs_mount+0xfec/0x1794 [ 10.364000] [<800cba38>] mount_fs+0x20/0xdc [ 10.368000] [<800e4634>] vfs_kern_mount+0x64/0x138 [ 10.372000] [<800e7f74>] do_mount+0x95c/0xb20 [ 10.376000] [<800e8478>] SyS_mount+0x90/0xd4 [ 10.38] [<8000875c>] handle_sys+0x11c/0x140 [ 10.384000] [ 10.388000] UBIFS: background thread "ubifs_bgt0_1" stops [ 10.392000] mount_root: failed to mount -t ubifs /dev/ubi0_1 /tmp/overlay: Invalid argument [ 10.40] mount_root: TDT readlink return value of file /tmp/overlay/.fs_state is -1 [ 10.408000] mount_root: TDT readlink error string is ** No such file or directory ** [ 10.416000] mount_root: TDT actual filystem state is 0 [ 10.42] mount_root: TDT readlink return value of file /tmp/overlay/.fs_state is -1 [ 10.428000] mount_root: TDT readlink error string is ** No such file or directory ** [ 10.436000] mount_root: TDT readlink return value of file /tmp/overlay/.fs_state is 1 [ 10.444000] mount_root: overlay filesystem has not been fully initialized yet [ 10.452000] mount_root: switching to jffs2 overlay [ 10.456000] mount_root: TDT olddir /tmp/overlay failed: No such file or directory [ 10.464000] mount_root: switching to jffs2 failed - fallback to ramoverlay [ 10.472000] mount_root: failed /rom/overlay /overlay: Invalid argument [ 10.488000] procd: - early - [ 10.492000] procd: - watchdog - [ 11.212000] procd: - ubus - [ 12.22] procd: - init - Please press Enter to activate this console. # I dont know if you are the right persons? I think it has do to with the ubifs layer and not with your fstool. Flo 2015-11-27 13:17 GMT+01:00 Florian Eckert: > Hi, > > I have tested your patch since last day when I got the patch from you. > I am using an programmable dc/dc power supply, who switches the power > between startup randomly. > I will run the test during the weekend. And then I will see what > happend on Monday morning. > But for now i havn't lost the configuration anymore. > > Flo > > > 2015-11-26 14:25 GMT+01:00 Florian Eckert : >> Hi, >> >> thank your very much for your fast reply and the fix :-). >> I will try it and give you an respond. >> >> flo >> >> 2015-11-26 14:05 GMT+01:00 Felix Fietkau : >>> 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
Re: [OpenWrt-Devel] fstools: factory reset on power failure during startup
Hi, I have tested your patch since last day when I got the patch from you. I am using an programmable dc/dc power supply, who switches the power between startup randomly. I will run the test during the weekend. And then I will see what happend on Monday morning. But for now i havn't lost the configuration anymore. Flo 2015-11-26 14:25 GMT+01:00 Florian Eckert: > Hi, > > thank your very much for your fast reply and the fix :-). > I will try it and give you an respond. > > flo > > 2015-11-26 14:05 GMT+01:00 Felix Fietkau : >> 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@lists.openwrt.org https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
[OpenWrt-Devel] fstools: factory reset on power failure during startup
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? int fs_state_set(const char *dir, enum fs_state state) { char valstr[16]; char *path; ->path = alloca(strlen(dir) + 1 + sizeof("/.fs_state")); ->sprintf(path, "%s/.fs_state", dir); ->unlink(path); ->snprintf(valstr, sizeof(valstr), "%d", state); return symlink(valstr, path); } Regards Flo ___ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
Re: [OpenWrt-Devel] fstools: factory reset on power failure during startup
On 26/11/2015 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? interesting bug. felix recently added this "i crashed during firstboot, lets retry" feature recently but it seesm that this works well on classical (spi-)nor flash but fails on nand/ubi. i've made a note and will look at this, however i am porting a new target today so might not happen till start of the week. (unless felix has time to look at it beforehand) John > > int fs_state_set(const char *dir, enum fs_state state) > { > char valstr[16]; > char *path; > > ->path = alloca(strlen(dir) + 1 + sizeof("/.fs_state")); > ->sprintf(path, "%s/.fs_state", dir); > ->unlink(path); > ->snprintf(valstr, sizeof(valstr), "%d", state); > > return symlink(valstr, path); > } > > Regards > Flo > ___ > openwrt-devel mailing list > openwrt-devel@lists.openwrt.org > https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel > ___ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
Re: [OpenWrt-Devel] fstools: factory reset on power failure during startup
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@lists.openwrt.org https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel