[PATCH] base-files: call "sync" after initial setup
Sergey Ryazanov
ryazanov.s.a at gmail.com
Mon Mar 7 17:42:41 PST 2022
On Tue, Mar 1, 2022 at 8:51 PM Rafał Miłecki <zajec5 at 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 <rafal at milecki.pl>
Acked-by: Sergey Ryazanov <ryazanov.s.a at gmail.com>
And thank you for such a detailed analysis of the situation!
--
Sergey
More information about the openwrt-devel
mailing list