[openwrt/openwrt] base-files: call "sync" after initial setup

LEDE Commits lede-commits at lists.infradead.org
Mon Mar 14 00:55:20 PDT 2022


rmilecki pushed a commit to openwrt/openwrt.git, branch openwrt-21.02:
https://git.openwrt.org/f44f8b07b0277d38fafb3d613a303454d3b9faaf

commit f44f8b07b0277d38fafb3d613a303454d3b9faaf
Author: Rafał Miłecki <rafal at milecki.pl>
AuthorDate: Tue Mar 1 18:46:27 2022 +0100

    base-files: call "sync" after initial setup
    
    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: Hauke Mehrtens <hauke at hauke-m.de>
    Acked-by: Sergey Ryazanov <ryazanov.s.a at gmail.com>
    (cherry picked from commit 9851d4b6ce6e89d164a04803817625a9041b060a)
---
 package/base-files/files/etc/init.d/boot | 1 +
 1 file changed, 1 insertion(+)

diff --git a/package/base-files/files/etc/init.d/boot b/package/base-files/files/etc/init.d/boot
index e1c60c1c2f..749d9e9711 100755
--- a/package/base-files/files/etc/init.d/boot
+++ b/package/base-files/files/etc/init.d/boot
@@ -48,6 +48,7 @@ boot() {
 
 	/bin/config_generate
 	uci_apply_defaults
+	sync
 	
 	# temporary hack until configd exists
 	/sbin/reload_config




More information about the lede-commits mailing list