Message ID | 20190409180839.1815-1-ken@miller.ec |
---|---|
State | Changes Requested |
Delegated to: | Rafał Miłecki |
Headers | show |
Series | [OpenWrt-Devel] fstools: block: make extroot mount preparation more robust | expand |
On Tue, 9 Apr 2019 at 14:08, Kenneth J. Miller <ken@miller.ec> wrote: > > 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. > > Fixes: FS#2231 > Ref: https://bugs.openwrt.org/index.php?do=details&task_id=2231 > Signed-off-by: Kenneth J. Miller <ken@miller.ec> This patch makes it possible to mount extroot overlay on x86_64. Tested-by: Val Kulkov <val.kulkov@gmail.com>
On 09.04.2019 20:08, Kenneth J. Miller wrote: > 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. There were some questions about this old patch on IRC so I took a moment to review it (finally). It touches some rarely used code and there are no enough experienced people who remember how it's supposed to work. > 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"); Did you consider consequences of this change? This breaks reading /etc/config/fstab from "rootfs" partition. You need to handle your case properly (carefully). Please don't suggest random change that just happen to work for your scenario.
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)
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. Fixes: FS#2231 Ref: https://bugs.openwrt.org/index.php?do=details&task_id=2231 Signed-off-by: Kenneth J. Miller <ken@miller.ec> --- block.c | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-)