Rootfs on devices such as USB is currently impossible, but not because the kernel modules aren't loaded early enough. The only problem is that procd does not create hotplug device files until after preinit.
Update partname_volume_init to also create the device file if necessary so that it will be able to be mounted. With this patch, USB rootfs with normal kmods Just Works. Signed-off-by: Caleb James DeLisle <[email protected]> --- libfstools/partname.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/libfstools/partname.c b/libfstools/partname.c index 9f2347a..a2b2b2c 100644 --- a/libfstools/partname.c +++ b/libfstools/partname.c @@ -2,6 +2,8 @@ #include "common.h" +#include <sys/sysmacros.h> + #define BUFLEN 64 struct devpath { @@ -41,14 +43,45 @@ static int partname_volume_identify(struct volume *v) return ret; } +static int ensure_block_dev(struct partname_volume *p, const char *voldir) +{ + unsigned int major, minor; + struct stat s; + char dev[8]; + + if (stat(p->dev.devpathstr, &s) < 0) { + if (errno != ENOENT) + return -1; + } else { + return S_ISBLK(s.st_mode) ? 0 : -2; + } + + if (read_string_from_file(voldir, "dev", dev, sizeof(dev)) == NULL) + return -3; + + if (sscanf(dev, "%d:%d", &major, &minor) != 2) + return -4; + + if (mknod(p->dev.devpathstr, S_IFBLK | 0600, makedev(major, minor)) < 0) + return -5; + + return 0; +} + static int partname_volume_init(struct volume *v) { struct partname_volume *p = container_of(v, struct partname_volume, v); char voldir[BUFLEN]; unsigned int volsize; + int ret; snprintf(voldir, sizeof(voldir), "%s/%s", block_dir_name, p->dev.devpath.device); + ret = ensure_block_dev(p, voldir); + if (ret < 0) + printf("Failed to create block device %s ret=%d errno=%d\n", + p->dev.devpathstr, ret, errno); + if (read_uint_from_file(voldir, "size", &volsize)) return -1; -- 2.39.5 _______________________________________________ openwrt-devel mailing list [email protected] https://lists.openwrt.org/mailman/listinfo/openwrt-devel
