diff options
| -rw-r--r-- | fs/partitions/efi.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/fs/partitions/efi.c b/fs/partitions/efi.c index dbb44d4bb8a7..ac0ccb5026a2 100644 --- a/fs/partitions/efi.c +++ b/fs/partitions/efi.c | |||
| @@ -94,6 +94,7 @@ | |||
| 94 | * | 94 | * |
| 95 | ************************************************************/ | 95 | ************************************************************/ |
| 96 | #include <linux/crc32.h> | 96 | #include <linux/crc32.h> |
| 97 | #include <linux/ctype.h> | ||
| 97 | #include <linux/math64.h> | 98 | #include <linux/math64.h> |
| 98 | #include <linux/slab.h> | 99 | #include <linux/slab.h> |
| 99 | #include "check.h" | 100 | #include "check.h" |
| @@ -604,6 +605,7 @@ int efi_partition(struct parsed_partitions *state) | |||
| 604 | gpt_entry *ptes = NULL; | 605 | gpt_entry *ptes = NULL; |
| 605 | u32 i; | 606 | u32 i; |
| 606 | unsigned ssz = bdev_logical_block_size(state->bdev) / 512; | 607 | unsigned ssz = bdev_logical_block_size(state->bdev) / 512; |
| 608 | u8 unparsed_guid[37]; | ||
| 607 | 609 | ||
| 608 | if (!find_valid_gpt(state, &gpt, &ptes) || !gpt || !ptes) { | 610 | if (!find_valid_gpt(state, &gpt, &ptes) || !gpt || !ptes) { |
| 609 | kfree(gpt); | 611 | kfree(gpt); |
| @@ -614,6 +616,9 @@ int efi_partition(struct parsed_partitions *state) | |||
| 614 | pr_debug("GUID Partition Table is valid! Yea!\n"); | 616 | pr_debug("GUID Partition Table is valid! Yea!\n"); |
| 615 | 617 | ||
| 616 | for (i = 0; i < le32_to_cpu(gpt->num_partition_entries) && i < state->limit-1; i++) { | 618 | for (i = 0; i < le32_to_cpu(gpt->num_partition_entries) && i < state->limit-1; i++) { |
| 619 | struct partition_meta_info *info; | ||
| 620 | unsigned label_count = 0; | ||
| 621 | unsigned label_max; | ||
| 617 | u64 start = le64_to_cpu(ptes[i].starting_lba); | 622 | u64 start = le64_to_cpu(ptes[i].starting_lba); |
| 618 | u64 size = le64_to_cpu(ptes[i].ending_lba) - | 623 | u64 size = le64_to_cpu(ptes[i].ending_lba) - |
| 619 | le64_to_cpu(ptes[i].starting_lba) + 1ULL; | 624 | le64_to_cpu(ptes[i].starting_lba) + 1ULL; |
| @@ -627,6 +632,26 @@ int efi_partition(struct parsed_partitions *state) | |||
| 627 | if (!efi_guidcmp(ptes[i].partition_type_guid, | 632 | if (!efi_guidcmp(ptes[i].partition_type_guid, |
| 628 | PARTITION_LINUX_RAID_GUID)) | 633 | PARTITION_LINUX_RAID_GUID)) |
| 629 | state->parts[i + 1].flags = ADDPART_FLAG_RAID; | 634 | state->parts[i + 1].flags = ADDPART_FLAG_RAID; |
| 635 | |||
| 636 | info = &state->parts[i + 1].info; | ||
| 637 | /* Instead of doing a manual swap to big endian, reuse the | ||
| 638 | * common ASCII hex format as the interim. | ||
| 639 | */ | ||
| 640 | efi_guid_unparse(&ptes[i].unique_partition_guid, unparsed_guid); | ||
| 641 | part_pack_uuid(unparsed_guid, info->uuid); | ||
| 642 | |||
| 643 | /* Naively convert UTF16-LE to 7 bits. */ | ||
| 644 | label_max = min(sizeof(info->volname) - 1, | ||
| 645 | sizeof(ptes[i].partition_name)); | ||
| 646 | info->volname[label_max] = 0; | ||
| 647 | while (label_count < label_max) { | ||
| 648 | u8 c = ptes[i].partition_name[label_count] & 0xff; | ||
| 649 | if (c && !isprint(c)) | ||
| 650 | c = '!'; | ||
| 651 | info->volname[label_count] = c; | ||
| 652 | label_count++; | ||
| 653 | } | ||
| 654 | state->parts[i + 1].has_info = true; | ||
| 630 | } | 655 | } |
| 631 | kfree(ptes); | 656 | kfree(ptes); |
| 632 | kfree(gpt); | 657 | kfree(gpt); |
