[PATCH] libfstools: partname: Create block device in init if needed

Caleb James DeLisle cjd at cjdns.fr
Fri Sep 19 11:54:20 PDT 2025


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;
 
-- 
2.39.5




More information about the openwrt-devel mailing list