[PATCH fstools] partname: add "fstools_use_partlabel" option to find part from label

INAGAKI Hiroshi musashino.open at gmail.com
Fri Mar 11 20:05:17 PST 2022

This patch adds "fstools_use_partlabel" option to partname driver.

The Linux Kernel supports "root=PARTLABEL=<label>" syntax, but fstools
doesn't and fail to parse the path to the root device.
To use this syntax, add the option and find from all block devices.

This change is required for I-O DATA HDL-A/HDL2-A. On they, kernel and
rootfs are stored in the storage device connected to SATA, port1 or
port2 and the path to the partition will be assigned dynamically. So
"root=PARTLABEL=<label>" syntax is required instead of "/dev/sdXN".

Signed-off-by: INAGAKI Hiroshi <musashino.open at gmail.com>
 libfstools/partname.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/libfstools/partname.c b/libfstools/partname.c
index f59c52e..7e57311 100644
--- a/libfstools/partname.c
+++ b/libfstools/partname.c
@@ -121,6 +121,7 @@ static struct volume *partname_volume_find(char *name)
 	char *rootdev = NULL, *devname, *tmp;
 	int j;
 	bool found = false;
+	bool use_label = false;
 	glob_t gl;
 	if (get_var_from_file("/proc/cmdline", "fstools_ignore_partname", rootparam, sizeof(rootparam))) {
@@ -128,12 +129,17 @@ static struct volume *partname_volume_find(char *name)
 			return NULL;
-	if (get_var_from_file("/proc/cmdline", "root", rootparam, sizeof(rootparam))) {
+	if (get_var_from_file("/proc/cmdline", "fstools_use_partlabel", rootparam, sizeof(rootparam)))
+		if (!strcmp("1", rootparam))
+			use_label = true;
+	if (get_var_from_file("/proc/cmdline", "root", rootparam, sizeof(rootparam)) &&
+	    !use_label) {
 		rootdev = rootdevname(rootparam);
 		/* find partition on same device as rootfs */
 		snprintf(ueventgstr, sizeof(ueventgstr), "%s/%s/*/uevent", block_dir_name, rootdev);
 	} else {
-		/* no 'root=' kernel cmdline parameter, find on any block device */
+		/* no 'root=' kernel cmdline parameter or use_label=true, find on any block device */
 		snprintf(ueventgstr, sizeof(ueventgstr), "%s/*/uevent", block_dir_name);

More information about the openwrt-devel mailing list