*** SPAM *** [PATCH] libfstools: partname: Create block device in init if needed
Caleb James DeLisle
cjd at cjdns.fr
Mon Oct 6 07:09:56 PDT 2025
Does anybody have any opinions about this patch?
It seems like a relatively non-controversial idea, and it
makes USB rootfs able to work.
Thanks,
Caleb
On 19/09/2025 20:54, Caleb James DeLisle wrote:
> 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 <cjd at cjdns.fr>
> ---
> 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;
>
More information about the openwrt-devel
mailing list