[PATCH] block: make extroot mount preparation more robust
Kenneth Miller
ken at miller.ec
Tue Apr 9 13:14:37 EDT 2019
The extroot mount preparation code for r/w rootfs overlay discovery, and
determining the user-defined /etc/config/fstab location within, would
only discover overlays residing on JFFS2 or UBIFS MTD storage.
This led to attempts at loading the uci fstab configuration without the
required /tmp/overlay directory prefix on devices with a non-MTD r/w
rootfs overlay, and thus failure to find any custom fstab /overlay
extroot entries on PREINIT.
(example: the default openwrt eMMC partition layout on the zyxel nbg6817)
Futher, with UBIFS_EXTROOT enabled (fstools package default), and no MTD
rootfs partitions present, check_extroot would not attempt rootfs
discovery on block devices, such as the ext4 mmcblk rootfs overlay on
the nbg6817.
With this patch:
1) main_extroot now attempts to load uci fstab configuration from an
already mounted overlay, before defaulting to the prefix-less uci config
dir when no MTD rootfs partitions are detected.
2) check_extroot now also attempts to find rootfs partitions on block
devices when no MTD rootfs partitions are detected.
Signed-off-by: Kenneth Miller <ken at miller.ec>
---
block.c | 17 +++++------------
1 file changed, 5 insertions(+), 12 deletions(-)
diff --git a/block.c b/block.c
index 39212d2..3dfc4a5 100644
--- a/block.c
+++ b/block.c
@@ -1301,7 +1301,7 @@ static int find_block_ubi_RO(libubi_t libubi, char
*name, char *part, int plen)
return err;
}
-#else
+#endif
static int find_root_dev(char *buf, int len)
{
@@ -1332,8 +1332,6 @@ static int find_root_dev(char *buf, int len)
return -1;
}
-#endif
-
static int test_fs_support(const char *name)
{
char line[128], *p;
@@ -1363,25 +1361,20 @@ static int check_extroot(char *path)
struct probe_info *pr = NULL;
char devpath[32];
-#ifdef UBIFS_EXTROOT
if (find_block_mtd("\"rootfs\"", devpath, sizeof(devpath))) {
int err = -1;
+#ifdef UBIFS_EXTROOT
libubi_t libubi;
libubi = libubi_open();
err = find_block_ubi_RO(libubi, "rootfs", devpath, sizeof(devpath));
libubi_close(libubi);
- if (err)
- return -1;
- }
-#else
- if (find_block_mtd("\"rootfs\"", devpath, sizeof(devpath))) {
- if (find_root_dev(devpath, sizeof(devpath))) {
+#endif
+ if (err && find_root_dev(devpath, sizeof(devpath))) {
ULOG_ERR("extroot: unable to determine root device\n");
return -1;
}
}
-#endif
list_for_each_entry(pr, &devices, list) {
if (!strcmp(pr->dev, devpath)) {
@@ -1585,7 +1578,7 @@ static int main_extroot(int argc, char **argv)
}
#endif
- return mount_extroot(NULL);
+ return mount_extroot("/tmp/overlay");
}
static int main_mount(int argc, char **argv)
--
2.21.0
On 4/9/19 6:44 PM, Kenneth Miller wrote:
> I had trouble using an ext4 extroot overlay on my Zyxel NBG6817 running
> 18.06.2, so I took a closer look at the way libfstools and its block
> tool setup the extroot overlay during PREINIT and found some things
> broke extroot mounting on certain devices.
>
> The issue and logs are documented in the following ticket:
> https://bugs.openwrt.org/index.php?do=details&task_id=2231
>
> What I found was that the main_extroot code would only look for
> "rootfs_data" partitions on MTD storage (specifically only JFFS2 and
> UBIFS partitions), before defaulting to calling mount_extroot with no
> configuration path prefix.
> mount_extroot would then try to load the fstab uci config at
> /etc/config/fstab, which would fail as this isn't present on the normal
> r/o squashfs eMMC partition.
>
> With a /etc/config/fstab uci config be pre-placed on the squashfs,
> mount_extroot would continue after loading it and successfully finding
> an /overlay extroot entry, but fail during check_extroot when no MTD
> partition or UBIFS volume can be found.
>
> With the attached patch the behaviour of main_extroot and check_extroot
> is expanded to allow detection of rootfs overlays on block devices such
> as eMMC, without compromising the behavior for JFFS2 and UBIFS rootfs
> discovery:
>
> 1. The default mount_extroot call now uses '/tmp/overlay' as a default
> parameter should no MTD partition be detected. This results in
> config_load attempting to load a uci fstab with this
> prefix before defaulting to /etc/config/fstab.
> 2. UBIFS_EXTROOT now acts as a supplementary option instead of an
> exclusionary one and will allow rootfs discovery on block devices even
> when it fails to find UBIFS rootfs volumes.
> (IMHO the best design decision as this option defaults to 'y' in the
> fstools package configuration)
>
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel
More information about the openwrt-devel
mailing list