diff options
author | Will Drewry <wad@chromium.org> | 2010-08-31 16:47:06 -0400 |
---|---|---|
committer | Jens Axboe <jaxboe@fusionio.com> | 2010-09-15 10:13:28 -0400 |
commit | eec7ecfede74bb996060efefd5c157acd5794e8a (patch) | |
tree | ecbe81ba3143aa8a90936a8acc51cc6a1cc6e01c /fs/partitions/efi.c | |
parent | 6d1d8050b4bc89d0165d29b58e894aeba2564a97 (diff) |
genhd, efi: add efi partition metadata to hd_structs
This change extends the partition_meta_info structure to
support EFI GPT-specific metadata and ensures that data
is copied in on partition scanning.
Signed-off-by: Will Drewry <wad@chromium.org>
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
Diffstat (limited to 'fs/partitions/efi.c')
-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); |