On Tue, Mar 1, 2022 at 8:51 PM Rafał Miłecki <zaj...@gmail.com> wrote: > OpenWrt uses a lot of (b)ash scripts for initial setup. This isn't the > best solution as they almost never consider syncing files / data. Still > this is what we have and we need to try living with it. > > Without proper syncing OpenWrt can easily get into an inconsistent state > on power cut. It's because: > 1. Actual (flash) inode and data writes are not synchronized > 2. Data writeback can take up to 30 seconds (dirty_expire_centisecs) > 3. ubifs adds extra 5 seconds (dirty_writeback_centisecs) "delay" > > Some possible cases (examples) for new files: > 1. Power cut during 5 seconds after write() can result in all data loss > 2. Power cut happening between 5 and 35 seconds after write() can result > in empty file (inode flushed after 5 seconds, data flush queued) > > Above affects e.g. uci-defaults. After executing some migration script > it may get deleted (whited out) without generated data getting actually > written. Power cut will result in missing data and deleted file. > > There are three ways of dealing with that: > 1. Rewriting all user-space init to proper C with syncs > 2. Trying bash hacks (like creating tmp files & moving them) > 3. Adding sync and hoping for no power cut during critical section > > This change introduces the last solution that is the simplest. It > reduces time during which things may go wrong from ~35 seconds to > probably less than a second. Of course it applies only to IO operations > performed before /etc/init.d/boot . It's probably the stage when the > most new files get created. > > All later changes are usually done using smarter C apps (e.g. busybox or > uci) that creates tmp files and uses rename() that is expected to be > atomic. > > Signed-off-by: Rafał Miłecki <ra...@milecki.pl>
Acked-by: Sergey Ryazanov <ryazanov....@gmail.com> And thank you for such a detailed analysis of the situation! -- Sergey _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/mailman/listinfo/openwrt-devel