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