diff mbox series

[LEDE-DEV,LEDE-DEV,3/3] fstools: fix lost mount point when first boot

Message ID 2018032916255252436911@rosinson.com
State Changes Requested
Delegated to: John Crispin
Headers show
Series [LEDE-DEV,LEDE-DEV,1/3] fstools: add exfat filesystem support | expand

Commit Message

Rosy Song March 29, 2018, 8:25 a.m. UTC
When firmware is new flashed and reboot with a storage device plug in its usb
interface. Though the filesystem is not ready (FS_STATE_UNKNOWN), the
/dev/sda1 still mount on /mnt/sda1 by block-mount, then the system switching jffs...

root@OpenWrt:~# dmesg
......
[   32.224522] jffs2_scan_eraseblock(): End of filesystem marker found at 0x0
[   32.270514] jffs2_build_filesystem(): unlocking the mtd device...
[   32.278711] jffs2_build_filesystem(): erasing all blocks after the end marker...

root@OpenWrt:~# mount
......
/dev/sda1 on /mnt/sda1 type exfat (rw,relatime,fmask=0000,dmask=0000,allow_utime=0022,iocharset=utf8,namecase=0,errors=remount-ro)
mountd(pid1314) on /tmp/run/blockd type autofs (rw,relatime,fd=7,pgrp=1,timeout=30,minproto=5,maxproto=5,indirect)

After few miniutes, when filesystem is ready (FS_STATE_READY, /overlay/.fs_state -> 2)
the /dev/sda1 lost its mount point

root@OpenWrt:~# dmesg

...

[  207.439407] jffs2: notice: (1336) jffs2_build_xattr_subsystem: complete building xattr subsystem, 0 of xdatum (0 unchecked, 0 orphan) and 0 of xref (0 dead, 0 orphan) found.

root@OpenWrt:~# mount
......
**no /mnt/sda1 found**
......

Signed-off-by: Rosy Song <rosysong@rosinson.com>
---
 mount_root.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

-- 
2.13.3



Lede-dev mailing list
Lede-dev@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/lede-dev

Comments

John Crispin April 2, 2018, 3:48 p.m. UTC | #1
On 29/03/18 10:25, rosysong@rosinson.com wrote:
> When firmware is new flashed and reboot with a storage device plug in its usb
> interface. Though the filesystem is not ready (FS_STATE_UNKNOWN), the
> /dev/sda1 still mount on /mnt/sda1 by block-mount, then the system switching jffs...
>
> root@OpenWrt:~# dmesg
> ......
> [   32.224522] jffs2_scan_eraseblock(): End of filesystem marker found at 0x0
> [   32.270514] jffs2_build_filesystem(): unlocking the mtd device...
> [   32.278711] jffs2_build_filesystem(): erasing all blocks after the end marker...
>
> root@OpenWrt:~# mount
> ......
> /dev/sda1 on /mnt/sda1 type exfat (rw,relatime,fmask=0000,dmask=0000,allow_utime=0022,iocharset=utf8,namecase=0,errors=remount-ro)
> mountd(pid1314) on /tmp/run/blockd type autofs (rw,relatime,fd=7,pgrp=1,timeout=30,minproto=5,maxproto=5,indirect)
>
> After few miniutes, when filesystem is ready (FS_STATE_READY, /overlay/.fs_state -> 2)
> the /dev/sda1 lost its mount point
>
> root@OpenWrt:~# dmesg
>
> ...
>
> [  207.439407] jffs2: notice: (1336) jffs2_build_xattr_subsystem: complete building xattr subsystem, 0 of xdatum (0 unchecked, 0 orphan) and 0 of xref (0 dead, 0 orphan) found.
>
> root@OpenWrt:~# mount
> ......
> **no /mnt/sda1 found**
> ......
>
> Signed-off-by: Rosy Song <rosysong@rosinson.com>

Hi
the description explains the bug but fails to expalin how the patch 
solves the problem. I am also struggeling to understand the problem. You 
are trying to use sda1 as jffs2 but there is a exfat already present so 
that they collide ?
     John

