diff mbox series

[LEDE-DEV,fstools] overlay: fix race condition when switching to jffs2

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

Commit Message

Roman Yeryomin Dec. 15, 2017, 2:10 p.m. UTC
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(+)

Comments

Hauke Mehrtens Jan. 3, 2018, 8:54 p.m. UTC | #1
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
Roman Yeryomin Jan. 7, 2018, 6:05 p.m. UTC | #2
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 mbox series

Patch

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: