xref: /OK3568_Linux_fs/buildroot/package/busybox/0006-Support-PARTLABEL.patch (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593SmuzhiyunFrom a3c839f7ca05ecd424be293f49e90f36845b8b8b Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com>
3*4882a593SmuzhiyunDate: Fri, 25 Nov 2022 19:39:30 +0800
4*4882a593SmuzhiyunSubject: [PATCH 6/8] Support PARTLABEL
5*4882a593Smuzhiyun
6*4882a593SmuzhiyunTested on RK3588 EVB:
7*4882a593Smuzhiyunbusybox mount PARTLABEL=rootfs /media/
8*4882a593Smuzhiyun
9*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
10*4882a593Smuzhiyun---
11*4882a593Smuzhiyun include/volume_id.h                       |  1 +
12*4882a593Smuzhiyun util-linux/volume_id/get_devname.c        | 59 +++++++++++++++++++----
13*4882a593Smuzhiyun util-linux/volume_id/volume_id_internal.h |  1 +
14*4882a593Smuzhiyun 3 files changed, 52 insertions(+), 9 deletions(-)
15*4882a593Smuzhiyun
16*4882a593Smuzhiyundiff --git a/include/volume_id.h b/include/volume_id.h
17*4882a593Smuzhiyunindex a83da89..afb76e4 100644
18*4882a593Smuzhiyun--- a/include/volume_id.h
19*4882a593Smuzhiyun+++ b/include/volume_id.h
20*4882a593Smuzhiyun@@ -20,6 +20,7 @@
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun char *get_devname_from_label(const char *spec);
23*4882a593Smuzhiyun char *get_devname_from_uuid(const char *spec);
24*4882a593Smuzhiyun+char *get_devname_from_partlabel(const char *spec);
25*4882a593Smuzhiyun void display_uuid_cache(int scan_devices);
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun /* Returns:
28*4882a593Smuzhiyundiff --git a/util-linux/volume_id/get_devname.c b/util-linux/volume_id/get_devname.c
29*4882a593Smuzhiyunindex 00cfb28..61d0461 100644
30*4882a593Smuzhiyun--- a/util-linux/volume_id/get_devname.c
31*4882a593Smuzhiyun+++ b/util-linux/volume_id/get_devname.c
32*4882a593Smuzhiyun@@ -24,15 +24,16 @@ static struct uuidCache_s {
33*4882a593Smuzhiyun //	int major, minor;
34*4882a593Smuzhiyun 	char *device;
35*4882a593Smuzhiyun 	char *label;
36*4882a593Smuzhiyun+	char *partlabel;
37*4882a593Smuzhiyun 	char *uc_uuid; /* prefix makes it easier to grep for */
38*4882a593Smuzhiyun 	IF_FEATURE_BLKID_TYPE(const char *type;)
39*4882a593Smuzhiyun } *uuidCache;
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun #if !ENABLE_FEATURE_BLKID_TYPE
42*4882a593Smuzhiyun-#define get_label_uuid(fd, label, uuid, type) \
43*4882a593Smuzhiyun-	get_label_uuid(fd, label, uuid)
44*4882a593Smuzhiyun-#define uuidcache_addentry(device, label, uuid, type) \
45*4882a593Smuzhiyun-	uuidcache_addentry(device, label, uuid)
46*4882a593Smuzhiyun+#define get_label_uuid(fd, label, partlabel, uuid, type) \
47*4882a593Smuzhiyun+	get_label_uuid(fd, label, partlabel, uuid)
48*4882a593Smuzhiyun+#define uuidcache_addentry(device, label, partlabel, uuid, type) \
49*4882a593Smuzhiyun+	uuidcache_addentry(device, label, partlabel, uuid)
50*4882a593Smuzhiyun #endif
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun /* Returns !0 on error.
53*4882a593Smuzhiyun@@ -40,11 +41,13 @@ static struct uuidCache_s {
54*4882a593Smuzhiyun  * (and they can't be NULL, although they can be "").
55*4882a593Smuzhiyun  * NB: closes fd. */
56*4882a593Smuzhiyun static int
57*4882a593Smuzhiyun-get_label_uuid(int fd, char **label, char **uuid, const char **type)
58*4882a593Smuzhiyun+get_label_uuid(int fd, char **label, char **partlabel, char **uuid, const char **type)
59*4882a593Smuzhiyun {
60*4882a593Smuzhiyun 	int rv = 1;
61*4882a593Smuzhiyun 	uint64_t size;
62*4882a593Smuzhiyun 	struct volume_id *vid;
63*4882a593Smuzhiyun+	struct stat st;
64*4882a593Smuzhiyun+	char *uevent;
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun 	/* fd is owned by vid now */
67*4882a593Smuzhiyun 	vid = volume_id_open_node(fd);
68*4882a593Smuzhiyun@@ -55,12 +58,30 @@ get_label_uuid(int fd, char **label, char **uuid, const char **type)
69*4882a593Smuzhiyun 	if (volume_id_probe_all(vid, /*0,*/ size) != 0)
70*4882a593Smuzhiyun 		goto ret;
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun-	if (vid->label[0] != '\0' || vid->uuid[0] != '\0'
73*4882a593Smuzhiyun+	fstat(fd, &st);
74*4882a593Smuzhiyun+	uevent = xasprintf("/sys/dev/block/%d:%d/uevent",
75*4882a593Smuzhiyun+			   major(st.st_rdev), minor(st.st_rdev));
76*4882a593Smuzhiyun+	if (uevent) {
77*4882a593Smuzhiyun+		FILE *rfile = fopen_for_read(uevent);
78*4882a593Smuzhiyun+		if (rfile) {
79*4882a593Smuzhiyun+			const char *line;
80*4882a593Smuzhiyun+			while ((line = xmalloc_fgetline(rfile)) != NULL) {
81*4882a593Smuzhiyun+				if (sscanf(line, "PARTNAME=%s",
82*4882a593Smuzhiyun+					   vid->partlabel) > 0)
83*4882a593Smuzhiyun+					break;
84*4882a593Smuzhiyun+			}
85*4882a593Smuzhiyun+			fclose(rfile);
86*4882a593Smuzhiyun+		}
87*4882a593Smuzhiyun+		free(uevent);
88*4882a593Smuzhiyun+	}
89*4882a593Smuzhiyun+
90*4882a593Smuzhiyun+	if (vid->label[0] != '\0' || vid->partlabel[0] != '\0' || vid->uuid[0] != '\0'
91*4882a593Smuzhiyun #if ENABLE_FEATURE_BLKID_TYPE
92*4882a593Smuzhiyun 	 || vid->type != NULL
93*4882a593Smuzhiyun #endif
94*4882a593Smuzhiyun 	) {
95*4882a593Smuzhiyun 		*label = xstrndup(vid->label, sizeof(vid->label));
96*4882a593Smuzhiyun+		*partlabel = xstrndup(vid->partlabel, sizeof(vid->partlabel));
97*4882a593Smuzhiyun 		*uuid  = xstrndup(vid->uuid, sizeof(vid->uuid));
98*4882a593Smuzhiyun #if ENABLE_FEATURE_BLKID_TYPE
99*4882a593Smuzhiyun 		*type = vid->type;
100*4882a593Smuzhiyun@@ -77,7 +98,7 @@ get_label_uuid(int fd, char **label, char **uuid, const char **type)
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun /* NB: we take ownership of (malloc'ed) label and uuid */
103*4882a593Smuzhiyun static void
104*4882a593Smuzhiyun-uuidcache_addentry(char *device, /*int major, int minor,*/ char *label, char *uuid, const char *type)
105*4882a593Smuzhiyun+uuidcache_addentry(char *device, /*int major, int minor,*/ char *label, char *partlabel, char *uuid, const char *type)
106*4882a593Smuzhiyun {
107*4882a593Smuzhiyun 	struct uuidCache_s *last;
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun@@ -94,6 +115,7 @@ uuidcache_addentry(char *device, /*int major, int minor,*/ char *label, char *uu
110*4882a593Smuzhiyun //	last->minor = minor;
111*4882a593Smuzhiyun 	last->device = device;
112*4882a593Smuzhiyun 	last->label = label;
113*4882a593Smuzhiyun+	last->partlabel = partlabel;
114*4882a593Smuzhiyun 	last->uc_uuid = uuid;
115*4882a593Smuzhiyun 	IF_FEATURE_BLKID_TYPE(last->type = type;)
116*4882a593Smuzhiyun }
117*4882a593Smuzhiyun@@ -244,6 +266,8 @@ void display_uuid_cache(int scan_devices)
118*4882a593Smuzhiyun 	if (uc->type)
119*4882a593Smuzhiyun 		printf(" TYPE=\"%s\"", uc->type);
120*4882a593Smuzhiyun #endif
121*4882a593Smuzhiyun+		if (uc->partlabel[0])
122*4882a593Smuzhiyun+			printf(" PARTLABEL=\"%s\"", uc->partlabel);
123*4882a593Smuzhiyun 		bb_putchar('\n');
124*4882a593Smuzhiyun 		uc = uc->next;
125*4882a593Smuzhiyun 	}
126*4882a593Smuzhiyun@@ -253,6 +277,7 @@ int add_to_uuid_cache(const char *device)
127*4882a593Smuzhiyun {
128*4882a593Smuzhiyun 	char *uuid = uuid; /* for compiler */
129*4882a593Smuzhiyun 	char *label = label;
130*4882a593Smuzhiyun+	char *partlabel = partlabel;
131*4882a593Smuzhiyun #if ENABLE_FEATURE_BLKID_TYPE
132*4882a593Smuzhiyun 	const char *type = type;
133*4882a593Smuzhiyun #endif
134*4882a593Smuzhiyun@@ -263,9 +288,9 @@ int add_to_uuid_cache(const char *device)
135*4882a593Smuzhiyun 		return 0;
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun 	/* get_label_uuid() closes fd in all cases (success & failure) */
138*4882a593Smuzhiyun-	if (get_label_uuid(fd, &label, &uuid, &type) == 0) {
139*4882a593Smuzhiyun+	if (get_label_uuid(fd, &label, &partlabel, &uuid, &type) == 0) {
140*4882a593Smuzhiyun 		/* uuidcache_addentry() takes ownership of all four params */
141*4882a593Smuzhiyun-		uuidcache_addentry(xstrdup(device), /*ma, mi,*/ label, uuid, type);
142*4882a593Smuzhiyun+		uuidcache_addentry(xstrdup(device), /*ma, mi,*/ label, partlabel, uuid, type);
143*4882a593Smuzhiyun 		return 1;
144*4882a593Smuzhiyun 	}
145*4882a593Smuzhiyun 	return 0;
146*4882a593Smuzhiyun@@ -288,6 +313,20 @@ char *get_devname_from_label(const char *spec)
147*4882a593Smuzhiyun 	return NULL;
148*4882a593Smuzhiyun }
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun+char *get_devname_from_partlabel(const char *spec)
151*4882a593Smuzhiyun+{
152*4882a593Smuzhiyun+	struct uuidCache_s *uc;
153*4882a593Smuzhiyun+
154*4882a593Smuzhiyun+	uc = uuidcache_init(/*scan_devices:*/ 1);
155*4882a593Smuzhiyun+	while (uc) {
156*4882a593Smuzhiyun+		if (uc->partlabel[0] && strcmp(spec, uc->partlabel) == 0) {
157*4882a593Smuzhiyun+			return xstrdup(uc->device);
158*4882a593Smuzhiyun+		}
159*4882a593Smuzhiyun+		uc = uc->next;
160*4882a593Smuzhiyun+	}
161*4882a593Smuzhiyun+	return NULL;
162*4882a593Smuzhiyun+}
163*4882a593Smuzhiyun+
164*4882a593Smuzhiyun char *get_devname_from_uuid(const char *spec)
165*4882a593Smuzhiyun {
166*4882a593Smuzhiyun 	struct uuidCache_s *uc;
167*4882a593Smuzhiyun@@ -311,6 +350,8 @@ int resolve_mount_spec(char **fsname)
168*4882a593Smuzhiyun 		tmp = get_devname_from_uuid(*fsname + 5);
169*4882a593Smuzhiyun 	else if (is_prefixed_with(*fsname, "LABEL="))
170*4882a593Smuzhiyun 		tmp = get_devname_from_label(*fsname + 6);
171*4882a593Smuzhiyun+	else if (is_prefixed_with(*fsname, "PARTLABEL="))
172*4882a593Smuzhiyun+		tmp = get_devname_from_partlabel(*fsname + 10);
173*4882a593Smuzhiyun
174*4882a593Smuzhiyun 	if (tmp == *fsname)
175*4882a593Smuzhiyun 		return 0; /* no UUID= or LABEL= prefix found */
176*4882a593Smuzhiyundiff --git a/util-linux/volume_id/volume_id_internal.h b/util-linux/volume_id/volume_id_internal.h
177*4882a593Smuzhiyunindex b1e4448..d1d9d4d 100644
178*4882a593Smuzhiyun--- a/util-linux/volume_id/volume_id_internal.h
179*4882a593Smuzhiyun+++ b/util-linux/volume_id/volume_id_internal.h
180*4882a593Smuzhiyun@@ -76,6 +76,7 @@ struct volume_id {
181*4882a593Smuzhiyun //	uint8_t		label_raw[VOLUME_ID_LABEL_SIZE];
182*4882a593Smuzhiyun //	size_t		label_raw_len;
183*4882a593Smuzhiyun 	char		label[VOLUME_ID_LABEL_SIZE+1];
184*4882a593Smuzhiyun+	char		partlabel[VOLUME_ID_LABEL_SIZE+1];
185*4882a593Smuzhiyun //	uint8_t		uuid_raw[VOLUME_ID_UUID_SIZE];
186*4882a593Smuzhiyun //	size_t		uuid_raw_len;
187*4882a593Smuzhiyun 	/* uuid is stored in ASCII (not binary) form here: */
188*4882a593Smuzhiyun--
189*4882a593Smuzhiyun2.20.1
190*4882a593Smuzhiyun
191