> ---
>   mount_root.c | 11 ++++++++++-
>   1 file changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/mount_root.c b/mount_root.c
> index dffb0a6..110e4fd 100644
> --- a/mount_root.c
> +++ b/mount_root.c
> @@ -101,6 +101,7 @@ stop(int argc, char *argv[1])
>   static int
>   done(int argc, char *argv[1])
>   {
> +	int ret;
>   	struct volume *v = volume_find("rootfs_data");
>   
>   	if (!v)
> @@ -109,7 +110,15 @@ done(int argc, char *argv[1])
>   	switch (volume_identify(v)) {
>   	case FS_NONE:
>   	case FS_DEADCODE:
> -		return jffs2_switch(v);
> +		ret = jffs2_switch(v);
> +		/*
> +		* Devices mounted under /mnt will lost their mount point(see switch2jffs())
> +		* if the filesystem's(/overlay) state is not FS_STATE_READY,
> +		* this action can fix it.
> +		*/
> +		if (!access("/sbin/block", X_OK))
> +			system("/sbin/block mount");
> +		return ret;
>   
>   	case FS_EXT4:
>   	case FS_F2FS:
> -- 
> 2.13.3
>
>
>
> Lede-dev mailing list
> Lede-dev@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/lede-dev
> _______________________________________________
> Lede-dev mailing list
> Lede-dev@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/lede-dev
Rosy Song April 5, 2018, 8:47 a.m. UTC | #2
Sorry for the description.

1. The sda1 is a USB disk (exfat format), not only exfat, but also ntfs, fat16, fat32, ext4, all of them have the same issue.
2. Plug in the USB disk before upgrade firmware (do not unplug) and then wait until the system boot,
    After the filesystem initialized but before the jffs2(FS_DEADCODE) get ready, 
    please use the "mount" command to check if the sda1 is mounted under UART console.
3. You will find that the sda1 is mounted at the begining but lost the mount point after jffs2 get ready (FS_READY).

rosysong@rosinson.com
 
From: John Crispin
Date: 2018-04-02 23:48
To: rosysong@rosinson.com; lede-dev
Subject: Re: [LEDE-DEV] [LEDE-DEV, 3/3] fstools: fix lost mount point when first boot
 
 
On 29/03/18 10:25, rosysong@rosinson.com wrote:
> When firmware is new flashed and reboot with a storage device plug in its usb
> interface. Though the filesystem is not ready (FS_STATE_UNKNOWN), the
> /dev/sda1 still mount on /mnt/sda1 by block-mount, then the system switching jffs...
>
> root@OpenWrt:~# dmesg
> ......
> [   32.224522] jffs2_scan_eraseblock(): End of filesystem marker found at 0x0
> [   32.270514] jffs2_build_filesystem(): unlocking the mtd device...
> [   32.278711] jffs2_build_filesystem(): erasing all blocks after the end marker...
>
> root@OpenWrt:~# mount
> ......
> /dev/sda1 on /mnt/sda1 type exfat (rw,relatime,fmask=0000,dmask=0000,allow_utime=0022,iocharset=utf8,namecase=0,errors=remount-ro)
> mountd(pid1314) on /tmp/run/blockd type autofs (rw,relatime,fd=7,pgrp=1,timeout=30,minproto=5,maxproto=5,indirect)
>
> After few miniutes, when filesystem is ready (FS_STATE_READY, /overlay/.fs_state -> 2)
> the /dev/sda1 lost its mount point
>
> root@OpenWrt:~# dmesg
>
> ...
>
> [  207.439407] jffs2: notice: (1336) jffs2_build_xattr_subsystem: complete building xattr subsystem, 0 of xdatum (0 unchecked, 0 orphan) and 0 of xref (0 dead, 0 orphan) found.
>
> root@OpenWrt:~# mount
> ......
> **no /mnt/sda1 found**
> ......
>
> Signed-off-by: Rosy Song <rosysong@rosinson.com>
 
Hi
the description explains the bug but fails to expalin how the patch
solves the problem. I am also struggeling to understand the problem. You
are trying to use sda1 as jffs2 but there is a exfat already present so
that they collide ?
    John
 
> ---
>   mount_root.c | 11 ++++++++++-
>   1 file changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/mount_root.c b/mount_root.c
> index dffb0a6..110e4fd 100644
> --- a/mount_root.c
> +++ b/mount_root.c
> @@ -101,6 +101,7 @@ stop(int argc, char *argv[1])
>   static int
>   done(int argc, char *argv[1])
>   {
> +	int ret;
>   	struct volume *v = volume_find("rootfs_data");
>  
>   	if (!v)
> @@ -109,7 +110,15 @@ done(int argc, char *argv[1])
>   	switch (volume_identify(v)) {
>   	case FS_NONE:
>   	case FS_DEADCODE:
> -	return jffs2_switch(v);
> +	ret = jffs2_switch(v);
> +	/*
> +	* Devices mounted under /mnt will lost their mount point(see switch2jffs())
> +	* if the filesystem's(/overlay) state is not FS_STATE_READY,
> +	* this action can fix it.
> +	*/
> +	if (!access("/sbin/block", X_OK))
> +	system("/sbin/block mount");
> +	return ret;
>  
>   	case FS_EXT4:
>   	case FS_F2FS:
> --
> 2.13.3
diff mbox series

Patch

diff --git a/mount_root.c b/mount_root.c
index dffb0a6..110e4fd 100644
--- a/mount_root.c
+++ b/mount_root.c
@@ -101,6 +101,7 @@  stop(int argc, char *argv[1])
 static int
 done(int argc, char *argv[1])
 {
+	int ret;
 	struct volume *v = volume_find("rootfs_data");
 
 	if (!v)
@@ -109,7 +110,15 @@  done(int argc, char *argv[1])
 	switch (volume_identify(v)) {
 	case FS_NONE:
 	case FS_DEADCODE:
-		return jffs2_switch(v);
+		ret = jffs2_switch(v);
+		/*
+		* Devices mounted under /mnt will lost their mount point(see switch2jffs())
+		* if the filesystem's(/overlay) state is not FS_STATE_READY,
+		* this action can fix it.
+		*/
+		if (!access("/sbin/block", X_OK))
+			system("/sbin/block mount");
+		return ret;
 
 	case FS_EXT4:
 	case FS_F2FS: