From: Will Drewry on
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(a)chromium.org>

v2: move info assignment after memcpy()s
adds _MAX to the enum after EFI
---
fs/partitions/efi.c | 16 ++++++++++++++++
include/linux/genhd.h | 14 ++++++++++++++
2 files changed, 30 insertions(+), 0 deletions(-)

diff --git a/fs/partitions/efi.c b/fs/partitions/efi.c
index 9efb2cf..fac527d 100644
--- a/fs/partitions/efi.c
+++ b/fs/partitions/efi.c
@@ -614,6 +614,7 @@ int efi_partition(struct parsed_partitions *state)
pr_debug("GUID Partition Table is valid! Yea!\n");

for (i = 0; i < le32_to_cpu(gpt->num_partition_entries) && i < state->limit-1; i++) {
+ struct partition_meta_info *info;
u64 start = le64_to_cpu(ptes[i].starting_lba);
u64 size = le64_to_cpu(ptes[i].ending_lba) -
le64_to_cpu(ptes[i].starting_lba) + 1ULL;
@@ -627,6 +628,21 @@ int efi_partition(struct parsed_partitions *state)
if (!efi_guidcmp(ptes[i].partition_type_guid,
PARTITION_LINUX_RAID_GUID))
state->parts[i + 1].flags = ADDPART_FLAG_RAID;
+
+ info = alloc_part_info(NULL);
+ if (!info) {
+ printk(KERN_WARNING
+ "unable to allocate memory for part->info\n");
+ continue;
+ }
+ info->format = PARTITION_META_INFO_FORMAT_EFI;
+ memcpy(info->efi.uuid.b, ptes[i].unique_partition_guid.b,
+ sizeof(info->efi.uuid.b));
+ memcpy(info->efi.type.b, ptes[i].partition_type_guid.b,
+ sizeof(info->efi.type.b));
+ memcpy(info->efi.label, ptes[i].partition_name,
+ sizeof(info->efi.label));
+ state->parts[i + 1].info = info;
}
kfree(ptes);
kfree(gpt);
diff --git a/include/linux/genhd.h b/include/linux/genhd.h
index 7b6644a..beb98e3 100644
--- a/include/linux/genhd.h
+++ b/include/linux/genhd.h
@@ -91,11 +91,25 @@ struct disk_stats {
enum partition_meta_info_format_t {
/* Partition info format */
PARTITION_META_INFO_FORMAT_NONE = 0,
+ PARTITION_META_INFO_FORMAT_EFI,
+ /* Place additional formats here. */
+ PARTITION_META_INFO_FORMAT_MAX,
};

+#ifdef CONFIG_EFI_PARTITION
+#include <linux/efi.h>
+#endif
+
struct partition_meta_info {
enum partition_meta_info_format_t format;
union {
+#ifdef CONFIG_EFI_PARTITION
+ struct {
+ efi_guid_t uuid;
+ efi_guid_t type;
+ efi_char16_t label[72 / sizeof(efi_char16_t)];
+ } efi;
+#endif
};
};

--
1.7.0.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/