HYL_OK3568_LINUX/buildroot/package/busybox/0006-Support-PARTLABEL.patch
2025-05-10 21:49:39 +08:00

191 lines
6.1 KiB
Diff

From a3c839f7ca05ecd424be293f49e90f36845b8b8b Mon Sep 17 00:00:00 2001
From: Jeffy Chen <jeffy.chen@rock-chips.com>
Date: Fri, 25 Nov 2022 19:39:30 +0800
Subject: [PATCH 6/8] Support PARTLABEL
Tested on RK3588 EVB:
busybox mount PARTLABEL=rootfs /media/
Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
---
include/volume_id.h | 1 +
util-linux/volume_id/get_devname.c | 59 +++++++++++++++++++----
util-linux/volume_id/volume_id_internal.h | 1 +
3 files changed, 52 insertions(+), 9 deletions(-)
diff --git a/include/volume_id.h b/include/volume_id.h
index a83da89..afb76e4 100644
--- a/include/volume_id.h
+++ b/include/volume_id.h
@@ -20,6 +20,7 @@
char *get_devname_from_label(const char *spec);
char *get_devname_from_uuid(const char *spec);
+char *get_devname_from_partlabel(const char *spec);
void display_uuid_cache(int scan_devices);
/* Returns:
diff --git a/util-linux/volume_id/get_devname.c b/util-linux/volume_id/get_devname.c
index 00cfb28..61d0461 100644
--- a/util-linux/volume_id/get_devname.c
+++ b/util-linux/volume_id/get_devname.c
@@ -24,15 +24,16 @@ static struct uuidCache_s {
// int major, minor;
char *device;
char *label;
+ char *partlabel;
char *uc_uuid; /* prefix makes it easier to grep for */
IF_FEATURE_BLKID_TYPE(const char *type;)
} *uuidCache;
#if !ENABLE_FEATURE_BLKID_TYPE
-#define get_label_uuid(fd, label, uuid, type) \
- get_label_uuid(fd, label, uuid)
-#define uuidcache_addentry(device, label, uuid, type) \
- uuidcache_addentry(device, label, uuid)
+#define get_label_uuid(fd, label, partlabel, uuid, type) \
+ get_label_uuid(fd, label, partlabel, uuid)
+#define uuidcache_addentry(device, label, partlabel, uuid, type) \
+ uuidcache_addentry(device, label, partlabel, uuid)
#endif
/* Returns !0 on error.
@@ -40,11 +41,13 @@ static struct uuidCache_s {
* (and they can't be NULL, although they can be "").
* NB: closes fd. */
static int
-get_label_uuid(int fd, char **label, char **uuid, const char **type)
+get_label_uuid(int fd, char **label, char **partlabel, char **uuid, const char **type)
{
int rv = 1;
uint64_t size;
struct volume_id *vid;
+ struct stat st;
+ char *uevent;
/* fd is owned by vid now */
vid = volume_id_open_node(fd);
@@ -55,12 +58,30 @@ get_label_uuid(int fd, char **label, char **uuid, const char **type)
if (volume_id_probe_all(vid, /*0,*/ size) != 0)
goto ret;
- if (vid->label[0] != '\0' || vid->uuid[0] != '\0'
+ fstat(fd, &st);
+ uevent = xasprintf("/sys/dev/block/%d:%d/uevent",
+ major(st.st_rdev), minor(st.st_rdev));
+ if (uevent) {
+ FILE *rfile = fopen_for_read(uevent);
+ if (rfile) {
+ const char *line;
+ while ((line = xmalloc_fgetline(rfile)) != NULL) {
+ if (sscanf(line, "PARTNAME=%s",
+ vid->partlabel) > 0)
+ break;
+ }
+ fclose(rfile);
+ }
+ free(uevent);
+ }
+
+ if (vid->label[0] != '\0' || vid->partlabel[0] != '\0' || vid->uuid[0] != '\0'
#if ENABLE_FEATURE_BLKID_TYPE
|| vid->type != NULL
#endif
) {
*label = xstrndup(vid->label, sizeof(vid->label));
+ *partlabel = xstrndup(vid->partlabel, sizeof(vid->partlabel));
*uuid = xstrndup(vid->uuid, sizeof(vid->uuid));
#if ENABLE_FEATURE_BLKID_TYPE
*type = vid->type;
@@ -77,7 +98,7 @@ get_label_uuid(int fd, char **label, char **uuid, const char **type)
/* NB: we take ownership of (malloc'ed) label and uuid */
static void
-uuidcache_addentry(char *device, /*int major, int minor,*/ char *label, char *uuid, const char *type)
+uuidcache_addentry(char *device, /*int major, int minor,*/ char *label, char *partlabel, char *uuid, const char *type)
{
struct uuidCache_s *last;
@@ -94,6 +115,7 @@ uuidcache_addentry(char *device, /*int major, int minor,*/ char *label, char *uu
// last->minor = minor;
last->device = device;
last->label = label;
+ last->partlabel = partlabel;
last->uc_uuid = uuid;
IF_FEATURE_BLKID_TYPE(last->type = type;)
}
@@ -244,6 +266,8 @@ void display_uuid_cache(int scan_devices)
if (uc->type)
printf(" TYPE=\"%s\"", uc->type);
#endif
+ if (uc->partlabel[0])
+ printf(" PARTLABEL=\"%s\"", uc->partlabel);
bb_putchar('\n');
uc = uc->next;
}
@@ -253,6 +277,7 @@ int add_to_uuid_cache(const char *device)
{
char *uuid = uuid; /* for compiler */
char *label = label;
+ char *partlabel = partlabel;
#if ENABLE_FEATURE_BLKID_TYPE
const char *type = type;
#endif
@@ -263,9 +288,9 @@ int add_to_uuid_cache(const char *device)
return 0;
/* get_label_uuid() closes fd in all cases (success & failure) */
- if (get_label_uuid(fd, &label, &uuid, &type) == 0) {
+ if (get_label_uuid(fd, &label, &partlabel, &uuid, &type) == 0) {
/* uuidcache_addentry() takes ownership of all four params */
- uuidcache_addentry(xstrdup(device), /*ma, mi,*/ label, uuid, type);
+ uuidcache_addentry(xstrdup(device), /*ma, mi,*/ label, partlabel, uuid, type);
return 1;
}
return 0;
@@ -288,6 +313,20 @@ char *get_devname_from_label(const char *spec)
return NULL;
}
+char *get_devname_from_partlabel(const char *spec)
+{
+ struct uuidCache_s *uc;
+
+ uc = uuidcache_init(/*scan_devices:*/ 1);
+ while (uc) {
+ if (uc->partlabel[0] && strcmp(spec, uc->partlabel) == 0) {
+ return xstrdup(uc->device);
+ }
+ uc = uc->next;
+ }
+ return NULL;
+}
+
char *get_devname_from_uuid(const char *spec)
{
struct uuidCache_s *uc;
@@ -311,6 +350,8 @@ int resolve_mount_spec(char **fsname)
tmp = get_devname_from_uuid(*fsname + 5);
else if (is_prefixed_with(*fsname, "LABEL="))
tmp = get_devname_from_label(*fsname + 6);
+ else if (is_prefixed_with(*fsname, "PARTLABEL="))
+ tmp = get_devname_from_partlabel(*fsname + 10);
if (tmp == *fsname)
return 0; /* no UUID= or LABEL= prefix found */
diff --git a/util-linux/volume_id/volume_id_internal.h b/util-linux/volume_id/volume_id_internal.h
index b1e4448..d1d9d4d 100644
--- a/util-linux/volume_id/volume_id_internal.h
+++ b/util-linux/volume_id/volume_id_internal.h
@@ -76,6 +76,7 @@ struct volume_id {
// uint8_t label_raw[VOLUME_ID_LABEL_SIZE];
// size_t label_raw_len;
char label[VOLUME_ID_LABEL_SIZE+1];
+ char partlabel[VOLUME_ID_LABEL_SIZE+1];
// uint8_t uuid_raw[VOLUME_ID_UUID_SIZE];
// size_t uuid_raw_len;
/* uuid is stored in ASCII (not binary) form here: */
--
2.20.1