Message ID | 20171215141030.5481-1-roman@advem.lv |
---|---|
State | Accepted |
Delegated to: | John Crispin |
Headers | show |
Series | [LEDE-DEV,fstools] overlay: fix race condition when switching to jffs2 | expand |
On 12/15/2017 03:10 PM, Roman Yeryomin wrote: > There is a race between `cp -a /tmp/root/* /rom/overlay` from > libfstools/overlay.c and a process creating new file(s) before > pivot(/rom, /mnt) occured. > That is a process can create a file and it will not be copied. > > To workaround this, do additional copy after jffs2 is ready. > This doesn't completely solve the problem but since there > was no other fix provided since original RFC [1], it is better > than nothiing. > > [1] https://www.mail-archive.com/openwrt-devel@lists.openwrt.org/msg38218.html > > Signed-off-by: Roman Yeryomin <roman@advem.lv> > --- > libfstools/overlay.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/libfstools/overlay.c b/libfstools/overlay.c > index 7ada5ff..8423a57 100644 > --- a/libfstools/overlay.c > +++ b/libfstools/overlay.c > @@ -243,6 +243,10 @@ jffs2_switch(struct volume *v) > ULOG_INFO("performing overlay whiteout\n"); > umount2("/tmp/root", MNT_DETACH); > foreachdir("/overlay/", handle_whiteout); > + > + /* try hard to be in sync */ > + ULOG_INFO("syncronizing overlay\n"); > + system("cp -a /tmp/root/upper/* / 2>/dev/null"); > break; > > case FS_EXT4: > This patch causes the following compile problem when compiled with glibc on x86: [ 50%] Building C object CMakeFiles/fstools.dir/libfstools/overlay.c.o /home/hauke/openwrt/lede/build_dir/target-x86_64_glibc/fstools-2018-01-02-11efbf3b/libfstools/overlay.c: In function 'jffs2_switch': /home/hauke/openwrt/lede/build_dir/target-x86_64_glibc/fstools-2018-01-02-11efbf3b/libfstools/overlay.c:249:3: warning: ignoring return value of 'system', declared with attribute warn_unused_result [-Wunused-result] system("cp -a /tmp/root/upper/* / 2>/dev/null"); ^ /home/hauke/openwrt/lede/build_dir/target-x86_64_glibc/fstools-2018-01-02-11efbf3b/libfstools/overlay.c: At top level: cc1: error: unrecognized command line option '-Wno-format-truncation' [-Werror] cc1: all warnings being treated as errors CMakeFiles/fstools.dir/build.make:110: recipe for target 'CMakeFiles/fstools.dir/libfstools/overlay.c.o' failed Hauke
On 2018-01-03 22:54, Hauke Mehrtens wrote: > On 12/15/2017 03:10 PM, Roman Yeryomin wrote: >> There is a race between `cp -a /tmp/root/* /rom/overlay` from >> libfstools/overlay.c and a process creating new file(s) before >> pivot(/rom, /mnt) occured. >> That is a process can create a file and it will not be copied. >> >> To workaround this, do additional copy after jffs2 is ready. >> This doesn't completely solve the problem but since there >> was no other fix provided since original RFC [1], it is better >> than nothiing. >> >> [1] >> https://www.mail-archive.com/openwrt-devel@lists.openwrt.org/msg38218.html >> >> Signed-off-by: Roman Yeryomin <roman@advem.lv> >> --- >> libfstools/overlay.c | 4 ++++ >> 1 file changed, 4 insertions(+) >> >> diff --git a/libfstools/overlay.c b/libfstools/overlay.c >> index 7ada5ff..8423a57 100644 >> --- a/libfstools/overlay.c >> +++ b/libfstools/overlay.c >> @@ -243,6 +243,10 @@ jffs2_switch(struct volume *v) >> ULOG_INFO("performing overlay whiteout\n"); >> umount2("/tmp/root", MNT_DETACH); >> foreachdir("/overlay/", handle_whiteout); >> + >> + /* try hard to be in sync */ >> + ULOG_INFO("syncronizing overlay\n"); >> + system("cp -a /tmp/root/upper/* / 2>/dev/null"); >> break; >> >> case FS_EXT4: >> > > This patch causes the following compile problem when compiled with > glibc > on x86: > > [ 50%] Building C object CMakeFiles/fstools.dir/libfstools/overlay.c.o > /home/hauke/openwrt/lede/build_dir/target-x86_64_glibc/fstools-2018-01-02-11efbf3b/libfstools/overlay.c: > In function 'jffs2_switch': > /home/hauke/openwrt/lede/build_dir/target-x86_64_glibc/fstools-2018-01-02-11efbf3b/libfstools/overlay.c:249:3: > warning: ignoring return value of 'system', declared with attribute > warn_unused_result [-Wunused-result] > system("cp -a /tmp/root/upper/* / 2>/dev/null"); > ^ > /home/hauke/openwrt/lede/build_dir/target-x86_64_glibc/fstools-2018-01-02-11efbf3b/libfstools/overlay.c: > At top level: > cc1: error: unrecognized command line option '-Wno-format-truncation' > [-Werror] > cc1: all warnings being treated as errors > CMakeFiles/fstools.dir/build.make:110: recipe for target > 'CMakeFiles/fstools.dir/libfstools/overlay.c.o' failed > Patch sent to list, thanks! Regards, Roman
diff --git a/libfstools/overlay.c b/libfstools/overlay.c index 7ada5ff..8423a57 100644 --- a/libfstools/overlay.c +++ b/libfstools/overlay.c @@ -243,6 +243,10 @@ jffs2_switch(struct volume *v) ULOG_INFO("performing overlay whiteout\n"); umount2("/tmp/root", MNT_DETACH); foreachdir("/overlay/", handle_whiteout); + + /* try hard to be in sync */ + ULOG_INFO("syncronizing overlay\n"); + system("cp -a /tmp/root/upper/* / 2>/dev/null"); break; case FS_EXT4:
There is a race between `cp -a /tmp/root/* /rom/overlay` from libfstools/overlay.c and a process creating new file(s) before pivot(/rom, /mnt) occured. That is a process can create a file and it will not be copied. To workaround this, do additional copy after jffs2 is ready. This doesn't completely solve the problem but since there was no other fix provided since original RFC [1], it is better than nothiing. [1] https://www.mail-archive.com/openwrt-devel@lists.openwrt.org/msg38218.html Signed-off-by: Roman Yeryomin <roman@advem.lv> --- libfstools/overlay.c | 4 ++++ 1 file changed, 4 insertions(+)