diff options
-rw-r--r-- | block/genhd.c | 8 | ||||
-rw-r--r-- | block/partitions/efi.c | 7 | ||||
-rw-r--r-- | include/linux/genhd.h | 8 | ||||
-rw-r--r-- | init/do_mounts.c | 28 |
4 files changed, 25 insertions, 26 deletions
diff --git a/block/genhd.c b/block/genhd.c index 6cace663a80e..b281f3a2d26a 100644 --- a/block/genhd.c +++ b/block/genhd.c | |||
@@ -743,7 +743,6 @@ void __init printk_all_partitions(void) | |||
743 | struct hd_struct *part; | 743 | struct hd_struct *part; |
744 | char name_buf[BDEVNAME_SIZE]; | 744 | char name_buf[BDEVNAME_SIZE]; |
745 | char devt_buf[BDEVT_SIZE]; | 745 | char devt_buf[BDEVT_SIZE]; |
746 | char uuid_buf[PARTITION_META_INFO_UUIDLTH * 2 + 5]; | ||
747 | 746 | ||
748 | /* | 747 | /* |
749 | * Don't show empty devices or things that have been | 748 | * Don't show empty devices or things that have been |
@@ -762,16 +761,11 @@ void __init printk_all_partitions(void) | |||
762 | while ((part = disk_part_iter_next(&piter))) { | 761 | while ((part = disk_part_iter_next(&piter))) { |
763 | bool is_part0 = part == &disk->part0; | 762 | bool is_part0 = part == &disk->part0; |
764 | 763 | ||
765 | uuid_buf[0] = '\0'; | ||
766 | if (part->info) | ||
767 | snprintf(uuid_buf, sizeof(uuid_buf), "%pU", | ||
768 | part->info->uuid); | ||
769 | |||
770 | printk("%s%s %10llu %s %s", is_part0 ? "" : " ", | 764 | printk("%s%s %10llu %s %s", is_part0 ? "" : " ", |
771 | bdevt_str(part_devt(part), devt_buf), | 765 | bdevt_str(part_devt(part), devt_buf), |
772 | (unsigned long long)part_nr_sects_read(part) >> 1 | 766 | (unsigned long long)part_nr_sects_read(part) >> 1 |
773 | , disk_name(disk, part->partno, name_buf), | 767 | , disk_name(disk, part->partno, name_buf), |
774 | uuid_buf); | 768 | part->info ? part->info->uuid : ""); |
775 | if (is_part0) { | 769 | if (is_part0) { |
776 | if (disk->driverfs_dev != NULL && | 770 | if (disk->driverfs_dev != NULL && |
777 | disk->driverfs_dev->driver != NULL) | 771 | disk->driverfs_dev->driver != NULL) |
diff --git a/block/partitions/efi.c b/block/partitions/efi.c index 6296b403c67a..b62fb88b8711 100644 --- a/block/partitions/efi.c +++ b/block/partitions/efi.c | |||
@@ -620,7 +620,6 @@ int efi_partition(struct parsed_partitions *state) | |||
620 | gpt_entry *ptes = NULL; | 620 | gpt_entry *ptes = NULL; |
621 | u32 i; | 621 | u32 i; |
622 | unsigned ssz = bdev_logical_block_size(state->bdev) / 512; | 622 | unsigned ssz = bdev_logical_block_size(state->bdev) / 512; |
623 | u8 unparsed_guid[37]; | ||
624 | 623 | ||
625 | if (!find_valid_gpt(state, &gpt, &ptes) || !gpt || !ptes) { | 624 | if (!find_valid_gpt(state, &gpt, &ptes) || !gpt || !ptes) { |
626 | kfree(gpt); | 625 | kfree(gpt); |
@@ -649,11 +648,7 @@ int efi_partition(struct parsed_partitions *state) | |||
649 | state->parts[i + 1].flags = ADDPART_FLAG_RAID; | 648 | state->parts[i + 1].flags = ADDPART_FLAG_RAID; |
650 | 649 | ||
651 | info = &state->parts[i + 1].info; | 650 | info = &state->parts[i + 1].info; |
652 | /* Instead of doing a manual swap to big endian, reuse the | 651 | efi_guid_unparse(&ptes[i].unique_partition_guid, info->uuid); |
653 | * common ASCII hex format as the interim. | ||
654 | */ | ||
655 | efi_guid_unparse(&ptes[i].unique_partition_guid, unparsed_guid); | ||
656 | part_pack_uuid(unparsed_guid, info->uuid); | ||
657 | 652 | ||
658 | /* Naively convert UTF16-LE to 7 bits. */ | 653 | /* Naively convert UTF16-LE to 7 bits. */ |
659 | label_max = min(sizeof(info->volname) - 1, | 654 | label_max = min(sizeof(info->volname) - 1, |
diff --git a/include/linux/genhd.h b/include/linux/genhd.h index 4f440b3e89fe..79b8bba19363 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h | |||
@@ -88,10 +88,14 @@ struct disk_stats { | |||
88 | }; | 88 | }; |
89 | 89 | ||
90 | #define PARTITION_META_INFO_VOLNAMELTH 64 | 90 | #define PARTITION_META_INFO_VOLNAMELTH 64 |
91 | #define PARTITION_META_INFO_UUIDLTH 16 | 91 | /* |
92 | * Enough for the string representation of any kind of UUID plus NULL. | ||
93 | * EFI UUID is 36 characters. MSDOS UUID is 11 characters. | ||
94 | */ | ||
95 | #define PARTITION_META_INFO_UUIDLTH 37 | ||
92 | 96 | ||
93 | struct partition_meta_info { | 97 | struct partition_meta_info { |
94 | u8 uuid[PARTITION_META_INFO_UUIDLTH]; /* always big endian */ | 98 | char uuid[PARTITION_META_INFO_UUIDLTH]; |
95 | u8 volname[PARTITION_META_INFO_VOLNAMELTH]; | 99 | u8 volname[PARTITION_META_INFO_VOLNAMELTH]; |
96 | }; | 100 | }; |
97 | 101 | ||
diff --git a/init/do_mounts.c b/init/do_mounts.c index f8a66424360d..b28ec5819325 100644 --- a/init/do_mounts.c +++ b/init/do_mounts.c | |||
@@ -69,23 +69,28 @@ __setup("ro", readonly); | |||
69 | __setup("rw", readwrite); | 69 | __setup("rw", readwrite); |
70 | 70 | ||
71 | #ifdef CONFIG_BLOCK | 71 | #ifdef CONFIG_BLOCK |
72 | struct uuidcmp { | ||
73 | const char *uuid; | ||
74 | int len; | ||
75 | }; | ||
76 | |||
72 | /** | 77 | /** |
73 | * match_dev_by_uuid - callback for finding a partition using its uuid | 78 | * match_dev_by_uuid - callback for finding a partition using its uuid |
74 | * @dev: device passed in by the caller | 79 | * @dev: device passed in by the caller |
75 | * @data: opaque pointer to a 36 byte char array with a UUID | 80 | * @data: opaque pointer to the desired struct uuidcmp to match |
76 | * | 81 | * |
77 | * Returns 1 if the device matches, and 0 otherwise. | 82 | * Returns 1 if the device matches, and 0 otherwise. |
78 | */ | 83 | */ |
79 | static int match_dev_by_uuid(struct device *dev, void *data) | 84 | static int match_dev_by_uuid(struct device *dev, void *data) |
80 | { | 85 | { |
81 | u8 *uuid = data; | 86 | struct uuidcmp *cmp = data; |
82 | struct hd_struct *part = dev_to_part(dev); | 87 | struct hd_struct *part = dev_to_part(dev); |
83 | 88 | ||
84 | if (!part->info) | 89 | if (!part->info) |
85 | goto no_match; | 90 | goto no_match; |
86 | 91 | ||
87 | if (memcmp(uuid, part->info->uuid, sizeof(part->info->uuid))) | 92 | if (strncasecmp(cmp->uuid, part->info->uuid, cmp->len)) |
88 | goto no_match; | 93 | goto no_match; |
89 | 94 | ||
90 | return 1; | 95 | return 1; |
91 | no_match: | 96 | no_match: |
@@ -95,7 +100,7 @@ no_match: | |||
95 | 100 | ||
96 | /** | 101 | /** |
97 | * devt_from_partuuid - looks up the dev_t of a partition by its UUID | 102 | * devt_from_partuuid - looks up the dev_t of a partition by its UUID |
98 | * @uuid: min 36 byte char array containing a hex ascii UUID | 103 | * @uuid: char array containing ascii UUID |
99 | * | 104 | * |
100 | * The function will return the first partition which contains a matching | 105 | * The function will return the first partition which contains a matching |
101 | * UUID value in its partition_meta_info struct. This does not search | 106 | * UUID value in its partition_meta_info struct. This does not search |
@@ -106,11 +111,11 @@ no_match: | |||
106 | * | 111 | * |
107 | * Returns the matching dev_t on success or 0 on failure. | 112 | * Returns the matching dev_t on success or 0 on failure. |
108 | */ | 113 | */ |
109 | static dev_t devt_from_partuuid(char *uuid_str) | 114 | static dev_t devt_from_partuuid(const char *uuid_str) |
110 | { | 115 | { |
111 | dev_t res = 0; | 116 | dev_t res = 0; |
117 | struct uuidcmp cmp; | ||
112 | struct device *dev = NULL; | 118 | struct device *dev = NULL; |
113 | u8 uuid[16]; | ||
114 | struct gendisk *disk; | 119 | struct gendisk *disk; |
115 | struct hd_struct *part; | 120 | struct hd_struct *part; |
116 | int offset = 0; | 121 | int offset = 0; |
@@ -118,6 +123,9 @@ static dev_t devt_from_partuuid(char *uuid_str) | |||
118 | if (strlen(uuid_str) < 36) | 123 | if (strlen(uuid_str) < 36) |
119 | goto done; | 124 | goto done; |
120 | 125 | ||
126 | cmp.uuid = uuid_str; | ||
127 | cmp.len = 36; | ||
128 | |||
121 | /* Check for optional partition number offset attributes. */ | 129 | /* Check for optional partition number offset attributes. */ |
122 | if (uuid_str[36]) { | 130 | if (uuid_str[36]) { |
123 | char c = 0; | 131 | char c = 0; |
@@ -134,10 +142,8 @@ static dev_t devt_from_partuuid(char *uuid_str) | |||
134 | } | 142 | } |
135 | } | 143 | } |
136 | 144 | ||
137 | /* Pack the requested UUID in the expected format. */ | 145 | dev = class_find_device(&block_class, NULL, &cmp, |
138 | part_pack_uuid(uuid_str, uuid); | 146 | &match_dev_by_uuid); |
139 | |||
140 | dev = class_find_device(&block_class, NULL, uuid, &match_dev_by_uuid); | ||
141 | if (!dev) | 147 | if (!dev) |
142 | goto done; | 148 | goto done; |
143 | 149 | ||